diff --git a/.ci/format.sh b/.ci/format.sh
index 7f201bb8..4df4282a 100755
--- a/.ci/format.sh
+++ b/.ci/format.sh
@@ -22,6 +22,8 @@ if [ ! -z "$QMLFORMAT_PATH" ]; then
do
qmlformat -i "$f"
done;
+else
+ echo "qmlformat not found; skipping qml formatting"
fi
git diff --exit-code
diff --git a/resources/qml/PrivacyScreen.qml b/resources/qml/PrivacyScreen.qml
index 9fdd35e0..45ae5cb5 100644
--- a/resources/qml/PrivacyScreen.qml
+++ b/resources/qml/PrivacyScreen.qml
@@ -1,13 +1,28 @@
import QtGraphicalEffects 1.0
import QtQuick 2.12
+import im.nheko 1.0
Item {
+ id: privacyScreen
+
property var timelineRoot
- property var imageSource
+ property var imageSource: ""
property int screenTimeout
anchors.fill: parent
+ Connections {
+ target: TimelineManager
+ onFocusChanged: {
+ if (TimelineManager.isWindowFocused) {
+ screenSaverTimer.stop();
+ screenSaver.state = "Invisible";
+ } else {
+ screenSaverTimer.start();
+ }
+ }
+ }
+
Timer {
id: screenSaverTimer
@@ -15,36 +30,98 @@ Item {
running: true
onTriggered: {
timelineRoot.grabToImage(function(result) {
+ screenSaver.state = "Visible";
imageSource = result.url;
- screenSaver.visible = true;
- particles.resume();
}, Qt.size(width, height));
}
}
- // Reset screensaver timer when clicks are received
- MouseArea {
- anchors.fill: parent
- // Pass mouse events through
- propagateComposedEvents: true
- hoverEnabled: true
- onClicked: {
- screenSaverTimer.restart();
- mouse.accepted = false;
- }
- }
-
Rectangle {
id: screenSaver
+ state: "Invisible"
anchors.fill: parent
visible: false
color: "transparent"
+ states: [
+ State {
+ name: "Visible"
+
+ PropertyChanges {
+ target: screenSaver
+ visible: true
+ }
+
+ PropertyChanges {
+ target: screenSaver
+ opacity: 1
+ }
+
+ },
+ State {
+ name: "Invisible"
+
+ PropertyChanges {
+ target: screenSaver
+ opacity: 0
+ }
+
+ PropertyChanges {
+ target: screenSaver
+ visible: false
+ }
+
+ }
+ ]
+ transitions: [
+ Transition {
+ from: "Visible"
+ to: "Invisible"
+
+ SequentialAnimation {
+ NumberAnimation {
+ target: screenSaver
+ property: "opacity"
+ duration: 250
+ easing.type: Easing.InQuad
+ }
+
+ NumberAnimation {
+ target: screenSaver
+ property: "visible"
+ duration: 0
+ }
+
+ }
+
+ },
+ Transition {
+ from: "Invisible"
+ to: "Visible"
+
+ SequentialAnimation {
+ NumberAnimation {
+ target: screenSaver
+ property: "visible"
+ duration: 0
+ }
+
+ NumberAnimation {
+ target: screenSaver
+ property: "opacity"
+ duration: 500
+ easing.type: Easing.InQuad
+ }
+
+ }
+
+ }
+ ]
Image {
id: image
- visible: screenSaver.visible
+ cache: false
anchors.fill: parent
source: imageSource
}
@@ -65,17 +142,6 @@ Item {
radius: 50
}
- MouseArea {
- anchors.fill: parent
- propagateComposedEvents: true
- hoverEnabled: true
- onClicked: {
- screenSaver.visible = false;
- screenSaverTimer.restart();
- mouse.accepted = false;
- }
- }
-
}
}
diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp
index 0377ce30..5bbfa351 100644
--- a/src/ChatPage.cpp
+++ b/src/ChatPage.cpp
@@ -312,6 +312,8 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent)
&ChatPage::initializeMentions,
user_mentions_popup_,
&popups::UserMentions::initializeMentions);
+ connect(
+ this, &ChatPage::chatFocusChanged, view_manager_, &TimelineViewManager::chatFocusChanged);
connect(this, &ChatPage::syncUI, this, [this](const mtx::responses::Rooms &rooms) {
try {
room_list_->cleanupInvites(cache::invites());
diff --git a/src/ChatPage.h b/src/ChatPage.h
index 0516f87d..917bd785 100644
--- a/src/ChatPage.h
+++ b/src/ChatPage.h
@@ -127,7 +127,6 @@ public slots:
void receivedSessionKey(const std::string &room_id, const std::string &session_id);
void decryptDownloadedSecrets(mtx::secret_storage::AesHmacSha2KeyDescription keyDesc,
const SecretsToDecrypt &secrets);
-
signals:
void connectionLost();
void connectionRestored();
@@ -176,6 +175,7 @@ signals:
void retrievedPresence(const QString &statusMsg, mtx::presence::PresenceState state);
void themeChanged();
void decryptSidebarChanged();
+ void chatFocusChanged(const bool focused);
//! Signals for device verificaiton
void receivedDeviceVerificationAccept(
diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp
index 77269008..8fd5c7e2 100644
--- a/src/MainWindow.cpp
+++ b/src/MainWindow.cpp
@@ -130,6 +130,9 @@ MainWindow::MainWindow(QWidget *parent)
SLOT(iconActivated(QSystemTrayIcon::ActivationReason)));
connect(chat_page_, SIGNAL(contentLoaded()), this, SLOT(removeOverlayProgressBar()));
+
+ connect(this, &MainWindow::focusChanged, chat_page_, &ChatPage::chatFocusChanged);
+
connect(
chat_page_, &ChatPage::showUserSettingsPage, this, &MainWindow::showUserSettingsPage);
@@ -204,6 +207,19 @@ MainWindow::resizeEvent(QResizeEvent *event)
QMainWindow::resizeEvent(event);
}
+bool
+MainWindow::event(QEvent *event)
+{
+ auto type = event->type();
+ if (type == QEvent::WindowActivate) {
+ emit focusChanged(true);
+ } else if (type == QEvent::WindowDeactivate) {
+ emit focusChanged(false);
+ }
+
+ return QMainWindow::event(event);
+}
+
void
MainWindow::adjustSideBars()
{
diff --git a/src/MainWindow.h b/src/MainWindow.h
index 0915a849..4560ec65 100644
--- a/src/MainWindow.h
+++ b/src/MainWindow.h
@@ -88,6 +88,7 @@ protected:
void closeEvent(QCloseEvent *event) override;
void resizeEvent(QResizeEvent *event) override;
void showEvent(QShowEvent *event) override;
+ bool event(QEvent *event) override;
private slots:
//! Show or hide the sidebars based on window's size.
@@ -115,6 +116,9 @@ private slots:
virtual void setWindowTitle(int notificationCount);
+signals:
+ void focusChanged(const bool focused);
+
private:
bool loadJdenticonPlugin();
diff --git a/src/UserSettingsPage.cpp b/src/UserSettingsPage.cpp
index a8558e95..c26bf2e9 100644
--- a/src/UserSettingsPage.cpp
+++ b/src/UserSettingsPage.cpp
@@ -836,13 +836,15 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge
decryptSidebar_,
tr("Decrypt the messages shown in the sidebar.\nOnly affects messages in "
"encrypted chats."));
- boxWrap(tr("Encrypted chat privacy screen"),
+ boxWrap(tr("Privacy Screen"),
privacyScreen_,
tr("When the window loses focus, the timeline will\nbe blurred."));
- boxWrap(tr("Privacy screen timeout"),
- privacyScreenTimeout_,
- tr("Set timeout for how long after window loses\nfocus before the screen"
- " will be blurred.\nSet to 0 to blur immediately after focus loss."));
+ boxWrap(
+ tr("Privacy screen timeout"),
+ privacyScreenTimeout_,
+ tr("Set timeout (in seconds) for how long after window loses\nfocus before the screen"
+ " will be blurred.\nSet to 0 to blur immediately after focus loss. Max value of 1 "
+ "hour (3600 seconds)"));
boxWrap(tr("Show buttons in timeline"),
timelineButtonsToggle_,
tr("Show buttons to quickly reply, react or access additional options next to each "
diff --git a/src/timeline/TimelineViewManager.h b/src/timeline/TimelineViewManager.h
index 23a960b8..74128865 100644
--- a/src/timeline/TimelineViewManager.h
+++ b/src/timeline/TimelineViewManager.h
@@ -36,6 +36,8 @@ class TimelineViewManager : public QObject
bool isInitialSync MEMBER isInitialSync_ READ isInitialSync NOTIFY initialSyncChanged)
Q_PROPERTY(
bool isNarrowView MEMBER isNarrowView_ READ isNarrowView NOTIFY narrowViewChanged)
+ Q_PROPERTY(
+ bool isWindowFocused MEMBER isWindowFocused_ READ isWindowFocused NOTIFY focusChanged)
public:
TimelineViewManager(CallManager *callManager, ChatPage *parent = nullptr);
@@ -54,6 +56,7 @@ public:
Q_INVOKABLE TimelineModel *activeTimeline() const { return timeline_; }
Q_INVOKABLE bool isInitialSync() const { return isInitialSync_; }
bool isNarrowView() const { return isNarrowView_; }
+ bool isWindowFocused() const { return isWindowFocused_; }
Q_INVOKABLE void openImageOverlay(QString mxcUrl, QString eventId) const;
Q_INVOKABLE QColor userColor(QString id, QColor background);
Q_INVOKABLE QString escapeEmoji(QString str) const;
@@ -83,11 +86,17 @@ signals:
void inviteUsers(QStringList users);
void showRoomList();
void narrowViewChanged();
+ void focusChanged();
public slots:
void updateReadReceipts(const QString &room_id, const std::vector<QString> &event_ids);
void receivedSessionKey(const std::string &room_id, const std::string &session_id);
void initWithMessages(const std::vector<QString> &roomIds);
+ void chatFocusChanged(bool focused)
+ {
+ isWindowFocused_ = focused;
+ emit focusChanged();
+ }
void setHistoryView(const QString &room_id);
TimelineModel *getHistoryView(const QString &room_id)
@@ -145,8 +154,9 @@ private:
TimelineModel *timeline_ = nullptr;
CallManager *callManager_ = nullptr;
- bool isInitialSync_ = true;
- bool isNarrowView_ = false;
+ bool isInitialSync_ = true;
+ bool isNarrowView_ = false;
+ bool isWindowFocused_ = false;
QHash<QString, QColor> userColors;
|