From b03b51a24c4308f460fe93bc2da6823adde75c5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20H=C3=B6rist?= Date: Fri, 27 Oct 2017 01:02:09 +0200 Subject: [PATCH] [tictactoe] Adapt to new ChatControl design --- tictactoe/plugin.py | 65 +++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 34 deletions(-) diff --git a/tictactoe/plugin.py b/tictactoe/plugin.py index 8a5a483..b929a3a 100644 --- a/tictactoe/plugin.py +++ b/tictactoe/plugin.py @@ -36,8 +36,8 @@ from gajim.plugins.gui import GajimPluginConfigDialog import nbxmpp from gi.repository import Gtk from gi.repository import Gdk -from gi.repository import GdkPixbuf -from gi.repository import cairo +from gi.repository import Gio +from gi.repository import GLib import gi gi.require_version('PangoCairo', '1.0') from gi.repository import PangoCairo @@ -61,7 +61,7 @@ class TictactoePlugin(GajimPlugin): self._nec_decrypted_message_received), } self.gui_extension_points = { - 'chat_control_base' : (self.connect_with_chat_control, + 'chat_control' : (self.connect_with_chat_control, self.disconnect_from_chat_control), 'chat_control_base_update_toolbar': (self.update_button_state, None), @@ -111,7 +111,7 @@ class TictactoePlugin(GajimPlugin): TicTacToeSession)] if tictactoes: base.tictactoe = tictactoes[0] - base.button.set_active(True) + base.enable_action(True) @log_calls('TictactoePlugin') def disconnect_from_chat_control(self, chat_control): @@ -125,13 +125,9 @@ class TictactoePlugin(GajimPlugin): if base.chat_control == control: if control.contact.supports(NS_GAMES) and \ control.contact.supports(NS_GAMES_TICTACTOE): - base.button.set_sensitive(True) - tooltip_text = _('Play tictactoe') + base.enable_action(True) else: - base.button.set_sensitive(False) - tooltip_text = _('Client on the other side ' - 'does not support playing tictactoe') - base.button.set_tooltip_text(tooltip_text) + base.enable_action(False) @log_calls('TictactoePlugin') def show_request_dialog(self, obj, session): @@ -174,34 +170,31 @@ class Base(object): self.contact = self.chat_control.contact self.account = self.chat_control.account self.fjid = self.contact.get_full_jid() - self.create_buttons() + self.add_action() self.tictactoe = None - def create_buttons(self): - # create whiteboard button - actions_hbox = self.chat_control.xml.get_object('actions_hbox') - self.button = Gtk.ToggleButton() - self.button.set_property('relief', Gtk.ReliefStyle.NONE) - self.button.set_property('can-focus', False) - img = Gtk.Image() - img_path = self.plugin.local_file_path('tictactoe.png') - pixbuf = GdkPixbuf.Pixbuf.new_from_file(img_path) - iconset = Gtk.IconSet(pixbuf=pixbuf) - factory = Gtk.IconFactory() - factory.add('tictactoe', iconset) - factory.add_default() - img.set_from_stock('tictactoe', Gtk.IconSize.MENU) - self.button.set_image(img) - actions_hbox.pack_start(self.button, False, False, 0) - id_ = self.button.connect('toggled', self.on_tictactoe_button_toggled) - self.chat_control.handlers[id_] = self.button - self.button.show() + def add_action(self): + action_name = 'toggle-tictactoe-' + self.chat_control.control_id + act = Gio.SimpleAction.new_stateful( + action_name, None, GLib.Variant.new_boolean(False)) + act.connect('change-state', self.on_tictactoe_button_toggled) + self.chat_control.parent_win.window.add_action(act) - def on_tictactoe_button_toggled(self, widget): + self.chat_control.control_menu.append( + 'TicTacToe', 'win.' + action_name) + + def enable_action(self, state): + win = self.chat_control.parent_win.window + action_name = 'toggle-tictactoe-' + self.chat_control.control_id + win.lookup_action(action_name).set_enabled(state) + + def on_tictactoe_button_toggled(self, action, param): """ Popup whiteboard """ - if widget.get_active(): + action.set_state(param) + state = param.get_boolean() + if state: if not self.tictactoe: self.start_tictactoe() else: @@ -220,8 +213,12 @@ class Base(object): self.tictactoe = None def disconnect_from_chat_control(self): - actions_hbox = self.chat_control.xml.get_object('actions_hbox') - actions_hbox.remove(self.button) + menu = self.chat_control.control_menu + for i in range(menu.get_n_items()): + label = menu.get_item_attribute_value(i, 'label') + if label.get_string() == 'TicTacToe': + menu.remove(i) + break class InvalidMove(Exception): pass