From 821da47f981dc5d7b476ea5a8d71bd6f4eb480aac21ae8630d0591fa6446dcbd Mon Sep 17 00:00:00 2001 From: linuxero Date: Fri, 7 Mar 2025 11:58:19 +0100 Subject: [PATCH] COnfiguration and systray --- Gui/CompanyConf.qml | 111 +++++++++++++++++++++++++++++-- Gui/MiscConf.qml | 22 ++++++ Gui/ObjectAddOnContactPerson.qml | 15 +++-- Gui/PyqcrmConf.qml | 44 +++++++++++- Gui/main.qml | 52 +++++++++++---- images/tero.jpg | Bin 0 -> 7329 bytes lib/ConfigLoader.py | 18 +++++ lib/DB/ObjectModel.py | 2 +- main.py | 11 ++- pyqcrm.qrc | 2 + qml.qrc | 1 + 11 files changed, 248 insertions(+), 30 deletions(-) create mode 100755 Gui/MiscConf.qml create mode 100644 images/tero.jpg diff --git a/Gui/CompanyConf.qml b/Gui/CompanyConf.qml index 52aa97e..73c6de1 100644 --- a/Gui/CompanyConf.qml +++ b/Gui/CompanyConf.qml @@ -2,16 +2,113 @@ import QtQuick import QtQuick.Layouts import QtQuick.Controls -Item +ColumnLayout { - property string name: "company" + property alias name: companyName + property alias street: street + property alias house: houseno + property alias zipcode: zipcode + property alias city: city anchors.fill: parent + anchors.topMargin: 50 - Label + RowLayout { - text: qsTr("Das Unternehmen") - anchors.centerIn: parent - font.pixelSize: 57 - font.bold: true + Layout.fillWidth: true + Label + { + text: qsTr("Namen") + // font.pixelSize: 57 + // font.bold: true + } + + TextField + { + id: companyName + Layout.fillWidth: true + } + } + + RowLayout + { + Layout.fillWidth: true + Label + { + text: qsTr("Straße") + // font.pixelSize: 57 + // font.bold: true + } + + TextField + { + id: street + Layout.fillWidth: true + } + + Label + { + text: qsTr("Haus-Nr.") + // font.pixelSize: 57 + // font.bold: true + } + + TextField + { + id: houseno + Layout.fillWidth: true + } + } + + + RowLayout + { + Layout.fillWidth: true + Label + { + text: qsTr("PLZ") + // font.pixelSize: 57 + // font.bold: true + } + + ComboBox + { + id: zipcode + Layout.fillWidth: true + editable: true + model: address_model + textRole: "display" + popup.height: 300 + popup.y: zipcode.y + 5 - (zipcode.height * 2) + //currentIndex: -1 + onCurrentIndexChanged: city.currentIndex = zipcode.currentIndex + validator: RegularExpressionValidator + { + regularExpression: /([0-9]{1,5})/ + } + } + + Label + { + text: qsTr("Stadt") + // font.pixelSize: 57 + // font.bold: true + } + + ComboBox + { + id: city + Layout.fillWidth: true + editable: true + model: address_model + textRole: "city" + popup.height: 300 + popup.y: zipcode.y + 5 - (zipcode.height * 2) + currentIndex: -1 + } + } + + Item + { + Layout.fillHeight: true } } diff --git a/Gui/MiscConf.qml b/Gui/MiscConf.qml new file mode 100755 index 0000000..b7cbd29 --- /dev/null +++ b/Gui/MiscConf.qml @@ -0,0 +1,22 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts + +ColumnLayout +{ + property alias sysTray: sysTray + anchors.fill: parent + anchors.topMargin: 35 + + Switch + { + id: sysTray + text: qsTr("Beim minimieren, in der Taskleiste anzeigen") + checked: config.systray() + } + + Item + { + Layout.fillHeight: true + } +} diff --git a/Gui/ObjectAddOnContactPerson.qml b/Gui/ObjectAddOnContactPerson.qml index 1d7eee3..1ffdb82 100644 --- a/Gui/ObjectAddOnContactPerson.qml +++ b/Gui/ObjectAddOnContactPerson.qml @@ -15,7 +15,7 @@ GridLayout ComboBox { - property string name: "contacttype" + //property string name: "contacttype" id: contacttype Layout.fillWidth: true editable: false @@ -150,6 +150,7 @@ GridLayout { contacts[num_contacts] = {} contacts[num_contacts]["title"] = title.currentText + contacts[num_contacts]["ctype"] = contacttype.currentText contacts[num_contacts]["fname"] = firstname.text.trim() contacts[num_contacts]["lname"] = lastname.text.trim() contacts[num_contacts]["phone"] = phonenumber.text.trim() @@ -261,7 +262,7 @@ GridLayout id: mainRect Layout.fillWidth: true implicitHeight: 100 - color: "salmon" // firstname.palette.base + color: firstname.palette.base border.color: firstname.activeFocus? firstname.palette.highlight: firstname.palette.base clip: true @@ -310,32 +311,32 @@ GridLayout //spacing: 3 Text { - text: qsTr('Name: ') + model.name + text: '' + qsTr('Name: ') + '' + model.name horizontalAlignment: Text.AlignLeft color: "white" } Text { - text: qsTr('Telefon: ') + model.phone + text: '' + qsTr('Telefon: ') + '' + model.phone horizontalAlignment: Text.AlignLeft color: "white" } Text { - text: qsTr('Handy: ') + model.mobile + text: '' + qsTr('Handy: ') + '' + model.mobile horizontalAlignment: Text.AlignLeft color: "white" } Text { - text: qsTr('Position: ') + model.posizion + text: '' + qsTr('Position: ') + '' + model.posizion horizontalAlignment: Text.AlignLeft color: "white" } Text { - text: qsTr('Typ: ') + model.cdata + text: '' + qsTr('Typ: ') + '' + model.cdata horizontalAlignment: Text.AlignLeft color: "white" } diff --git a/Gui/PyqcrmConf.qml b/Gui/PyqcrmConf.qml index b37913c..d112b85 100644 --- a/Gui/PyqcrmConf.qml +++ b/Gui/PyqcrmConf.qml @@ -4,6 +4,8 @@ import QtQuick.Layouts Item { + property alias companyConf: companyConf + property alias miscConf: miscConf anchors.fill: parent TabBar { @@ -27,6 +29,10 @@ Item text: qsTr("Sicherung") } + TabButton + { + text: qsTr("Sonstiges") + } } StackLayout @@ -72,6 +78,15 @@ Item } } + Item + { + id: miscelanea + MiscConf + { + id: miscConf + anchors.fill: parent + } + } } RowLayout @@ -101,7 +116,10 @@ Item break case 2: - console.log("Need to update company's info.") + updateCompanyInfo() + break + case 4: + updateMiscConf() break default: console.log("Need to handle users") @@ -109,4 +127,28 @@ Item } } } + + function updateCompanyInfo() + { + var company = {} + company['company'] = {} + company['company']['NAME'] = companyConf.name.text.trim() + company['company']['STREET'] = companyConf.street.text.trim() + company['company']['HOUSE'] = companyConf.house.text.trim() + company['company']['ZIPCODE'] = companyConf.zipcode.editText? companyConf.zipcode.editText.trim(): companyConf.zipcode.currentText + company['company']['CITY'] = companyConf.city.editText? companyConf.city.editText.trim(): companyConf.city.currentText + + if (company['company']['NAME'] === '' || company['company']['STREET'] === '' || + company['company']['HOUSE'] === '' || company['company']['ZIPCODE'] === '' || + company['company']['CITY'] === ''); + else config.saveCompanyInfo(company) + } + + function updateMiscConf() + { + var misc = {} + misc['misc'] = {} + misc['misc']['SYSTRAY'] = miscConf.sysTray.checked + config.saveMiscConf(misc) + } } diff --git a/Gui/main.qml b/Gui/main.qml index 3d43405..f3c1c06 100644 --- a/Gui/main.qml +++ b/Gui/main.qml @@ -62,19 +62,6 @@ ApplicationWindow property alias window: appWindow } - Component.onCompleted: - { - if(bad_config) - { - importDialog.open() - } - else - { - if (db_con) appLoader.source= "LoginScreen.qml" - else appLoader.source= "NoDbConnection.qml" - } - } - Dialog { id: importDialog @@ -127,4 +114,43 @@ ApplicationWindow } } } + + Component.onCompleted: + { + systray.activated.connect(showWindow) + if(bad_config) + { + importDialog.open() + } + else + { + if (db_con) appLoader.source= "LoginScreen.qml" + else appLoader.source= "NoDbConnection.qml" + } + } + + function showWindow(why) + { + if (why === 3) + { + systray.setVisible(false) + appWindow.show() + } + } + onVisibilityChanged: + { + if (appWindow.visibility === Window.Minimized && config.systray()) + { + systray.setVisible(true) + appWindow.hide() + } + } + + onClosing: (close) => + { + if (false) + { + console.log("Main window closed!! Was soll ich tun? kann ich mich beenden?!") + } + } } diff --git a/images/tero.jpg b/images/tero.jpg new file mode 100644 index 0000000000000000000000000000000000000000000000000000000000000000..a7c43e39748695405a6e01e3a9b04f6f9631dba0a989a7422b2e92200b42b5c9 GIT binary patch literal 7329 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/account.svg README LICENSE + ../tero.jpg + images/tero.jpg diff --git a/qml.qrc b/qml.qrc index a524421..d1ad983 100644 --- a/qml.qrc +++ b/qml.qrc @@ -45,5 +45,6 @@ Gui/CompanyConf.qml Gui/Firststart.qml Gui/BackupSettings.qml + Gui/MiscConf.qml