Compare commits

...

5 Commits

Author SHA256 Message Date
6df02d9ff2 Merge main 2025-03-21 13:45:53 +01:00
9499eace9b combobox 2025-03-21 13:27:54 +01:00
Yuri Becker
721232a975 Implement Quick Filters 2025-03-21 13:25:03 +01:00
Yuri Becker
83f64f9af8 Use dark/light specification from system 2025-03-20 14:03:40 +01:00
Yuri Becker
dc1ea604f7 Add Icons to Buttons 2025-03-20 13:04:28 +01:00
38 changed files with 536 additions and 352 deletions

View File

@@ -16,7 +16,7 @@ GridLayout
Label Label
{ {
text: qsTr("Straße") text: qsTr("Straße*")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
} }
@@ -27,13 +27,11 @@ GridLayout
Layout.fillWidth: true Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
onTextChanged: checkFields() onTextChanged: checkFields()
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
} }
Label Label
{ {
text: qsTr("Nr.") text: qsTr("Nr.*")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
} }
@@ -44,8 +42,6 @@ GridLayout
Layout.fillWidth: true Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
onTextChanged: checkFields() onTextChanged: checkFields()
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
} }
// New grid row // New grid row
@@ -197,7 +193,7 @@ GridLayout
Label Label
{ {
text: qsTr("Reinigungsmittel wo?") text: qsTr("Reinigungsmittel wo?*")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
} }
@@ -206,8 +202,6 @@ GridLayout
property string name: "cleaningproducts" property string name: "cleaningproducts"
id: cleaningproducts id: cleaningproducts
Layout.fillWidth: true Layout.fillWidth: true
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
onTextChanged: checkFields() onTextChanged: checkFields()
} }
Item Item

View File

@@ -37,7 +37,7 @@ GridLayout
} }
Label Label
{ {
text: qsTr("Vorname") text: qsTr("Vorname*")
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
} }
TextField TextField
@@ -45,14 +45,12 @@ GridLayout
property string name: "firstname" property string name: "firstname"
id: firstname id: firstname
Layout.fillWidth: true Layout.fillWidth: true
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
onTextChanged: checkFields() onTextChanged: checkFields()
Layout.columnSpan: 3 Layout.columnSpan: 3
} }
Label Label
{ {
text: qsTr("Nachname") text: qsTr("Nachname*")
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
} }
TextField TextField
@@ -60,8 +58,6 @@ GridLayout
property string name: "lastname" property string name: "lastname"
id: lastname id: lastname
Layout.fillWidth: true Layout.fillWidth: true
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
onTextChanged: checkFields() onTextChanged: checkFields()
Layout.columnSpan: 3 Layout.columnSpan: 3
} }
@@ -164,7 +160,7 @@ GridLayout
} }
Label Label
{ {
text: qsTr("Geburtsdatum") text: qsTr("Geburtsdatum*")
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
visible: radio.children[1].checked visible: radio.children[1].checked
} }
@@ -173,8 +169,6 @@ GridLayout
property string name: "birthday" property string name: "birthday"
id: birthday id: birthday
Layout.fillWidth: true Layout.fillWidth: true
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
onTextChanged: checkFields() onTextChanged: checkFields()
Layout.columnSpan: 3 Layout.columnSpan: 3
visible: radio.children[1].checked visible: radio.children[1].checked
@@ -195,7 +189,7 @@ GridLayout
Label Label
{ {
text: qsTr("Geburtsort") text: qsTr("Geburtsort*")
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
visible: radio.children[1].checked visible: radio.children[1].checked
} }
@@ -204,8 +198,6 @@ GridLayout
property string name: "placeofbirth" property string name: "placeofbirth"
id: placeofbirth id: placeofbirth
Layout.fillWidth: true Layout.fillWidth: true
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
onTextChanged: checkFields() onTextChanged: checkFields()
Layout.columnSpan: 3 Layout.columnSpan: 3
visible: radio.children[1].checked visible: radio.children[1].checked

View File

