diff --git a/src/controller.cpp b/src/controller.cpp index 5171f0b10..916b33c35 100644 --- a/src/controller.cpp +++ b/src/controller.cpp @@ -439,4 +439,14 @@ void Controller::revertToDefaultConfig() config->save(); } +bool Controller::isImageShown(const QString &eventId) +{ + return m_shownImages.contains(eventId); +} + +void Controller::markImageShown(const QString &eventId) +{ + m_shownImages.append(eventId); +} + #include "moc_controller.cpp" diff --git a/src/controller.h b/src/controller.h index f6027aac5..3865e2e58 100644 --- a/src/controller.h +++ b/src/controller.h @@ -116,6 +116,9 @@ public: */ Q_INVOKABLE void revertToDefaultConfig(); + Q_INVOKABLE bool isImageShown(const QString &eventId); + Q_INVOKABLE void markImageShown(const QString &eventId); + private: explicit Controller(QObject *parent = nullptr); @@ -128,6 +131,7 @@ private: QStringList m_accountsLoading; QMap> m_connectionsLoading; QString m_endpoint; + QStringList m_shownImages; private Q_SLOTS: void invokeLogin(); diff --git a/src/neochatconfig.kcfg b/src/neochatconfig.kcfg index c1ef7bfa0..6f59d8a67 100644 --- a/src/neochatconfig.kcfg +++ b/src/neochatconfig.kcfg @@ -89,6 +89,10 @@ false + + + false + diff --git a/src/settings/NeoChatGeneralPage.qml b/src/settings/NeoChatGeneralPage.qml index 70d18724f..b20bb4797 100644 --- a/src/settings/NeoChatGeneralPage.qml +++ b/src/settings/NeoChatGeneralPage.qml @@ -193,6 +193,23 @@ FormCard.FormCardPage { NeoChatConfig.save(); } } + + FormCard.FormDelegateSeparator { + above: showAvatarChangeDelegate + below: hideImagesDelegate + } + + FormCard.FormCheckDelegate { + id: hideImagesDelegate + text: i18nc("@label:checkbox", "Hide image and video events by default") + description: i18nc("@info", "When this option is enabled, images and videos are only shown after a button is clicked.") + checked: NeoChatConfig.hideImages + enabled: !NeoChatConfig.isHideImagesImmutable + onToggled: { + NeoChatConfig.hideImages = checked; + NeoChatConfig.save(); + } + } } FormCard.FormHeader { title: i18nc("Chat Editor", "Editor") diff --git a/src/timeline/ImageComponent.qml b/src/timeline/ImageComponent.qml index d66f95272..29fb9d109 100644 --- a/src/timeline/ImageComponent.qml +++ b/src/timeline/ImageComponent.qml @@ -74,7 +74,7 @@ Item { anchors.fill: parent - active: !root.mediaInfo.animated + active: !root.mediaInfo.animated && !_private.hideImage sourceComponent: Image { source: root.mediaInfo.source sourceSize.width: mediaSizeHelper.currentSize.width * Screen.devicePixelRatio @@ -89,7 +89,7 @@ Item { anchors.fill: parent - active: root?.mediaInfo.animated ?? false + active: (root?.mediaInfo.animated ?? false) && !_private.hideImage sourceComponent: AnimatedImage { source: root.mediaInfo.source @@ -101,8 +101,8 @@ Item { Image { anchors.fill: parent - source: root?.mediaInfo.tempInfo.source ?? "" - visible: _private.imageItem.status !== Image.Ready + source: visible ? (root?.mediaInfo.tempInfo.source ?? "") : "" + visible: _private.imageItem && _private.imageItem.status !== Image.Ready && !_private.hideImage } QQC2.ToolTip.text: root.display @@ -124,11 +124,23 @@ Item { anchors.centerIn: parent width: parent.width * 0.8 + visible: !_private.hideImage from: 0 to: 1.0 value: _private.imageItem.progress } + + } + + QQC2.Button { + anchors.centerIn: parent + text: i18nc("@action:button", "Show Image") + visible: _private.hideImage + onClicked: { + _private.hideImage = false; + Controller.markImageShown(root.eventId); + } } TapHandler { @@ -180,5 +192,7 @@ Item { // The space available for the component after taking away the border readonly property real downloaded: root.fileTransferInfo && root.fileTransferInfo.completed + + property bool hideImage: NeoChatConfig.hideImages && !Controller.isImageShown(root.eventId) } } diff --git a/src/timeline/VideoComponent.qml b/src/timeline/VideoComponent.qml index fe764b29d..fcd062da1 100644 --- a/src/timeline/VideoComponent.qml +++ b/src/timeline/VideoComponent.qml @@ -93,6 +93,12 @@ Video { fillMode: VideoOutput.PreserveAspectFit Component.onDestruction: root.stop() + Component.onCompleted: { + console.warn("state", root.state) + if (NeoChatConfig.hideImages && !Controller.isImageShown(root.eventId)) { + root.state = "hidden"; + } + } states: [ State { @@ -167,6 +173,21 @@ Video { root.play(); } } + }, + State { + name: "hidden" + PropertyChanges { + target: mediaThumbnail + visible: false + } + PropertyChanges { + target: videoControls + visible: false + } + PropertyChanges { + target: hidden + visible: true + } } ] @@ -184,7 +205,7 @@ Video { anchors.fill: parent visible: false - source: root.mediaInfo.tempInfo.source + source: visible ? root.mediaInfo.tempInfo.source : "" fillMode: Image.PreserveAspectFit } @@ -225,6 +246,23 @@ Video { } } + Rectangle { + id: hidden + anchors.fill: parent + + visible: false + color: "#BB000000" + + QQC2.Button { + anchors.centerIn: parent + text: i18nc("@action:button", "Show Video") + onClicked: { + root.state = "notDownloaded"; + Controller.markImageShown(root.eventId); + } + } + } + QQC2.Control { id: videoControls property bool stateVisible: false