diff options
author | Philipp Hörist <philipp@hoerist.com> | 2018-10-15 02:06:34 +0300 |
---|---|---|
committer | Philipp Hörist <philipp@hoerist.com> | 2018-10-15 02:06:34 +0300 |
commit | 33ea49db00466d7126c7f44b56638d06412818d9 (patch) | |
tree | b597e9d64094d0aa1a0d840b2633aab5f5604ba4 /acronyms_expander/gtk | |
parent | 91baabe4d4a8583c52139c8ccd799c793af6bf72 (diff) |
[acronyms] Add config dialog
Diffstat (limited to 'acronyms_expander/gtk')
-rw-r--r-- | acronyms_expander/gtk/config.py | 90 | ||||
-rw-r--r-- | acronyms_expander/gtk/config.ui | 139 |
2 files changed, 229 insertions, 0 deletions
diff --git a/acronyms_expander/gtk/config.py b/acronyms_expander/gtk/config.py new file mode 100644 index 0000000..706551a --- /dev/null +++ b/acronyms_expander/gtk/config.py @@ -0,0 +1,90 @@ +# Copyright (C) 2018 Philipp Hörist <philipp AT hoerist.com> +# +# This file is part of Acronyms Expander. +# +# Acronyms Expander is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published +# by the Free Software Foundation; version 3 only. +# +# Acronyms Expander is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Acronyms Expander. If not, see <http://www.gnu.org/licenses/>. + +from pathlib import Path + +from gi.repository import Gtk +from gi.repository import Gdk + +from gajim.common import app + +from gajim.plugins.plugins_i18n import _ +from gajim.plugins.helpers import get_builder + + +class ConfigDialog(Gtk.ApplicationWindow): + def __init__(self, plugin, transient): + Gtk.ApplicationWindow.__init__(self) + self.set_application(app.app) + self.set_show_menubar(False) + self.set_title(_('Acronyms Configuration')) + self.set_transient_for(transient) + self.set_default_size(400, 400) + self.set_type_hint(Gdk.WindowTypeHint.DIALOG) + self.set_modal(True) + self.set_destroy_with_parent(True) + + ui_path = Path(__file__).parent + self._ui = get_builder(ui_path / 'config.ui') + + self._plugin = plugin + + self.add(self._ui.grid) + + self._fill_list() + self.show_all() + + self._ui.connect_signals(self) + self.connect('destroy', self._on_destroy) + + def _fill_list(self): + for acronym, substitute in self._plugin.acronyms.items(): + self._ui.acronyms_store.append([acronym, substitute]) + + def _on_acronym_edited(self, _renderer, path, new_text): + iter_ = self._ui.acronyms_store.get_iter(path) + self._ui.acronyms_store.set_value(iter_, 0, new_text) + + def _on_substitute_edited(self, _renderer, path, new_text): + iter_ = self._ui.acronyms_store.get_iter(path) + self._ui.acronyms_store.set_value(iter_, 1, new_text) + + def _on_add_clicked(self, _button): + self._ui.acronyms_store.append(['', '']) + row = self._ui.acronyms_store[-1] + self._ui.acronyms_treeview.scroll_to_cell( + row.path, None, False, 0, 0) + self._ui.selection.unselect_all() + self._ui.selection.select_path(row.path) + + def _on_remove_clicked(self, _button): + model, paths = self._ui.selection.get_selected_rows() + references = [] + for path in paths: + references.append(Gtk.TreeRowReference.new(model, path)) + + for ref in references: + iter_ = model.get_iter(ref.get_path()) + self._ui.acronyms_store.remove(iter_) + + def _on_destroy(self, *args): + acronyms = {} + for row in self._ui.acronyms_store: + acronym, substitute = row + if not acronym or not substitute: + continue + acronyms[acronym] = substitute + self._plugin.set_acronyms(acronyms) diff --git a/acronyms_expander/gtk/config.ui b/acronyms_expander/gtk/config.ui new file mode 100644 index 0000000..9c2a03b --- /dev/null +++ b/acronyms_expander/gtk/config.ui @@ -0,0 +1,139 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface> + <requires lib="gtk+" version="3.20"/> + <object class="GtkListStore" id="acronyms_store"> + <columns> + <!-- column-name acronym --> + <column type="gchararray"/> + <!-- column-name substitute --> + <column type="gchararray"/> + </columns> + </object> + <object class="GtkGrid" id="grid"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="margin_left">12</property> + <property name="margin_right">12</property> + <property name="margin_top">12</property> + <property name="margin_bottom">12</property> + <property name="row_spacing">6</property> + <child> + <object class="GtkScrolledWindow"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkTreeView" id="acronyms_treeview"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hexpand">True</property> + <property name="vexpand">True</property> + <property name="model">acronyms_store</property> + <property name="search_column">1</property> + <child internal-child="selection"> + <object class="GtkTreeSelection" id="selection"> + <property name="mode">multiple</property> + </object> + </child> + <child> + <object class="GtkTreeViewColumn"> + <property name="resizable">True</property> + <property name="title" translatable="yes">Acronym</property> + <property name="clickable">True</property> + <property name="sort_indicator">True</property> + <property name="sort_column_id">0</property> + <child> + <object class="GtkCellRendererText"> + <property name="editable">True</property> + <signal name="edited" handler="_on_acronym_edited" swapped="no"/> + </object> + <attributes> + <attribute name="text">0</attribute> + </attributes> + </child> + </object> + </child> + <child> + <object class="GtkTreeViewColumn"> + <property name="resizable">True</property> + <property name="title" translatable="yes">Substitute</property> + <property name="clickable">True</property> + <property name="sort_indicator">True</property> + <property name="sort_column_id">0</property> + <child> + <object class="GtkCellRendererText"> + <property name="editable">True</property> + <signal name="edited" handler="_on_substitute_edited" swapped="no"/> + </object> + <attributes> + <attribute name="text">1</attribute> + </attributes> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkButtonBox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkButton"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="halign">start</property> + <signal name="clicked" handler="_on_add_clicked" swapped="no"/> + <child> + <object class="GtkImage"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="icon_name">list-add-symbolic</property> + </object> + </child> + <style> + <class name="suggested-action"/> + </style> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton"> + <property name="label" translatable="yes">Remove</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="halign">end</property> + <signal name="clicked" handler="_on_remove_clicked" swapped="no"/> + <style> + <class name="destructive-action"/> + </style> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + </object> +</interface> |