@@ -16,11 +16,10 @@ GridLayout
Label Label
{ {
id: lblFirmenName id: lblFirmenName
text: qsTr("Firmenname") text: qsTr("Firmenname*")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
} }
TextField TextField
{ {
property string name: "business" property string name: "business"
@@ -29,34 +28,26 @@ GridLayout
Layout.fillWidth: true Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
onTextChanged: checkFields() onTextChanged: checkFields()
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
Layout.columnSpan: 3 Layout.columnSpan: 3
} }
Label Label
{ {
text: qsTr("Straße") text: qsTr("Straße*")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
} }
TextField TextField
{ {
property string name: "street" property string name: "street"
id: streetid id: streetid
Layout.fillWidth: true Layout.fillWidth: true
onTextChanged: checkFields() onTextChanged: checkFields()
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
} }
Label Label
{ {
text: qsTr("Nr.") text: qsTr("Nr.*")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
} }
@@ -66,8 +57,6 @@ GridLayout
id: housenoid id: housenoid
Layout.fillWidth: true Layout.fillWidth: true
onTextChanged: checkFields() onTextChanged: checkFields()
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
validator: RegularExpressionValidator validator: RegularExpressionValidator
{ {
regularExpression: /([0-9a-zA-Z\-]{1,6})/ regularExpression: /([0-9a-zA-Z\-]{1,6})/

View File

@@ -3,175 +3,159 @@ import QtQuick.Layouts
import QtQuick.Controls import QtQuick.Controls
import Qt.labs.qmlmodels import Qt.labs.qmlmodels
ColumnLayout {
Item function viewCriterion(criterion) {
{ business_model.viewCriterion(criterion.text);
SearchBar
{
id:searchBar
anchors.margins: 9
} }
Button anchors.fill: parent
{
id: addBusinessBtn Component.onCompleted: customersStack.pop()
icon.source: "qrc:/images/addbusiness.svg"
icon.color: "olive" RowLayout {
anchors.right: parent.right Layout.fillWidth: true
flat: true Layout.horizontalStretchFactor: 1
spacing: Dimensions.l
SearchBar {
}
QuickFilter {
onSelectedChanged: (name) => {
business_model.viewCriterion(name)
}
model: ListModel {
ListElement {
name: "Alle"
text: qsTr("Alle")
selected: true
}
ListElement {
name: "showProvider"
text: qsTr("Interessent")
selected: false
}
ListElement {
name: "showClientele"
text: qsTr("Kunde")
selected: false
}
ListElement {
name: "showProvider"
text: qsTr("Lieferant")
selected: false
}
ListElement {
name: "showFinished"
text: qsTr("Erledigt")
selected: false
}
}
}
Button {
id: addCustomer
Layout.alignment: Qt.AlignRight
icon.source: "qrc:/images/PlusCircle.svg"
text: qsTr("Kunde Hinzufügen")
onClicked: appLoader.source = "AddCustomer.qml" onClicked: appLoader.source = "AddCustomer.qml"
} }
}
ColumnLayout ColumnLayout {
{
id: tableColumn
clip: true clip: true
anchors
{
top: searchBar.bottom
bottom: parent.bottom
left: parent.left
right: parent.right
}
RowLayout HorizontalHeaderView {
{
id: sortView
RadioButton
{
id: showAll
checked: true
text: qsTr("Alle")
onClicked: viewCriterion(showAll)
}
RadioButton
{
id: showInterested
text: qsTr("Interessent")
onClicked: viewCriterion(showInterested)
}
RadioButton
{
id: showClientele
text: qsTr("Kunden")
onClicked: viewCriterion(showClientele)
}
RadioButton
{
id: showProvider
text: qsTr("Lieferant")
onClicked: viewCriterion(showProvider)
}
RadioButton
{
id: showFinished
text: qsTr("Erledigt")
onClicked: viewCriterion(showFinished)
}
}
HorizontalHeaderView
{
id: horizontalHeader id: horizontalHeader
Layout.fillWidth: true Layout.fillWidth: true
implicitHeight: 40 implicitHeight: 40
movableColumns: true //@disable-check M16 movableColumns: true //@disable-check M16
syncView: customerTable syncView: customerTable
delegate: Rectangle
{ delegate: Rectangle {
color: addBusinessBtn.palette.alternateBase
border.color: addBusinessBtn.palette.base
implicitHeight: 40
Layout.fillWidth: true Layout.fillWidth: true
border.color: addCustomer.palette.base
color: addCustomer.palette.alternateBase
implicitHeight: 40
implicitWidth: 1 implicitWidth: 1
Text
{ Text {
text: model.display color: addCustomer.palette.text
elide: Text.ElideRight elide: Text.ElideRight
width: parent.width
height: parent.height height: parent.height
horizontalAlignment: Text.AlignHCenter horizontalAlignment: Text.AlignHCenter
text: model.display
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
color: addBusinessBtn.palette.text width: parent.width
} }
} }
} }
TableView {
TableView
{
property real newWidth: 0
id: customerTable id: customerTable
z: 1
property real newWidth: 0
Layout.fillHeight: true Layout.fillHeight: true
//height: tableColumn.height - (sortView.height + horizontalHeader.height)
Layout.fillWidth: true Layout.fillWidth: true
columnSpacing: 1
rowSpacing: 2
model: business_model
alternatingRows: true alternatingRows: true
columnSpacing: 1
model: business_model
resizableColumns: true resizableColumns: true
rowSpacing: 2
selectionBehavior: TableView.SelectRows selectionBehavior: TableView.SelectRows
ScrollBar.vertical: ScrollBar z: 1
{
ScrollBar.vertical: ScrollBar {
policy: customerTable.contentHeight > customerTable.height ? ScrollBar.AlwaysOn : ScrollBar.AlwaysOff policy: customerTable.contentHeight > customerTable.height ? ScrollBar.AlwaysOn : ScrollBar.AlwaysOff
} }
delegate: Rectangle {
selectionModel: ItemSelectionModel
{
id: selModel
model: customerTable.model
}
delegate:Rectangle
{
required property bool selected
required property bool current required property bool current
implicitWidth: customerTable.width / customerTable.columns required property bool selected
color: selected ? addCustomer.palette.highlight //palette.highlight
: (customerTable.alternatingRows && row % 2 !== 0 ? addCustomer.palette.base // palette.base
: addCustomer.palette.alternateBase) //palette.alternateBase)
implicitHeight: 25 implicitHeight: 25
color: selected implicitWidth: customerTable.width / customerTable.columns
? addBusinessBtn.palette.highlight //palette.highlight
: (customerTable.alternatingRows && row % 2 !== 0 Text {
? addBusinessBtn.palette.base // palette.base color: addCustomer.palette.text
: addBusinessBtn.palette.alternateBase) //palette.alternateBase)
Text
{
text: model.display == null? "": model.display // @disable-check M126
elide: Text.ElideRight elide: Text.ElideRight
width: parent.width
height: parent.height height: parent.height
verticalAlignment: Text.AlignVCenter
leftPadding: 9 leftPadding: 9
color: addBusinessBtn.palette.text text: model.display == null ? "" : model.display // @disable-check M126
verticalAlignment: Text.AlignVCenter
width: parent.width
} }
MouseArea MouseArea {
{
property bool hovered: false
id: mouseArea id: mouseArea
property bool hovered: false
anchors.fill: parent anchors.fill: parent
hoverEnabled: true hoverEnabled: true
onDoubleClicked:
{
business_model.onRowClicked(row)
customersStack.push("CustomerDetails.qml", {selectedClient: row});
}
onEntered: onDoubleClicked: {
{ business_model.onRowClicked(row);
customerTable.selectionModel.select(customerTable.model.index(row, 0), ItemSelectionModel.SelectCurrent | ItemSelectionModel.Rows) customersStack.push("CustomerDetails.qml", {
} selectedClient: row
});
}
onEntered: {
customerTable.selectionModel.select(customerTable.model.index(row, 0), ItemSelectionModel.SelectCurrent | ItemSelectionModel.Rows);
} }
} }
} }
selectionModel: ItemSelectionModel {
id: selModel
Item model: customerTable.model
{ }
}
Item {
Layout.fillWidth: true Layout.fillWidth: true
} }
} }
function viewCriterion(criterion)
{
business_model.viewCriterion(criterion.text)
}
Component.onCompleted: customersStack.pop()
} }

View File

@@ -16,8 +16,8 @@ Item
Button Button
{ {
id: addEmployeeBtn id: addEmployeeBtn
icon.source: "qrc:/images/addbusiness.svg" text: qsTr("Mitarbeiter Hinzufügen")
icon.color: "olive" icon.source: "qrc:/images/PlusCircle.svg"
anchors.right: parent.right anchors.right: parent.right
flat: true flat: true
onClicked: appLoader.source = "AddApplicant.qml" onClicked: appLoader.source = "AddApplicant.qml"

View File

@@ -32,16 +32,15 @@ Item {
} }
ColumnLayout { ColumnLayout {
spacing: Dimensions.m
anchors.centerIn: parent anchors.centerIn: parent
spacing: Dimensions.m
Label { Label {
font: Typography.h1
text: qsTr("Login")
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
Layout.bottomMargin: Dimensions.l Layout.bottomMargin: Dimensions.l
font: Typography.h1
text: qsTr("Login")
} }
Field { Field {
label: qsTr("Benutzername") label: qsTr("Benutzername")
@@ -78,11 +77,11 @@ Item {
} }
} }
} }
Button { Button {
Layout.topMargin: Dimensions.m Layout.topMargin: Dimensions.m
implicitWidth: parent.width
icon.source: "qrc:/images/ArrowRightEndOnRectangle.svg"
text: qsTr("Login") text: qsTr("Login")
width: parent.width
onClicked: { onClicked: {
if (benutzerName.text.trim() && passwort.text.trim()) if (benutzerName.text.trim() && passwort.text.trim())

View File

@@ -35,71 +35,45 @@ GridLayout
} }
Label Label
{ {
text: qsTr("Vorname") text: qsTr("Vorname*")
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
} }
TextField TextField
{ {
id: firstname id: firstname
Layout.fillWidth: true Layout.fillWidth: true
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
// onTextChanged: checkContactFields() // onTextChanged: checkContactFields()
} }
Label Label
{ {
text: qsTr("Nachname") text: qsTr("Nachname*")
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
} }
TextField TextField
{ {
id: lastname id: lastname
Layout.fillWidth: true Layout.fillWidth: true
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
} }
Label Label
{ {
text: qsTr("Telefonnummer") text: mobile.text ? qsTr("Telefonnummer") : qsTr("Telefonnummer*")
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
} }
TextField TextField
{ {
id: phonenumber id: phonenumber
Layout.fillWidth: true Layout.fillWidth: true
placeholderText: mobile.text ? "" : "Pflichtfeld"
placeholderTextColor: "red"
} }
Label Label
{ {
text: qsTr("Mobil") text: phonenumber.text ? qsTr("Mobil") : qsTr("Mobil*")
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
} }
TextField TextField
{ {
id: mobile id: mobile
Layout.fillWidth: true Layout.fillWidth: true
placeholderText: phonenumber.text ? "" : "Pflichtfeld"
placeholderTextColor: "red"
} }
// Label
// {
// text: qsTr("Position")
// Layout.alignment: Qt.AlignRight
// }
// TextField
// {
// id: posizion
// Layout.fillWidth: true
// placeholderText: "Pflichtfeld"
// placeholderTextColor: "red"
// }
RowLayout RowLayout
{ {

View File

@@ -27,7 +27,7 @@ GridLayout
Label Label
{ {
text: qsTr("Straße") text: qsTr("Straße*")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
} }
@@ -38,12 +38,10 @@ GridLayout
Layout.fillWidth: true Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
onTextChanged: checkFields() onTextChanged: checkFields()
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
} }
Label Label
{ {
text: qsTr("Nr.") text: qsTr("Nr.*")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
} }
@@ -54,13 +52,11 @@ GridLayout
Layout.fillWidth: true Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
onTextChanged: checkFields() onTextChanged: checkFields()
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
} }
Label Label
{ {
text: qsTr("PLZ") text: qsTr("PLZ*")
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
} }
@@ -70,8 +66,6 @@ GridLayout
id: postcode id: postcode
Layout.fillWidth: true Layout.fillWidth: true
onTextChanged: checkFields() onTextChanged: checkFields()
placeholderText: "Pflichtfeld"
placeholderTextColor: "red"
} }
Label Label
{ {

View File

@@ -2,6 +2,7 @@ import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Controls import QtQuick.Controls
import Qt.labs.qmlmodels import Qt.labs.qmlmodels
Item Item
{ {
@@ -13,10 +14,9 @@ Item
Button Button
{ {
id: addObjectBtn id: addObjectBtn
icon.source: "qrc:/images/addbusiness.svg" icon.source: "qrc:/images/PlusCircle.svg"
icon.color: "olive" text: qsTr("Objekt Hinzufügen")
anchors.right: parent.right anchors.right: parent.right
flat: true
onClicked: appLoader.source = "AddObject.qml" onClicked: appLoader.source = "AddObject.qml"
} }

View File

@@ -76,6 +76,5 @@ RowLayout
{ {
console.log(filter) console.log(filter)
console.log(activated) console.log(activated)
} }
} }

View File

@@ -225,12 +225,10 @@ ColumnLayout
BarButton BarButton
{ {
id: atajos id: atajos
icon.source: "qrc:/images/menu.svg"
implicitWidth: 90
implicitHeight: 90
checkable: false checkable: false
icon.source: "qrc:/images/Bars3.svg"
flat: true flat: true
Layout.bottomMargin: Dimensions.s Layout.bottomMargin: Dimensions.s
onClicked: mainMenu.open() onClicked: mainMenu.open()

View File

@@ -16,6 +16,8 @@ ApplicationWindow
property string confile: "" property string confile: ""
property alias settingsFileDialog: settingsFiledialog property alias settingsFileDialog: settingsFiledialog
palette.text: Colors.foreground
TopBar TopBar
{ {
@@ -45,11 +47,13 @@ ApplicationWindow
anchors anchors
{ {
left: topBar.right
right: parent.right fill: parent
top: parent.top topMargin: Dimensions.l
bottom: parent.bottom bottomMargin: Dimensions.l
margins: Dimensions.s rightMargin: Dimensions.l
leftMargin: Dimensions.l
} }
property alias window: appWindow property alias window: appWindow

View File

@@ -1,30 +1,68 @@
import QtQuick import QtQuick
import QtQuick.Layouts
import QtQuick.Controls.impl as I
import QtQuick.Templates as T import QtQuick.Templates as T
T.Button { T.Button {
id: control id: control
implicitHeight: implicitContentHeight /**
implicitWidth: contentItem.width * Set true when the button is supposed to be displayed in e.g. a TextField.
* You want to do this when this button is directly related to the TextField
* and the primary and only action for the TextField.
* Usually, you'd only want to display an icon in this button.
* If true, automatically sets height, width and position.
*
* ```qml
* TextField {
* placeholderText: "Search..."
* Button {
* icon.source: "qrc:/images/MagnifyingGlass.svg"
* isFieldButton: true
* }
* }
* ```
*/
property bool isFieldButton: false
height: isFieldButton ? parent.height : null
icon.color: Colors.primaryContrast
icon.height: 21
icon.width: 21
implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset, implicitContentHeight + topPadding + bottomPadding)
implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset, implicitContentWidth + leftPadding + rightPadding)
/**
* Icon is slightly larger than Text, so we need to reduce the padding a
* tiny bit to make sure all Buttons are still the same height.
*/
padding: Dimensions.m - (icon.source.toString() === "" ? 0 : 1)
x: isFieldButton ? parent.x + parent.width - width : null
background: Rectangle { background: Rectangle {
anchors.fill: parent
border.color: Colors.interactive
border.width: isFieldButton ? 1 : 0
bottomLeftRadius: topLeftRadius
color: Colors.primary color: Colors.primary
radius: Dimensions.radius radius: Dimensions.radius
topLeftRadius: isFieldButton ? 0 : radius
} }
contentItem: Text { contentItem: I.IconLabel {
color: Colors.foreground color: Colors.primaryContrast
display: control.display
font: control.font font: control.font
padding: Dimensions.s + 2 icon: control.icon
mirrored: control.mirrored
spacing: Dimensions.s
text: control.text text: control.text
// Make sure the button is at least wide enough to be comfortably clickable
width: Math.max(implicitWidth, 120)
horizontalAlignment: Text.AlignHCenter
} }
MouseArea { MouseArea {
id: mouseArea id: mouseArea
anchors.fill: parent anchors.fill: parent
cursorShape: Qt.PointingHandCursor cursorShape: Qt.PointingHandCursor
onPressed: (mouse) => mouse.accepted = false
onPressed: mouse => mouse.accepted = false
} }
} }

View File

@@ -6,14 +6,16 @@ QtObject {
readonly property int dark: 0 readonly property int dark: 0
readonly property int light: 1 readonly property int light: 1
property int theme: dark property int theme: Application.styleHints.colorScheme === Qt.ColorScheme.Light ? light : dark
readonly property color primary: "#b81a34" property color primary: "#b81a34"
readonly property color foreground: theme === dark ? "#fdfdfd" : "#110b0c" property color primaryContrast: "#fdfdfd"
property color foreground: theme === dark ? "#fdfdfd" : "#110b0c"
readonly property color background: theme === dark ? "#303136" : "#eff1f5" readonly property color background: theme === dark ? "#303136" : "#eff1f5"
readonly property color mantle: theme === dark ? "#1e1f22" : "#e7e9ef" readonly property color mantle: theme === dark ? "#1e1f22" : "#e7e9ef"
readonly property color interactive: theme === dark ? "#878b97" : "#d9d9da" readonly property color interactive: theme === dark ? "#878b97" : "#d9d9da"
readonly property color error: theme === dark ? "#ff2264" : "#ff004b" readonly property color error: theme === dark ? "#ff2264" : "#ff004b"
readonly property color transparent: "transparent"
readonly property double highlightOpacity: .3 readonly property double highlightOpacity: .3
} }

View File

@@ -1,59 +1,22 @@
pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import QtQuick.Templates as T
import QtQuick.Controls
import QtQuick.Controls.impl import QtQuick.Controls.impl
import QtQuick.Controls
import QtQuick.Templates as T
T.ComboBox { T.ComboBox {
id: control id: control
font: Typography.body implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
implicitContentWidth + leftPadding + rightPadding)
implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset, implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
implicitContentHeight + topPadding + bottomPadding, implicitContentHeight + topPadding + bottomPadding,
implicitIndicatorHeight + topPadding + bottomPadding) implicitIndicatorHeight + topPadding + bottomPadding)
leftPadding: padding + (!control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width + spacing)
rightPadding: padding + (control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width + spacing)
contentItem: T.TextField {
id: test
autoScroll: control.editable
color: Colors.foreground
enabled: control.editable
font: Typography.body
implicitHeight: Typography.body.pixelSize + topPadding + bottomPadding
inputMethodHints: control.inputMethodHints
padding: Dimensions.m
readOnly: control.down
selectByMouse: control.selectTextByMouse
text: control.editable ? control.editText : control.displayText
validator: control.validator
width: control.width - indicator.width
verticalAlignment: Text.AlignVCenter
}
background: Rectangle {
border.color: Colors.interactive
border.width: 1
color: Colors.mantle
// height: parent.height
radius: Dimensions.radius
width: parent.width
}
// delegate: MenuItem {
// id: menuItem
// required property int index
// required property var model
// highlighted: control.highlightedIndex === index
// hoverEnabled: control.hoverEnabled
// text: model[control.textRole]
// width: control.width
// background: Rectangle {
// color: menuItem.down || menuItem.highlighted ? Colors.primary : "transparent"
// height: menuItem.height
// width: menuItem.width
// }
// }
delegate: ItemDelegate { delegate: ItemDelegate {
required property var model required property var model
required property int index required property int index
@@ -62,71 +25,222 @@ T.ComboBox {
text: model[control.textRole] text: model[control.textRole]
// palette.text: control.palette.text // palette.text: control.palette.text
// palette.highlightedText: control.palette.highlightedText // palette.highlightedText: control.palette.highlightedText
// font.weight: control.currentIndex === index ? Font.DemiBold : Font.Normal font.weight: control.currentIndex === index ? Font.DemiBold : Font.Normal
highlighted: control.highlightedIndex === index highlighted: control.highlightedIndex === index
hoverEnabled: control.hoverEnabled hoverEnabled: control.hoverEnabled
} }
indicator: Rectangle {
id: indicator
border.color: Colors.interactive indicator: ColorImage {
bottomRightRadius: Dimensions.radius x: control.mirrored ? control.padding : control.width - width - control.padding
color: Colors.primary y: control.topPadding + (control.availableHeight - height) / 2
height: control.height
topRightRadius: Dimensions.radius
width: 20 + Dimensions.s * 2
x: control.width - width
y: 0
z: 2
IconLabel { source: "qrc:/images/ChevronDown.svg"
anchors.fill: parent opacity: enabled ? 1 : 0.3
bottomPadding: Dimensions.s
icon.color: Colors.foreground
icon.source: "qrc:/images/ChevronDown.svg"
leftPadding: Dimensions.s
rightPadding: Dimensions.s
topPadding: Dimensions.s
} }
MouseArea {
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onPressed: () => { contentItem: T.TextField {
control.popup.visible = true; // leftPadding: !control.mirrored ? 12 : control.editable && activeFocus ? 3 : 1
control.popup.forceActiveFocus() // rightPadding: control.mirrored ? 12 : control.editable && activeFocus ? 3 : 1
} // topPadding: 6 - control.padding
} // bottomPadding: 6 - control.padding
} implicitHeight: Typography.body.pixelSize + bottomPadding + topPadding
popup: T.Popup { text: control.editable ? control.editText : control.displayText
bottomMargin: 6 padding: Dimensions.m
height: Math.min(contentItem.implicitHeight + 2, control.Window.height - topMargin - bottomMargin) enabled: control.editable
padding: 1 autoScroll: control.editable
topMargin: 6 readOnly: control.down
width: control.width inputMethodHints: control.inputMethodHints
y: control.height validator: control.validator
selectByMouse: control.selectTextByMouse
color: Colors.foreground
// selectionColor: control.palette.highlight
// selectedTextColor: control.palette.highlightedText
verticalAlignment: Text.AlignVCenter
background: Rectangle { background: Rectangle {
visible: control.enabled && control.editable && !control.flat
border.width: parent && parent.activeFocus ? 2 : 1
border.color: Colors.interactive border.color: Colors.interactive
color: Colors.mantle
radius: Dimensions.radius radius: Dimensions.radius
color: Colors.mantle
} }
}
background: Rectangle {
implicitWidth: 140
implicitHeight: 40
radius: Dimensions.radius
color: Colors.mantle
border.color: Colors.interactive
border.width: 1
visible: !control.flat || control.down
}
popup: T.Popup {
y: control.height
width: control.width
height: Math.min(contentItem.implicitHeight, control.Window.height - topMargin - bottomMargin)
topMargin: 6
bottomMargin: 6
palette: control.palette
contentItem: ListView { contentItem: ListView {
clip: true clip: true
currentIndex: control.highlightedIndex
implicitHeight: contentHeight implicitHeight: contentHeight
model: control.popup.visible ? control.delegateModel : null model: control.delegateModel
currentIndex: control.highlightedIndex
highlightMoveDuration: 0
T.ScrollBar.vertical: ScrollBar { Rectangle {
z: 10
width: parent.width
height: parent.height
color: "transparent"
border.color: control.palette.mid
} }
highlight: Rectangle {
color: Colors.primary T.ScrollIndicator.vertical: ScrollIndicator { }
opacity: Colors.highlightOpacity
} }
background: Rectangle {
color: control.palette.window
} }
}
Component.onCompleted:
{
console.log(control.implicitContentHeight)
} }
} }
// import QtQuick
// import QtQuick.Templates as T
// import QtQuick.Controls
// import QtQuick.Controls.impl
// T.ComboBox {
// id: control
// font: Typography.body
// implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
// implicitContentHeight + topPadding + bottomPadding,
// implicitIndicatorHeight + topPadding + bottomPadding)
// contentItem: T.TextField {
// id: test
// autoScroll: control.editable
// color: Colors.foreground
// enabled: control.editable
// font: Typography.body
// implicitHeight: Typography.body.pixelSize + topPadding + bottomPadding
// inputMethodHints: control.inputMethodHints
// padding: Dimensions.m
// readOnly: control.down
// selectByMouse: control.selectTextByMouse
// text: control.editable ? control.editText : control.displayText
// validator: control.validator
// width: control.width - indicator.width
// verticalAlignment: Text.AlignVCenter
// }
// background: Rectangle {
// border.color: Colors.interactive
// border.width: 1
// color: Colors.mantle
// // height: parent.height
// radius: Dimensions.radius
// width: parent.width
// }
// // delegate: MenuItem {
// // id: menuItem
// // required property int index
// // required property var model
// // highlighted: control.highlightedIndex === index
// // hoverEnabled: control.hoverEnabled
// // text: model[control.textRole]
// // width: control.width
// // background: Rectangle {
// // color: menuItem.down || menuItem.highlighted ? Colors.primary : "transparent"
// // height: menuItem.height
// // width: menuItem.width
// // }
// // }
// delegate: ItemDelegate {
// required property var model
// required property int index
// width: ListView.view.width
// text: model[control.textRole]
// // palette.text: control.palette.text
// // palette.highlightedText: control.palette.highlightedText
// // font.weight: control.currentIndex === index ? Font.DemiBold : Font.Normal
// highlighted: control.highlightedIndex === index
// hoverEnabled: control.hoverEnabled
// }
// indicator: Rectangle {
// id: indicator
// border.color: Colors.interactive
// bottomRightRadius: Dimensions.radius
// color: Colors.primary
// height: control.height
// topRightRadius: Dimensions.radius
// width: 20 + Dimensions.s * 2
// x: control.width - width
// y: 0
// z: 2
// IconLabel {
// anchors.fill: parent
// bottomPadding: Dimensions.s
// icon.color: Colors.foreground
// icon.source: "qrc:/images/ChevronDown.svg"
// leftPadding: Dimensions.s
// rightPadding: Dimensions.s
// topPadding: Dimensions.s
// }
// MouseArea {
// anchors.fill: parent
// cursorShape: Qt.PointingHandCursor
// onPressed: () => {
// control.popup.visible = true;
// control.popup.forceActiveFocus()
// }
// }
// }
// popup: T.Popup {
// bottomMargin: 6
// height: Math.min(contentItem.implicitHeight + 2, control.Window.height - topMargin - bottomMargin)
// padding: 1
// topMargin: 6
// width: control.width
// y: control.height
// background: Rectangle {
// border.color: Colors.interactive
// color: Colors.mantle
// radius: Dimensions.radius
// }
// contentItem: ListView {
// clip: true
// currentIndex: control.highlightedIndex
// implicitHeight: contentHeight
// model: control.popup.visible ? control.delegateModel : null
// T.ScrollBar.vertical: ScrollBar {
// }
// highlight: Rectangle {
// color: Colors.primary
// opacity: Colors.highlightOpacity
// }
// }
// }
// Component.onCompleted:
// {
// console.log(control.implicitContentHeight)
// }
// }

5
TeroStyle/Label.qml Normal file
View File

@@ -0,0 +1,5 @@
import QtQuick.Controls
Label {
color: Colors.foreground
}

60
TeroStyle/QuickFilter.qml Normal file
View File

@@ -0,0 +1,60 @@
import QtQuick
import QtCore
import QtQuick.Layouts
RowLayout {
id: root
required property ListModel model
signal selectedChanged(string name)
spacing: Dimensions.m
Repeater {
model: root.model
Item {
id: item
required property int index
required property var modelData
property real padding: Dimensions.m
height: text.height + padding * 2
width: text.width + padding * 2
Rectangle {
anchors.fill: parent
border.color: modelData.selected ? Colors.transparent : Colors.foreground
border.width: 2
color: modelData.selected ? Colors.primary : Colors.transparent
radius: parent.height
}
Text {
id: text
color: Colors.foreground
font: Typography.body
text: modelData.text
x: parent.padding
y: parent.padding
}
MouseArea {
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onPressed: {
if (item.modelData.selected)
return;
const model = root.model;
for (let i = 0; i < model.count; i++) {
model.setProperty(i, "selected", false);
}
model.setProperty(item.index, "selected", true);
selectedChanged(item.modelData.name)
}
}
}
}
}

View File

@@ -19,7 +19,28 @@ T.TextField
placeholderTextColor: Colors.interactive placeholderTextColor: Colors.interactive
font: Typography.body font: Typography.body
padding: Dimensions.m padding: Dimensions.m
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
/**
* Placeholder
*/
Text {
x: control.leftPadding
y: control.topPadding
width: control.width - (control.leftPadding + control.rightPadding)
height: control.height - (control.topPadding + control.bottomPadding)
font: control.font
text: control.placeholderText
color: control.placeholderTextColor
verticalAlignment: control.verticalAlignment
visible: !control.length && !control.preeditText && (!control.activeFocus || control.horizontalAlignment !== Qt.AlignHCenter)
elide: Text.ElideRight
renderType: control.renderType
}
} }

