Daniel Brötzmann pushed to branch master at gajim / gajim


Commits:
2293f439 by wurstsalat at 2023-07-01T17:19:28+02:00
imprv: XMLConsole: Enable browsing sent stanzas in message input

Fixes #5403

- - - - -


2 changed files:

- gajim/data/gui/xml_console.ui
- gajim/gtk/xml_console.py


Changes:

=====================================
gajim/data/gui/xml_console.ui
=====================================
@@ -326,7 +326,7 @@
                 <property name="can-focus">True</property>
                 <property name="receives-default">True</property>
                 <property name="no-show-all">True</property>
-                <signal name="clicked" handler="_on_paste_last" swapped="no"/>
+                <signal name="clicked" handler="_on_paste_previous" 
swapped="no"/>
                 <child>
                   <object class="GtkImage">
                     <property name="visible">True</property>


=====================================
gajim/gtk/xml_console.py
=====================================
@@ -59,7 +59,8 @@ def __init__(self) -> None:
         self._selected_account = 'AllAccounts'
         self._selected_send_account: str | None = None
         self._filter_dialog: SettingsDialog | None = None
-        self._last_stanza: str | None = None
+        self._sent_stanzas = SentSzanzas()
+        self._last_selected_ts = 0
         self._last_search: str = ''
 
         self._presence = True
@@ -199,7 +200,10 @@ def _on_key_press(self, _widget: Gtk.Widget, event: 
Gdk.EventKey) -> None:
             self._on_send()
         if (event.state & Gdk.ModifierType.CONTROL_MASK and
                 event.keyval == Gdk.KEY_Up):
-            self._on_paste_last()
+            self._on_paste_previous()
+        if (event.state & Gdk.ModifierType.CONTROL_MASK and
+                event.keyval == Gdk.KEY_Down):
+            self._on_paste_next()
         if (event.state & Gdk.ModifierType.CONTROL_MASK and
                 event.keyval == Gdk.KEY_f):
             self._ui.search_toggle.set_active(
@@ -274,13 +278,17 @@ def _on_send(self, *args: Any) -> None:
             client = app.get_client(self._selected_send_account)
             assert isinstance(node, nbxmpp.Protocol)
             client.connection.send_stanza(node)
-            self._last_stanza = stanza
+            self._sent_stanzas.add(stanza)
             buffer_.set_text('')
 
-    def _on_paste_last(self, *args: Any) -> None:
+    def _on_paste_previous(self, *args: Any) -> None:
+        buffer_ = self._ui.input_entry.get_buffer()
+        buffer_.set_text(self._sent_stanzas.get_previous())
+        self._ui.input_entry.grab_focus()
+
+    def _on_paste_next(self, *args: Any) -> None:
         buffer_ = self._ui.input_entry.get_buffer()
-        if self._last_stanza is not None:
-            buffer_.set_text(self._last_stanza)
+        buffer_.set_text(self._sent_stanzas.get_next())
         self._ui.input_entry.grab_focus()
 
     def _on_input(self, button: Gtk.ToggleButton) -> None:
@@ -520,3 +528,39 @@ def _print_stanza(self,
 
         if is_at_the_end:
             GLib.idle_add(scroll_to_end, self._ui.scrolled)
+
+
+class SentSzanzas:
+    def __init__(self) -> None:
+        self._sent_stanzas: dict[float, str] = {}
+        self._last_selected_ts = 0
+
+    def add(self, stanza: str) -> None:
+        self._sent_stanzas[time.time()] = stanza
+        self._last_selected_ts = 0
+
+    def get_previous(self) -> str:
+        return self._get(Direction.PREV)
+
+    def get_next(self) -> str:
+        return self._get(Direction.NEXT)
+
+    def _get(self, direction: Direction) -> str:
+        if not self._sent_stanzas:
+            return ''
+
+        if direction == Direction.PREV:
+            for timestamp, stanza in reversed(self._sent_stanzas.items()):
+                if timestamp >= self._last_selected_ts:
+                    continue
+                self._last_selected_ts = timestamp
+                return stanza
+        else:
+            for timestamp, stanza in self._sent_stanzas.items():
+                if timestamp <= self._last_selected_ts:
+                    continue
+                self._last_selected_ts = timestamp
+                return stanza
+
+        self._last_selected_ts = list(self._sent_stanzas.keys())[-1]
+        return self._sent_stanzas[self._last_selected_ts]



View it on GitLab: 
https://dev.gajim.org/gajim/gajim/-/commit/2293f439f7b26dc8414313360cb1ea2bc5952b85

-- 
View it on GitLab: 
https://dev.gajim.org/gajim/gajim/-/commit/2293f439f7b26dc8414313360cb1ea2bc5952b85
You're receiving this email because of your account on dev.gajim.org.


_______________________________________________
Commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to