Daniel Brötzmann pushed to branch master at gajim / gajim
Commits: e9cfd624 by wurstsalat at 2022-02-16T18:30:27+01:00 GroupchatManage: Add destroy action
- - - - -
3 changed files:
- gajim/data/gui/groupchat_manage.ui - gajim/gtk/builder.pyi - gajim/gtk/groupchat_manage.py
Changes:
===================================== gajim/data/gui/groupchat_manage.ui ===================================== @@ -2,9 +2,6 @@ <!-- Generated with glade 3.38.2 --> <interface> <requires lib="gtk+" version="3.24"/> - <object class="GtkTextBuffer" id="subject_buffer"> - <signal name="changed" handler="_on_subject_text_changed" swapped="no"/> - </object> <object class="GtkStack" id="stack"> <property name="visible">True</property> <property name="can-focus">False</property> @@ -131,18 +128,51 @@ </packing> </child> <child> - <object class="GtkButton" id="manage_save_button"> - <property name="label" translatable="yes">Save</property> + <object class="GtkBox"> <property name="visible">True</property> - <property name="sensitive">False</property> - <property name="can-focus">True</property> - <property name="can-default">True</property> - <property name="receives-default">False</property> - <property name="halign">end</property> - <signal name="clicked" handler="_on_manage_save_clicked" swapped="no"/> - <style> - <class name="suggested-action"/> - </style> + <property name="can-focus">False</property> + <child> + <object class="GtkButton" id="manage_save_button"> + <property name="label" translatable="yes">Save</property> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can-focus">True</property> + <property name="can-default">True</property> + <property name="receives-default">False</property> + <signal name="clicked" handler="_on_manage_save_clicked" swapped="no"/> + <style> + <class name="suggested-action"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack-type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="destroy_muc_button"> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="tooltip-text" translatable="yes">Destroy Groupchat…</property> + <signal name="clicked" handler="_on_destroy_clicked" swapped="no"/> + <child> + <object class="GtkImage"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="icon-name">user-trash-symbolic</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> </object> <packing> <property name="expand">False</property> @@ -193,7 +223,6 @@ <property name="right-margin">6</property> <property name="top-margin">6</property> <property name="bottom-margin">6</property> - <property name="buffer">subject_buffer</property> </object> </child> </object> @@ -240,7 +269,7 @@ <property name="visible">True</property> <property name="can-focus">False</property> <property name="halign">center</property> - <property name="valign">center</property> + <property name="valign">start</property> <property name="hexpand">True</property> <property name="vexpand">True</property> <property name="border-width">18</property> @@ -312,6 +341,8 @@ <property name="visible">True</property> <property name="can-focus">False</property> <property name="label" translatable="yes">Update Avatar</property> + <property name="justify">center</property> + <property name="wrap">True</property> <style> <class name="bold16"/> </style> @@ -337,6 +368,172 @@ <property name="position">1</property> </packing> </child> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">center</property> + <property name="valign">start</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">6</property> + <child> + <object class="GtkLabel"> + <property name="width-request">300</property> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-bottom">6</property> + <property name="label" translatable="yes">Destroy This Chat</property> + <property name="justify">center</property> + <property name="wrap">True</property> + <property name="max-width-chars">22</property> + <style> + <class name="bold16"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">start</property> + <property name="label" translatable="yes">Reason for destruction</property> + <style> + <class name="dim-label"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="destroy_reason_entry"> + <property name="width-request">200</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="margin-bottom">6</property> + <property name="activates-default">True</property> + <property name="caps-lock-warning">False</property> + <property name="secondary-icon-name">face-smile-symbolic</property> + <property name="secondary-icon-tooltip-text" translatable="yes">Insert Emoji</property> + <property name="secondary-icon-tooltip-markup" translatable="yes">Insert Emoji</property> + <property name="placeholder-text" translatable="yes">Reason (optional)...</property> + <property name="show-emoji-icon">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkLabel"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">start</property> + <property name="label" translatable="yes">Where participants should go</property> + <style> + <class name="dim-label"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="destroy_alternate_entry"> + <property name="width-request">200</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="margin-bottom">6</property> + <property name="activates-default">True</property> + <property name="caps-lock-warning">False</property> + <property name="placeholder-text" translatable="yes">Alternate venue (optional)...</property> + <signal name="changed" handler="_on_destroy_alternate_changed" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-top">18</property> + <child> + <object class="GtkButton"> + <property name="label" translatable="yes">_Cancel</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="halign">start</property> + <property name="valign">start</property> + <property name="use-underline">True</property> + <signal name="clicked" handler="_on_destroy_cancelled" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="destroy_button"> + <property name="label" translatable="yes">_Destroy</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="can-default">True</property> + <property name="receives-default">True</property> + <property name="halign">end</property> + <property name="valign">start</property> + <property name="use-underline">True</property> + <signal name="clicked" handler="_on_destroy_confirmed" swapped="no"/> + <style> + <class name="destructive-action"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack-type">end</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="name">destroy</property> + <property name="position">2</property> + </packing> + </child> <style> <class name="padding-18"/> </style>
===================================== gajim/gtk/builder.pyi ===================================== @@ -510,17 +510,20 @@ class GroupchatInviterBuilder(Builder):
class GroupchatManageBuilder(Builder): - subject_buffer: Gtk.TextBuffer stack: Gtk.Stack avatar_button_image: Gtk.Image avatar_select_button: Gtk.Button muc_description_entry: Gtk.Entry muc_name_entry: Gtk.Entry manage_save_button: Gtk.Button + destroy_muc_button: Gtk.Button subject_textview: Gtk.TextView subject_change_button: Gtk.Button avatar_selector_grid: Gtk.Grid avatar_update_button: Gtk.Button + destroy_reason_entry: Gtk.Entry + destroy_alternate_entry: Gtk.Entry + destroy_button: Gtk.Button
class GroupchatNickChooserBuilder(Builder):
===================================== gajim/gtk/groupchat_manage.py ===================================== @@ -27,6 +27,7 @@
from gajim.common import app from gajim.common.const import AvatarSize +from gajim.common.helpers import validate_jid from gajim.common.i18n import _ from gajim.common.modules.contacts import GroupchatContact
@@ -64,12 +65,15 @@ def __init__(self,
self._prepare_subject() self._prepare_manage() + + self._ui.subject_textview.get_buffer().connect( + 'changed', self._on_subject_text_changed) self.connect('destroy', self._on_destroy)
self.show_all()
def _on_destroy(self, *args: Any) -> None: - self._avatar_selector = None + del self._avatar_selector app.check_finalize(self)
@property @@ -142,6 +146,7 @@ def _prepare_manage(self) -> None: if self_contact.affiliation.is_owner: self._client.get_module('MUC').request_config( self._contact.jid, callback=self._on_manage_form_received) + self._ui.destroy_muc_button.set_sensitive(True)
def _on_manage_form_received(self, task: Task) -> None: try: @@ -242,3 +247,37 @@ def update_avatar(self): AvatarSize.GROUP_INFO, self.get_scale_factor()) self._ui.avatar_button_image.set_from_surface(surface) + + def _on_destroy_clicked(self, _button: Gtk.Button) -> None: + self._ui.stack.set_visible_child_name('destroy') + self._ui.destroy_reason_entry.grab_focus() + self._ui.destroy_button.grab_default() + + def _on_destroy_alternate_changed(self, entry: Gtk.Entry) -> None: + jid = entry.get_text() + if jid: + try: + jid = validate_jid(jid) + except Exception: + icon = 'dialog-warning-symbolic' + text = _('Invalid XMPP Address') + self._ui.destroy_alternate_entry.set_icon_from_icon_name( + Gtk.EntryIconPosition.SECONDARY, icon) + self._ui.destroy_alternate_entry.set_icon_tooltip_text( + Gtk.EntryIconPosition.SECONDARY, text) + self._ui.destroy_button.set_sensitive(False) + return + self._ui.destroy_alternate_entry.set_icon_from_icon_name( + Gtk.EntryIconPosition.SECONDARY, None) + self._ui.destroy_button.set_sensitive(True) + + def _on_destroy_confirmed(self, _button: Gtk.Button) -> None: + reason = self._ui.destroy_reason_entry.get_text() + alternate_jid = self._ui.destroy_alternate_entry.get_text() + self._client.get_module('MUC').destroy( + self._contact.jid, reason, alternate_jid) + window = self.get_toplevel() + window.destroy() + + def _on_destroy_cancelled(self, _button: Gtk.Button) -> None: + self._ui.stack.set_visible_child_name('manage')
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/commit/e9cfd624146a7c95fd34ccf4bb202f8fa...