View File

@@ -7,3 +7,7 @@ ComboBox ComboBox.qml
Field Field.qml Field Field.qml
TextField TextField.qml TextField TextField.qml
BarButton BarButton.qml BarButton BarButton.qml
Label Label.qml
QuickFilter QuickFilter.qml

View File

@@ -0,0 +1,4 @@
<svg fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" data-slot="icon" data-darkreader-inline-fill="">
<path clip-rule="evenodd" fill-rule="evenodd" d="M17 4.25A2.25 2.25 0 0 0 14.75 2h-5.5A2.25 2.25 0 0 0 7 4.25v2a.75.75 0 0 0 1.5 0v-2a.75.75 0 0 1 .75-.75h5.5a.75.75 0 0 1 .75.75v11.5a.75.75 0 0 1-.75.75h-5.5a.75.75 0 0 1-.75-.75v-2a.75.75 0 0 0-1.5 0v2A2.25 2.25 0 0 0 9.25 18h5.5A2.25 2.25 0 0 0 17 15.75V4.25Z"></path>
<path clip-rule="evenodd" fill-rule="evenodd" d="M1 10a.75.75 0 0 1 .75-.75h9.546l-1.048-.943a.75.75 0 1 1 1.004-1.114l2.5 2.25a.75.75 0 0 1 0 1.114l-2.5 2.25a.75.75 0 1 1-1.004-1.114l1.048-.943H1.75A.75.75 0 0 1 1 10Z"></path>
</svg>

