Philipp Hörist pushed to branch master at gajim / gajim
Commits: e1bef611 by Philipp Hörist at 2019-06-12T19:18:58Z MUC: Rework captcha prompt
- - - - -
4 changed files:
- gajim/chat_control_base.py - gajim/data/gui/groupchat_control.ui - gajim/groupchat_control.py - gajim/gtk/dataform.py
Changes:
===================================== gajim/chat_control_base.py ===================================== @@ -314,6 +314,8 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): self.msg_textview.drag_dest_set(Gtk.DestDefaults.MOTION | Gtk.DestDefaults.HIGHLIGHT, self.dnd_list, Gdk.DragAction.COPY)
+ self._overlay = self.xml.get_object('overlay') + # the following vars are used to keep history of user's messages self.sent_history = [] self.sent_history_pos = 0
===================================== gajim/data/gui/groupchat_control.ui ===================================== @@ -98,309 +98,318 @@ <signal name="button-release-event" handler="_on_hpaned_release_button" swapped="no"/> <signal name="notify::position" handler="_on_hpaned_handle_change" swapped="no"/> <child> - <object class="GtkBox" id="gc_textviews_vbox"> - <property name="width_request">0</property> + <object class="GtkOverlay" id="overlay"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="margin_right">4</property> - <property name="orientation">vertical</property> <child> - <object class="GtkEventBox" id="banner_eventbox"> - <property name="name">GroupChatControl-BannerEventBox</property> + <object class="GtkBox" id="gc_textviews_vbox"> + <property name="width_request">0</property> <property name="visible">True</property> <property name="can_focus">False</property> + <property name="margin_right">4</property> + <property name="orientation">vertical</property> <child> - <object class="GtkBox" id="hbox3024"> + <object class="GtkEventBox" id="banner_eventbox"> + <property name="name">GroupChatControl-BannerEventBox</property> <property name="visible">True</property> <property name="can_focus">False</property> <child> - <object class="GtkImage" id="gc_banner_status_image"> + <object class="GtkBox" id="hbox3024"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="stock">gtk-missing-image</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="padding">5</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="banner_name_label"> - <property name="name">GroupChatControl-BannerNameLabel</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label"><span weight="heavy" size="large">room jid</span></property> - <property name="use_markup">True</property> - <property name="selectable">True</property> - <property name="xalign">0</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - <child> - <object class="GtkActionBar" id="banner_actionbar"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <style> - <class name="actionbar-no-border"/> - </style> - </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="pack_type">end</property> - <property name="position">2</property> - </packing> - </child> - </object> - </child> - <style> - <class name="gajim-banner"/> - </style> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkSeparator"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <style> - <class name="chatcontrol-separator-top"/> - </style> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - <child> - <object class="GtkScrolledWindow" id="conversation_scrolledwindow"> - <property name="width_request">200</property> - <property name="height_request">60</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="shadow_type">in</property> - <property name="overlay_scrolling">False</property> - <signal name="edge-reached" handler="_on_edge_reached" swapped="no"/> - <signal name="scroll-event" handler="_on_scroll" swapped="no"/> - <child> - <placeholder/> - </child> - <style> - <class name="scrolled-no-border"/> - <class name="no-scroll-indicator"/> - <class name="scrollbar-style"/> - </style> - </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">2</property> - </packing> - </child> - <child> - <object class="GtkSeparator"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <style> - <class name="chatcontrol-separator"/> - </style> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">3</property> - </packing> - </child> - <child> - <object class="GtkBox" id="hbox"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <child> - <object class="GtkMenuButton" id="settings_menu"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="relief">none</property> - <child> - <object class="GtkImage"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="icon_name">open-menu-symbolic</property> + <child> + <object class="GtkImage" id="gc_banner_status_image"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-missing-image</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="banner_name_label"> + <property name="name">GroupChatControl-BannerNameLabel</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label"><span weight="heavy" size="large">room jid</span></property> + <property name="use_markup">True</property> + <property name="selectable">True</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkActionBar" id="banner_actionbar"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <style> + <class name="actionbar-no-border"/> + </style> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> + </child> </object> </child> <style> - <class name="chatcontrol-actionbar-button"/> + <class name="gajim-banner"/> </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="authentication_button"> - <property name="can_focus">True</property> - <property name="focus_on_click">False</property> - <property name="receives_default">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="no_show_all">True</property> - <property name="relief">none</property> - <child> - <object class="GtkImage" id="lock_image"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="stock">gtk-dialog-authentication</property> - <property name="icon_size">1</property> - </object> - </child> + <object class="GtkSeparator"> + <property name="visible">True</property> + <property name="can_focus">False</property> <style> - <class name="chatcontrol-actionbar-button"/> + <class name="chatcontrol-separator-top"/> </style> </object> <packing> <property name="expand">False</property> - <property name="fill">False</property> - <property name="pack_type">end</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> <child> - <object class="GtkMenuButton" id="encryption_menu"> + <object class="GtkScrolledWindow" id="conversation_scrolledwindow"> + <property name="width_request">200</property> + <property name="height_request">60</property> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Choose encryption</property> - <property name="relief">none</property> + <property name="shadow_type">in</property> + <property name="overlay_scrolling">False</property> + <signal name="edge-reached" handler="_on_edge_reached" swapped="no"/> + <signal name="scroll-event" handler="_on_scroll" swapped="no"/> <child> <placeholder/> </child> <style> - <class name="chatcontrol-actionbar-button"/> + <class name="scrolled-no-border"/> + <class name="no-scroll-indicator"/> + <class name="scrollbar-style"/> </style> </object> <packing> - <property name="expand">False</property> + <property name="expand">True</property> <property name="fill">True</property> - <property name="pack_type">end</property> <property name="position">2</property> </packing> </child> <child> - <object class="GtkButton" id="sendfile_button"> + <object class="GtkSeparator"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="focus_on_click">False</property> - <property name="receives_default">True</property> - <property name="relief">none</property> - <child> - <object class="GtkImage"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="icon_name">mail-attachment-symbolic</property> - </object> - </child> + <property name="can_focus">False</property> <style> - <class name="chatcontrol-actionbar-button"/> + <class name="chatcontrol-separator"/> </style> </object> <packing> <property name="expand">False</property> - <property name="fill">False</property> - <property name="pack_type">end</property> + <property name="fill">True</property> <property name="position">3</property> </packing> </child> <child> - <object class="GtkMenuButton" id="emoticons_button"> + <object class="GtkBox" id="hbox"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Show a list of emojis (Alt+M)</property> - <property name="relief">none</property> + <property name="can_focus">False</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <child> - <object class="GtkImage"> + <object class="GtkMenuButton" id="settings_menu"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="icon_name">face-smile-symbolic</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="relief">none</property> + <child> + <object class="GtkImage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="icon_name">open-menu-symbolic</property> + </object> + </child> + <style> + <class name="chatcontrol-actionbar-button"/> + </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="authentication_button"> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="no_show_all">True</property> + <property name="relief">none</property> + <child> + <object class="GtkImage" id="lock_image"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-dialog-authentication</property> + <property name="icon_size">1</property> + </object> + </child> + <style> + <class name="chatcontrol-actionbar-button"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkMenuButton" id="encryption_menu"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Choose encryption</property> + <property name="relief">none</property> + <child> + <placeholder/> + </child> + <style> + <class name="chatcontrol-actionbar-button"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">2</property> + </packing> </child> - <style> - <class name="chatcontrol-actionbar-button"/> - </style> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">4</property> - </packing> - </child> - <child> - <object class="GtkMenuButton" id="formattings_button"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="focus_on_click">False</property> - <property name="receives_default">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="has_tooltip">True</property> - <property name="relief">none</property> - <property name="popup">formattings_menu</property> <child> - <object class="GtkImage" id="image10"> + <object class="GtkButton" id="sendfile_button"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="relief">none</property> + <child> + <object class="GtkImage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="icon_name">mail-attachment-symbolic</property> + </object> + </child> + <style> + <class name="chatcontrol-actionbar-button"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="GtkMenuButton" id="emoticons_button"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Show a list of emojis (Alt+M)</property> + <property name="relief">none</property> + <child> + <object class="GtkImage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="icon_name">face-smile-symbolic</property> + </object> + </child> + <style> + <class name="chatcontrol-actionbar-button"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="GtkMenuButton" id="formattings_button"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="focus_on_click">False</property> + <property name="receives_default">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="has_tooltip">True</property> + <property name="relief">none</property> + <property name="popup">formattings_menu</property> + <child> + <object class="GtkImage" id="image10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="icon_name">format-text-bold-symbolic</property> + <property name="icon_size">1</property> + </object> + </child> + <style> + <class name="chatcontrol-actionbar-button"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <placeholder/> + </child> + <child> + <object class="GtkComboBox" id="label_selector"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="icon_name">format-text-bold-symbolic</property> - <property name="icon_size">1</property> + <property name="no_show_all">True</property> </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> </child> - <style> - <class name="chatcontrol-actionbar-button"/> - </style> </object> <packing> <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">5</property> - </packing> - </child> - <child> - <placeholder/> - </child> - <child> - <object class="GtkComboBox" id="label_selector"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="no_show_all">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">7</property> + <property name="fill">False</property> + <property name="position">4</property> </packing> </child> </object> <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">4</property> + <property name="index">-1</property> </packing> </child> </object> <packing> - <property name="resize">True</property> + <property name="resize">False</property> <property name="shrink">False</property> </packing> </child>
===================================== gajim/groupchat_control.py ===================================== @@ -264,8 +264,6 @@ class GroupchatControl(ChatControlBase):
self.setup_seclabel()
- self.form_widget = None - # Send file self.sendfile_button = self.xml.get_object('sendfile_button') self.sendfile_button.set_action_name('win.send-file-' + \ @@ -299,6 +297,9 @@ class GroupchatControl(ChatControlBase): self.banner_actionbar.pack_end(self.hide_roster_button) self.banner_actionbar.pack_start(self.subject_button)
+ # Holds CaptchaRequest widget + self._captcha_request = None + # GC Roster tooltip self.gc_tooltip = GCTooltip()
@@ -1155,42 +1156,31 @@ class GroupchatControl(ChatControlBase): if event.jid != self.room_jid: return
- if self.form_widget: - self.form_widget.hide() - self.form_widget.destroy() - self.btn_box.destroy() # pylint: disable=access-member-before-definition + self._remove_captcha_request()
- self.form_widget = DataFormWidget(event.form) - - def on_send_dataform_clicked(widget): - if not self.form_widget: - return - form_node = self.form_widget.get_submit_form() + def on_send_dataform_clicked(*args): + form_node = self._captcha_request.get_submit_form() con = app.connections[self.account] con.get_module('MUC').send_captcha(self.room_jid, form_node) - self.form_widget.hide() - self.form_widget.destroy() - self.btn_box.destroy() - self.form_widget = None - del self.btn_box - - # self.form_widget.connect('validated', on_send_dataform_clicked) - self.form_widget.show_all() - vbox = self.xml.get_object('gc_textviews_vbox') - vbox.pack_start(self.form_widget, False, True, 0) - - valid_button = Gtk.Button(stock=Gtk.STOCK_OK) - valid_button.connect('clicked', on_send_dataform_clicked) - self.btn_box = Gtk.HButtonBox() - self.btn_box.set_layout(Gtk.ButtonBoxStyle.END) - self.btn_box.pack_start(valid_button, True, True, 0) - self.btn_box.show_all() - vbox.pack_start(self.btn_box, False, False, 0) + self._remove_captcha_request() + + self._captcha_request = CaptchaRequest(event.form, + on_send_dataform_clicked) + self._overlay.add_overlay(self._captcha_request) + if self.parent_win: self.parent_win.redraw_tab(self, 'attention') else: self.attention_flag = True
+ def _remove_captcha_request(self): + if self._captcha_request is None: + return + if self._captcha_request in self._overlay.get_children(): + self._overlay.remove(self._captcha_request) + self._captcha_request.destroy() + self._captcha_request = None + def _nec_mam_decrypted_message_received(self, obj): if obj.conn.name != self.account: return @@ -3062,3 +3052,27 @@ class SubjectPopover(Gtk.Popover): # is not cross-platform compatible open_uri(uri) return Gdk.EVENT_STOP + + +class CaptchaRequest(Gtk.Box): + def __init__(self, form, callback): + Gtk.Box.__init__(self, orientation=Gtk.Orientation.VERTICAL) + + options = {'no-scrolling': True} + self._form_widget = DataFormWidget(form, options=options) + self._form_widget.set_valign(Gtk.Align.START) + + send_button = Gtk.Button(label='Send') + send_button.connect('clicked', callback) + send_button.set_halign(Gtk.Align.CENTER) + + self.add(self._form_widget) + self.add(send_button) + + self.set_valign(Gtk.Align.START) + self.set_margin_top(100) + + self.show_all() + + def get_submit_form(self): + return self._form_widget.get_submit_form()
===================================== gajim/gtk/dataform.py ===================================== @@ -38,10 +38,13 @@ class DataFormWidget(Gtk.ScrolledWindow): self.get_style_context().add_class('data-form-widget') self.set_overlay_scrolling(False)
- self._form_node = form_node - if options is None: options = {} + + if options.get('no-scrolling', False): + self.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.NEVER) + + self._form_node = form_node self._form_grid = FormGrid(form_node, options)
self.add(self._form_grid)
View it on GitLab: https://dev.gajim.org/gajim/gajim/commit/e1bef6111caa5132adc60bc4c5c06d36b1d...