From 59cb3d09164478eec2b095e444b4df0f896ef137 Mon Sep 17 00:00:00 2001 From: EndrII Date: Tue, 30 Sep 2025 19:50:29 +0200 Subject: [PATCH 01/14] added image effects instance --- ViewSolutions/ViewSolutions/ImageView.qml | 1 + ViewSolutions/src/basehashmodel.h | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/ViewSolutions/ViewSolutions/ImageView.qml b/ViewSolutions/ViewSolutions/ImageView.qml index 0c01aec..c6975af 100644 --- a/ViewSolutions/ViewSolutions/ImageView.qml +++ b/ViewSolutions/ViewSolutions/ImageView.qml @@ -16,6 +16,7 @@ AbstractButton { id: root property string source: "" property alias imagesource: sourceImg + property alias imagEffect: imgEffect property int radius: 16 property real power: 1.0 diff --git a/ViewSolutions/src/basehashmodel.h b/ViewSolutions/src/basehashmodel.h index 9f7cdd8..432c86e 100644 --- a/ViewSolutions/src/basehashmodel.h +++ b/ViewSolutions/src/basehashmodel.h @@ -43,11 +43,12 @@ class BaseHashModel: public QAbstractListModel { public: + BaseHashModel(QObject* parent = nullptr): QAbstractListModel(parent) { } - int rowCount(const QModelIndex &parent) const override { + int rowCount(const QModelIndex &) const override { return m_data.size(); } @@ -114,6 +115,10 @@ class BaseHashModel: public QAbstractListModel return {}; } + DATA get(const KEY& key) { + return m_data.value(key); + } + const QHash& dateList() const { return m_data; } From 17d1bc295632e431601d9388b75760e4597944eb Mon Sep 17 00:00:00 2001 From: EndrII Date: Wed, 8 Oct 2025 22:09:58 +0200 Subject: [PATCH 02/14] added extendable widget --- ViewSolutions/ViewSolutions/Extendable.qml | 78 ++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 ViewSolutions/ViewSolutions/Extendable.qml diff --git a/ViewSolutions/ViewSolutions/Extendable.qml b/ViewSolutions/ViewSolutions/Extendable.qml new file mode 100644 index 0000000..c70e96f --- /dev/null +++ b/ViewSolutions/ViewSolutions/Extendable.qml @@ -0,0 +1,78 @@ +//# +//# Copyright (C) 2025-2025 QuasarApp. +//# Distributed under the GPLv3 software license, see the accompanying +//# Everyone is permitted to copy and distribute verbatim copies +//# of this license document, but changing it is not allowed. +//# + +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts + +Control { + + id: root + + property alias extendableWidget: extendetArea.contentItem + property alias mainWidget: mainButton.contentItem + // see GridLayout + property alias layoutDirection: columnLayout.layoutDirection + property alias flow: columnLayout.flow + + property alias extended: extendetArea.visible + property int animationDuration: 600 + + contentItem: GridLayout { + id: columnLayout + columnSpacing: 0 + rowSpacing: 0 + + Control { + id: extendetArea + clip: true + padding: 0 + Layout.alignment: Qt.AlignCenter + + Behavior on implicitHeight { + + NumberAnimation { + easing.type: Easing.OutExpo + duration: root.animationDuration + } + } + + Behavior on implicitWidth { + enabled: root.flow === GridLayout.LeftToRight + NumberAnimation { + easing.type: Easing.OutExpo + duration: root.animationDuration + } + } + + } + + Control { + Layout.alignment: Qt.AlignCenter + padding: 0 + id: mainButton + + Behavior on implicitHeight { + + NumberAnimation { + easing.type: Easing.OutExpo + duration: root.animationDuration + + } + } + + Behavior on implicitWidth { + enabled: root.flow === GridLayout.LeftToRight + NumberAnimation { + easing.type: Easing.OutExpo + duration: root.animationDuration + + } + } + } + } +} From 00e8365340df27aa79ef795a8665a11809fb29c8 Mon Sep 17 00:00:00 2001 From: EndrII Date: Wed, 15 Oct 2025 19:25:38 +0200 Subject: [PATCH 03/14] added custom message type --- ViewSolutions/src/notificationdata.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ViewSolutions/src/notificationdata.h b/ViewSolutions/src/notificationdata.h index 7b2f07b..c5ad70c 100644 --- a/ViewSolutions/src/notificationdata.h +++ b/ViewSolutions/src/notificationdata.h @@ -31,6 +31,9 @@ class VIEWSOLUTION_EXPORT NotificationData Warning = 1, /// This is critical error notifications. Error = 2, + + /// This is user defined type of message. + Custom = 3, }; explicit NotificationData(const QString& title = "", From 5e56566f3aa4a74a0387025c7cdfe575ea6095d2 Mon Sep 17 00:00:00 2001 From: EndrII Date: Thu, 16 Oct 2025 01:11:29 +0200 Subject: [PATCH 04/14] update notifications --- ViewSolutions/ViewSolutions/Metrix.qml | 32 ------------------- .../ViewSolutions/NotificationServiceView.qml | 32 ++++++++----------- ViewSolutions/src/notificationservice.h | 3 +- 3 files changed, 16 insertions(+), 51 deletions(-) delete mode 100644 ViewSolutions/ViewSolutions/Metrix.qml diff --git a/ViewSolutions/ViewSolutions/Metrix.qml b/ViewSolutions/ViewSolutions/Metrix.qml deleted file mode 100644 index b3d2adc..0000000 --- a/ViewSolutions/ViewSolutions/Metrix.qml +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2018-2024 QuasarApp. - * Distributed under the GPLv3 software license, see the accompanying - * Everyone is permitted to copy and distribute verbatim copies - * of this license document, but changing it is not allowed. -*/ - -import QtQuick -import QtQuick.Window -import QtQuick.Controls.Material -import QtQuick.Controls - -Item { - readonly property int pointCount: 100; - readonly property real mm: Screen.pixelDensity - readonly property real sm: 10 * mm - readonly property real dsm: Math.sqrt(Math.pow(Screen.desktopAvailableWidth, 2) + Math.pow(Screen.desktopAvailableHeight, 2)) / sm - readonly property real pt: getfactor(dsm) * sm - readonly property real controlPtMaterial: Material.buttonHeight - readonly property real gamePt: (width < height) ? width / pointCount : height / pointCount; - - function getfactor(dsm) { - if ( dsm < 70) { - return 1 - } else if (dsm < 140) { - return 2; - } else - return 4; - } - - anchors.fill: parent; -} diff --git a/ViewSolutions/ViewSolutions/NotificationServiceView.qml b/ViewSolutions/ViewSolutions/NotificationServiceView.qml index 1fc37a4..b0f9885 100644 --- a/ViewSolutions/ViewSolutions/NotificationServiceView.qml +++ b/ViewSolutions/ViewSolutions/NotificationServiceView.qml @@ -18,45 +18,41 @@ Item { readonly property var history: model.history - Metrix { - id: metrix - } - NotificationForm { id: notyfyView - titleText : msg.title(); - text: (msg)? msg.text(): ""; - img: (msg && msg.img().length)? msg.img(): getDefaultImage((msg)? msg.type(): 0); - type: (msg)? msg.type(): 0; + titleText : root.msg.title(); + text: (root.msg)? root.msg.text(): ""; + img: (root.msg && root.msg.img().length)? root.msg.img(): getDefaultImage((root.msg)? root.msg.type(): 0); + type: (root.msg)? root.msg.type(): 0; x: parent.width - width - margin; y: margin; - width: Math.min(6 * metrix.pt, root.width); + width: Math.min(440, root.width); } YesNoQuestion { id: questionMsgBox - titleText : qst.title(); - text: (qst)? qst.text(): ""; - img: (qst && qst.img().length)? qst.img(): defImg; + titleText : root.qst.title(); + text: (root.qst)? root.qst.text(): ""; + img: (root.qst && root.qst.img().length)? root.qst.img(): defImg; type: 0; x: parent.width / 2 - width / 2; y: parent.height / 2 - height / 2; - width: Math.min(6 * metrix.pt, root.width); + width: Math.min(440, root.width); onAccepted: { - if (model) { - model.questionComplete(true, qst.type()) + if (root.model) { + root.model.questionComplete(true, root.qst.type()) } } onRejected: { - if (model) { - model.questionComplete(false, qst.type()) + if (root.model) { + root.model.questionComplete(false, root.qst.type()) } } } @@ -83,7 +79,7 @@ Item { } Connections { - target: model + target: root.model function onSigShowHistory() { history.open() } diff --git a/ViewSolutions/src/notificationservice.h b/ViewSolutions/src/notificationservice.h index d954141..9f6488c 100644 --- a/ViewSolutions/src/notificationservice.h +++ b/ViewSolutions/src/notificationservice.h @@ -38,6 +38,8 @@ class VIEWSOLUTION_EXPORT NotificationService: public QObject, public iModel Q_PROPERTY(int notificationsCount READ notificationsCount NOTIFY countNotificationsChanged) public: + explicit NotificationService(QObject *ptr = nullptr); + /** * @brief Notify This method return data of the last notify message. * @return return data of the last notify message. @@ -170,7 +172,6 @@ class VIEWSOLUTION_EXPORT NotificationService: public QObject, public iModel private: - explicit NotificationService(QObject *ptr = nullptr); QHash _listners; From 6249fd3781d190695aaca4acfe75cfdde7934181 Mon Sep 17 00:00:00 2001 From: EndrII Date: Mon, 20 Oct 2025 12:57:38 +0200 Subject: [PATCH 05/14] update notification service --- ViewSolutions/src/notificationservice.cpp | 5 ++++- ViewSolutions/src/notificationservice.h | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/ViewSolutions/src/notificationservice.cpp b/ViewSolutions/src/notificationservice.cpp index 29fe707..0c136ea 100644 --- a/ViewSolutions/src/notificationservice.cpp +++ b/ViewSolutions/src/notificationservice.cpp @@ -117,11 +117,14 @@ void NotificationService::showHistory() { emit sigShowHistory(); } +void NotificationService::notificationHiden() { + _notify = NotificationData{}; +} + int NotificationService::notificationsCount() const { return _history->rowCount({}); } - QString ViewSolutions::NotificationService::modelId() const { return "NotificationService"; } diff --git a/ViewSolutions/src/notificationservice.h b/ViewSolutions/src/notificationservice.h index 9f6488c..722d3d8 100644 --- a/ViewSolutions/src/notificationservice.h +++ b/ViewSolutions/src/notificationservice.h @@ -133,6 +133,11 @@ class VIEWSOLUTION_EXPORT NotificationService: public QObject, public iModel Q_INVOKABLE void showHistory(); + /** + * @brief notificationHiden this method should invoked every time when the current notification is hiden, automaticaly or by user. + */ + Q_INVOKABLE void notificationHiden(); + /** * @brief notificationsCount - This method used for return count of history notifications. * @return count of history notifications. From 00e9db6bc31f1818800b9bf80e459be60f61459c Mon Sep 17 00:00:00 2001 From: EndrII Date: Tue, 21 Oct 2025 16:57:44 +0200 Subject: [PATCH 06/14] update extandable behavior --- ViewSolutions/ViewSolutions/Extendable.qml | 48 ++++++++-------------- 1 file changed, 16 insertions(+), 32 deletions(-) diff --git a/ViewSolutions/ViewSolutions/Extendable.qml b/ViewSolutions/ViewSolutions/Extendable.qml index c70e96f..3423056 100644 --- a/ViewSolutions/ViewSolutions/Extendable.qml +++ b/ViewSolutions/ViewSolutions/Extendable.qml @@ -22,6 +22,22 @@ Control { property alias extended: extendetArea.visible property int animationDuration: 600 + Behavior on height { + + NumberAnimation { + easing.type: Easing.OutExpo + duration: root.animationDuration + } + } + + Behavior on width { + enabled: root.flow === GridLayout.LeftToRight + NumberAnimation { + easing.type: Easing.OutExpo + duration: root.animationDuration + } + } + contentItem: GridLayout { id: columnLayout columnSpacing: 0 @@ -33,21 +49,6 @@ Control { padding: 0 Layout.alignment: Qt.AlignCenter - Behavior on implicitHeight { - - NumberAnimation { - easing.type: Easing.OutExpo - duration: root.animationDuration - } - } - - Behavior on implicitWidth { - enabled: root.flow === GridLayout.LeftToRight - NumberAnimation { - easing.type: Easing.OutExpo - duration: root.animationDuration - } - } } @@ -56,23 +57,6 @@ Control { padding: 0 id: mainButton - Behavior on implicitHeight { - - NumberAnimation { - easing.type: Easing.OutExpo - duration: root.animationDuration - - } - } - - Behavior on implicitWidth { - enabled: root.flow === GridLayout.LeftToRight - NumberAnimation { - easing.type: Easing.OutExpo - duration: root.animationDuration - - } - } } } } From fac8e2b30632f8b177cdb4854d266ad78b2c0d24 Mon Sep 17 00:00:00 2001 From: EndrII Date: Wed, 22 Oct 2025 15:38:49 +0200 Subject: [PATCH 07/14] update simple errors --- ViewSolutions/ViewSolutions/Extendable.qml | 63 ++++++++++++++-------- ViewSolutions/ViewSolutions/ImageView.qml | 1 + 2 files changed, 43 insertions(+), 21 deletions(-) diff --git a/ViewSolutions/ViewSolutions/Extendable.qml b/ViewSolutions/ViewSolutions/Extendable.qml index 3423056..d6c90d4 100644 --- a/ViewSolutions/ViewSolutions/Extendable.qml +++ b/ViewSolutions/ViewSolutions/Extendable.qml @@ -22,40 +22,61 @@ Control { property alias extended: extendetArea.visible property int animationDuration: 600 - Behavior on height { - - NumberAnimation { - easing.type: Easing.OutExpo - duration: root.animationDuration - } - } - - Behavior on width { - enabled: root.flow === GridLayout.LeftToRight - NumberAnimation { - easing.type: Easing.OutExpo - duration: root.animationDuration - } - } - contentItem: GridLayout { id: columnLayout columnSpacing: 0 rowSpacing: 0 Control { - id: extendetArea - clip: true - padding: 0 Layout.alignment: Qt.AlignCenter + Layout.maximumWidth: root.implicitWidth - root.rightPadding - root.leftPadding + padding: 0 + id: mainButton + Behavior on implicitHeight { + enabled: root.flow !== GridLayout.LeftToRight + + NumberAnimation { + easing.type: Easing.OutExpo + duration: root.animationDuration + } + } + + Behavior on implicitWidth { + enabled: root.flow === GridLayout.LeftToRight + NumberAnimation { + easing.type: Easing.OutExpo + duration: root.animationDuration + } + } } + Control { - Layout.alignment: Qt.AlignCenter + id: extendetArea + clip: true + visible: false padding: 0 - id: mainButton + Layout.alignment: Qt.AlignCenter + Layout.maximumWidth: root.implicitWidth - root.rightPadding - root.leftPadding + + Behavior on implicitHeight { + enabled: root.flow !== GridLayout.LeftToRight + + NumberAnimation { + easing.type: Easing.OutExpo + duration: root.animationDuration + } + } + + Behavior on implicitWidth { + enabled: root.flow === GridLayout.LeftToRight + NumberAnimation { + easing.type: Easing.OutExpo + duration: root.animationDuration + } + } } } diff --git a/ViewSolutions/ViewSolutions/ImageView.qml b/ViewSolutions/ViewSolutions/ImageView.qml index c6975af..6b99a23 100644 --- a/ViewSolutions/ViewSolutions/ImageView.qml +++ b/ViewSolutions/ViewSolutions/ImageView.qml @@ -122,6 +122,7 @@ AbstractButton { source: Image { id: sourceImg source: root.source + mipmap: true clip: true fillMode: Image.PreserveAspectCrop From 1f751d55afcfcb9003999346892679c861eb45dd Mon Sep 17 00:00:00 2001 From: EndrII Date: Fri, 24 Oct 2025 23:56:02 +0200 Subject: [PATCH 08/14] fix normal type of message --- ViewSolutions/src/notificationdata.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ViewSolutions/src/notificationdata.h b/ViewSolutions/src/notificationdata.h index c5ad70c..3fa5070 100644 --- a/ViewSolutions/src/notificationdata.h +++ b/ViewSolutions/src/notificationdata.h @@ -26,7 +26,7 @@ class VIEWSOLUTION_EXPORT NotificationData */ enum Type { /// This is message for general notification. - Normal, + Normal = 0, /// This is warning notification. Warning = 1, /// This is critical error notifications. From 7c83776e6b3a7f373fbd9f888bde59a327ffe310 Mon Sep 17 00:00:00 2001 From: EndrII Date: Wed, 26 Nov 2025 15:19:45 +0100 Subject: [PATCH 09/14] stacktextview --- ViewSolutions/ViewSolutions/StackText.qml | 80 +++++++++++++++++++++++ ViewSolutions/src/stacktextmodel.cpp | 47 +++++++++++++ ViewSolutions/src/stacktextmodel.h | 72 ++++++++++++++++++++ ViewSolutions/src/viewsolutions.cpp | 5 +- 4 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 ViewSolutions/ViewSolutions/StackText.qml create mode 100644 ViewSolutions/src/stacktextmodel.cpp create mode 100644 ViewSolutions/src/stacktextmodel.h diff --git a/ViewSolutions/ViewSolutions/StackText.qml b/ViewSolutions/ViewSolutions/StackText.qml new file mode 100644 index 0000000..339551b --- /dev/null +++ b/ViewSolutions/ViewSolutions/StackText.qml @@ -0,0 +1,80 @@ +//# +//# Copyright (C) 2025-2025 QuasarApp. +//# Distributed under the GPLv3 software license, see the accompanying +//# Everyone is permitted to copy and distribute verbatim copies +//# of this license document, but changing it is not allowed. +//# + +pragma ComponentBehavior: Bound + +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts +import ViewSolutions +import QtQuick.Effects + +Control { + id: root + padding: 24 + + required property var guiTokens + property alias text: model.fullText; + property alias delimiter: model.delimiter + property alias delegate: contentList.delegate + + + contentItem: ColumnLayout { + ListView { + id: contentList + + interactive: false + // snapMode: ListView.SnapOneItem + boundsBehavior:Flickable.StopAtBounds + Layout.fillWidth: true + Layout.fillHeight: true + + model: StackTextModel { + id: model; + } + + + } + + ToolButton { + Layout.alignment: Qt.AlignHCenter + + + id: nextButton + text: qsTr("Next") + visible: contentList.count > 1 && contentList.currentIndex < contentList.count - 1 + opacity: visible + + Behavior on opacity { + NumberAnimation { + easing.type: Easing.InOutQuad + duration: 300 + } + } + + font: root.font + + onClicked: { + if (contentList.currentIndex + 1 >= contentList.count) { + contentList.currentIndex = 0; + return; + } + contentList.currentIndex = contentList.currentIndex + 1; + } + + layer.enabled: true + layer.effect: MultiEffect { + shadowBlur: 1.0 + shadowEnabled: true + shadowColor: root.guiTokens.color_accent_primary + shadowScale: 1.0 + } + + } + } + +} diff --git a/ViewSolutions/src/stacktextmodel.cpp b/ViewSolutions/src/stacktextmodel.cpp new file mode 100644 index 0000000..d4a10e0 --- /dev/null +++ b/ViewSolutions/src/stacktextmodel.cpp @@ -0,0 +1,47 @@ +//# +//# Copyright (C) 2025-2025 QuasarApp. +//# Distributed under the GPLv3 software license, see the accompanying +//# Everyone is permitted to copy and distribute verbatim copies +//# of this license document, but changing it is not allowed. +//# + +#include "stacktextmodel.h" + +StackTextModel::StackTextModel() {} + +QString StackTextModel::fullText() const { + return _fullText; +} + +void StackTextModel::setFullText(const QString &newFullText) { + if (_fullText == newFullText) + return; + _fullText = newFullText; + updateText(); + emit fullTextChanged(); +} + +QString StackTextModel::delimiter() const { + return _delimiter; +} + +void StackTextModel::setDelimiter(const QString &newDelimiter) { + if (_delimiter == newDelimiter) + return; + _delimiter = newDelimiter; + updateText(); + emit delimiterChanged(); +} + +void StackTextModel::updateText() { + QStringList lines = _fullText.split(_delimiter, Qt::SkipEmptyParts); + setStringList(lines); +} + + + +QHash StackTextModel::roleNames() const { + QHash roles; + roles[Qt::DisplayRole] = "display"; + return roles; +} diff --git a/ViewSolutions/src/stacktextmodel.h b/ViewSolutions/src/stacktextmodel.h new file mode 100644 index 0000000..a31eeef --- /dev/null +++ b/ViewSolutions/src/stacktextmodel.h @@ -0,0 +1,72 @@ +//# +//# Copyright (C) 2025-2025 QuasarApp. +//# Distributed under the GPLv3 software license, see the accompanying +//# Everyone is permitted to copy and distribute verbatim copies +//# of this license document, but changing it is not allowed. +//# + + +#ifndef STACKTEXTMODEL_H +#define STACKTEXTMODEL_H + +#include +#include "viewsolutions_global.h" + +/** + * @brief The StackTextModel class is model that contains stack text lines. + * This model split full text into lines by delimiter. + */ +class VIEWSOLUTION_EXPORT StackTextModel: public QStringListModel +{ + Q_OBJECT + + Q_PROPERTY(QString fullText READ fullText WRITE setFullText NOTIFY fullTextChanged FINAL) + Q_PROPERTY(QString delimiter READ delimiter WRITE setDelimiter NOTIFY delimiterChanged FINAL) + +public: + StackTextModel(); + + // QAbstractItemModel interface + + /** + * @brief fullText returns full text from all lines. + * @return full text from all lines. + */ + QString fullText() const; + void setFullText(const QString &newFullText); + + /** + * @brief delimiter returns delimiter that used to split fullText into lines. + * @return delimiter that used to split fullText into lines. + * @default is "\n" + */ + QString delimiter() const; + + /** + * @brief setDelimiter sets new delimiter for split fullText into lines. + * @param newDelimiter new delimiter for split fullText into lines. + */ + void setDelimiter(const QString &newDelimiter); + QHash roleNames() const override; + +protected: + + /** + * @brief updateText updates internal model data from fullText and delimiter. + */ + virtual void updateText(); + +signals: + void fullTextChanged(); + void delimiterChanged(); + +private: + + QString _fullText; + QString _delimiter = "\n"; + + // QAbstractItemModel interface +public: +}; + +#endif // STACKTEXTMODEL_H diff --git a/ViewSolutions/src/viewsolutions.cpp b/ViewSolutions/src/viewsolutions.cpp index 3eb58c8..0173615 100644 --- a/ViewSolutions/src/viewsolutions.cpp +++ b/ViewSolutions/src/viewsolutions.cpp @@ -13,6 +13,7 @@ #include #include #include +#include namespace ViewSolutions { QSharedPointer init(QQmlEngine *engine) { @@ -37,7 +38,9 @@ QSharedPointer init(QQmlEngine *engine) { // to-do - remove root->setContextProperty("colorPicker", picker.get()); - qRegisterMetaType("VariantListModel"); + qmlRegisterType("ViewSolutions", 1, 0, "VariantListModel"); + qmlRegisterType("ViewSolutions", 1, 0, "StackTextModel"); + return storage; } From 5519ddbf07c9cd19379417e350594e9b9d11c9cd Mon Sep 17 00:00:00 2001 From: EndrII Date: Thu, 27 Nov 2025 15:50:45 +0100 Subject: [PATCH 10/14] added readonly properrty to stak text --- ViewSolutions/ViewSolutions/StackText.qml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ViewSolutions/ViewSolutions/StackText.qml b/ViewSolutions/ViewSolutions/StackText.qml index 339551b..91badd1 100644 --- a/ViewSolutions/ViewSolutions/StackText.qml +++ b/ViewSolutions/ViewSolutions/StackText.qml @@ -21,7 +21,7 @@ Control { property alias text: model.fullText; property alias delimiter: model.delimiter property alias delegate: contentList.delegate - + readonly property bool isFinished: contentList.currentIndex >= contentList.count - 1 contentItem: ColumnLayout { ListView { @@ -36,8 +36,6 @@ Control { model: StackTextModel { id: model; } - - } ToolButton { From 65597d80011154cdf1aa081ff019644d49276f0b Mon Sep 17 00:00:00 2001 From: EndrII Date: Tue, 2 Dec 2025 16:33:54 +0100 Subject: [PATCH 11/14] fix start status of TextStack --- ViewSolutions/ViewSolutions/StackText.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ViewSolutions/ViewSolutions/StackText.qml b/ViewSolutions/ViewSolutions/StackText.qml index 91badd1..755fbd0 100644 --- a/ViewSolutions/ViewSolutions/StackText.qml +++ b/ViewSolutions/ViewSolutions/StackText.qml @@ -26,7 +26,7 @@ Control { contentItem: ColumnLayout { ListView { id: contentList - + currentIndex: 0 interactive: false // snapMode: ListView.SnapOneItem boundsBehavior:Flickable.StopAtBounds From 9b7578264d9c89fb93f7193eb49b8c599adab82b Mon Sep 17 00:00:00 2001 From: EndrII Date: Sun, 7 Dec 2025 11:34:49 +0100 Subject: [PATCH 12/14] fix text stack view --- ViewSolutions/ViewSolutions/StackText.qml | 4 +++ ViewSolutions/src/stacktextmodel.cpp | 31 ++++++++++++++++++----- ViewSolutions/src/stacktextmodel.h | 3 ++- 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/ViewSolutions/ViewSolutions/StackText.qml b/ViewSolutions/ViewSolutions/StackText.qml index 755fbd0..b42de71 100644 --- a/ViewSolutions/ViewSolutions/StackText.qml +++ b/ViewSolutions/ViewSolutions/StackText.qml @@ -35,6 +35,10 @@ Control { model: StackTextModel { id: model; + + onFullTextChanged: { + contentList.currentIndex = 0; + } } } diff --git a/ViewSolutions/src/stacktextmodel.cpp b/ViewSolutions/src/stacktextmodel.cpp index d4a10e0..65e2cd5 100644 --- a/ViewSolutions/src/stacktextmodel.cpp +++ b/ViewSolutions/src/stacktextmodel.cpp @@ -22,23 +22,42 @@ void StackTextModel::setFullText(const QString &newFullText) { } QString StackTextModel::delimiter() const { - return _delimiter; + return _delimiter.pattern(); } void StackTextModel::setDelimiter(const QString &newDelimiter) { - if (_delimiter == newDelimiter) + if (_delimiter.pattern() == newDelimiter) return; - _delimiter = newDelimiter; + _delimiter.setPattern(newDelimiter); updateText(); emit delimiterChanged(); } void StackTextModel::updateText() { - QStringList lines = _fullText.split(_delimiter, Qt::SkipEmptyParts); - setStringList(lines); -} + QStringList lines; + QString line; + + int delimeterIdx = _fullText.indexOf(_delimiter); + int lastIdx = -1; + while (delimeterIdx >= 0) { + line = _fullText.mid(lastIdx + 1, delimeterIdx - lastIdx); + lastIdx = delimeterIdx; + delimeterIdx = _fullText.indexOf(_delimiter, lastIdx + 1); + + if (line.size()) { + lines += line; + } + } + // take last string. + line = _fullText.mid(lastIdx + 1, delimeterIdx); + if (line.size()) { + lines += line; + } + + setStringList(lines); +} QHash StackTextModel::roleNames() const { QHash roles; diff --git a/ViewSolutions/src/stacktextmodel.h b/ViewSolutions/src/stacktextmodel.h index a31eeef..ffca14d 100644 --- a/ViewSolutions/src/stacktextmodel.h +++ b/ViewSolutions/src/stacktextmodel.h @@ -10,6 +10,7 @@ #define STACKTEXTMODEL_H #include +#include #include "viewsolutions_global.h" /** @@ -63,7 +64,7 @@ class VIEWSOLUTION_EXPORT StackTextModel: public QStringListModel private: QString _fullText; - QString _delimiter = "\n"; + QRegularExpression _delimiter = QRegularExpression("([.?!;]+)"); // QAbstractItemModel interface public: From 47be920ee14f3a8c3622f2a6a2667738de48dd96 Mon Sep 17 00:00:00 2001 From: EndrII Date: Thu, 11 Dec 2025 14:13:03 +0100 Subject: [PATCH 13/14] next function added into stackText --- ViewSolutions/ViewSolutions/StackText.qml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ViewSolutions/ViewSolutions/StackText.qml b/ViewSolutions/ViewSolutions/StackText.qml index b42de71..e75fabb 100644 --- a/ViewSolutions/ViewSolutions/StackText.qml +++ b/ViewSolutions/ViewSolutions/StackText.qml @@ -23,6 +23,12 @@ Control { property alias delegate: contentList.delegate readonly property bool isFinished: contentList.currentIndex >= contentList.count - 1 + function next() { + if (nextButton.visible) { + nextButton.click() + } + } + contentItem: ColumnLayout { ListView { id: contentList From 07558daa6a2d7c55cd6cca6dff1d9cb775b08a51 Mon Sep 17 00:00:00 2001 From: EndrII Date: Sun, 14 Dec 2025 23:12:54 +0100 Subject: [PATCH 14/14] added timeout of notifications --- ViewSolutions/src/notificationservice.cpp | 28 +++++++++++++++++++++-- ViewSolutions/src/notificationservice.h | 19 ++++++++++++++- 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/ViewSolutions/src/notificationservice.cpp b/ViewSolutions/src/notificationservice.cpp index 0c136ea..fb19932 100644 --- a/ViewSolutions/src/notificationservice.cpp +++ b/ViewSolutions/src/notificationservice.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2024 QuasarApp. + * Copyright (C) 2018-2025 QuasarApp. * Distributed under the GPLv3 software license, see the accompanying * Everyone is permitted to copy and distribute verbatim copies * of this license document, but changing it is not allowed. @@ -118,7 +118,7 @@ void NotificationService::showHistory() { } void NotificationService::notificationHiden() { - _notify = NotificationData{}; + setUiIsDisplay(false); } int NotificationService::notificationsCount() const { @@ -129,5 +129,29 @@ QString ViewSolutions::NotificationService::modelId() const { return "NotificationService"; } +bool NotificationService::uiIsDisplay() const { + return _uiIsDisplay && time(0) - _lastDisplayTime < _uiTimeOut; +} + +void NotificationService::setUiIsDisplay(bool newUiIsDisplay) { + if (_uiIsDisplay == newUiIsDisplay) + return; + + if (_uiIsDisplay) { + _lastDisplayTime = time(0); + } + + _uiIsDisplay = newUiIsDisplay; + emit uiIsDisplayChanged(); +} + +int NotificationService::uiTimeOut() const { + return _uiTimeOut; +} + +void NotificationService::setUiTimeOut(int newUiTimeOut) { + _uiTimeOut = newUiTimeOut; +} + } diff --git a/ViewSolutions/src/notificationservice.h b/ViewSolutions/src/notificationservice.h index 722d3d8..d9cf892 100644 --- a/ViewSolutions/src/notificationservice.h +++ b/ViewSolutions/src/notificationservice.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2024 QuasarApp. + * Copyright (C) 2018-2025 QuasarApp. * Distributed under the GPLv3 software license, see the accompanying * Everyone is permitted to copy and distribute verbatim copies * of this license document, but changing it is not allowed. @@ -32,6 +32,7 @@ class VIEWSOLUTION_EXPORT NotificationService: public QObject, public iModel Q_PROPERTY(NotificationData notify READ notify NOTIFY notifyChanged) Q_PROPERTY(NotificationData question READ question NOTIFY questionChanged) + Q_PROPERTY(bool uiIsDisplay READ uiIsDisplay WRITE setUiIsDisplay NOTIFY uiIsDisplayChanged FINAL) Q_PROPERTY(QObject* history READ history NOTIFY notifyChanged) @@ -150,6 +151,16 @@ class VIEWSOLUTION_EXPORT NotificationService: public QObject, public iModel public: QString modelId() const override; + bool uiIsDisplay() const; + void setUiIsDisplay(bool newUiIsDisplay); + + /** + * @brief uiTimeOut this is maximu time that notify service can be loked fo display. + * @return + */ + int uiTimeOut() const; + void setUiTimeOut(int newUiTimeOut); + signals: /** * @brief notifyChanged This signal emited whet the notificator (Ths object) received a new notification message. @@ -175,6 +186,8 @@ class VIEWSOLUTION_EXPORT NotificationService: public QObject, public iModel void countNotificationsChanged(); + void uiIsDisplayChanged(); + private: @@ -182,6 +195,10 @@ class VIEWSOLUTION_EXPORT NotificationService: public QObject, public iModel QHash _listners; NotificationData _question; NotificationData _notify; + bool _uiIsDisplay = false; + int _uiTimeOut = 60; + int _lastDisplayTime = 0; + HistoryNotificationsModel* _history = nullptr;