After

Width:  |  Height:  |  Size: 708 B

3
images/Bars3.svg Normal file
View File

@@ -0,0 +1,3 @@
<svg fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" data-slot="icon">
<path clip-rule="evenodd" fill-rule="evenodd" d="M2 4.75A.75.75 0 0 1 2.75 4h14.5a.75.75 0 0 1 0 1.5H2.75A.75.75 0 0 1 2 4.75ZM2 10a.75.75 0 0 1 .75-.75h14.5a.75.75 0 0 1 0 1.5H2.75A.75.75 0 0 1 2 10Zm0 5.25a.75.75 0 0 1 .75-.75h14.5a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1-.75-.75Z"></path>
</svg>

After

Width:  |  Height:  |  Size: 414 B

View File

@@ -1,3 +1,3 @@
<svg fill="none" stroke-width="1.5" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" data-slot="icon" data-darkreader-inline-stroke=""> <svg fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" data-slot="icon">
<path stroke-linecap="round" stroke-linejoin="round" d="m19.5 8.25-7.5 7.5-7.5-7.5"></path> <path clip-rule="evenodd" fill-rule="evenodd" d="M5.22 8.22a.75.75 0 0 1 1.06 0L10 11.94l3.72-3.72a.75.75 0 1 1 1.06 1.06l-4.25 4.25a.75.75 0 0 1-1.06 0L5.22 9.28a.75.75 0 0 1 0-1.06Z"></path>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 283 B

