Import/Export GUI

This commit is contained in:
Pavel Škoda
2020-06-23 15:35:54 +02:00
committed by Michal Horejsek
parent 1c10cc5065
commit 7e5e3d3dd4
50 changed files with 1793 additions and 692 deletions

View File

@ -210,7 +210,7 @@ Window {
Component.onCompleted : {
testgui.winMain.x = 150
testgui.winMain.x = 350
testgui.winMain.y = 100
}
@ -230,7 +230,7 @@ Window {
}
ListModel{
id: structureExternal
id: structureExternalOFF
property var globalOptions: JSON.parse('{ "folderId" : "global--uniq" , "folderName" : "" , "folderColor" : "" , "folderType" : "" , "folderEntries" : 0, "fromDate": 0, "toDate": 0, "isFolderSelected" : false , "targetFolderID": "14" , "targetLabelIDs": ";20;29" }')
@ -265,7 +265,7 @@ Window {
}
ListModel{
id: structurePM
id: structurePMOFF
// group selectors
property bool selectedLabels : false
@ -328,6 +328,7 @@ Window {
}
}
function setTypeSelected (model, folderType , toSelect ) {
console.log(" select type ", folderType, toSelect)
for (var i= -1; i<model.count; i++) {
@ -457,6 +458,355 @@ Window {
ListElement{ mailSubject : "Pop art is cool again" ; mailDate : "March 2 , 2019 12 : 00 : 22" ; inputFolder : "Archive" ; mailFrom : "me@me.me" ; errorMessage : "Something went wrong and import retry was not successful" ; }
ListElement{ mailSubject : "Check this cute kittens play volleyball on Copacabanana beach" ; mailDate : "March 2 , 2019 12 : 00 : 22" ; inputFolder : "Archive" ; mailFrom : "me@me.me" ; errorMessage : "Something went wrong and import retry was not successful" ; }
}
// Transfer rules
ListModel {
id: transferRules
property var targets : new Object();
// test data for import
property var importRules : JSON.parse('[
{"isActive" : true , "mboxID" : "src1" , "fromDate" : 0 , "toDate" : 0 , "targetIDs" : [ "0" , "label1" ] } ,
{"isActive" : true , "mboxID" : "src2" , "fromDate" : 0 , "toDate" : 0 , "targetIDs" : [ "6" , "label2" ] } ,
{"isActive" : true , "mboxID" : "src3" , "fromDate" : 350000 , "toDate" : 5000000 , "targetIDs" : [ "folder1" ] } ,
{"isActive" : true , "mboxID" : "src4" , "fromDate" : 0 , "toDate" : 0 , "targetIDs" : [ "folder2" , "label1" , "label2" ] }
]')
property var selectedForExport : [ "0", "7", "folder1", "folde2", "label1", "label2", "label3"]
property var extMailboxes: JSON.parse('{
"src1": {"name" : "Source Inbox" , "type" : "external" , "color" : "#000"} ,
"src2": {"name" : "Source Sent" , "type" : "external" , "color" : "#000"} ,
"src3": {"name" : "Source Folder" , "type" : "external" , "color" : "#000"} ,
"src4": {"name" : "Source Trash" , "type" : "external" , "color" : "#000"}
}')
property var pmMailboxes : JSON.parse('{
"0": {"name" : "Inbox" , "type" : "system" , "color" : "#000"} ,
"3": {"name" : "Draft" , "type" : "system" , "color" : "#000"} ,
"6": {"name" : "Archive" , "type" : "system" , "color" : "#000"} ,
"5": {"name" : "All Mail" , "type" : "system" , "color" : "#000"} ,
"3": {"name" : "Trash" , "type" : "system" , "color" : "#000"} ,
"7": {"name" : "Sent" , "type" : "system" , "color" : "#000"} ,
"4": {"name" : "Spam" , "type" : "system" , "color" : "#000"} ,
"folder1": {"name": "Folder 1", "type":"folder", "color":"#57c"},
"folder2": {"name": "Folder 2", "type":"folder", "color":"#5c7"},
"folder3": {"name": "Folder 3", "type":"folder", "color":"#c57"},
"label1": {"name": "Label 1", "type":"label", "color":"#a5a"},
"label2": {"name": "Label 2", "type":"label", "color":"#5aa"},
"label3": {"name": "Label 3", "type":"label", "color":"#aa5"}
}')
ListElement{isActive : true ; mboxID : "source1" ; name : "Source folder 1" ; iconColor : "#cccccc" ; type : "external" ; fromDate : 0 ; toDate : 0 ; labelColors : "red ; green ; blue"}
ListElement{isActive : false ; mboxID : "source2" ; name : "Source folder 2" ; iconColor : "#cccccc" ; type : "external" ; fromDate : 300000 ; toDate : 15000000 ; labelColors : "red ; green ; blue"}
ListElement{isActive : true ; mboxID : "source3" ; name : "Source folder 4" ; iconColor : "#cccccc" ; type : "external" ; fromDate : 0 ; toDate : 0 ; labelColors : "red ; green ; blue"}
// TransferRules INTERFACE
// TransferRules properties
property int globalFromDate : 0 // 45000
property int globalToDate : 0 // 120000
property bool isLabelGroupSelected : false
property bool isFolderGroupSelected : false
// TransferRules default getters
// func (*TransferRules) count() int
// func (*TransferRules) roleNames() map[int] QByteArray
// func (*TransferRules) data(index, role) *QVariant
//
// Expected roles for TransferRules
//
// isActive bool
// mboxID string // constant
// name string // constant
// type string // constant, expected values: "label", "folder", ""
// iconColor string // constant
// fromDate int64
// toDate int64
// labelColors string // list of hex RGB strings delimited by `;`
// TransferRules custom getters
function targetFolders(sourceID) {
//ListElement{isActive: true; mboxID: "target1"; name: "Target system folder"; type: "system"; iconColor:"red"}
return getTargets(sourceID, "folder")
}
function targetLabels(sourceID) {
//ListElement{isActive: false; mboxID: "target3"; name: "Target custom label 1"; type: "label"; iconColor:"green"}
return getTargets(sourceID, "label")
}
// For target drop down menu (labels and folders) we need
// additional model TargetList (QAbstractListModel).
//
// func (*TransferRules) targetFolders(sourceID string) * QAbstractListModel
//
// There is no setter functions for this list all actions are
// handled by TransferRules.
//
// The target models have therefore only data functions and one property as interface:
//
// TargetList properties:
// property int selectedIndex : -1
//
// TargetList default getters
// func (*TargetList) count() int
// func (*TargetList) roleNames() map[int] QByteArray
// func (*TargetList) data(index, role) *QVariant
//
// Expected roles for TargetList
//
// isActive bool
// mboxID string // constant
// name string // constant
// type string // constant, expected values: "label", "folder", ""
// iconColor string // constant
//
// The tricky part here is the QAbstractListModel implemetation: it
// needs to return all targets of certain type and their index.
// Setters
function setIsRuleActive(srcID, isActive){
console.log("setIsRuleActive", srcID, isActive)
var groupLabelsSelected = true
var groupFoldersSelected = true
for (var i = 0; i < transferRules.count; i++) {
var rule = transferRules.get(i)
if (rule.mboxID ==srcID) rule.isActive = isActive;
if (!rule.isActive && rule.type == "label") groupLabelsSelected = false
if (!rule.isActive && rule.type == "folder") groupFoldersSelected = false
}
transferRules.isLabelGroupSelected = groupLabelsSelected
transferRules.isFolderGroupSelected = groupFoldersSelected
}
function setIsGroupActive(groupName,isActive){
console.log("setIsGroupActive", groupName, isActive)
var groupLabelsSelected = true
var groupFoldersSelected = true
for (var i = 0; i < transferRules.count; i++) {
var rule = transferRules.get(i)
if (rule.type == groupName) rule.isActive = isActive;
if (!rule.isActive && rule.type == "label") groupLabelsSelected = false
if (!rule.isActive && rule.type == "folder") groupFoldersSelected = false
}
transferRules.isLabelGroupSelected = groupLabelsSelected
transferRules.isFolderGroupSelected = groupFoldersSelected
}
function setFromToDate(srcID, fromDate, toDate){
console.log("setFromToDate", srcID, fromDate, toDate)
for (var i = 0; i < transferRules.count; i++) {
var rule = transferRules.get(i)
if (rule.mboxID ==srcID) {
rule.fromDate = fromDate
rule.toDate = toDate
}
}
}
function addTargetID(srcID, targetID){
console.log("addTargetID", srcID, targetID)
changeTargetID(srcID, targetID, true)
}
function removeTargetID(srcID, targetID){
console.log("removeTargetID", srcID, targetID)
changeTargetID(srcID, targetID, false)
}
// MOCK METHODS: NOT PART OF INTERFACE
Component.onCompleted: prepareImport()
// Fill model with import rules
function prepareImport() {
console.log(" ==== Prepare IMPORT ==== ")
console.trace()
transferRules.clear()
for (var ruleI in transferRules.importRules) {
var rule = transferRules.importRules[ruleI]
var src = transferRules.extMailboxes[rule.mboxID];
var labelColors = [];
for (var tid in rule.targetIDs) {
var targetID = rule.targetIDs[tid]
if (pmMailboxes[targetID].type == "label") {
labelColors.push(pmMailboxes[targetID]["color"])
}
}
transferRules.append({
"isActive" : rule.isActive,
"mboxID" : rule.mboxID,
"name" : src.name,
"type" : src.type,
"iconColor" : src["color"],
"fromDate" : rule.fromDate,
"toDate" : rule.toDate,
"labelColors" : labelColors.join(";"),
});
}
}
// Fill model with export rules
function prepareExport() {
console.log(" ==== Prepare EXPORT ==== ")
console.trace()
transferRules.clear()
var groupLabelsSelected = true
var groupFoldersSelected = true
for (var srcID in transferRules.pmMailboxes) {
var src = transferRules.pmMailboxes[srcID]
var isActive = transferRules.selectedForExport.find(function(mboxID){return mboxID == srcID}) !== undefined
transferRules.append({
"isActive" : isActive,
"mboxID" : srcID,
"name" : src.name,
"type" : (src.type == "system" ? "" : src["type"]),
"iconColor" : src["color"],
"fromDate" : 0,
"toDate" : 0,
"labelColors" : src["color"]
});
if (!isActive) {
if (src.type == "label") {
groupLabelsSelected = false
}
if (src.type == "folder") {
groupFoldersSelected = false
}
}
}
transferRules.isLabelGroupSelected = groupLabelsSelected
transferRules.isFolderGroupSelected = groupFoldersSelected
}
function getTargets(sourceID, type) {
console.log("get targets:", type, sourceID)
if (! (type+sourceID in transferRules.targets)){
var source;
for (var srcI in transferRules.importRules) {
source = transferRules.importRules[srcI]
if (source.mboxID == sourceID ) {
break
}
}
var model = Qt.createQmlObject ('import QtQuick 2.3; ListModel { property int selectedIndex: -1; }', transferRules);
var i = -1
for (var tgtID in transferRules.pmMailboxes) {
var tgt = transferRules.pmMailboxes[tgtID]
if (type == "label" && tgt.type != "label") continue
if (type != "label" && tgt.type == "label") continue
i++;
var isActive = false
for (var tid in source.targetIDs ) {
var selectedID = source.targetIDs[tid]
if (selectedID == tgtID) {
isActive = true
model.selectedIndex=i
break
}
}
var row = {
"isActive" : isActive,
"mboxID" : tgtID,
"name" : tgt.name,
"type" : tgt.type,
"iconColor" : tgt["color"]
};
model.append (row) ;
}
transferRules.targets[type+sourceID] = model;
}
return transferRules.targets[type+sourceID];
}
function changeTargetID(srcID, targetID, add){
console.log("change target ID ", srcID, targetID, add)
for (var targetsName in transferRules.targets) {
var targets = transferRules.targets[targetsName]
var areFolders = targetsName == "folder"+srcID
var areLabels = targetsName == "label"+srcID
if (areFolders || areLabels) {
console.log("matched targets ", targetsName, targets)
var deactivateOthers = false
var colorList = []
for (var i =0; i<targets.count; i++) {
var tgt = targets.get(i)
console.log(" tgt", i, tgt.mboxID, tgt.isActive)
if (tgt.mboxID == targetID) {
console.log(" matched tgt", i, tgt.mboxID)
if (areFolders && !add) {
console.exception("WRONG LOGIC: removing folder")
}
if (add) {
targets.selectedIndex=i
}
tgt.isActive = add
deactivateOthers = add && areFolders
console.log(" active ", tgt.isActive)
}
if (areLabels && tgt.isActive) {
colorList.push(tgt.iconColor)
console.log(" colors", i, colorList)
}
}
if (areLabels) {
if (colorList.length == 0){
targets.selectedIndex = -1
}
for (var i = 0; i<transferRules.count; i++) {
var rule = transferRules.get(i)
console.log (" are labels: color list", i, rule.mboxID )
if (rule.mboxID == srcID) {
rule.labelColors = colorList.join(";")
console.log("updated label color list", rule.labelColors)
break
}
}
}
if (deactivateOthers) {
for (var i =0; i<targets.count; i++) {
var tgt = targets.get(i)
if (tgt.mboxID != targetID) {
tgt.isActive = false
console.log(" deactivate ", tgt.mboxID, tgt.isActive)
}
}
}
}
}
}
}
}
@ -497,6 +847,14 @@ Window {
signal toggleMainWin(int systX, int systY, int systW, int systH)
signal notifyHasNoKeychain()
signal notifyKeychainRebuild()
signal notifyAddressChangedLogout()
signal notifyAddressChanged()
signal notifyUpdate()
signal showWindow()
signal showHelp()
signal showQuit()
@ -692,8 +1050,8 @@ Window {
go.animateProgressBar.resume()
}
function cancelProcess(clearUnfinished) {
console.log("stopped at ", go.progress, " clearing unfinished", clearUnfinished)
function cancelProcess() {
console.log("stopped at ", go.progress)
go.animateProgressBar.stop()
}
@ -718,6 +1076,7 @@ Window {
break;
case "loadStructureForExport" :
transferRules.prepareExport()
go.exportStructureLoadFinished(true)
break;