From 9b1bb0a4de9610095caddc7df88958a89a18d48a Mon Sep 17 00:00:00 2001 From: Rui Matos Date: Fri, 3 Apr 2015 17:10:52 +0200 Subject: [PATCH 02/12] xkb: Switch to expanders and radio buttons instead of combo boxes Since some of the xkb options have unfortunately long description strings, combo boxes don't really work to present them so instead let's go with radio buttons under an expander which allows us to easily present long strings by wrapping them. https://bugzilla.gnome.org/show_bug.cgi?id=711137 --- gtweak/tweaks/tweak_group_xkb.py | 65 +++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 31 deletions(-) diff --git a/gtweak/tweaks/tweak_group_xkb.py b/gtweak/tweaks/tweak_group_xkb.py index 0e1c902..7b16829 100644 --- a/gtweak/tweaks/tweak_group_xkb.py +++ b/gtweak/tweaks/tweak_group_xkb.py @@ -28,15 +28,20 @@ from gtweak.gsettings import GSettingsSetting, GSettingsMissingError, GSettingsF _shell = GnomeShellFactory().get_shell() _shell_loaded = _shell is not None -class _XkbOption(Gtk.Box, Tweak): +class _XkbOption(Gtk.Expander, Tweak): def __init__(self, group_id, parent_settings, xkb_info, **options): try: desc = xkb_info.description_for_group(group_id) except AttributeError: desc = group_id - Gtk.Box.__init__(self, orientation=Gtk.Orientation.HORIZONTAL) + Gtk.Expander.__init__(self) Tweak.__init__(self, desc, desc, **options) + self.set_label(self.name) + vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=3) + vbox.set_margin_start(15) + self.add(vbox) + self._group_id = group_id self._parent_settings = parent_settings self._xkb_info = xkb_info @@ -49,53 +54,53 @@ class _XkbOption(Gtk.Box, Tweak): model_values.append((option_id, desc)) self._possible_values.append(option_id) - store = Gtk.ListStore(str, str) - store.set_sort_column_id(0, Gtk.SortType.ASCENDING) + self._radios = dict() for (val, name) in model_values: - store.append((val, name)) - - self._combo = Gtk.ComboBox(model = store) - renderer = Gtk.CellRendererText() - renderer.props.ellipsize = Pango.EllipsizeMode.END - renderer.props.max_width_chars = 30 - self._combo.pack_start(renderer, True) - self._combo.add_attribute(renderer, "text", 1) - self._combo_changed_handler_id = self._combo.connect("changed", self._on_combo_changed) + self._radios[val] = r = Gtk.RadioButton.new_from_widget(self._radios.get(None)) + vbox.add(r) + l = Gtk.Label(name) + l.set_line_wrap(True) + r.add(l) + r._changed_id = r.connect('toggled', self._on_radio_changed) + r._val = val - build_label_beside_widget(self.name, self._combo, hbox=self) self.widget_for_size_group = None - self.reload() def reload(self): for v in self._parent_settings.get_strv(TypingTweakGroup.XKB_GSETTINGS_NAME): if (v in self._possible_values): self._value = v - self._update_combo() + self._update_radios() return self._value = None - self._update_combo() + self._update_radios() + + def _update_radios(self): + if self._value: + self.set_label(''+self.name+'') + self.set_use_markup(True) + else: + self.set_label(self.name) - def _update_combo(self): - model = self._combo.get_model() - for row in model: - if self._value == row[0]: - self._combo.disconnect(self._combo_changed_handler_id) - self._combo.set_active_iter(row.iter) - self._combo_changed_handler_id = self._combo.connect("changed", self._on_combo_changed) - break + r = self._radios.get(self._value) + if r: + r.disconnect(r._changed_id) + r.set_active(True) + r._changed_id = r.connect('toggled', self._on_radio_changed) - def _on_combo_changed(self, combo): - new_value = combo.get_model().get_value(combo.get_active_iter(), 0) + def _on_radio_changed(self, r): + if not r.get_active(): + return - if not new_value: + if not r._val: if self._value: self._parent_settings.setting_remove_from_list(TypingTweakGroup.XKB_GSETTINGS_NAME, self._value) else: if self._value: self._parent_settings.setting_remove_from_list(TypingTweakGroup.XKB_GSETTINGS_NAME, self._value) - self._parent_settings.setting_add_to_list(TypingTweakGroup.XKB_GSETTINGS_NAME, new_value) + self._parent_settings.setting_add_to_list(TypingTweakGroup.XKB_GSETTINGS_NAME, r._val) class TypingTweakGroup(Gtk.Box, TweakGroup): @@ -107,7 +112,6 @@ class TypingTweakGroup(Gtk.Box, TweakGroup): def __init__(self): Gtk.Box.__init__(self, orientation=Gtk.Orientation.VERTICAL, spacing=3) self._option_objects = [] - self._sg = Gtk.SizeGroup(mode=Gtk.SizeGroupMode.HORIZONTAL) ok = False try: self._kbdsettings = GSettingsSetting(self.XKB_GSETTINGS_SCHEMA) @@ -125,7 +129,6 @@ class TypingTweakGroup(Gtk.Box, TweakGroup): if ok: for opt in set(self._xkb_info.get_all_option_groups()) - self.XKB_OPTIONS_BLACKLIST: obj = _XkbOption(opt, self._kbdsettings, self._xkb_info) - self._sg.add_widget(obj._combo) self._option_objects.append(obj) self.pack_start(obj, False, False, 0) TweakGroup.__init__(self, _("Typing"), *self._option_objects) -- 2.3.6