forked from Silverfish/proton-bridge
197 lines
7.1 KiB
Go
197 lines
7.1 KiB
Go
// Copyright (c) 2021 Proton Technologies AG
|
|
//
|
|
// This file is part of ProtonMail Bridge.
|
|
//
|
|
// ProtonMail Bridge is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// ProtonMail Bridge is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with ProtonMail Bridge. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
// +build build_qt
|
|
|
|
package qtie
|
|
|
|
// TODO:
|
|
// Proposal for new structure
|
|
// It will be a bit more memory but much better performance
|
|
// * Rules:
|
|
// * rules []Rule /QAbstracItemModel/
|
|
// * globalFromDate int64
|
|
// * globalToDate int64
|
|
// * globalLabel Mbox
|
|
// * targetPath string
|
|
// * filterEncryptedBodies bool
|
|
// * Rule
|
|
// * sourceMbox: Mbox
|
|
// * targetFolders: []Mbox /QAbstracItemModel/ (all available target folders)
|
|
// * targetLabels: []Mbox /QAbstracItemModel/ (all available target labels)
|
|
// * selectedLabelColors: QStringList (need reset context on change) (show label list)
|
|
// * fromDate int64
|
|
// * toDate int64
|
|
// * Mbox
|
|
// * IsActive bool (show checkox)
|
|
// * Name string (show name)
|
|
// * Type string (show icon)
|
|
// * Color string (show icon)
|
|
//
|
|
// Biggest update: add folder or label for all roles update target models
|
|
|
|
import (
|
|
qtcommon "github.com/ProtonMail/proton-bridge/internal/frontend/qt-common"
|
|
"github.com/ProtonMail/proton-bridge/internal/transfer"
|
|
"github.com/therecipe/qt/core"
|
|
)
|
|
|
|
// FolderStructure model providing container for items (folder info) to QML
|
|
//
|
|
// QML ListView connects the model from Go and it shows item (entities)
|
|
// information.
|
|
//
|
|
// Copied and edited from `github.com/therecipe/qt/internal/examples/sailfish/listview`
|
|
//
|
|
// NOTE: When implementing a model it is important to remember that QAbstractItemModel does not store any data itself !!!!
|
|
// see https://doc.qt.io/qt-5/model-view-programming.html#designing-a-model
|
|
type FolderStructure struct {
|
|
core.QAbstractListModel
|
|
|
|
// QtObject Constructor
|
|
_ func() `constructor:"init"`
|
|
|
|
// List of item properties
|
|
//
|
|
// All available item properties are inside the map
|
|
_ map[int]*core.QByteArray `property:"roles"`
|
|
|
|
// The data storage
|
|
//
|
|
// The slice with all entities. It is not accessed directly but using
|
|
// `data(index,role)`
|
|
entities []*FolderInfo
|
|
GlobalOptions FolderInfo
|
|
|
|
transfer *transfer.Transfer
|
|
|
|
// Global Folders/Labels selection flag, use setter from QML
|
|
_ bool `property:"selectedLabels"`
|
|
_ bool `property:"selectedFolders"`
|
|
_ bool `property:"atLeastOneSelected"`
|
|
|
|
// Getters (const)
|
|
_ func() int `slot:"getCount"`
|
|
_ func(index int) string `slot:"getID"`
|
|
_ func(id string) string `slot:"getName"`
|
|
_ func(id string) string `slot:"getType"`
|
|
_ func(id string) string `slot:"getColor"`
|
|
_ func(id string) int64 `slot:"getFrom"`
|
|
_ func(id string) int64 `slot:"getTo"`
|
|
_ func(id string) string `slot:"getTargetLabelIDs"`
|
|
_ func(name string) bool `slot:"hasFolderWithName"`
|
|
_ func() bool `slot:"hasTarget"`
|
|
|
|
// TODO get folders
|
|
// TODO get labels
|
|
// TODO get selected labels
|
|
// TODO get selected folder
|
|
|
|
// Setters (emits DataChanged)
|
|
_ func(fileType string, toSelect bool) `slot:"selectType"`
|
|
_ func(id string, toSelect bool) `slot:"setFolderSelection"`
|
|
_ func(id string, target string) `slot:"setTargetFolderID"`
|
|
_ func(id string, label string) `slot:"addTargetLabelID"`
|
|
_ func(id string, label string) `slot:"removeTargetLabelID"`
|
|
_ func(id string, from, to int64) `slot:"setFromToDate"`
|
|
}
|
|
|
|
// FolderInfo is the element of model
|
|
//
|
|
// It contains all data for one structure entry
|
|
type FolderInfo struct {
|
|
/*
|
|
FolderId string
|
|
FolderFullPath string
|
|
FolderColor string
|
|
FolderFullName string
|
|
*/
|
|
mailbox transfer.Mailbox // TODO how to reference from qml source mailbox to go target mailbox
|
|
FolderType string
|
|
FolderEntries int // todo remove
|
|
IsFolderSelected bool
|
|
FromDate int64 // Unix seconds
|
|
ToDate int64 // Unix seconds
|
|
TargetFolderID string // target ID TODO: this will be hash
|
|
TargetLabelIDs string // semicolon separated list of label ID same here
|
|
}
|
|
|
|
// Registration of new metatype before creating instance
|
|
//
|
|
// NOTE: check it is run once per program. write a log
|
|
func init() {
|
|
FolderStructure_QRegisterMetaType()
|
|
}
|
|
|
|
// Constructor
|
|
//
|
|
// Creates the map for item properties and connects the methods
|
|
func (s *FolderStructure) init() {
|
|
s.SetRoles(map[int]*core.QByteArray{
|
|
FolderId: qtcommon.NewQByteArrayFromString("folderId"),
|
|
FolderName: qtcommon.NewQByteArrayFromString("folderName"),
|
|
FolderColor: qtcommon.NewQByteArrayFromString("folderColor"),
|
|
FolderType: qtcommon.NewQByteArrayFromString("folderType"),
|
|
FolderEntries: qtcommon.NewQByteArrayFromString("folderEntries"),
|
|
IsFolderSelected: qtcommon.NewQByteArrayFromString("isFolderSelected"),
|
|
FolderFromDate: qtcommon.NewQByteArrayFromString("fromDate"),
|
|
FolderToDate: qtcommon.NewQByteArrayFromString("toDate"),
|
|
TargetFolderID: qtcommon.NewQByteArrayFromString("targetFolderID"),
|
|
TargetLabelIDs: qtcommon.NewQByteArrayFromString("targetLabelIDs"),
|
|
})
|
|
|
|
// basic QAbstractListModel mehods
|
|
s.ConnectGetCount(s.getCount)
|
|
s.ConnectRowCount(s.rowCount)
|
|
s.ConnectColumnCount(func(parent *core.QModelIndex) int { return 1 }) // for list it should be always 1
|
|
s.ConnectData(s.data)
|
|
s.ConnectHeaderData(s.headerData)
|
|
s.ConnectRoleNames(s.roleNames)
|
|
// Editable QAbstractListModel needs: https://doc.qt.io/qt-5/model-view-programming.html#an-editable-model
|
|
s.ConnectSetData(s.setData)
|
|
s.ConnectFlags(s.flags)
|
|
|
|
// Custom FolderStructure slots to export
|
|
|
|
// Getters (const)
|
|
s.ConnectGetID(func(row int) string { return s.get(row).mailbox.Hash() })
|
|
s.ConnectGetType(func(id string) string { row := s.getRowById(id); return s.get(row).FolderType })
|
|
s.ConnectGetName(func(id string) string { row := s.getRowById(id); return s.get(row).mailbox.Name })
|
|
s.ConnectGetColor(func(id string) string { row := s.getRowById(id); return s.get(row).mailbox.Color })
|
|
s.ConnectGetFrom(func(id string) int64 { row := s.getRowById(id); return s.get(row).FromDate })
|
|
s.ConnectGetTo(func(id string) int64 { row := s.getRowById(id); return s.get(row).ToDate })
|
|
s.ConnectGetTargetLabelIDs(func(id string) string { row := s.getRowById(id); return s.get(row).TargetLabelIDs })
|
|
s.ConnectHasFolderWithName(s.hasFolderWithName)
|
|
s.ConnectHasTarget(s.hasTarget)
|
|
|
|
// Setters (emits DataChanged)
|
|
s.ConnectSelectType(s.selectType)
|
|
s.ConnectSetFolderSelection(s.setFolderSelection)
|
|
s.ConnectSetTargetFolderID(s.setTargetFolderID)
|
|
s.ConnectAddTargetLabelID(s.addTargetLabelID)
|
|
s.ConnectRemoveTargetLabelID(s.removeTargetLabelID)
|
|
s.ConnectSetFromToDate(s.setFromToDate)
|
|
|
|
s.GlobalOptions = FolderInfo{
|
|
mailbox: transfer.Mailbox{Name: "="},
|
|
FromDate: 0,
|
|
ToDate: 0,
|
|
TargetFolderID: "",
|
|
TargetLabelIDs: "",
|
|
}
|
|
}
|