Display more options in "reset" menu
Andrew P.
9 years ago
96 | 96 | <property name="receives_default">True</property> |
97 | 97 | <property name="halign">start</property> |
98 | 98 | <property name="font">Sans 12</property> |
99 | <property name="use_font">True</property> | |
99 | 100 | </object> |
100 | 101 | <packing> |
101 | 102 | <property name="left_attach">1</property> |
74 | 74 | if not values: |
75 | 75 | del self._items[item] |
76 | 76 | |
77 | def get_key_file(self, key): | |
78 | values = self._items.get(key) | |
79 | return values[-1][0] if values else None | |
80 | ||
81 | 77 | def __init__(self): |
82 | 78 | self._output_path = helpers.get_config_path() |
83 | 79 | self._groups = OrderedDict() |
80 | self._key_values = helpers.SimpleDictWrapper(getter=self._get_key_values) | |
84 | 81 | |
85 | 82 | def read(self): |
86 | 83 | self._groups.clear() |
159 | 156 | else: |
160 | 157 | return self._groups.setdefault(name, Config.ConfigGroup(self)) |
161 | 158 | |
162 | def get_key_file(self, groupname, key): | |
163 | group = self._groups.get(groupname) | |
164 | return group.get_key_file(key) if group is not None else None | |
159 | @property | |
160 | def key_values(self): | |
161 | return self._key_values | |
162 | ||
163 | def _get_key_values(self, item): | |
164 | group = self._groups.get(item[0]) | |
165 | if group: | |
166 | values = group._items.get(item[1]) | |
167 | if values is not None: | |
168 | return tuple(values) | |
169 | return None | |
165 | 170 | |
166 | 171 | def __iter__(self): |
167 | 172 | return iter(self._groups) |
288 | 288 | if event.button != 3: |
289 | 289 | return |
290 | 290 | |
291 | def new_item(activate=None, width=90): | |
292 | item = Gtk.MenuItem('') | |
293 | label = item.get_child() | |
294 | label.props.use_markup = True | |
295 | label.props.ellipsize = Pango.EllipsizeMode.END | |
296 | label.props.max_width_chars = width | |
297 | if activate: | |
298 | item.connect('activate', activate) | |
299 | else: | |
300 | item.props.sensitive = False | |
301 | return item | |
302 | ||
291 | 303 | if not self._entry_menu: |
292 | def new_item(activate=None, width=90): | |
293 | item = Gtk.MenuItem('') | |
294 | label = item.get_child() | |
295 | label.props.use_markup = True | |
296 | label.props.ellipsize = Pango.EllipsizeMode.END | |
297 | label.props.max_width_chars = width | |
298 | if activate: | |
299 | item.connect('activate', activate) | |
300 | else: | |
301 | item.props.sensitive = False | |
302 | return item | |
303 | ||
304 | 304 | class EntryMenu: |
305 | 305 | menu = Gtk.Menu() |
306 | 306 | value = new_item() |
311 | 311 | reset_separator = Gtk.SeparatorMenuItem() |
312 | 312 | initial = new_item(self.on_entry_reset_clicked) |
313 | 313 | default = new_item(self.on_entry_reset_clicked) |
314 | other = [] | |
314 | 315 | |
315 | 316 | menu.append(value) |
316 | 317 | menu.append(file) |
341 | 342 | key=key, |
342 | 343 | value=format_value(value=entry.value, enabled=entry.enabled)) |
343 | 344 | |
344 | key_file = None | |
345 | if entry not in self._changed_entries: | |
346 | key_file = self._config.get_key_file(group.name, key) | |
347 | if key_file and key_file == helpers.get_config_path(): | |
348 | key_file = None | |
349 | elif key_file: | |
345 | config_values = self._config.key_values[group.name, key] | |
346 | ||
347 | if entry not in self._changed_entries and \ | |
348 | config_values and config_values[-1][0] != helpers.get_config_path(): | |
350 | 349 | menu.file.props.label = _('Value defined in file: {path}')\ |
351 | .format(path=escape_markup(key_file)) | |
352 | menu.file.set_tooltip_text(key_file) | |
353 | menu.file.props.visible = key_file is not None | |
350 | .format(path=escape_markup(config_values[-1][0])) | |
351 | menu.file.set_tooltip_text(config_values[-1][0]) | |
352 | menu.file.show() | |
353 | else: | |
354 | menu.file.hide() | |
354 | 355 | |
355 | 356 | error = entry.error |
356 | 357 | error_action = None |
396 | 397 | else: |
397 | 398 | menu.default.props.visible = False |
398 | 399 | |
400 | item_idx = 0 | |
401 | if config_values and len(config_values) > 1: | |
402 | values = {None, default, self._initial_values[entry].value, entry.value} | |
403 | for __, value in config_values[:-1]: | |
404 | if value in values: | |
405 | continue | |
406 | ||
407 | if len(menu.other) <= item_idx: | |
408 | item = new_item(self.on_entry_reset_clicked) | |
409 | menu.other.append(item) | |
410 | menu.menu.append(item) | |
411 | else: | |
412 | item = menu.other[item_idx] | |
413 | item._reset_entry_data = entry, value, None | |
414 | value = format_value(value=value) | |
415 | item.set_tooltip_markup(value) | |
416 | item.props.label = _('Reset to value: <b>{value}</b>').format(value=value) | |
417 | item.show() | |
418 | item_idx += 1 | |
419 | for item in menu.other[item_idx:]: | |
420 | item.hide() | |
421 | ||
399 | 422 | menu.reset_separator.props.visible = \ |
400 | menu.initial.props.visible or menu.default.props.visible | |
423 | menu.initial.props.visible or menu.default.props.visible or \ | |
424 | any(item.props.visible for item in menu.other) | |
401 | 425 | |
402 | 426 | self._entry_menu.menu.popup(None, None, None, None, 0, Gtk.get_current_event_time()) |
403 | 427 |
19 | 19 | |
20 | 20 | from lightdm_gtk_greeter_settings.helpers import WidgetsWrapper |
21 | 21 | from lightdm_gtk_greeter_settings.OptionEntry import BaseEntry |
22 | from lightdm_gtk_greeter_settings import helpers | |
22 | 23 | |
23 | 24 | |
24 | 25 | __all__ = [ |
29 | 30 | # Broken solution - too complex |
30 | 31 | class BaseGroup(GObject.GObject): |
31 | 32 | |
32 | class __DictWrapper: | |
33 | ||
34 | def __init__(self, getter): | |
35 | self._getter = getter | |
36 | ||
37 | def __getitem__(self, key): | |
38 | return self._getter(key) | |
39 | ||
40 | 33 | def __init__(self, widgets): |
41 | 34 | super().__init__() |
42 | self.__entries_wrapper = None | |
43 | self.__defaults_wrapper = None | |
35 | self.__entries_wrapper = helpers.SimpleDictWrapper(self._get_entry) | |
36 | self.__defaults_wrapper = helpers.SimpleDictWrapper(self._get_default) | |
44 | 37 | |
45 | 38 | def read(self, config): |
46 | 39 | '''Read group content from specified GreeterConfig object''' |
53 | 46 | @property |
54 | 47 | def entries(self): |
55 | 48 | '''entries["key"] - key => Entry mapping. Read only.''' |
56 | if not self.__entries_wrapper: | |
57 | self.__entries_wrapper = BaseGroup.__DictWrapper(self._get_entry) | |
58 | 49 | return self.__entries_wrapper |
59 | 50 | |
60 | 51 | @property |
61 | 52 | def defaults(self): |
62 | 53 | '''defaults["key"] - default value for "key" entry. Read only.''' |
63 | if not self.__defaults_wrapper: | |
64 | self.__defaults_wrapper = BaseGroup.__DictWrapper(self._get_default) | |
65 | 54 | return self.__defaults_wrapper |
66 | 55 | |
67 | 56 | def _get_entry(self, key): |
72 | 72 | 'set_image_from_path', |
73 | 73 | 'show_message', |
74 | 74 | 'SimpleEnum', |
75 | 'SimpleDictWrapper', | |
75 | 76 | 'string2bool', |
76 | 77 | 'TreeStoreDataWrapper', |
77 | 78 | 'WidgetsEnum', |
83 | 84 | message_with_context = '{}{}{}'.format(context, separator, message) |
84 | 85 | result = locale.gettext(message_with_context) |
85 | 86 | if separator in result: |
86 | result = message | |
87 | return message | |
87 | 88 | return result |
88 | 89 | |
89 | 90 | |
349 | 350 | def __init__(self, data): |
350 | 351 | super().__init__() |
351 | 352 | self.data = data |
353 | ||
354 | ||
355 | class SimpleDictWrapper: | |
356 | ||
357 | def __init__(self, getter): | |
358 | self._getter = getter | |
359 | ||
360 | def __getitem__(self, key): | |
361 | return self._getter(key) |