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

Commits:

3 changed files:

Changes:

  • gajim/data/gui/groupchat_manage.ui
    ... ... @@ -2,9 +2,6 @@
    2 2
     <!-- Generated with glade 3.38.2 -->
    
    3 3
     <interface>
    
    4 4
       <requires lib="gtk+" version="3.24"/>
    
    5
    -  <object class="GtkTextBuffer" id="subject_buffer">
    
    6
    -    <signal name="changed" handler="_on_subject_text_changed" swapped="no"/>
    
    7
    -  </object>
    
    8 5
       <object class="GtkStack" id="stack">
    
    9 6
         <property name="visible">True</property>
    
    10 7
         <property name="can-focus">False</property>
    
    ... ... @@ -131,18 +128,51 @@
    131 128
               </packing>
    
    132 129
             </child>
    
    133 130
             <child>
    
    134
    -          <object class="GtkButton" id="manage_save_button">
    
    135
    -            <property name="label" translatable="yes">Save</property>
    
    131
    +          <object class="GtkBox">
    
    136 132
                 <property name="visible">True</property>
    
    137
    -            <property name="sensitive">False</property>
    
    138
    -            <property name="can-focus">True</property>
    
    139
    -            <property name="can-default">True</property>
    
    140
    -            <property name="receives-default">False</property>
    
    141
    -            <property name="halign">end</property>
    
    142
    -            <signal name="clicked" handler="_on_manage_save_clicked" swapped="no"/>
    
    143
    -            <style>
    
    144
    -              <class name="suggested-action"/>
    
    145
    -            </style>
    
    133
    +            <property name="can-focus">False</property>
    
    134
    +            <child>
    
    135
    +              <object class="GtkButton" id="manage_save_button">
    
    136
    +                <property name="label" translatable="yes">Save</property>
    
    137
    +                <property name="visible">True</property>
    
    138
    +                <property name="sensitive">False</property>
    
    139
    +                <property name="can-focus">True</property>
    
    140
    +                <property name="can-default">True</property>
    
    141
    +                <property name="receives-default">False</property>
    
    142
    +                <signal name="clicked" handler="_on_manage_save_clicked" swapped="no"/>
    
    143
    +                <style>
    
    144
    +                  <class name="suggested-action"/>
    
    145
    +                </style>
    
    146
    +              </object>
    
    147
    +              <packing>
    
    148
    +                <property name="expand">False</property>
    
    149
    +                <property name="fill">True</property>
    
    150
    +                <property name="pack-type">end</property>
    
    151
    +                <property name="position">0</property>
    
    152
    +              </packing>
    
    153
    +            </child>
    
    154
    +            <child>
    
    155
    +              <object class="GtkButton" id="destroy_muc_button">
    
    156
    +                <property name="visible">True</property>
    
    157
    +                <property name="sensitive">False</property>
    
    158
    +                <property name="can-focus">True</property>
    
    159
    +                <property name="receives-default">False</property>
    
    160
    +                <property name="tooltip-text" translatable="yes">Destroy Groupchat…</property>
    
    161
    +                <signal name="clicked" handler="_on_destroy_clicked" swapped="no"/>
    
    162
    +                <child>
    
    163
    +                  <object class="GtkImage">
    
    164
    +                    <property name="visible">True</property>
    
    165
    +                    <property name="can-focus">False</property>
    
    166
    +                    <property name="icon-name">user-trash-symbolic</property>
    
    167
    +                  </object>
    
    168
    +                </child>
    
    169
    +              </object>
    
    170
    +              <packing>
    
    171
    +                <property name="expand">False</property>
    
    172
    +                <property name="fill">True</property>
    
    173
    +                <property name="position">1</property>
    
    174
    +              </packing>
    
    175
    +            </child>
    
    146 176
               </object>
    
    147 177
               <packing>
    
    148 178
                 <property name="expand">False</property>
    
    ... ... @@ -193,7 +223,6 @@
    193 223
                     <property name="right-margin">6</property>
    
    194 224
                     <property name="top-margin">6</property>
    
    195 225
                     <property name="bottom-margin">6</property>
    
    196
    -                <property name="buffer">subject_buffer</property>
    
    197 226
                   </object>
    
    198 227
                 </child>
    
    199 228
               </object>
    
    ... ... @@ -240,7 +269,7 @@
    240 269
                 <property name="visible">True</property>
    
    241 270
                 <property name="can-focus">False</property>
    
    242 271
                 <property name="halign">center</property>
    
    243
    -            <property name="valign">center</property>
    
    272
    +            <property name="valign">start</property>
    
    244 273
                 <property name="hexpand">True</property>
    
    245 274
                 <property name="vexpand">True</property>
    
    246 275
                 <property name="border-width">18</property>
    
    ... ... @@ -312,6 +341,8 @@
    312 341
                     <property name="visible">True</property>
    
    313 342
                     <property name="can-focus">False</property>
    
    314 343
                     <property name="label" translatable="yes">Update Avatar</property>
    
    344
    +                <property name="justify">center</property>
    
    345
    +                <property name="wrap">True</property>
    
    315 346
                     <style>
    
    316 347
                       <class name="bold16"/>
    
    317 348
                     </style>
    
    ... ... @@ -337,6 +368,172 @@
    337 368
             <property name="position">1</property>
    
    338 369
           </packing>
    
    339 370
         </child>
    
    371
    +    <child>
    
    372
    +      <object class="GtkBox">
    
    373
    +        <property name="visible">True</property>
    
    374
    +        <property name="can-focus">False</property>
    
    375
    +        <property name="halign">center</property>
    
    376
    +        <property name="valign">start</property>
    
    377
    +        <property name="orientation">vertical</property>
    
    378
    +        <child>
    
    379
    +          <object class="GtkBox">
    
    380
    +            <property name="visible">True</property>
    
    381
    +            <property name="can-focus">False</property>
    
    382
    +            <property name="orientation">vertical</property>
    
    383
    +            <property name="spacing">6</property>
    
    384
    +            <child>
    
    385
    +              <object class="GtkLabel">
    
    386
    +                <property name="width-request">300</property>
    
    387
    +                <property name="visible">True</property>
    
    388
    +                <property name="can-focus">False</property>
    
    389
    +                <property name="margin-bottom">6</property>
    
    390
    +                <property name="label" translatable="yes">Destroy This Chat</property>
    
    391
    +                <property name="justify">center</property>
    
    392
    +                <property name="wrap">True</property>
    
    393
    +                <property name="max-width-chars">22</property>
    
    394
    +                <style>
    
    395
    +                  <class name="bold16"/>
    
    396
    +                </style>
    
    397
    +              </object>
    
    398
    +              <packing>
    
    399
    +                <property name="expand">False</property>
    
    400
    +                <property name="fill">True</property>
    
    401
    +                <property name="position">0</property>
    
    402
    +              </packing>
    
    403
    +            </child>
    
    404
    +            <child>
    
    405
    +              <object class="GtkLabel">
    
    406
    +                <property name="visible">True</property>
    
    407
    +                <property name="can-focus">False</property>
    
    408
    +                <property name="halign">start</property>
    
    409
    +                <property name="label" translatable="yes">Reason for destruction</property>
    
    410
    +                <style>
    
    411
    +                  <class name="dim-label"/>
    
    412
    +                </style>
    
    413
    +              </object>
    
    414
    +              <packing>
    
    415
    +                <property name="expand">False</property>
    
    416
    +                <property name="fill">True</property>
    
    417
    +                <property name="position">1</property>
    
    418
    +              </packing>
    
    419
    +            </child>
    
    420
    +            <child>
    
    421
    +              <object class="GtkEntry" id="destroy_reason_entry">
    
    422
    +                <property name="width-request">200</property>
    
    423
    +                <property name="visible">True</property>
    
    424
    +                <property name="can-focus">True</property>
    
    425
    +                <property name="margin-bottom">6</property>
    
    426
    +                <property name="activates-default">True</property>
    
    427
    +                <property name="caps-lock-warning">False</property>
    
    428
    +                <property name="secondary-icon-name">face-smile-symbolic</property>
    
    429
    +                <property name="secondary-icon-tooltip-text" translatable="yes">Insert Emoji</property>
    
    430
    +                <property name="secondary-icon-tooltip-markup" translatable="yes">Insert Emoji</property>
    
    431
    +                <property name="placeholder-text" translatable="yes">Reason (optional)...</property>
    
    432
    +                <property name="show-emoji-icon">True</property>
    
    433
    +              </object>
    
    434
    +              <packing>
    
    435
    +                <property name="expand">False</property>
    
    436
    +                <property name="fill">True</property>
    
    437
    +                <property name="position">2</property>
    
    438
    +              </packing>
    
    439
    +            </child>
    
    440
    +            <child>
    
    441
    +              <object class="GtkLabel">
    
    442
    +                <property name="visible">True</property>
    
    443
    +                <property name="can-focus">False</property>
    
    444
    +                <property name="halign">start</property>
    
    445
    +                <property name="label" translatable="yes">Where participants should go</property>
    
    446
    +                <style>
    
    447
    +                  <class name="dim-label"/>
    
    448
    +                </style>
    
    449
    +              </object>
    
    450
    +              <packing>
    
    451
    +                <property name="expand">False</property>
    
    452
    +                <property name="fill">True</property>
    
    453
    +                <property name="position">3</property>
    
    454
    +              </packing>
    
    455
    +            </child>
    
    456
    +            <child>
    
    457
    +              <object class="GtkEntry" id="destroy_alternate_entry">
    
    458
    +                <property name="width-request">200</property>
    
    459
    +                <property name="visible">True</property>
    
    460
    +                <property name="can-focus">True</property>
    
    461
    +                <property name="margin-bottom">6</property>
    
    462
    +                <property name="activates-default">True</property>
    
    463
    +                <property name="caps-lock-warning">False</property>
    
    464
    +                <property name="placeholder-text" translatable="yes">Alternate venue (optional)...</property>
    
    465
    +                <signal name="changed" handler="_on_destroy_alternate_changed" swapped="no"/>
    
    466
    +              </object>
    
    467
    +              <packing>
    
    468
    +                <property name="expand">False</property>
    
    469
    +                <property name="fill">True</property>
    
    470
    +                <property name="position">4</property>
    
    471
    +              </packing>
    
    472
    +            </child>
    
    473
    +            <child>
    
    474
    +              <object class="GtkBox">
    
    475
    +                <property name="visible">True</property>
    
    476
    +                <property name="can-focus">False</property>
    
    477
    +                <property name="margin-top">18</property>
    
    478
    +                <child>
    
    479
    +                  <object class="GtkButton">
    
    480
    +                    <property name="label" translatable="yes">_Cancel</property>
    
    481
    +                    <property name="visible">True</property>
    
    482
    +                    <property name="can-focus">True</property>
    
    483
    +                    <property name="receives-default">True</property>
    
    484
    +                    <property name="halign">start</property>
    
    485
    +                    <property name="valign">start</property>
    
    486
    +                    <property name="use-underline">True</property>
    
    487
    +                    <signal name="clicked" handler="_on_destroy_cancelled" swapped="no"/>
    
    488
    +                  </object>
    
    489
    +                  <packing>
    
    490
    +                    <property name="expand">False</property>
    
    491
    +                    <property name="fill">True</property>
    
    492
    +                    <property name="position">0</property>
    
    493
    +                  </packing>
    
    494
    +                </child>
    
    495
    +                <child>
    
    496
    +                  <object class="GtkButton" id="destroy_button">
    
    497
    +                    <property name="label" translatable="yes">_Destroy</property>
    
    498
    +                    <property name="visible">True</property>
    
    499
    +                    <property name="can-focus">True</property>
    
    500
    +                    <property name="can-default">True</property>
    
    501
    +                    <property name="receives-default">True</property>
    
    502
    +                    <property name="halign">end</property>
    
    503
    +                    <property name="valign">start</property>
    
    504
    +                    <property name="use-underline">True</property>
    
    505
    +                    <signal name="clicked" handler="_on_destroy_confirmed" swapped="no"/>
    
    506
    +                    <style>
    
    507
    +                      <class name="destructive-action"/>
    
    508
    +                    </style>
    
    509
    +                  </object>
    
    510
    +                  <packing>
    
    511
    +                    <property name="expand">False</property>
    
    512
    +                    <property name="fill">True</property>
    
    513
    +                    <property name="pack-type">end</property>
    
    514
    +                    <property name="position">1</property>
    
    515
    +                  </packing>
    
    516
    +                </child>
    
    517
    +              </object>
    
    518
    +              <packing>
    
    519
    +                <property name="expand">False</property>
    
    520
    +                <property name="fill">True</property>
    
    521
    +                <property name="position">5</property>
    
    522
    +              </packing>
    
    523
    +            </child>
    
    524
    +          </object>
    
    525
    +          <packing>
    
    526
    +            <property name="expand">False</property>
    
    527
    +            <property name="fill">True</property>
    
    528
    +            <property name="position">1</property>
    
    529
    +          </packing>
    
    530
    +        </child>
    
    531
    +      </object>
    
    532
    +      <packing>
    
    533
    +        <property name="name">destroy</property>
    
    534
    +        <property name="position">2</property>
    
    535
    +      </packing>
    
    536
    +    </child>
    
    340 537
         <style>
    
    341 538
           <class name="padding-18"/>
    
    342 539
         </style>
    

  • gajim/gtk/builder.pyi
    ... ... @@ -510,17 +510,20 @@ class GroupchatInviterBuilder(Builder):
    510 510
     
    
    511 511
     
    
    512 512
     class GroupchatManageBuilder(Builder):
    
    513
    -    subject_buffer: Gtk.TextBuffer
    
    514 513
         stack: Gtk.Stack
    
    515 514
         avatar_button_image: Gtk.Image
    
    516 515
         avatar_select_button: Gtk.Button
    
    517 516
         muc_description_entry: Gtk.Entry
    
    518 517
         muc_name_entry: Gtk.Entry
    
    519 518
         manage_save_button: Gtk.Button
    
    519
    +    destroy_muc_button: Gtk.Button
    
    520 520
         subject_textview: Gtk.TextView
    
    521 521
         subject_change_button: Gtk.Button
    
    522 522
         avatar_selector_grid: Gtk.Grid
    
    523 523
         avatar_update_button: Gtk.Button
    
    524
    +    destroy_reason_entry: Gtk.Entry
    
    525
    +    destroy_alternate_entry: Gtk.Entry
    
    526
    +    destroy_button: Gtk.Button
    
    524 527
     
    
    525 528
     
    
    526 529
     class GroupchatNickChooserBuilder(Builder):
    

  • gajim/gtk/groupchat_manage.py
    ... ... @@ -27,6 +27,7 @@
    27 27
     
    
    28 28
     from gajim.common import app
    
    29 29
     from gajim.common.const import AvatarSize
    
    30
    +from gajim.common.helpers import validate_jid
    
    30 31
     from gajim.common.i18n import _
    
    31 32
     from gajim.common.modules.contacts import GroupchatContact
    
    32 33
     
    
    ... ... @@ -64,12 +65,15 @@ def __init__(self,
    64 65
     
    
    65 66
             self._prepare_subject()
    
    66 67
             self._prepare_manage()
    
    68
    +
    
    69
    +        self._ui.subject_textview.get_buffer().connect(
    
    70
    +            'changed', self._on_subject_text_changed)
    
    67 71
             self.connect('destroy', self._on_destroy)
    
    68 72
     
    
    69 73
             self.show_all()
    
    70 74
     
    
    71 75
         def _on_destroy(self, *args: Any) -> None:
    
    72
    -        self._avatar_selector = None
    
    76
    +        del self._avatar_selector
    
    73 77
             app.check_finalize(self)
    
    74 78
     
    
    75 79
         @property
    
    ... ... @@ -142,6 +146,7 @@ def _prepare_manage(self) -> None:
    142 146
             if self_contact.affiliation.is_owner:
    
    143 147
                 self._client.get_module('MUC').request_config(
    
    144 148
                     self._contact.jid, callback=self._on_manage_form_received)
    
    149
    +            self._ui.destroy_muc_button.set_sensitive(True)
    
    145 150
     
    
    146 151
         def _on_manage_form_received(self, task: Task) -> None:
    
    147 152
             try:
    
    ... ... @@ -242,3 +247,37 @@ def update_avatar(self):
    242 247
                 AvatarSize.GROUP_INFO,
    
    243 248
                 self.get_scale_factor())
    
    244 249
             self._ui.avatar_button_image.set_from_surface(surface)
    
    250
    +
    
    251
    +    def _on_destroy_clicked(self, _button: Gtk.Button) -> None:
    
    252
    +        self._ui.stack.set_visible_child_name('destroy')
    
    253
    +        self._ui.destroy_reason_entry.grab_focus()
    
    254
    +        self._ui.destroy_button.grab_default()
    
    255
    +
    
    256
    +    def _on_destroy_alternate_changed(self, entry: Gtk.Entry) -> None:
    
    257
    +        jid = entry.get_text()
    
    258
    +        if jid:
    
    259
    +            try:
    
    260
    +                jid = validate_jid(jid)
    
    261
    +            except Exception:
    
    262
    +                icon = 'dialog-warning-symbolic'
    
    263
    +                text = _('Invalid XMPP Address')
    
    264
    +                self._ui.destroy_alternate_entry.set_icon_from_icon_name(
    
    265
    +                    Gtk.EntryIconPosition.SECONDARY, icon)
    
    266
    +                self._ui.destroy_alternate_entry.set_icon_tooltip_text(
    
    267
    +                    Gtk.EntryIconPosition.SECONDARY, text)
    
    268
    +                self._ui.destroy_button.set_sensitive(False)
    
    269
    +                return
    
    270
    +        self._ui.destroy_alternate_entry.set_icon_from_icon_name(
    
    271
    +            Gtk.EntryIconPosition.SECONDARY, None)
    
    272
    +        self._ui.destroy_button.set_sensitive(True)
    
    273
    +
    
    274
    +    def _on_destroy_confirmed(self, _button: Gtk.Button) -> None:
    
    275
    +        reason = self._ui.destroy_reason_entry.get_text()
    
    276
    +        alternate_jid = self._ui.destroy_alternate_entry.get_text()
    
    277
    +        self._client.get_module('MUC').destroy(
    
    278
    +            self._contact.jid, reason, alternate_jid)
    
    279
    +        window = self.get_toplevel()
    
    280
    +        window.destroy()
    
    281
    +
    
    282
    +    def _on_destroy_cancelled(self, _button: Gtk.Button) -> None:
    
    283
    +        self._ui.stack.set_visible_child_name('manage')