COnfiguration and systray

This commit is contained in:
2025-03-07 11:58:19 +01:00
parent fb81b764f1
commit 821da47f98
11 changed files with 248 additions and 30 deletions

View File

@@ -2,16 +2,113 @@ import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Controls 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.fill: parent
anchors.topMargin: 50
Label RowLayout
{ {
text: qsTr("Das Unternehmen") Layout.fillWidth: true
anchors.centerIn: parent Label
font.pixelSize: 57 {
font.bold: true 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
} }
} }

22
Gui/MiscConf.qml Executable file
View File

@@ -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
}
}

View File

@@ -15,7 +15,7 @@ GridLayout
ComboBox ComboBox
{ {
property string name: "contacttype" //property string name: "contacttype"
id: contacttype id: contacttype
Layout.fillWidth: true Layout.fillWidth: true
editable: false editable: false
@@ -150,6 +150,7 @@ GridLayout
{ {
contacts[num_contacts] = {} contacts[num_contacts] = {}
contacts[num_contacts]["title"] = title.currentText contacts[num_contacts]["title"] = title.currentText
contacts[num_contacts]["ctype"] = contacttype.currentText
contacts[num_contacts]["fname"] = firstname.text.trim() contacts[num_contacts]["fname"] = firstname.text.trim()
contacts[num_contacts]["lname"] = lastname.text.trim() contacts[num_contacts]["lname"] = lastname.text.trim()
contacts[num_contacts]["phone"] = phonenumber.text.trim() contacts[num_contacts]["phone"] = phonenumber.text.trim()
@@ -261,7 +262,7 @@ GridLayout
id: mainRect id: mainRect
Layout.fillWidth: true Layout.fillWidth: true
implicitHeight: 100 implicitHeight: 100
color: "salmon" // firstname.palette.base color: firstname.palette.base
border.color: firstname.activeFocus? firstname.palette.highlight: firstname.palette.base border.color: firstname.activeFocus? firstname.palette.highlight: firstname.palette.base
clip: true clip: true
@@ -310,32 +311,32 @@ GridLayout
//spacing: 3 //spacing: 3
Text Text
{ {
text: qsTr('Name: ') + model.name text: '<b>' + qsTr('Name: ') + '</b>' + model.name
horizontalAlignment: Text.AlignLeft horizontalAlignment: Text.AlignLeft
color: "white" color: "white"
} }
Text Text
{ {
text: qsTr('Telefon: ') + model.phone text: '<b>' + qsTr('Telefon: ') + '</b>' + model.phone
horizontalAlignment: Text.AlignLeft horizontalAlignment: Text.AlignLeft
color: "white" color: "white"
} }
Text Text
{ {
text: qsTr('Handy: ') + model.mobile text: '<b>' + qsTr('Handy: ') + '</b>' + model.mobile
horizontalAlignment: Text.AlignLeft horizontalAlignment: Text.AlignLeft
color: "white" color: "white"
} }
Text Text
{ {
text: qsTr('Position: ') + model.posizion text: '<b>' + qsTr('Position: ') + '</b>' + model.posizion
horizontalAlignment: Text.AlignLeft horizontalAlignment: Text.AlignLeft
color: "white" color: "white"
} }
Text Text
{ {
text: qsTr('Typ: ') + model.cdata text: '<b>' + qsTr('Typ: ') + '</b>' + model.cdata
horizontalAlignment: Text.AlignLeft horizontalAlignment: Text.AlignLeft
color: "white" color: "white"
} }

View File

@@ -4,6 +4,8 @@ import QtQuick.Layouts
Item Item
{ {
property alias companyConf: companyConf
property alias miscConf: miscConf
anchors.fill: parent anchors.fill: parent
TabBar TabBar
{ {
@@ -27,6 +29,10 @@ Item
text: qsTr("Sicherung") text: qsTr("Sicherung")
} }
TabButton
{
text: qsTr("Sonstiges")
}
} }
StackLayout StackLayout
@@ -72,6 +78,15 @@ Item
} }
} }
Item
{
id: miscelanea
MiscConf
{
id: miscConf
anchors.fill: parent
}
}
} }
RowLayout RowLayout
@@ -101,7 +116,10 @@ Item
break break
case 2: case 2:
console.log("Need to update company's info.") updateCompanyInfo()
break
case 4:
updateMiscConf()
break break
default: default:
console.log("Need to handle users") 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)
}
} }