After

Width:  |  Height:  |  Size: 318 B

3
images/Funnel.svg Normal file
View File

@@ -0,0 +1,3 @@
<svg fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" data-slot="icon">
<path clip-rule="evenodd" fill-rule="evenodd" d="M2.628 1.601C5.028 1.206 7.49 1 10 1s4.973.206 7.372.601a.75.75 0 0 1 .628.74v2.288a2.25 2.25 0 0 1-.659 1.59l-4.682 4.683a2.25 2.25 0 0 0-.659 1.59v3.037c0 .684-.31 1.33-.844 1.757l-1.937 1.55A.75.75 0 0 1 8 18.25v-5.757a2.25 2.25 0 0 0-.659-1.591L2.659 6.22A2.25 2.25 0 0 1 2 4.629V2.34a.75.75 0 0 1 .628-.74Z"></path>
</svg>

After

Width:  |  Height:  |  Size: 495 B

View File

@@ -0,0 +1,3 @@
<svg fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" data-slot="icon">
<path clip-rule="evenodd" fill-rule="evenodd" d="M9 3.5a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11ZM2 9a7 7 0 1 1 12.452 4.391l3.328 3.329a.75.75 0 1 1-1.06 1.06l-3.329-3.328A7 7 0 0 1 2 9Z"></path>
</svg>

