[quick_replies] Complete rework

This commit is contained in:
Daniel Brötzmann
2020-04-24 20:49:41 +02:00
parent 4098a77add
commit 63484c5b59
5 changed files with 286 additions and 120 deletions

View File

@@ -1,140 +1,113 @@
from gi.repository import Gtk
from gi.repository import GdkPixbuf
import json
from pathlib import Path
from functools import partial
from gajim.common import app
from gi.repository import Gtk
from gajim.common import configpaths
from gajim.plugins import GajimPlugin
from gajim.plugins.gui import GajimPluginConfigDialog
from gajim.plugins.helpers import log_calls
from gajim.plugins.plugins_i18n import _
from quick_replies.quick_replies import DEFAULT_DATA
from quick_replies.gtk.config import ConfigDialog
class QuickRepliesPlugin(GajimPlugin):
@log_calls('QuickRepliesPlugin')
def init(self):
self.description = _('Plugin for quick replies')
self.config_dialog = QuickRepliesPluginConfigDialog(self)
self.chat_control = None
self.description = _('Adds a menu with customizable quick replies')
self.config_dialog = partial(ConfigDialog, self)
self.gui_extension_points = {
'chat_control_base': (self.connect_with_chat_control,
self.disconnect_from_chat_control),
'chat_control_base_update_toolbar': (self.update_button_state,
None)}
self.config_default_values = {
'entry1': ('Hello!', ''),
'entry2': ('How are you?', ''),
'entry3': ('Good bye.', ''),
'entry4': ('', ''),
'entry5': ('', ''),
'entry6': ('', ''),
'entry7': ('', ''),
'entry8': ('', ''),
'entry9': ('', ''),
'entry10': ('', ''),
'chat_control_base': (self._connect_chat_control,
self._disconnect_chat_control),
}
self.controls = []
self._buttons = {}
self.quick_replies = self._load_quick_replies()
@log_calls('QuickRepliesPlugin')
def connect_with_chat_control(self, chat_control):
def _connect_chat_control(self, chat_control):
button = QuickRepliesButton(chat_control, self.quick_replies)
self._buttons[chat_control.control_id] = button
actions_hbox = chat_control.xml.get_object('hbox')
actions_hbox.pack_start(button, False, False, 0)
actions_hbox.reorder_child(
button, len(actions_hbox.get_children()) - 2)
button.show()
self.chat_control = chat_control
base = Base(self, chat_control)
self.controls.append(base)
def _disconnect_chat_control(self, chat_control):
button = self._buttons.get(chat_control.control_id)
if button is not None:
button.destroy()
self._buttons.pop(chat_control.control_id, None)
@log_calls('QuickRepliesPlugin')
def disconnect_from_chat_control(self, chat_control):
@staticmethod
def _load_quick_replies():
try:
data_path = Path(configpaths.get('PLUGINS_DATA'))
except KeyError:
# PLUGINS_DATA was added in 1.0.99.1
return DEFAULT_DATA
for control in self.controls:
control.disconnect_from_chat_control()
self.controls = []
path = data_path / 'quick_replies' / 'quick_replies'
if not path.exists():
return DEFAULT_DATA
@log_calls('QuickRepliesPlugin')
def update_button_state(self, chat_control):
for base in self.controls:
if base.chat_control != chat_control:
continue
base.button.set_sensitive(
app.account_is_connected(chat_control.account))
with path.open('r') as file:
quick_replies = json.load(file)
return quick_replies
@staticmethod
def _save_quick_replies(quick_replies):
try:
data_path = Path(configpaths.get('PLUGINS_DATA'))
except KeyError:
# PLUGINS_DATA was added in 1.0.99.1
return
path = data_path / 'quick_replies'
if not path.exists():
path.mkdir(parents=True)
filepath = path / 'quick_replies'
with filepath.open('w') as file:
json.dump(quick_replies, file)
def set_quick_replies(self, quick_replies):
self.quick_replies = quick_replies
self._save_quick_replies(quick_replies)
self._update_buttons()
def _update_buttons(self):
for button in self._buttons.values():
button.update_menu(self.quick_replies)
class Base(object):
class QuickRepliesButton(Gtk.MenuButton):
def __init__(self, chat_control, replies):
Gtk.MenuButton.__init__(self)
self.get_style_context().add_class('chatcontrol-actionbar-button')
self.set_property('relief', Gtk.ReliefStyle.NONE)
self.set_can_focus(False)
plugin_path = Path(__file__).parent
img_path = plugin_path.resolve() / 'quick_replies.png'
img = Gtk.Image.new_from_file(str(img_path))
self.set_image(img)
self.set_tooltip_text(_('Quick Replies'))
def __init__(self, plugin, chat_control):
self._chat_control = chat_control
self.plugin = plugin
self.chat_control = chat_control
self.create_button()
self.create_menu()
self.update_menu(replies)
def create_button(self):
def update_menu(self, replies):
self._menu = Gtk.Menu()
for reply in replies:
item = Gtk.MenuItem.new_with_label(label=reply)
item.connect('activate', self._on_insert, reply)
self._menu.append(item)
self._menu.show_all()
self.set_popup(self._menu)
actions_hbox = self.chat_control.xml.get_object('hbox')
self.button = Gtk.MenuButton(label=None, stock=None, use_underline=True)
self.button.get_style_context().add_class(
'chatcontrol-actionbar-button')
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('quick_replies.png')
pixbuf = GdkPixbuf.Pixbuf.new_from_file(img_path)
img.set_from_pixbuf(pixbuf)
self.button.set_image(img)
self.button.set_tooltip_text(_('Quick replies'))
actions_hbox.pack_start(self.button, False, False , 0)
actions_hbox.reorder_child(self.button,
len(actions_hbox.get_children()) - 2)
self.button.show()
def on_insert(self, widget, text):
text = text.rstrip() + ' '
message_buffer = self.chat_control.msg_textview.get_buffer()
self.chat_control.msg_textview.remove_placeholder()
message_buffer.insert_at_cursor(text)
self.chat_control.msg_textview.grab_focus()
def create_menu(self):
self.menu = Gtk.Menu()
for count in range(1, 11):
text = self.plugin.config['entry' + str(count)]
if not text:
continue
item = Gtk.MenuItem(text)
item.connect('activate', self.on_insert, text)
self.menu.append(item)
self.menu.show_all()
self.button.set_popup(self.menu)
def disconnect_from_chat_control(self):
actions_hbox = self.chat_control.xml.get_object('hbox')
actions_hbox.remove(self.button)
class QuickRepliesPluginConfigDialog(GajimPluginConfigDialog):
def init(self):
self.GTK_BUILDER_FILE_PATH = self.plugin.local_file_path(
'config_dialog.ui')
self.xml = Gtk.Builder()
self.xml.set_translation_domain('gajim_plugins')
self.xml.add_objects_from_file(self.GTK_BUILDER_FILE_PATH, ['table1'])
hbox = self.xml.get_object('table1')
self.get_child().pack_start(hbox, True, True, 0)
self.xml.connect_signals(self)
def on_run(self):
for count in range(1, 11):
self.xml.get_object('entry' + str(count)).set_text(
self.plugin.config['entry' + str(count)])
def entry_changed(self, widget):
name = Gtk.Buildable.get_name(widget)
self.plugin.config[name] = widget.get_text()
for control in self.plugin.controls:
control.create_menu()
def _on_insert(self, widget, text):
message_buffer = self._chat_control.msg_textview.get_buffer()
self._chat_control.msg_textview.remove_placeholder()
message_buffer.insert_at_cursor(text.rstrip() + ' ')
self._chat_control.msg_textview.grab_focus()