View File

@@ -62,19 +62,6 @@ ApplicationWindow
property alias window: appWindow 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 Dialog
{ {
id: importDialog 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?!")
}
}
} }

BIN
images/tero.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

View File

@@ -245,3 +245,21 @@ class ConfigLoader(QObject):
self.__encrypt_key = toml.dumps(self.getConfig()) self.__encrypt_key = toml.dumps(self.getConfig())
self.saveRecoveryKey(filename, password) self.saveRecoveryKey(filename, password)
@Slot(dict)
def saveCompanyInfo(self, company = None):
self.__config.update(company)
self.__saveConfig()
@Slot(result = dict)
def getCompanyInfo():
return self.__config['company']
@Slot(dict)
def saveMiscConf(self, misc_conf = None):
self.__config.update(misc_conf)
self.__saveConfig()
@Slot(result = bool)
def systray(self):
return self.__config['misc']['SYSTRAY']

View File

@@ -33,7 +33,7 @@ class ObjectModel(QAbstractTableModel):
print(new_objcontact) print(new_objcontact)
self.__object_dao.addObject(new_object, new_objcontact, self.__key) #self.__object_dao.addObject(new_object, new_objcontact, self.__key)
# @Slot(str) # @Slot(str)
# def viewCriterion(self, criterion, processed = False, fired = False): # def viewCriterion(self, criterion, processed = False, fired = False):

11
main.py
View File

@@ -2,7 +2,8 @@
import os import os
import sys import sys
import logging import logging
from PySide6.QtGui import QGuiApplication from PySide6.QtWidgets import QSystemTrayIcon
from PySide6.QtGui import QGuiApplication, QIcon
from PySide6.QtQml import QQmlApplicationEngine from PySide6.QtQml import QQmlApplicationEngine
#from PySide6.QtCore import QResource #from PySide6.QtCore import QResource
from lib.ConfigLoader import ConfigLoader from lib.ConfigLoader import ConfigLoader
@@ -86,6 +87,13 @@ if __name__ == "__main__":
qml_file = "qrc:/Gui/main.qml" qml_file = "qrc:/Gui/main.qml"
icon = QIcon(":/images/tero.jpg")
app.setWindowIcon(QIcon(icon))
tray = QSystemTrayIcon()
tray.setIcon(icon)
tray.setToolTip("PYQCRM")
config = ConfigLoader() config = ConfigLoader()
if not config.getConfig(): if not config.getConfig():
@@ -98,6 +106,7 @@ if __name__ == "__main__":
engine.rootContext().setContextProperty("bad_config", bad_config) # print(f"Fehler: {i}") engine.rootContext().setContextProperty("bad_config", bad_config) # print(f"Fehler: {i}")
engine.rootContext().setContextProperty("db_con", db_con) engine.rootContext().setContextProperty("db_con", db_con)
engine.rootContext().setContextProperty("config", config) engine.rootContext().setContextProperty("config", config)
engine.rootContext().setContextProperty("systray", tray)
engine.load(qml_file) engine.load(qml_file)

View File

@@ -20,5 +20,7 @@
<file>images/account.svg</file> <file>images/account.svg</file>
<file>README</file> <file>README</file>
<file>LICENSE</file> <file>LICENSE</file>
<file>../tero.jpg</file>
<file>images/tero.jpg</file>
</qresource> </qresource>
</RCC> </RCC>

View File

@@ -45,5 +45,6 @@
<file>Gui/CompanyConf.qml</file> <file>Gui/CompanyConf.qml</file>
<file>Gui/Firststart.qml</file> <file>Gui/Firststart.qml</file>
<file>Gui/BackupSettings.qml</file> <file>Gui/BackupSettings.qml</file>
<file>Gui/MiscConf.qml</file>
</qresource> </qresource>
</RCC> </RCC>