Codebase list lightdm-gtk-greeter-settings / 5125910
Display more options in "reset" menu Andrew P. 9 years ago
5 changed file(s) with 73 addition(s) and 44 deletion(s). Raw diff Collapse all Expand all
9696 <property name="receives_default">True</property>
9797 <property name="halign">start</property>
9898 <property name="font">Sans 12</property>
99 <property name="use_font">True</property>
99100 </object>
100101 <packing>
101102 <property name="left_attach">1</property>
7474 if not values:
7575 del self._items[item]
7676
77 def get_key_file(self, key):
78 values = self._items.get(key)
79 return values[-1][0] if values else None
80
8177 def __init__(self):
8278 self._output_path = helpers.get_config_path()
8379 self._groups = OrderedDict()
80 self._key_values = helpers.SimpleDictWrapper(getter=self._get_key_values)
8481
8582 def read(self):
8683 self._groups.clear()
159156 else:
160157 return self._groups.setdefault(name, Config.ConfigGroup(self))
161158
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
165170
166171 def __iter__(self):
167172 return iter(self._groups)
288288 if event.button != 3:
289289 return
290290
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
291303 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
304304 class EntryMenu:
305305 menu = Gtk.Menu()
306306 value = new_item()
311311 reset_separator = Gtk.SeparatorMenuItem()
312312 initial = new_item(self.on_entry_reset_clicked)
313313 default = new_item(self.on_entry_reset_clicked)
314 other = []
314315
315316 menu.append(value)
316317 menu.append(file)
341342 key=key,
342343 value=format_value(value=entry.value, enabled=entry.enabled))
343344
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():
350349 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()
354355
355356 error = entry.error
356357 error_action = None
396397 else:
397398 menu.default.props.visible = False
398399
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
399422 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)
401425
402426 self._entry_menu.menu.popup(None, None, None, None, 0, Gtk.get_current_event_time())
403427
1919
2020 from lightdm_gtk_greeter_settings.helpers import WidgetsWrapper
2121 from lightdm_gtk_greeter_settings.OptionEntry import BaseEntry
22 from lightdm_gtk_greeter_settings import helpers
2223
2324
2425 __all__ = [
2930 # Broken solution - too complex
3031 class BaseGroup(GObject.GObject):
3132
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
4033 def __init__(self, widgets):
4134 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)
4437
4538 def read(self, config):
4639 '''Read group content from specified GreeterConfig object'''
5346 @property
5447 def entries(self):
5548 '''entries["key"] - key => Entry mapping. Read only.'''
56 if not self.__entries_wrapper:
57 self.__entries_wrapper = BaseGroup.__DictWrapper(self._get_entry)
5849 return self.__entries_wrapper
5950
6051 @property
6152 def defaults(self):
6253 '''defaults["key"] - default value for "key" entry. Read only.'''
63 if not self.__defaults_wrapper:
64 self.__defaults_wrapper = BaseGroup.__DictWrapper(self._get_default)
6554 return self.__defaults_wrapper
6655
6756 def _get_entry(self, key):
7272 'set_image_from_path',
7373 'show_message',
7474 'SimpleEnum',
75 'SimpleDictWrapper',
7576 'string2bool',
7677 'TreeStoreDataWrapper',
7778 'WidgetsEnum',
8384 message_with_context = '{}{}{}'.format(context, separator, message)
8485 result = locale.gettext(message_with_context)
8586 if separator in result:
86 result = message
87 return message
8788 return result
8889
8990
349350 def __init__(self, data):
350351 super().__init__()
351352 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)