Przeglądaj źródła

ClipboardHistory: Listen for configuration changes

Resize the clipboard history size dynamically by listening for config
changes. This is currently not ideal since we don't have the callbacks
for `Config::Listener::config_i32_did_change`, so for now we are just
taking the string and attempting to convert it to an int.
Mustafa Quraish 3 lat temu
rodzic
commit
441e601689

+ 21 - 1
Userland/Applets/ClipboardHistory/ClipboardHistoryModel.cpp

@@ -6,9 +6,9 @@
  */
 
 #include "ClipboardHistoryModel.h"
-#include <LibConfig/Client.h>
 #include <AK/NumberFormat.h>
 #include <AK/StringBuilder.h>
+#include <LibConfig/Client.h>
 
 NonnullRefPtr<ClipboardHistoryModel> ClipboardHistoryModel::create()
 {
@@ -121,3 +121,23 @@ void ClipboardHistoryModel::remove_item(int index)
 {
     m_history_items.remove(index);
 }
+
+void ClipboardHistoryModel::config_string_did_change(String const& domain, String const& group, String const& key, String const& value_string)
+{
+    if (domain != "ClipboardHistory" || group != "ClipboardHistory")
+        return;
+
+    // FIXME: Once we can get notified for `i32` changes, we can use that instead of this hack.
+    if (key == "NumHistoryItems") {
+        auto value_or_error = value_string.to_int();
+        if (!value_or_error.has_value())
+            return;
+        auto value = value_or_error.value();
+        if (value < (int)m_history_items.size()) {
+            m_history_items.remove(value, m_history_items.size() - value);
+            invalidate();
+        }
+        m_history_limit = value;
+        return;
+    }
+}

+ 6 - 1
Userland/Applets/ClipboardHistory/ClipboardHistoryModel.h

@@ -8,11 +8,13 @@
 #pragma once
 
 #include <AK/Vector.h>
+#include <LibConfig/Listener.h>
 #include <LibGUI/Clipboard.h>
 #include <LibGUI/Model.h>
 
 class ClipboardHistoryModel final : public GUI::Model
-    , public GUI::Clipboard::ClipboardClient {
+    , public GUI::Clipboard::ClipboardClient
+    , public Config::Listener {
 public:
     static NonnullRefPtr<ClipboardHistoryModel> create();
 
@@ -28,6 +30,9 @@ public:
     const GUI::Clipboard::DataAndType& item_at(int index) const { return m_history_items[index]; }
     void remove_item(int index);
 
+    // ^Config::Listener
+    virtual void config_string_did_change(String const& domain, String const& group, String const& key, String const& value) override;
+
 private:
     ClipboardHistoryModel();
     void add_item(const GUI::Clipboard::DataAndType& item);

+ 1 - 0
Userland/Applets/ClipboardHistory/main.cpp

@@ -25,6 +25,7 @@ int main(int argc, char* argv[])
     auto app = GUI::Application::construct(argc, argv);
 
     Config::pledge_domains("ClipboardHistory");
+    Config::monitor_domain("ClipboardHistory");
 
     if (pledge("stdio recvfd sendfd rpath", nullptr) < 0) {
         perror("pledge");