Daniel Brötzmann pushed to branch new-chat-menu at gajim / gajim
Commits:
-
c28bf8bf
by Philipp Hörist at 2023-04-05T20:36:49+02:00
-
3bb3865b
by wurstsalat at 2023-04-07T23:59:35+02:00
-
40b6b3d0
by wurstsalat at 2023-04-07T23:59:35+02:00
-
e94865b3
by wurstsalat at 2023-04-07T23:59:35+02:00
-
080b0b3e
by wurstsalat at 2023-04-07T23:59:35+02:00
-
c4f0095b
by wurstsalat at 2023-04-07T23:59:35+02:00
-
b20d6246
by wurstsalat at 2023-04-07T23:59:35+02:00
-
7325ada8
by wurstsalat at 2023-04-07T23:59:35+02:00
-
6c93ddd3
by wurstsalat at 2023-04-07T23:59:35+02:00
12 changed files:
- debian/control
- gajim/data/gui/chat_banner.ui
- gajim/data/gui/chat_control.ui
- gajim/data/gui/groupchat_roster.ui
- gajim/data/gui/message_actions_box.ui
- gajim/data/style/gajim.css
- gajim/gtk/builder.pyi
- gajim/gtk/chat_banner.py
- gajim/gtk/control.py
- gajim/gtk/groupchat_roster.py
- gajim/gtk/menus.py
- gajim/gtk/message_actions_box.py
Changes:
| ... | ... | @@ -12,7 +12,7 @@ Build-Depends: |
| 12 | 12 | python3-css-parser,
|
| 13 | 13 | python3-gi,
|
| 14 | 14 | python3-gi-cairo,
|
| 15 | - python3-nbxmpp-nightly (>=20230206),
|
|
| 15 | + python3-nbxmpp-nightly (>=20230405),
|
|
| 16 | 16 | python3-setuptools,
|
| 17 | 17 | python3-packaging,
|
| 18 | 18 | python3-cryptography (>=3.4.8),
|
| ... | ... | @@ -34,7 +34,7 @@ Depends: |
| 34 | 34 | python3 (>= 3.10),
|
| 35 | 35 | python3-gi (>= 3.42.0),
|
| 36 | 36 | python3-gi-cairo (>= 1.14.0~),
|
| 37 | - python3-nbxmpp-nightly (>=20230123),
|
|
| 37 | + python3-nbxmpp-nightly (>=20230405),
|
|
| 38 | 38 | gir1.2-pango-1.0 (>= 1.50.0),
|
| 39 | 39 | gir1.2-gtk-3.0 (>= 3.24.30),
|
| 40 | 40 | gir1.2-gtksource-4,
|
| ... | ... | @@ -2,6 +2,70 @@ |
| 2 | 2 | <!-- Generated with glade 3.40.0 -->
|
| 3 | 3 | <interface>
|
| 4 | 4 | <requires lib="gtk+" version="3.24"/>
|
| 5 | + <object class="GtkPopover" id="share_popover">
|
|
| 6 | + <property name="can-focus">False</property>
|
|
| 7 | + <child>
|
|
| 8 | + <object class="GtkBox">
|
|
| 9 | + <property name="visible">True</property>
|
|
| 10 | + <property name="can-focus">False</property>
|
|
| 11 | + <property name="orientation">vertical</property>
|
|
| 12 | + <property name="spacing">6</property>
|
|
| 13 | + <child>
|
|
| 14 | + <object class="GtkBox">
|
|
| 15 | + <property name="visible">True</property>
|
|
| 16 | + <property name="can-focus">False</property>
|
|
| 17 | + <property name="spacing">12</property>
|
|
| 18 | + <child>
|
|
| 19 | + <object class="GtkLabel" id="jid_label">
|
|
| 20 | + <property name="visible">True</property>
|
|
| 21 | + <property name="can-focus">False</property>
|
|
| 22 | + <property name="justify">center</property>
|
|
| 23 | + <property name="wrap">True</property>
|
|
| 24 | + <property name="wrap-mode">word-char</property>
|
|
| 25 | + <property name="max-width-chars">30</property>
|
|
| 26 | + </object>
|
|
| 27 | + <packing>
|
|
| 28 | + <property name="expand">True</property>
|
|
| 29 | + <property name="fill">True</property>
|
|
| 30 | + <property name="position">0</property>
|
|
| 31 | + </packing>
|
|
| 32 | + </child>
|
|
| 33 | + <child>
|
|
| 34 | + <object class="GtkButton">
|
|
| 35 | + <property name="visible">True</property>
|
|
| 36 | + <property name="can-focus">True</property>
|
|
| 37 | + <property name="receives-default">True</property>
|
|
| 38 | + <property name="tooltip-text" translatable="yes">Copy to clipboard</property>
|
|
| 39 | + <property name="valign">center</property>
|
|
| 40 | + <signal name="clicked" handler="_on_copy_jid_clicked" swapped="no"/>
|
|
| 41 | + <child>
|
|
| 42 | + <object class="GtkImage">
|
|
| 43 | + <property name="visible">True</property>
|
|
| 44 | + <property name="can-focus">False</property>
|
|
| 45 | + <property name="icon-name">edit-copy-symbolic</property>
|
|
| 46 | + </object>
|
|
| 47 | + </child>
|
|
| 48 | + </object>
|
|
| 49 | + <packing>
|
|
| 50 | + <property name="expand">False</property>
|
|
| 51 | + <property name="fill">True</property>
|
|
| 52 | + <property name="pack-type">end</property>
|
|
| 53 | + <property name="position">1</property>
|
|
| 54 | + </packing>
|
|
| 55 | + </child>
|
|
| 56 | + </object>
|
|
| 57 | + <packing>
|
|
| 58 | + <property name="expand">False</property>
|
|
| 59 | + <property name="fill">True</property>
|
|
| 60 | + <property name="position">1</property>
|
|
| 61 | + </packing>
|
|
| 62 | + </child>
|
|
| 63 | + <style>
|
|
| 64 | + <class name="padding-12"/>
|
|
| 65 | + </style>
|
|
| 66 | + </object>
|
|
| 67 | + </child>
|
|
| 68 | + </object>
|
|
| 5 | 69 | <object class="GtkBox" id="banner_box">
|
| 6 | 70 | <property name="visible">True</property>
|
| 7 | 71 | <property name="can-focus">False</property>
|
| ... | ... | @@ -23,51 +87,39 @@ |
| 23 | 87 | <property name="can-focus">False</property>
|
| 24 | 88 | <property name="spacing">12</property>
|
| 25 | 89 | <child>
|
| 26 | - <object class="GtkBox">
|
|
| 90 | + <object class="GtkSeparator">
|
|
| 27 | 91 | <property name="visible">True</property>
|
| 28 | 92 | <property name="can-focus">False</property>
|
| 93 | + <property name="margin-top">12</property>
|
|
| 94 | + <property name="margin-bottom">12</property>
|
|
| 95 | + </object>
|
|
| 96 | + <packing>
|
|
| 97 | + <property name="expand">False</property>
|
|
| 98 | + <property name="fill">True</property>
|
|
| 99 | + <property name="pack-type">end</property>
|
|
| 100 | + <property name="position">0</property>
|
|
| 101 | + </packing>
|
|
| 102 | + </child>
|
|
| 103 | + <child>
|
|
| 104 | + <object class="GtkMenuButton" id="chat_menu_button">
|
|
| 105 | + <property name="visible">True</property>
|
|
| 106 | + <property name="can-focus">True</property>
|
|
| 107 | + <property name="focus-on-click">False</property>
|
|
| 108 | + <property name="receives-default">True</property>
|
|
| 29 | 109 | <property name="valign">center</property>
|
| 30 | - <property name="orientation">vertical</property>
|
|
| 31 | - <property name="spacing">3</property>
|
|
| 110 | + <property name="margin-end">6</property>
|
|
| 32 | 111 | <child>
|
| 33 | - <object class="GtkLabel" id="name_label">
|
|
| 112 | + <object class="GtkImage">
|
|
| 34 | 113 | <property name="visible">True</property>
|
| 35 | - <property name="can-focus">True</property>
|
|
| 36 | - <property name="selectable">True</property>
|
|
| 37 | - <property name="halign">start</property>
|
|
| 38 | - <property name="hexpand">True</property>
|
|
| 39 | - <property name="ellipsize">end</property>
|
|
| 40 | - <property name="single-line-mode">True</property>
|
|
| 41 | - <property name="xalign">0</property>
|
|
| 42 | - <style>
|
|
| 43 | - <class name="large-header"/>
|
|
| 44 | - </style>
|
|
| 45 | - </object>
|
|
| 46 | - <packing>
|
|
| 47 | - <property name="expand">False</property>
|
|
| 48 | - <property name="fill">True</property>
|
|
| 49 | - <property name="position">0</property>
|
|
| 50 | - </packing>
|
|
| 51 | - </child>
|
|
| 52 | - <child>
|
|
| 53 | - <object class="GtkImage" id="phone_image">
|
|
| 54 | 114 | <property name="can-focus">False</property>
|
| 55 | - <property name="no-show-all">True</property>
|
|
| 56 | - <property name="tooltip-text" translatable="yes">The last message was written on a mobile client</property>
|
|
| 57 | - <property name="halign">start</property>
|
|
| 58 | - <property name="margin-end">4</property>
|
|
| 59 | - <property name="icon-name">phone-apple-iphone-symbolic</property>
|
|
| 115 | + <property name="icon-name">view-more-symbolic</property>
|
|
| 60 | 116 | </object>
|
| 61 | - <packing>
|
|
| 62 | - <property name="expand">False</property>
|
|
| 63 | - <property name="fill">True</property>
|
|
| 64 | - <property name="position">1</property>
|
|
| 65 | - </packing>
|
|
| 66 | 117 | </child>
|
| 67 | 118 | </object>
|
| 68 | 119 | <packing>
|
| 69 | 120 | <property name="expand">False</property>
|
| 70 | 121 | <property name="fill">True</property>
|
| 122 | + <property name="pack-type">end</property>
|
|
| 71 | 123 | <property name="position">0</property>
|
| 72 | 124 | </packing>
|
| 73 | 125 | </child>
|
| ... | ... | @@ -78,7 +130,6 @@ |
| 78 | 130 | <property name="no-show-all">True</property>
|
| 79 | 131 | <property name="tooltip-text" translatable="yes">Toggle participants list</property>
|
| 80 | 132 | <property name="valign">center</property>
|
| 81 | - <property name="relief">none</property>
|
|
| 82 | 133 | <signal name="clicked" handler="_on_toggle_roster_clicked" swapped="no"/>
|
| 83 | 134 | <child>
|
| 84 | 135 | <object class="GtkBox">
|
| ... | ... | @@ -109,20 +160,163 @@ |
| 109 | 160 | <property name="position">1</property>
|
| 110 | 161 | </packing>
|
| 111 | 162 | </child>
|
| 163 | + </object>
|
|
| 164 | + </child>
|
|
| 165 | + </object>
|
|
| 166 | + <packing>
|
|
| 167 | + <property name="expand">False</property>
|
|
| 168 | + <property name="fill">True</property>
|
|
| 169 | + <property name="pack-type">end</property>
|
|
| 170 | + <property name="position">2</property>
|
|
| 171 | + </packing>
|
|
| 172 | + </child>
|
|
| 173 | + <child>
|
|
| 174 | + <object class="GtkButton" id="contact_info_button">
|
|
| 175 | + <property name="visible">True</property>
|
|
| 176 | + <property name="can-focus">True</property>
|
|
| 177 | + <property name="receives-default">True</property>
|
|
| 178 | + <property name="tooltip-text" translatable="yes">Contact Details and Settings</property>
|
|
| 179 | + <property name="valign">center</property>
|
|
| 180 | + <property name="action-name">win.show-contact-info</property>
|
|
| 181 | + <child>
|
|
| 182 | + <object class="GtkImage">
|
|
| 183 | + <property name="visible">True</property>
|
|
| 184 | + <property name="can-focus">False</property>
|
|
| 185 | + <property name="icon-name">user-info-symbolic</property>
|
|
| 186 | + </object>
|
|
| 187 | + </child>
|
|
| 188 | + </object>
|
|
| 189 | + <packing>
|
|
| 190 | + <property name="expand">False</property>
|
|
| 191 | + <property name="fill">True</property>
|
|
| 192 | + <property name="pack-type">end</property>
|
|
| 193 | + <property name="position">3</property>
|
|
| 194 | + </packing>
|
|
| 195 | + </child>
|
|
| 196 | + <child>
|
|
| 197 | + <object class="GtkButton">
|
|
| 198 | + <property name="visible">True</property>
|
|
| 199 | + <property name="can-focus">True</property>
|
|
| 200 | + <property name="receives-default">True</property>
|
|
| 201 | + <property name="tooltip-text" translatable="yes">Search…</property>
|
|
| 202 | + <property name="valign">center</property>
|
|
| 203 | + <property name="action-name">win.search-history</property>
|
|
| 204 | + <child>
|
|
| 205 | + <object class="GtkImage">
|
|
| 206 | + <property name="visible">True</property>
|
|
| 207 | + <property name="can-focus">False</property>
|
|
| 208 | + <property name="icon-name">system-search-symbolic</property>
|
|
| 209 | + </object>
|
|
| 210 | + </child>
|
|
| 211 | + </object>
|
|
| 212 | + <packing>
|
|
| 213 | + <property name="expand">False</property>
|
|
| 214 | + <property name="fill">True</property>
|
|
| 215 | + <property name="pack-type">end</property>
|
|
| 216 | + <property name="position">4</property>
|
|
| 217 | + </packing>
|
|
| 218 | + </child>
|
|
| 219 | + <child>
|
|
| 220 | + <object class="GtkMenuButton" id="share_menu_button">
|
|
| 221 | + <property name="visible">True</property>
|
|
| 222 | + <property name="sensitive">False</property>
|
|
| 223 | + <property name="can-focus">True</property>
|
|
| 224 | + <property name="focus-on-click">False</property>
|
|
| 225 | + <property name="receives-default">True</property>
|
|
| 226 | + <property name="tooltip-text" translatable="yes">Share Contact…</property>
|
|
| 227 | + <property name="valign">center</property>
|
|
| 228 | + <property name="popover">share_popover</property>
|
|
| 229 | + <child>
|
|
| 230 | + <object class="GtkImage">
|
|
| 231 | + <property name="visible">True</property>
|
|
| 232 | + <property name="can-focus">False</property>
|
|
| 233 | + <property name="icon-name">emblem-shared-symbolic</property>
|
|
| 234 | + </object>
|
|
| 235 | + </child>
|
|
| 236 | + </object>
|
|
| 237 | + <packing>
|
|
| 238 | + <property name="expand">False</property>
|
|
| 239 | + <property name="fill">True</property>
|
|
| 240 | + <property name="pack-type">end</property>
|
|
| 241 | + <property name="position">5</property>
|
|
| 242 | + </packing>
|
|
| 243 | + </child>
|
|
| 244 | + <child>
|
|
| 245 | + <object class="GtkBox">
|
|
| 246 | + <property name="visible">True</property>
|
|
| 247 | + <property name="can-focus">False</property>
|
|
| 248 | + <property name="valign">center</property>
|
|
| 249 | + <property name="orientation">vertical</property>
|
|
| 250 | + <child>
|
|
| 251 | + <object class="GtkLabel" id="name_label">
|
|
| 252 | + <property name="visible">True</property>
|
|
| 253 | + <property name="can-focus">True</property>
|
|
| 254 | + <property name="halign">start</property>
|
|
| 255 | + <property name="hexpand">True</property>
|
|
| 256 | + <property name="selectable">True</property>
|
|
| 257 | + <property name="ellipsize">end</property>
|
|
| 258 | + <property name="single-line-mode">True</property>
|
|
| 259 | + <property name="xalign">0</property>
|
|
| 112 | 260 | <style>
|
| 113 | - <class name="dim-label"/>
|
|
| 261 | + <class name="large-header"/>
|
|
| 114 | 262 | </style>
|
| 115 | 263 | </object>
|
| 264 | + <packing>
|
|
| 265 | + <property name="expand">False</property>
|
|
| 266 | + <property name="fill">True</property>
|
|
| 267 | + <property name="position">0</property>
|
|
| 268 | + </packing>
|
|
| 269 | + </child>
|
|
| 270 | + <child>
|
|
| 271 | + <object class="GtkBox">
|
|
| 272 | + <property name="visible">True</property>
|
|
| 273 | + <property name="can-focus">False</property>
|
|
| 274 | + <property name="spacing">12</property>
|
|
| 275 | + <child>
|
|
| 276 | + <object class="GtkImage" id="phone_image">
|
|
| 277 | + <property name="can-focus">False</property>
|
|
| 278 | + <property name="no-show-all">True</property>
|
|
| 279 | + <property name="tooltip-text" translatable="yes">The last message was written on a mobile client</property>
|
|
| 280 | + <property name="halign">start</property>
|
|
| 281 | + <property name="margin-end">4</property>
|
|
| 282 | + <property name="icon-name">phone-apple-iphone-symbolic</property>
|
|
| 283 | + </object>
|
|
| 284 | + <packing>
|
|
| 285 | + <property name="expand">False</property>
|
|
| 286 | + <property name="fill">True</property>
|
|
| 287 | + <property name="position">0</property>
|
|
| 288 | + </packing>
|
|
| 289 | + </child>
|
|
| 290 | + <child>
|
|
| 291 | + <object class="GtkLabel" id="description_label">
|
|
| 292 | + <property name="visible">True</property>
|
|
| 293 | + <property name="can-focus">False</property>
|
|
| 294 | + <property name="ellipsize">end</property>
|
|
| 295 | + <property name="single-line-mode">True</property>
|
|
| 296 | + <property name="max-width-chars">30</property>
|
|
| 297 | + <property name="xalign">0</property>
|
|
| 298 | + <style>
|
|
| 299 | + <class name="dim-label"/>
|
|
| 300 | + </style>
|
|
| 301 | + </object>
|
|
| 302 | + <packing>
|
|
| 303 | + <property name="expand">False</property>
|
|
| 304 | + <property name="fill">True</property>
|
|
| 305 | + <property name="position">1</property>
|
|
| 306 | + </packing>
|
|
| 307 | + </child>
|
|
| 308 | + </object>
|
|
| 309 | + <packing>
|
|
| 310 | + <property name="expand">False</property>
|
|
| 311 | + <property name="fill">True</property>
|
|
| 312 | + <property name="position">1</property>
|
|
| 313 | + </packing>
|
|
| 116 | 314 | </child>
|
| 117 | - <style>
|
|
| 118 | - <class name="flat"/>
|
|
| 119 | - </style>
|
|
| 120 | 315 | </object>
|
| 121 | 316 | <packing>
|
| 122 | 317 | <property name="expand">False</property>
|
| 123 | 318 | <property name="fill">True</property>
|
| 124 | - <property name="pack-type">end</property>
|
|
| 125 | - <property name="position">0</property>
|
|
| 319 | + <property name="position">6</property>
|
|
| 126 | 320 | </packing>
|
| 127 | 321 | </child>
|
| 128 | 322 | <child>
|
| ... | ... | @@ -141,7 +335,7 @@ |
| 141 | 335 | <property name="expand">False</property>
|
| 142 | 336 | <property name="fill">True</property>
|
| 143 | 337 | <property name="pack-type">end</property>
|
| 144 | - <property name="position">1</property>
|
|
| 338 | + <property name="position">6</property>
|
|
| 145 | 339 | </packing>
|
| 146 | 340 | </child>
|
| 147 | 341 | <child>
|
| ... | ... | @@ -192,7 +386,7 @@ |
| 192 | 386 | <property name="expand">False</property>
|
| 193 | 387 | <property name="fill">True</property>
|
| 194 | 388 | <property name="pack-type">end</property>
|
| 195 | - <property name="position">3</property>
|
|
| 389 | + <property name="position">7</property>
|
|
| 196 | 390 | </packing>
|
| 197 | 391 | </child>
|
| 198 | 392 | </object>
|
| 1 | 1 | <?xml version="1.0" encoding="UTF-8"?>
|
| 2 | -<!-- Generated with glade 3.38.2 -->
|
|
| 2 | +<!-- Generated with glade 3.40.0 -->
|
|
| 3 | 3 | <interface>
|
| 4 | 4 | <requires lib="gtk+" version="3.24"/>
|
| 5 | 5 | <object class="GtkBox" id="control_box">
|
| 6 | 6 | <property name="can-focus">True</property>
|
| 7 | 7 | <child>
|
| 8 | - <object class="GtkBox" id="conv_view_box">
|
|
| 8 | + <object class="GtkPaned" id="conv_view_paned">
|
|
| 9 | + <property name="visible">True</property>
|
|
| 9 | 10 | <property name="can-focus">True</property>
|
| 10 | - <property name="spacing">3</property>
|
|
| 11 | 11 | <child>
|
| 12 | 12 | <object class="GtkOverlay" id="conv_view_overlay">
|
| 13 | 13 | <property name="visible">True</property>
|
| ... | ... | @@ -18,16 +18,18 @@ |
| 18 | 18 | </child>
|
| 19 | 19 | </object>
|
| 20 | 20 | <packing>
|
| 21 | - <property name="expand">False</property>
|
|
| 22 | - <property name="fill">True</property>
|
|
| 23 | - <property name="position">0</property>
|
|
| 21 | + <property name="resize">True</property>
|
|
| 22 | + <property name="shrink">True</property>
|
|
| 24 | 23 | </packing>
|
| 25 | 24 | </child>
|
| 25 | + <child>
|
|
| 26 | + <placeholder/>
|
|
| 27 | + </child>
|
|
| 26 | 28 | </object>
|
| 27 | 29 | <packing>
|
| 28 | 30 | <property name="expand">True</property>
|
| 29 | 31 | <property name="fill">True</property>
|
| 30 | - <property name="position">0</property>
|
|
| 32 | + <property name="position">1</property>
|
|
| 31 | 33 | </packing>
|
| 32 | 34 | </child>
|
| 33 | 35 | </object>
|
| ... | ... | @@ -2,74 +2,167 @@ |
| 2 | 2 | <!-- Generated with glade 3.40.0 -->
|
| 3 | 3 | <interface>
|
| 4 | 4 | <requires lib="gtk+" version="3.20"/>
|
| 5 | - <object class="GtkTreeStore" id="participant_store">
|
|
| 6 | - <columns>
|
|
| 7 | - <!-- column-name Avatar -->
|
|
| 8 | - <column type="CairoGObjectSurface"/>
|
|
| 9 | - <!-- column-name Text -->
|
|
| 10 | - <column type="gchararray"/>
|
|
| 11 | - <!-- column-name IsContact -->
|
|
| 12 | - <column type="gboolean"/>
|
|
| 13 | - <!-- column-name GroupOrNickname -->
|
|
| 14 | - <column type="gchararray"/>
|
|
| 15 | - </columns>
|
|
| 16 | - </object>
|
|
| 17 | - <object class="GtkScrolledWindow" id="scrolled">
|
|
| 5 | + <object class="GtkBox" id="box">
|
|
| 18 | 6 | <property name="visible">True</property>
|
| 19 | - <property name="can-focus">True</property>
|
|
| 20 | - <property name="hscrollbar-policy">never</property>
|
|
| 7 | + <property name="can-focus">False</property>
|
|
| 8 | + <property name="orientation">vertical</property>
|
|
| 9 | + <property name="spacing">6</property>
|
|
| 21 | 10 | <child>
|
| 22 | - <object class="GtkTreeView" id="roster_treeview">
|
|
| 11 | + <object class="GtkBox">
|
|
| 23 | 12 | <property name="visible">True</property>
|
| 24 | - <property name="can-focus">True</property>
|
|
| 25 | - <property name="headers-visible">False</property>
|
|
| 26 | - <property name="expander-column">expander</property>
|
|
| 27 | - <property name="search-column">1</property>
|
|
| 28 | - <signal name="button-press-event" handler="_on_roster_button_press_event" swapped="no"/>
|
|
| 29 | - <signal name="focus-out-event" handler="_on_focus_out" swapped="no"/>
|
|
| 30 | - <signal name="query-tooltip" handler="_query_tooltip" swapped="no"/>
|
|
| 31 | - <signal name="row-activated" handler="_on_roster_row_activated" swapped="no"/>
|
|
| 32 | - <child internal-child="selection">
|
|
| 33 | - <object class="GtkTreeSelection"/>
|
|
| 13 | + <property name="can-focus">False</property>
|
|
| 14 | + <property name="margin-start">6</property>
|
|
| 15 | + <property name="margin-end">6</property>
|
|
| 16 | + <property name="margin-top">12</property>
|
|
| 17 | + <property name="orientation">vertical</property>
|
|
| 18 | + <property name="spacing">12</property>
|
|
| 19 | + <child>
|
|
| 20 | + <object class="GtkButton">
|
|
| 21 | + <property name="visible">True</property>
|
|
| 22 | + <property name="can-focus">True</property>
|
|
| 23 | + <property name="receives-default">True</property>
|
|
| 24 | + <property name="halign">center</property>
|
|
| 25 | + <property name="action-name">win.muc-invite</property>
|
|
| 26 | + <child>
|
|
| 27 | + <object class="GtkBox">
|
|
| 28 | + <property name="visible">True</property>
|
|
| 29 | + <property name="can-focus">False</property>
|
|
| 30 | + <property name="spacing">12</property>
|
|
| 31 | + <child>
|
|
| 32 | + <object class="GtkImage">
|
|
| 33 | + <property name="visible">True</property>
|
|
| 34 | + <property name="can-focus">False</property>
|
|
| 35 | + <property name="icon-name">contact-new-symbolic</property>
|
|
| 36 | + </object>
|
|
| 37 | + <packing>
|
|
| 38 | + <property name="expand">False</property>
|
|
| 39 | + <property name="fill">True</property>
|
|
| 40 | + <property name="position">0</property>
|
|
| 41 | + </packing>
|
|
| 42 | + </child>
|
|
| 43 | + <child>
|
|
| 44 | + <object class="GtkLabel">
|
|
| 45 | + <property name="visible">True</property>
|
|
| 46 | + <property name="can-focus">False</property>
|
|
| 47 | + <property name="label" translatable="yes">Invite someone…</property>
|
|
| 48 | + </object>
|
|
| 49 | + <packing>
|
|
| 50 | + <property name="expand">False</property>
|
|
| 51 | + <property name="fill">True</property>
|
|
| 52 | + <property name="position">1</property>
|
|
| 53 | + </packing>
|
|
| 54 | + </child>
|
|
| 55 | + </object>
|
|
| 56 | + </child>
|
|
| 57 | + </object>
|
|
| 58 | + <packing>
|
|
| 59 | + <property name="expand">False</property>
|
|
| 60 | + <property name="fill">True</property>
|
|
| 61 | + <property name="position">0</property>
|
|
| 62 | + </packing>
|
|
| 34 | 63 | </child>
|
| 35 | 64 | <child>
|
| 36 | - <object class="GtkTreeViewColumn" id="contact_column">
|
|
| 37 | - <property name="sizing">fixed</property>
|
|
| 38 | - <property name="fixed-width">210</property>
|
|
| 39 | - <property name="title">avatar</property>
|
|
| 40 | - <property name="expand">True</property>
|
|
| 65 | + <object class="GtkSearchEntry" id="search_entry">
|
|
| 66 | + <property name="visible">True</property>
|
|
| 67 | + <property name="can-focus">True</property>
|
|
| 68 | + <property name="primary-icon-name">edit-find-symbolic</property>
|
|
| 69 | + <property name="primary-icon-activatable">False</property>
|
|
| 70 | + <property name="primary-icon-sensitive">False</property>
|
|
| 71 | + <property name="placeholder-text" translatable="yes">Search Participants…</property>
|
|
| 72 | + <signal name="changed" handler="_on_search_changed" swapped="no"/>
|
|
| 73 | + </object>
|
|
| 74 | + <packing>
|
|
| 75 | + <property name="expand">False</property>
|
|
| 76 | + <property name="fill">True</property>
|
|
| 77 | + <property name="position">1</property>
|
|
| 78 | + </packing>
|
|
| 79 | + </child>
|
|
| 80 | + </object>
|
|
| 81 | + <packing>
|
|
| 82 | + <property name="expand">False</property>
|
|
| 83 | + <property name="fill">True</property>
|
|
| 84 | + <property name="position">0</property>
|
|
| 85 | + </packing>
|
|
| 86 | + </child>
|
|
| 87 | + <child>
|
|
| 88 | + <placeholder/>
|
|
| 89 | + </child>
|
|
| 90 | + <child>
|
|
| 91 | + <object class="GtkScrolledWindow" id="scrolled">
|
|
| 92 | + <property name="visible">True</property>
|
|
| 93 | + <property name="can-focus">True</property>
|
|
| 94 | + <property name="hscrollbar-policy">never</property>
|
|
| 95 | + <child>
|
|
| 96 | + <object class="GtkTreeView" id="roster_treeview">
|
|
| 97 | + <property name="visible">True</property>
|
|
| 98 | + <property name="can-focus">True</property>
|
|
| 99 | + <property name="headers-visible">False</property>
|
|
| 100 | + <property name="expander-column">expander</property>
|
|
| 101 | + <property name="enable-search">False</property>
|
|
| 102 | + <signal name="button-press-event" handler="_on_roster_button_press_event" swapped="no"/>
|
|
| 103 | + <signal name="focus-out-event" handler="_on_focus_out" swapped="no"/>
|
|
| 104 | + <signal name="query-tooltip" handler="_query_tooltip" swapped="no"/>
|
|
| 105 | + <signal name="row-activated" handler="_on_roster_row_activated" swapped="no"/>
|
|
| 106 | + <child internal-child="selection">
|
|
| 107 | + <object class="GtkTreeSelection"/>
|
|
| 108 | + </child>
|
|
| 41 | 109 | <child>
|
| 42 | - <object class="GtkCellRendererPixbuf" id="avatar_renderer">
|
|
| 43 | - <property name="width">40</property>
|
|
| 44 | - <property name="ypad">3</property>
|
|
| 45 | - <property name="xalign">0</property>
|
|
| 110 | + <object class="GtkTreeViewColumn" id="contact_column">
|
|
| 111 | + <property name="sizing">fixed</property>
|
|
| 112 | + <property name="fixed-width">210</property>
|
|
| 113 | + <property name="title">avatar</property>
|
|
| 114 | + <property name="expand">True</property>
|
|
| 115 | + <child>
|
|
| 116 | + <object class="GtkCellRendererPixbuf" id="avatar_renderer">
|
|
| 117 | + <property name="width">40</property>
|
|
| 118 | + <property name="ypad">3</property>
|
|
| 119 | + <property name="xalign">0</property>
|
|
| 120 | + </object>
|
|
| 121 | + <attributes>
|
|
| 122 | + <attribute name="visible">2</attribute>
|
|
| 123 | + <attribute name="surface">0</attribute>
|
|
| 124 | + </attributes>
|
|
| 125 | + </child>
|
|
| 126 | + <child>
|
|
| 127 | + <object class="GtkCellRendererText" id="text_renderer">
|
|
| 128 | + <property name="ellipsize">end</property>
|
|
| 129 | + </object>
|
|
| 130 | + <attributes>
|
|
| 131 | + <attribute name="markup">1</attribute>
|
|
| 132 | + </attributes>
|
|
| 133 | + </child>
|
|
| 46 | 134 | </object>
|
| 47 | - <attributes>
|
|
| 48 | - <attribute name="visible">2</attribute>
|
|
| 49 | - <attribute name="surface">0</attribute>
|
|
| 50 | - </attributes>
|
|
| 51 | 135 | </child>
|
| 52 | 136 | <child>
|
| 53 | - <object class="GtkCellRendererText" id="text_renderer">
|
|
| 54 | - <property name="ellipsize">end</property>
|
|
| 137 | + <object class="GtkTreeViewColumn" id="expander">
|
|
| 138 | + <property name="visible">False</property>
|
|
| 139 | + <property name="sizing">fixed</property>
|
|
| 140 | + <property name="title">expander</property>
|
|
| 55 | 141 | </object>
|
| 56 | - <attributes>
|
|
| 57 | - <attribute name="markup">1</attribute>
|
|
| 58 | - </attributes>
|
|
| 59 | 142 | </child>
|
| 60 | 143 | </object>
|
| 61 | 144 | </child>
|
| 62 | - <child>
|
|
| 63 | - <object class="GtkTreeViewColumn" id="expander">
|
|
| 64 | - <property name="visible">False</property>
|
|
| 65 | - <property name="sizing">fixed</property>
|
|
| 66 | - <property name="title">expander</property>
|
|
| 67 | - </object>
|
|
| 68 | - </child>
|
|
| 69 | 145 | </object>
|
| 146 | + <packing>
|
|
| 147 | + <property name="expand">True</property>
|
|
| 148 | + <property name="fill">True</property>
|
|
| 149 | + <property name="position">2</property>
|
|
| 150 | + </packing>
|
|
| 70 | 151 | </child>
|
| 71 | 152 | <style>
|
| 72 | 153 | <class name="groupchat-roster"/>
|
| 73 | 154 | </style>
|
| 74 | 155 | </object>
|
| 156 | + <object class="GtkTreeStore" id="participant_store">
|
|
| 157 | + <columns>
|
|
| 158 | + <!-- column-name Avatar -->
|
|
| 159 | + <column type="CairoGObjectSurface"/>
|
|
| 160 | + <!-- column-name Text -->
|
|
| 161 | + <column type="gchararray"/>
|
|
| 162 | + <!-- column-name IsContact -->
|
|
| 163 | + <column type="gboolean"/>
|
|
| 164 | + <!-- column-name GroupOrNickname -->
|
|
| 165 | + <column type="gchararray"/>
|
|
| 166 | + </columns>
|
|
| 167 | + </object>
|
|
| 75 | 168 | </interface> |
| ... | ... | @@ -9,55 +9,7 @@ |
| 9 | 9 | <property name="hexpand">True</property>
|
| 10 | 10 | <property name="spacing">2</property>
|
| 11 | 11 | <child>
|
| 12 | - <object class="GtkButton" id="quick_invite_button">
|
|
| 13 | - <property name="visible">True</property>
|
|
| 14 | - <property name="can-focus">True</property>
|
|
| 15 | - <property name="receives-default">True</property>
|
|
| 16 | - <property name="tooltip-text" translatable="yes">Invite Contacts…</property>
|
|
| 17 | - <property name="action-name">win.invite</property>
|
|
| 18 | - <property name="relief">none</property>
|
|
| 19 | - <child>
|
|
| 20 | - <object class="GtkImage">
|
|
| 21 | - <property name="visible">True</property>
|
|
| 22 | - <property name="can-focus">False</property>
|
|
| 23 | - <property name="icon-name">list-add-symbolic</property>
|
|
| 24 | - </object>
|
|
| 25 | - </child>
|
|
| 26 | - <style>
|
|
| 27 | - <class name="message-actions-box-button"/>
|
|
| 28 | - <class name="flat"/>
|
|
| 29 | - </style>
|
|
| 30 | - </object>
|
|
| 31 | - <packing>
|
|
| 32 | - <property name="expand">False</property>
|
|
| 33 | - <property name="fill">True</property>
|
|
| 34 | - <property name="pack-type">end</property>
|
|
| 35 | - <property name="position">0</property>
|
|
| 36 | - </packing>
|
|
| 37 | - </child>
|
|
| 38 | - <child>
|
|
| 39 | - <object class="GtkMenuButton" id="settings_menu">
|
|
| 40 | - <property name="visible">True</property>
|
|
| 41 | - <property name="can-focus">True</property>
|
|
| 42 | - <property name="receives-default">True</property>
|
|
| 43 | - <property name="relief">none</property>
|
|
| 44 | - <child>
|
|
| 45 | - <object class="GtkImage">
|
|
| 46 | - <property name="visible">True</property>
|
|
| 47 | - <property name="can-focus">False</property>
|
|
| 48 | - <property name="icon-name">open-menu-symbolic</property>
|
|
| 49 | - </object>
|
|
| 50 | - </child>
|
|
| 51 | - <style>
|
|
| 52 | - <class name="message-actions-box-button"/>
|
|
| 53 | - </style>
|
|
| 54 | - </object>
|
|
| 55 | - <packing>
|
|
| 56 | - <property name="expand">False</property>
|
|
| 57 | - <property name="fill">True</property>
|
|
| 58 | - <property name="pack-type">end</property>
|
|
| 59 | - <property name="position">0</property>
|
|
| 60 | - </packing>
|
|
| 12 | + <placeholder/>
|
|
| 61 | 13 | </child>
|
| 62 | 14 | <child>
|
| 63 | 15 | <object class="GtkButton" id="encryption_details_button">
|
| ... | ... | @@ -216,20 +168,17 @@ |
| 216 | 168 | <property name="position">7</property>
|
| 217 | 169 | </packing>
|
| 218 | 170 | </child>
|
| 219 | - <child>
|
|
| 220 | - <placeholder/>
|
|
| 221 | - </child>
|
|
| 222 | 171 | <child>
|
| 223 | 172 | <object class="GtkScrolledWindow" id="input_scrolled">
|
| 224 | 173 | <property name="visible">True</property>
|
| 225 | 174 | <property name="can-focus">True</property>
|
| 226 | 175 | <property name="margin-start">3</property>
|
| 227 | 176 | <property name="margin-end">3</property>
|
| 177 | + <property name="hscrollbar-policy">external</property>
|
|
| 228 | 178 | <property name="shadow-type">in</property>
|
| 229 | 179 | <property name="overlay-scrolling">False</property>
|
| 230 | 180 | <property name="max-content-height">100</property>
|
| 231 | 181 | <property name="propagate-natural-height">True</property>
|
| 232 | - <property name="hscrollbar-policy">GTK_POLICY_EXTERNAL</property>
|
|
| 233 | 182 | <child>
|
| 234 | 183 | <placeholder/>
|
| 235 | 184 | </child>
|
| ... | ... | @@ -968,10 +968,6 @@ .start-chat-row:not(.activatable) label { color: @insensitive_fg_color; } |
| 968 | 968 | .start-chat-row:focus { outline: none; }
|
| 969 | 969 | |
| 970 | 970 | /* GroupChatRoster */
|
| 971 | -.groupchat-roster {
|
|
| 972 | - border-left: 1px solid;
|
|
| 973 | - border-color: @borders;
|
|
| 974 | -}
|
|
| 975 | 971 | .groupchat-roster treeview { padding-left: 4px; }
|
| 976 | 972 | |
| 977 | 973 | /* GroupchatConfig */
|
| ... | ... | @@ -186,12 +186,18 @@ class CertificateBuilder(Builder): |
| 186 | 186 | |
| 187 | 187 | |
| 188 | 188 | class ChatBannerBuilder(Builder):
|
| 189 | + share_popover: Gtk.Popover
|
|
| 190 | + jid_label: Gtk.Label
|
|
| 189 | 191 | banner_box: Gtk.Box
|
| 190 | 192 | avatar_image: Gtk.Image
|
| 191 | - name_label: Gtk.Label
|
|
| 192 | - phone_image: Gtk.Image
|
|
| 193 | + chat_menu_button: Gtk.MenuButton
|
|
| 193 | 194 | toggle_roster_button: Gtk.Button
|
| 194 | 195 | toggle_roster_image: Gtk.Image
|
| 196 | + contact_info_button: Gtk.Button
|
|
| 197 | + share_menu_button: Gtk.MenuButton
|
|
| 198 | + name_label: Gtk.Label
|
|
| 199 | + phone_image: Gtk.Image
|
|
| 200 | + description_label: Gtk.Label
|
|
| 195 | 201 | additional_items_box: Gtk.Box
|
| 196 | 202 | visitor_box: Gtk.Box
|
| 197 | 203 | visitor_menu_button: Gtk.MenuButton
|
| ... | ... | @@ -200,7 +206,7 @@ class ChatBannerBuilder(Builder): |
| 200 | 206 | |
| 201 | 207 | class ChatControlBuilder(Builder):
|
| 202 | 208 | control_box: Gtk.Box
|
| 203 | - conv_view_box: Gtk.Box
|
|
| 209 | + conv_view_paned: Gtk.Paned
|
|
| 204 | 210 | conv_view_overlay: Gtk.Overlay
|
| 205 | 211 | |
| 206 | 212 | |
| ... | ... | @@ -485,13 +491,15 @@ class GroupchatOutcastBuilder(Builder): |
| 485 | 491 | |
| 486 | 492 | |
| 487 | 493 | class GroupchatRosterBuilder(Builder):
|
| 488 | - participant_store: Gtk.TreeStore
|
|
| 494 | + box: Gtk.Box
|
|
| 495 | + search_entry: Gtk.SearchEntry
|
|
| 489 | 496 | scrolled: Gtk.ScrolledWindow
|
| 490 | 497 | roster_treeview: Gtk.TreeView
|
| 491 | 498 | contact_column: Gtk.TreeViewColumn
|
| 492 | 499 | avatar_renderer: Gtk.CellRendererPixbuf
|
| 493 | 500 | text_renderer: Gtk.CellRendererText
|
| 494 | 501 | expander: Gtk.TreeViewColumn
|
| 502 | + participant_store: Gtk.TreeStore
|
|
| 495 | 503 | |
| 496 | 504 | |
| 497 | 505 | class GroupchatRosterTooltipBuilder(Builder):
|
| ... | ... | @@ -572,8 +580,6 @@ class ManageSoundsBuilder(Builder): |
| 572 | 580 | |
| 573 | 581 | class MessageActionsBoxBuilder(Builder):
|
| 574 | 582 | box: Gtk.Box
|
| 575 | - quick_invite_button: Gtk.Button
|
|
| 576 | - settings_menu: Gtk.MenuButton
|
|
| 577 | 583 | encryption_details_button: Gtk.Button
|
| 578 | 584 | encryption_details_image: Gtk.Image
|
| 579 | 585 | encryption_menu_button: Gtk.MenuButton
|
| ... | ... | @@ -18,6 +18,7 @@ |
| 18 | 18 | from typing import Optional
|
| 19 | 19 | |
| 20 | 20 | import cairo
|
| 21 | +from gi.repository import Gdk
|
|
| 21 | 22 | from gi.repository import GLib
|
| 22 | 23 | from gi.repository import Gtk
|
| 23 | 24 | |
| ... | ... | @@ -38,6 +39,10 @@ |
| 38 | 39 | |
| 39 | 40 | from gajim.gtk.builder import get_builder
|
| 40 | 41 | from gajim.gtk.groupchat_voice_requests_button import VoiceRequestsButton
|
| 42 | +from gajim.gtk.menus import get_groupchat_menu
|
|
| 43 | +from gajim.gtk.menus import get_private_chat_menu
|
|
| 44 | +from gajim.gtk.menus import get_self_contact_menu
|
|
| 45 | +from gajim.gtk.menus import get_singlechat_menu
|
|
| 41 | 46 | from gajim.gtk.util import AccountBadge
|
| 42 | 47 | |
| 43 | 48 | |
| ... | ... | @@ -93,12 +98,15 @@ def switch_contact(self, contact: types.ChatContactT) -> None: |
| 93 | 98 | |
| 94 | 99 | self._voice_requests_button.switch_contact(self._contact)
|
| 95 | 100 | |
| 101 | + self._set_chat_menu(contact)
|
|
| 96 | 102 | self._update_phone_image()
|
| 97 | 103 | self._update_roster_button()
|
| 98 | 104 | self._update_avatar()
|
| 99 | 105 | self._update_visitor_button()
|
| 100 | 106 | self._update_name_label()
|
| 107 | + self._update_description_label()
|
|
| 101 | 108 | self._update_account_badge()
|
| 109 | + self._update_share_box()
|
|
| 102 | 110 | |
| 103 | 111 | def _connect_signals(self) -> None:
|
| 104 | 112 | assert self._contact is not None
|
| ... | ... | @@ -212,6 +220,7 @@ def _on_muc_disco_update(self, event: MucDiscoUpdate) -> None: |
| 212 | 220 | return
|
| 213 | 221 | |
| 214 | 222 | self._update_name_label()
|
| 223 | + self._update_description_label()
|
|
| 215 | 224 | |
| 216 | 225 | def _on_account_changed(self, event: AccountEnabled) -> None:
|
| 217 | 226 | self._update_account_badge()
|
| ... | ... | @@ -232,6 +241,17 @@ def _on_message_received(self, event: MessageReceived) -> None: |
| 232 | 241 | |
| 233 | 242 | self._update_phone_image()
|
| 234 | 243 | |
| 244 | + def _set_chat_menu(self, contact: types.ChatContactT) -> None:
|
|
| 245 | + if isinstance(contact, GroupchatContact):
|
|
| 246 | + menu = get_groupchat_menu(contact)
|
|
| 247 | + elif isinstance(contact, GroupchatParticipant):
|
|
| 248 | + menu = get_private_chat_menu(contact)
|
|
| 249 | + elif contact.is_self:
|
|
| 250 | + menu = get_self_contact_menu(contact)
|
|
| 251 | + else:
|
|
| 252 | + menu = get_singlechat_menu(contact)
|
|
| 253 | + self._ui.chat_menu_button.set_menu_model(menu)
|
|
| 254 | + |
|
| 235 | 255 | def _update_phone_image(self) -> None:
|
| 236 | 256 | self._ui.phone_image.set_visible(
|
| 237 | 257 | self._contact in self._last_message_from_phone)
|
| ... | ... | @@ -283,6 +303,17 @@ def _update_name_label(self) -> None: |
| 283 | 303 | |
| 284 | 304 | self._ui.name_label.set_tooltip_text(tooltip_text)
|
| 285 | 305 | |
| 306 | + def _update_description_label(self) -> None:
|
|
| 307 | + assert self._contact is not None
|
|
| 308 | + text = ''
|
|
| 309 | + if self._contact.is_groupchat:
|
|
| 310 | + disco_info = app.storage.cache.get_last_disco_info(
|
|
| 311 | + self._contact.jid)
|
|
| 312 | + if disco_info is not None:
|
|
| 313 | + text = disco_info.muc_description or ''
|
|
| 314 | + self._ui.description_label.set_text(text)
|
|
| 315 | + self._ui.description_label.set_visible(bool(text))
|
|
| 316 | + |
|
| 286 | 317 | def _update_account_badge(self) -> None:
|
| 287 | 318 | if self._contact is None:
|
| 288 | 319 | self._account_badge.set_visible(False)
|
| ... | ... | @@ -294,6 +325,20 @@ def _update_account_badge(self) -> None: |
| 294 | 325 | |
| 295 | 326 | self._account_badge.set_visible(visible)
|
| 296 | 327 | |
| 328 | + def _update_share_box(self) -> None:
|
|
| 329 | + assert self._contact is not None
|
|
| 330 | + self._ui.share_menu_button.set_sensitive(True)
|
|
| 331 | + self._ui.jid_label.set_text(str(self._contact.jid))
|
|
| 332 | + |
|
| 333 | + def _on_copy_jid_clicked(self, _button: Gtk.Button) -> None:
|
|
| 334 | + assert self._contact is not None
|
|
| 335 | + text = f'xmpp:{self._contact.jid}'
|
|
| 336 | + if self._contact.is_groupchat:
|
|
| 337 | + text = f'{text}?join'
|
|
| 338 | + clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
|
|
| 339 | + clipboard.set_text(text, -1)
|
|
| 340 | + self._ui.share_popover.popdown()
|
|
| 341 | + |
|
| 297 | 342 | def _on_request_voice_clicked(self, _button: Gtk.Button) -> None:
|
| 298 | 343 | self._ui.visitor_popover.popdown()
|
| 299 | 344 | app.window.activate_action('muc-request-voice', None)
|
| ... | ... | @@ -90,8 +90,7 @@ def __init__(self) -> None: |
| 90 | 90 | self._ui.conv_view_overlay.add_overlay(self._jump_to_end_button)
|
| 91 | 91 | |
| 92 | 92 | self._roster = GroupchatRoster()
|
| 93 | - |
|
| 94 | - self._ui.conv_view_box.add(self._roster)
|
|
| 93 | + self._ui.conv_view_paned.pack2(self._roster, False, False)
|
|
| 95 | 94 | |
| 96 | 95 | # Used with encryption plugins
|
| 97 | 96 | self.sendmessage = False
|
| ... | ... | @@ -84,7 +84,7 @@ def __init__(self) -> None: |
| 84 | 84 | self._tooltip = GCTooltip()
|
| 85 | 85 | |
| 86 | 86 | self._ui = get_builder('groupchat_roster.ui')
|
| 87 | - self.add(self._ui.scrolled)
|
|
| 87 | + self.add(self._ui.box)
|
|
| 88 | 88 | |
| 89 | 89 | self._contact_refs: dict[str, Gtk.TreeRowReference] = {}
|
| 90 | 90 | self._group_refs: dict[str, Gtk.TreeRowReference] = {}
|
| ... | ... | @@ -93,7 +93,10 @@ def __init__(self) -> None: |
| 93 | 93 | self._store.set_sort_func(Column.TEXT, self._tree_compare_iters)
|
| 94 | 94 | |
| 95 | 95 | self._roster = self._ui.roster_treeview
|
| 96 | - self._roster.set_search_equal_func(self._search_func)
|
|
| 96 | + |
|
| 97 | + self._filter_string = ''
|
|
| 98 | + self._modelfilter = self._store.filter_new()
|
|
| 99 | + self._modelfilter.set_visible_func(self._visible_func)
|
|
| 97 | 100 | self._roster.set_has_tooltip(True)
|
| 98 | 101 | |
| 99 | 102 | self._ui.contact_column.set_fixed_width(
|
| ... | ... | @@ -201,14 +204,24 @@ def _query_tooltip(self, |
| 201 | 204 | tooltip.set_custom(widget)
|
| 202 | 205 | return value
|
| 203 | 206 | |
| 204 | - @staticmethod
|
|
| 205 | - def _search_func(model: Gtk.TreeModel,
|
|
| 206 | - _column: int,
|
|
| 207 | - search_text: str,
|
|
| 208 | - iter_: Gtk.TreeIter
|
|
| 209 | - ) -> bool:
|
|
| 207 | + def _on_search_changed(self, widget: Gtk.SearchEntry) -> None:
|
|
| 208 | + self._filter_string = widget.get_text().lower()
|
|
| 209 | + self._modelfilter.refilter()
|
|
| 210 | + self._roster.expand_all()
|
|
| 211 | + |
|
| 212 | + def _visible_func(self,
|
|
| 213 | + model: Gtk.TreeModelFilter,
|
|
| 214 | + iter_: Gtk.TreeIter,
|
|
| 215 | + *_data: Any
|
|
| 216 | + ) -> bool:
|
|
| 210 | 217 | |
| 211 | - return search_text.lower() not in model[iter_][1].lower()
|
|
| 218 | + if not self._filter_string:
|
|
| 219 | + return True
|
|
| 220 | + |
|
| 221 | + if not model[iter_][Column.IS_CONTACT]:
|
|
| 222 | + return True
|
|
| 223 | + |
|
| 224 | + return self._filter_string in model[iter_][Column.TEXT].lower()
|
|
| 212 | 225 | |
| 213 | 226 | def _get_group_iter(self, group_name: str) -> Optional[Gtk.TreeIter]:
|
| 214 | 227 | try:
|
| ... | ... | @@ -512,7 +525,9 @@ def _load_roster(self) -> None: |
| 512 | 525 | self._add_contact(participant)
|
| 513 | 526 | |
| 514 | 527 | self.enable_sort(True)
|
| 515 | - self._roster.set_model(self._store)
|
|
| 528 | + self._roster.set_model(self._modelfilter)
|
|
| 529 | + |
|
| 530 | + self._ui.search_entry.set_text('')
|
|
| 516 | 531 | self._roster.expand_all()
|
| 517 | 532 | |
| 518 | 533 | def _unload_roster(self) -> None:
|
| ... | ... | @@ -75,7 +75,6 @@ def get_self_contact_menu(contact: types.BareContact) -> GajimMenu: |
| 75 | 75 | |
| 76 | 76 | params = RemoveHistoryActionParams(account=account, jid=jid)
|
| 77 | 77 | menu.add_item(_('Remove History…'), 'app.remove-history', params)
|
| 78 | - menu.add_item(_('Search…'), 'win.search-history', None)
|
|
| 79 | 78 | return menu
|
| 80 | 79 | |
| 81 | 80 | |
| ... | ... | @@ -83,7 +82,6 @@ def get_singlechat_menu(contact: types.BareContact) -> GajimMenu: |
| 83 | 82 | account = contact.account
|
| 84 | 83 | |
| 85 | 84 | menu = GajimMenu()
|
| 86 | - menu.add_item(_('Details'), 'win.show-contact-info')
|
|
| 87 | 85 | menu.add_item(_('Block Contact…'),
|
| 88 | 86 | f'app.{account}-block-contact',
|
| 89 | 87 | str(contact.jid))
|
| ... | ... | @@ -94,8 +92,6 @@ def get_singlechat_menu(contact: types.BareContact) -> GajimMenu: |
| 94 | 92 | menu.add_item(_('Start Voice Call…'), 'win.start-voice-call')
|
| 95 | 93 | menu.add_item(_('Start Video Call…'), 'win.start-video-call')
|
| 96 | 94 | |
| 97 | - menu.add_item(_('Search…'), 'win.search-history', None)
|
|
| 98 | - |
|
| 99 | 95 | if can_add_to_roster(contact):
|
| 100 | 96 | params = AccountJidParam(account=account, jid=contact.jid)
|
| 101 | 97 | menu.add_item(_('Add to Contact List…'), 'win.add-to-roster', params)
|
| ... | ... | @@ -108,9 +104,7 @@ def get_private_chat_menu(contact: types.GroupchatParticipant) -> GajimMenu: |
| 108 | 104 | |
| 109 | 105 | value = GLib.Variant('as', [''])
|
| 110 | 106 | |
| 111 | - menu.add_item(_('Details'), 'win.show-contact-info')
|
|
| 112 | 107 | menu.add_item(_('Upload File…'), 'win.send-file-httpupload', value)
|
| 113 | - menu.add_item(_('Search…'), 'win.search-history')
|
|
| 114 | 108 | |
| 115 | 109 | if can_add_to_roster(contact):
|
| 116 | 110 | params = AccountJidParam(account=contact.account, jid=contact.jid)
|
| ... | ... | @@ -131,11 +125,9 @@ def get_send_file_submenu() -> GajimMenu: |
| 131 | 125 | |
| 132 | 126 | def get_groupchat_menu(contact: GroupchatContact) -> GajimMenu:
|
| 133 | 127 | menuitems: MenuItemListT = [
|
| 134 | - (_('Details'), 'win.show-contact-info', None),
|
|
| 135 | 128 | (_('Change Nickname…'), 'win.muc-change-nickname', None),
|
| 136 | 129 | (_('Request Voice'), 'win.muc-request-voice', None),
|
| 137 | 130 | (_('Execute Command…'), 'win.muc-execute-command', ''),
|
| 138 | - (_('Search…'), 'win.search-history', None)
|
|
| 139 | 131 | ]
|
| 140 | 132 | |
| 141 | 133 | return GajimMenu.from_list(menuitems)
|
| ... | ... | @@ -44,10 +44,6 @@ |
| 44 | 44 | from gajim.gtk.dialogs import ErrorDialog
|
| 45 | 45 | from gajim.gtk.menus import get_encryption_menu
|
| 46 | 46 | from gajim.gtk.menus import get_format_menu
|
| 47 | -from gajim.gtk.menus import get_groupchat_menu
|
|
| 48 | -from gajim.gtk.menus import get_private_chat_menu
|
|
| 49 | -from gajim.gtk.menus import get_self_contact_menu
|
|
| 50 | -from gajim.gtk.menus import get_singlechat_menu
|
|
| 51 | 47 | from gajim.gtk.message_input import MessageInputTextView
|
| 52 | 48 | from gajim.gtk.security_label_selector import SecurityLabelSelector
|
| 53 | 49 | |
| ... | ... | @@ -93,8 +89,6 @@ def __init__(self) -> None: |
| 93 | 89 | self._ui.formattings_button.set_menu_model(get_format_menu())
|
| 94 | 90 | self._ui.encryption_menu_button.set_menu_model(get_encryption_menu())
|
| 95 | 91 | |
| 96 | - self._ui.quick_invite_button.set_action_name('win.muc-invite')
|
|
| 97 | - |
|
| 98 | 92 | self.show_all()
|
| 99 | 93 | self._ui.connect_signals(self)
|
| 100 | 94 | |
| ... | ... | @@ -181,23 +175,17 @@ def switch_contact(self, contact: ChatContactT) -> None: |
| 181 | 175 | self._contact = contact
|
| 182 | 176 | |
| 183 | 177 | if isinstance(self._contact, GroupchatContact):
|
| 184 | - self._ui.quick_invite_button.show()
|
|
| 185 | 178 | self._contact.multi_connect({
|
| 186 | 179 | 'state-changed': self._on_muc_state_changed,
|
| 187 | 180 | 'user-role-changed': self._on_muc_state_changed,
|
| 188 | 181 | })
|
| 189 | 182 | elif isinstance(self._contact, GroupchatParticipant):
|
| 190 | - self._ui.quick_invite_button.hide()
|
|
| 191 | 183 | self._contact.multi_connect({
|
| 192 | 184 | 'user-joined': self._on_user_state_changed,
|
| 193 | 185 | 'user-left': self._on_user_state_changed,
|
| 194 | 186 | 'room-joined': self._on_user_state_changed,
|
| 195 | 187 | 'room-left': self._on_user_state_changed,
|
| 196 | 188 | })
|
| 197 | - else:
|
|
| 198 | - self._ui.quick_invite_button.hide()
|
|
| 199 | - |
|
| 200 | - self._set_settings_menu(contact)
|
|
| 201 | 189 | |
| 202 | 190 | self._update_encryption_button()
|
| 203 | 191 | self._update_encryption_details_button()
|
| ... | ... | @@ -374,17 +362,6 @@ def _on_encryption_details_clicked(self, _button: Gtk.Button) -> None: |
| 374 | 362 | app.plugin_manager.extension_point(
|
| 375 | 363 | f'encryption_dialog{encryption}', app.window.get_control())
|
| 376 | 364 | |
| 377 | - def _set_settings_menu(self, contact: ChatContactT) -> None:
|
|
| 378 | - if isinstance(contact, GroupchatContact):
|
|
| 379 | - menu = get_groupchat_menu(contact)
|
|
| 380 | - elif isinstance(contact, GroupchatParticipant):
|
|
| 381 | - menu = get_private_chat_menu(contact)
|
|
| 382 | - elif contact.is_self:
|
|
| 383 | - menu = get_self_contact_menu(contact)
|
|
| 384 | - else:
|
|
| 385 | - menu = get_singlechat_menu(contact)
|
|
| 386 | - self._ui.settings_menu.set_menu_model(menu)
|
|
| 387 | - |
|
| 388 | 365 | def _on_format(self, name: str) -> None:
|
| 389 | 366 | name = name.removeprefix('input-')
|
| 390 | 367 | self.msg_textview.apply_formatting(name)
|