Prechádzať zdrojové kódy

IRCClient: Post desktop notifications when messaged while inactive

If you receive a channel or query message while the app is inactive,
or while the channel/query is inactive, we now post a desktop
notification so you can learn that something is happening. :^)
Andreas Kling 5 rokov pred
rodič
commit
163812df97

+ 1 - 1
Applications/IRCClient/IRCChannel.cpp

@@ -69,7 +69,7 @@ void IRCChannel::remove_member(const String& name)
 void IRCChannel::add_message(char prefix, const String& name, const String& text, Color color)
 {
     log().add_message(prefix, name, text, color);
-    window().did_add_message();
+    window().did_add_message(name, text);
 }
 
 void IRCChannel::add_message(const String& text, Color color)

+ 1 - 1
Applications/IRCClient/IRCQuery.cpp

@@ -56,7 +56,7 @@ void IRCQuery::dump() const
 void IRCQuery::add_message(char prefix, const String& name, const String& text, Color color)
 {
     log().add_message(prefix, name, text, color);
-    window().did_add_message();
+    window().did_add_message(name, text);
 }
 
 void IRCQuery::say(const String& text)

+ 22 - 1
Applications/IRCClient/IRCWindow.cpp

@@ -28,11 +28,14 @@
 #include "IRCChannel.h"
 #include "IRCChannelMemberListModel.h"
 #include "IRCClient.h"
+#include <AK/StringBuilder.h>
 #include <LibGUI/BoxLayout.h>
+#include <LibGUI/Notification.h>
 #include <LibGUI/Splitter.h>
 #include <LibGUI/TableView.h>
 #include <LibGUI/TextBox.h>
 #include <LibGUI/TextEditor.h>
+#include <LibGUI/Window.h>
 #include <LibWeb/HtmlView.h>
 
 IRCWindow::IRCWindow(IRCClient& client, void* owner, Type type, const String& name)
@@ -90,8 +93,26 @@ bool IRCWindow::is_active() const
     return m_client.current_window() == this;
 }
 
-void IRCWindow::did_add_message()
+void IRCWindow::did_add_message(const String& name, const String& message)
 {
+    if ((!is_active() || !window()->is_active()) && !name.is_null() && !message.is_null()) {
+        auto notification = GUI::Notification::construct();
+
+        if (type() == Type::Channel) {
+            StringBuilder builder;
+            builder.append(name);
+            builder.append(" in ");
+            builder.append(m_name);
+            notification->set_title(builder.to_string());
+        } else {
+            notification->set_title(name);
+        }
+
+        notification->set_title(name);
+        notification->set_text(message);
+        notification->show();
+    }
+
     if (!is_active()) {
         ++m_unread_count;
         m_client.aid_update_window_list();

+ 1 - 1
Applications/IRCClient/IRCWindow.h

@@ -57,7 +57,7 @@ public:
     int unread_count() const;
     void clear_unread_count();
 
-    void did_add_message();
+    void did_add_message(const String& name = {}, const String& message = {});
 
     IRCChannel& channel() { return *(IRCChannel*)m_owner; }
     const IRCChannel& channel() const { return *(const IRCChannel*)m_owner; }