After

Width:  |  Height:  |  Size: 319 B

3
images/PlusCircle.svg Normal file
View File

@@ -0,0 +1,3 @@
<svg fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" data-slot="icon">
<path clip-rule="evenodd" fill-rule="evenodd" d="M10 18a8 8 0 1 0 0-16 8 8 0 0 0 0 16Zm.75-11.25a.75.75 0 0 0-1.5 0v2.5h-2.5a.75.75 0 0 0 0 1.5h2.5v2.5a.75.75 0 0 0 1.5 0v-2.5h2.5a.75.75 0 0 0 0-1.5h-2.5v-2.5Z"></path>
</svg>

After

Width:  |  Height:  |  Size: 344 B

6
images/README.md Normal file
View File

@@ -0,0 +1,6 @@
Icons are sourced from [heroicons.dev](https://heroicons.dev/?iconset=v2-20-solid&size=21) and licensed under the terms of the MIT license.
## Solid or Outline?
Get the 20px Solid icon for most cases, since solid icons are the easiest for users to scan.
You might need an Outline icon in some cases, e.g. because the icon renders so big that a solid icon looks "boring". Suffix outline icon files with `-Outline`) and change the `stroke-width` attribute in the .svg to 2.

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#000000"><path d="M234-276q51-39 114-61.5T480-360q69 0 132 22.5T726-276q35-41 54.5-93T800-480q0-133-93.5-226.5T480-800q-133 0-226.5 93.5T160-480q0 59 19.5 111t54.5 93Zm246-164q-59 0-99.5-40.5T340-580q0-59 40.5-99.5T480-720q59 0 99.5 40.5T620-580q0 59-40.5 99.5T480-440Zm0 360q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q53 0 100-15.5t86-44.5q-39-29-86-44.5T480-280q-53 0-100 15.5T294-220q39 29 86 44.5T480-160Zm0-360q26 0 43-17t17-43q0-26-17-43t-43-17q-26 0-43 17t-17 43q0 26 17 43t43 17Zm0-60Zm0 360Z"/></svg>

Before

Width:  |  Height:  |  Size: 751 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#000000"><path d="M440-440H200v-80h240v-240h80v240h240v80H520v240h-80v-240Z"/></svg>

Before

Width:  |  Height:  |  Size: 182 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#000000"><path d="M720-40v-120H600v-80h120v-120h80v120h120v80H800v120h-80ZM80-160v-240H40v-80l40-200h600l40 200v80h-40v120h-80v-120H440v240H80Zm80-80h200v-160H160v160Zm-38-240h516-516ZM80-720v-80h600v80H80Zm42 240h516l-24-120H146l-24 120Z"/></svg>

Before

Width:  |  Height:  |  Size: 345 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#5F6368"><path d="M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h360v80H200v560h560v-360h80v360q0 33-23.5 56.5T760-120H200Zm120-160v-80h320v80H320Zm0-120v-80h320v80H320Zm0-120v-80h320v80H320Zm360-80v-80h-80v-80h80v-80h80v80h80v80h-80v80h-80Z"/></svg>

Before

Width:  |  Height:  |  Size: 362 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#000000"><path d="M720-400v-120H600v-80h120v-120h80v120h120v80H800v120h-80Zm-360-80q-66 0-113-47t-47-113q0-66 47-113t113-47q66 0 113 47t47 113q0 66-47 113t-113 47ZM40-160v-112q0-34 17.5-62.5T104-378q62-31 126-46.5T360-440q66 0 130 15.5T616-378q29 15 46.5 43.5T680-272v112H40Zm80-80h480v-32q0-11-5.5-20T580-306q-54-27-109-40.5T360-360q-56 0-111 13.5T140-306q-9 5-14.5 14t-5.5 20v32Zm240-320q33 0 56.5-23.5T440-640q0-33-23.5-56.5T360-720q-33 0-56.5 23.5T280-640q0 33 23.5 56.5T360-560Zm0-80Zm0 400Z"/></svg>

Before

Width:  |  Height:  |  Size: 603 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed"><path d="M440-160q-17 0-28.5-11.5T400-200v-240L168-736q-15-20-4.5-42t36.5-22h560q26 0 36.5 22t-4.5 42L560-440v240q0 17-11.5 28.5T520-160h-80Zm40-308 198-252H282l198 252Zm0 0Z"/></svg>

Before

Width:  |  Height:  |  Size: 290 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed"><path d="M120-240v-80h720v80H120Zm0-200v-80h720v80H120Zm0-200v-80h720v80H120Z"/></svg>

Before

Width:  |  Height:  |  Size: 193 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed"><path d="M784-120 532-372q-30 24-69 38t-83 14q-109 0-184.5-75.5T120-580q0-109 75.5-184.5T380-840q109 0 184.5 75.5T640-580q0 44-14 83t-38 69l252 252-56 56ZM380-400q75 0 127.5-52.5T560-580q0-75-52.5-127.5T380-760q-75 0-127.5 52.5T200-580q0 75 52.5 127.5T380-400Z"/></svg>

Before

Width:  |  Height:  |  Size: 376 B

View File

@@ -11,7 +11,6 @@ class BusinessDAO(QObject):
__all_cols = None __all_cols = None
def __init__(self): def __init__(self):
#print(f"*** File: {__file__}, init()")
super().__init__() super().__init__()
self.__con = DbManager().getConnection() self.__con = DbManager().getConnection()
if self.__con: if self.__con:

View File

@@ -1,22 +1,22 @@
<RCC> <RCC>
<qresource prefix="/"> <qresource prefix="/">
<file>qtquickcontrols2.conf</file> <file>qtquickcontrols2.conf</file>
<file>images/add.svg</file> <file>images/ArrowRightEndOnRectangle.svg</file>
<file>images/addbusiness.svg</file> <file>images/Bars3.svg</file>
<file>images/addperson.svg</file>
<file>images/filter.svg</file>
<file>images/menu.svg</file>
<file>images/search.svg</file>
<file>images/ChevronDown.svg</file> <file>images/ChevronDown.svg</file>
<file>images/Funnel.svg</file>
<file>images/MagnifyingGlass.svg</file>
<file>images/PlusCircle.svg</file>
<file>images/tero.jpg</file>
<file>sounds/error.ogg</file> <file>sounds/error.ogg</file>
<file>sounds/fail2c.ogg</file> <file>sounds/fail2c.ogg</file>
<file>sounds/puzzerr.ogg</file> <file>sounds/puzzerr.ogg</file>
<file>sounds/sysnotify.ogg</file> <file>sounds/sysnotify.ogg</file>
<file>sounds/wrong.ogg</file> <file>sounds/wrong.ogg</file>
<file>fonts/RobotoCondensed.otf</file> <file>fonts/RobotoCondensed.otf</file>
<file>images/account.svg</file>
<file>README</file> <file>README</file>
<file>LICENSE</file> <file>LICENSE</file>
<<<<<<< HEAD
<file>images/tero.jpg</file> <file>images/tero.jpg</file>
<file>images/dash.svg</file> <file>images/dash.svg</file>
<file>images/invoice.svg</file> <file>images/invoice.svg</file>
@@ -25,5 +25,7 @@
<file>images/customer.svg</file> <file>images/customer.svg</file>
<file>images/contract.svg</file> <file>images/contract.svg</file>
<file>images/object.svg</file> <file>images/object.svg</file>
=======
>>>>>>> main
</qresource> </qresource>
</RCC> </RCC>

View File

@@ -52,9 +52,11 @@
<file>TeroStyle/Button.qml</file> <file>TeroStyle/Button.qml</file>
<file>TeroStyle/Colors.qml</file> <file>TeroStyle/Colors.qml</file>
<file>TeroStyle/ComboBox.qml</file> <file>TeroStyle/ComboBox.qml</file>
<file>TeroStyle/Field.qml</file>
<file>TeroStyle/Dimensions.qml</file> <file>TeroStyle/Dimensions.qml</file>
<file>TeroStyle/Field.qml</file>
<file>TeroStyle/Label.qml</file>
<file>TeroStyle/qmldir</file> <file>TeroStyle/qmldir</file>
<file>TeroStyle/QuickFilter.qml</file>
<file>TeroStyle/TextField.qml</file> <file>TeroStyle/TextField.qml</file>
<file>TeroStyle/Typography.qml</file> <file>TeroStyle/Typography.qml</file>
<file>TeroStyle/BarButton.qml</file> <file>TeroStyle/BarButton.qml</file>

View File

@@ -7,7 +7,3 @@ mariadb
soundfile soundfile
sounddevice sounddevice
reportlab reportlab