From 85ac736cdd953d7bc0694b4d2283c01d0ef07491 Mon Sep 17 00:00:00 2001 From: Thomas Leonard Date: Sun, 16 Jan 2011 10:01:22 +0000 Subject: [PATCH] GUI Preferences works again Use Requirements to parse GUI options too. --- zeroinstall/0launch-gui/combo_compat.py | 71 --------------------------------- zeroinstall/0launch-gui/freshness.py | 2 +- zeroinstall/0launch-gui/main.py | 38 ++++++------------ zeroinstall/0launch-gui/preferences.py | 43 ++++++++++---------- zeroinstall/cmd/select.py | 22 +--------- zeroinstall/injector/policy.py | 5 +++ zeroinstall/injector/requirements.py | 16 ++++++++ 7 files changed, 58 insertions(+), 139 deletions(-) delete mode 100644 zeroinstall/0launch-gui/combo_compat.py diff --git a/zeroinstall/0launch-gui/combo_compat.py b/zeroinstall/0launch-gui/combo_compat.py deleted file mode 100644 index a01df04..0000000 --- a/zeroinstall/0launch-gui/combo_compat.py +++ /dev/null @@ -1,71 +0,0 @@ -# Copyright (C) 2009, Thomas Leonard -# See the README file for details, or visit http://0install.net. - -import gtk, gobject - -class Action(gobject.GObject): - __proxy = None - __sensitive = True - - __gproperties__ = { - 'sensitive' : (gobject.TYPE_BOOLEAN, # type - 'sensitive', # nick name - 'sensitive', # description - True, # default value - gobject.PARAM_READWRITE) # flags - } - - __gsignals__ = { - 'activate' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()) - } - - def __init__(self, name, label, tooltip, stock_id): - gobject.GObject.__init__(self) - - def do_get_property(self, property): - return getattr(self, property.name) - - def do_set_property(self, property, value): - setattr(self, property.name, value) - - def connect_proxy(self, widget): - assert self.__proxy is None - self.__proxy = widget - self.sensitive = self.__sensitive - widget.connect('clicked', lambda w: self.emit('activate')) - - def set_sensitive(self, value): - if self.__proxy: - self.__proxy.set_sensitive(value) - self.__sensitive = value - - sensitive = property(lambda self: self.__sensitive, set_sensitive) - -gobject.type_register(Action) - -class ComboText(gtk.OptionMenu): - def __init__(self): - gtk.OptionMenu.__init__(self) - self.__menu = gtk.Menu() - self.__model = [] - self.set_menu(self.__menu) - - def append_text(self, text): - item = gtk.MenuItem(text) - self.__model.append([text]) - self.__menu.append(item) - - def set_active(self, i): - self.set_history(i) - - def get_active(self): - return self.get_history() - - def get_model(self): - return self.__model - -def combo_box_new_text(): - return ComboText() - -gtk.combo_box_new_text = combo_box_new_text -gtk.Action = Action diff --git a/zeroinstall/0launch-gui/freshness.py b/zeroinstall/0launch-gui/freshness.py index 159ecde..6b66e53 100644 --- a/zeroinstall/0launch-gui/freshness.py +++ b/zeroinstall/0launch-gui/freshness.py @@ -12,7 +12,7 @@ class Freshness(object): return self.text freshness_levels = [ - Freshness(-1, _('No automatic updates')), + Freshness(0, _('No automatic updates')), #Freshness(60, _('Up to one minute old')), #Freshness(60 * 60, _('Up to one hour old')), Freshness(24 * 60 * 60, _('Up to one day old')), diff --git a/zeroinstall/0launch-gui/main.py b/zeroinstall/0launch-gui/main.py index e1e0c91..265cc1c 100644 --- a/zeroinstall/0launch-gui/main.py +++ b/zeroinstall/0launch-gui/main.py @@ -6,8 +6,7 @@ import os, sys from optparse import OptionParser from zeroinstall.injector import model, arch -from zeroinstall.injector.policy import Policy -from zeroinstall.injector.iface_cache import iface_cache +from zeroinstall.injector.policy import Policy, load_config from zeroinstall.support import tasks _recalculate = tasks.Blocker('recalculate') @@ -48,11 +47,6 @@ def run_gui(args): else: logger.setLevel(logging.DEBUG) - if options.with_store: - from zeroinstall import zerostore - for x in options.with_store: - iface_cache.stores.stores.append(zerostore.Store(os.path.abspath(x))) - import gui if options.version: @@ -70,20 +64,18 @@ def run_gui(args): print >>sys.stderr, "Failed to connect to display. Aborting." sys.exit(1) - if not hasattr(gtk, 'combo_box_new_text'): - import combo_compat - handler = gui.GUIHandler() + config = load_config(handler) + + if options.with_store: + from zeroinstall import zerostore + for x in options.with_store: + config.stores.stores.append(zerostore.Store(os.path.abspath(x))) + if len(args) < 1: import preferences - # Once we separate configuration from Policy, this hack can go away - class DummyPolicy(Policy): - def recalculate(fetch_stale_interfaces = True): - pass - def solve_with_downloads(force = False): - pass - box = preferences.show_preferences(DummyPolicy('http://localhost/dummy', handler)) + box = preferences.show_preferences(config) box.connect('destroy', gtk.main_quit) gtk.main() sys.exit(0) @@ -96,17 +88,13 @@ def run_gui(args): import mainwindow, dialog - restrictions = [] - if options.before or options.not_before: - restrictions.append(model.VersionRangeRestriction(model.parse_version(options.before), - model.parse_version(options.not_before))) + r = requirements.Requirements(interface_uri) + r.parse_options(options) widgets = dialog.Template('main') - policy = Policy(interface_uri, handler, src = bool(options.source), command = options.command) - policy.target_arch = arch.get_architecture(options.os, options.cpu) + policy = Policy(config = config, requirements = r) root_iface = iface_cache.get_interface(interface_uri) - policy.solver.extra_restrictions[root_iface] = restrictions policy.solver.record_details = True window = mainwindow.MainWindow(policy, widgets, download_only = bool(options.download_only), select_only = bool(options.select_only)) @@ -115,7 +103,7 @@ def run_gui(args): if options.message: window.set_message(options.message) - root = iface_cache.get_interface(policy.root) + root = config.iface_cache.get_interface(policy.root) window.browser.set_root(root) window.window.connect('destroy', lambda w: handler.abort_all_downloads()) diff --git a/zeroinstall/0launch-gui/preferences.py b/zeroinstall/0launch-gui/preferences.py index c8df5b8..ea1fa72 100644 --- a/zeroinstall/0launch-gui/preferences.py +++ b/zeroinstall/0launch-gui/preferences.py @@ -11,46 +11,47 @@ from freshness import freshness_levels, Freshness SHOW_CACHE = 0 class Preferences: - def __init__(self, policy): + def __init__(self, config, notify_cb = None): + if notify_cb is None: + notify_cb = lambda: None + widgets = Template('preferences_box') self.window = widgets.get_widget('preferences_box') self.window.connect('destroy', lambda w: self.destroyed()) network = widgets.get_widget('network_use') - network.set_active(list(network_levels).index(policy.network_use)) + network.set_active(list(network_levels).index(config.network_use)) def set_network_use(combo): - policy.network_use = network_levels[network.get_active()] - policy.save_config() - policy.solve_with_downloads() + config.network_use = network_levels[network.get_active()] + config.save_globals() + notify_cb() network.connect('changed', set_network_use) # Freshness times = [x.time for x in freshness_levels] - if policy.freshness not in times: - freshness_levels.append(Freshness(policy.freshness, - '%d seconds' % policy.freshness)) - times.append(policy.freshness) + if config.freshness not in times: + freshness_levels.append(Freshness(config.freshness, + '%d seconds' % config.freshness)) + times.append(config.freshness) eb = gtk.EventBox() # For the tooltip freshness = widgets.get_widget('freshness') for level in freshness_levels: freshness.append_text(str(level)) - freshness.set_active(times.index(policy.freshness)) + freshness.set_active(times.index(config.freshness)) def set_freshness(combo, freshness = freshness): # (pygtk bug?) - policy.freshness = freshness_levels[freshness.get_active()].time - policy.save_config() - import main - main.recalculate() + config.freshness = freshness_levels[freshness.get_active()].time + config.save_globals() + notify_cb() freshness.connect('changed', set_freshness) stable_toggle = widgets.get_widget('help_test') - stable_toggle.set_active(policy.help_with_testing) + stable_toggle.set_active(config.help_with_testing) def toggle_stability(toggle): - policy.help_with_testing = toggle.get_active() - policy.save_config() - import main - main.recalculate() + config.help_with_testing = toggle.get_active() + config.save_globals() + notify_cb() stable_toggle.connect('toggled', toggle_stability) # Keys @@ -147,11 +148,11 @@ class KeyList: tv.connect('button-press-event', trusted_keys_button_press) preferences_box = None -def show_preferences(policy): +def show_preferences(config, notify_cb = None): global preferences_box if preferences_box: preferences_box.destroy() - preferences_box = Preferences(policy) + preferences_box = Preferences(config, notify_cb) preferences_box.window.show() return preferences_box.window diff --git a/zeroinstall/cmd/select.py b/zeroinstall/cmd/select.py index 8d88df0..0be202b 100644 --- a/zeroinstall/cmd/select.py +++ b/zeroinstall/cmd/select.py @@ -57,30 +57,10 @@ def get_selections(config, options, iface_uri, select_only, download_only, test_ root_iface = config.iface_cache.get_interface(iface_uri) r = requirements.Requirements(iface_uri) - - # (None becomes 'run', while '' becomes None) - if options.command is None: - r.command = 'run' - else: - r.command = options.command or None - r.source = bool(options.source) - - r.before = options.before - r.not_before = options.not_before + r.parse_options(options) policy = Policy(config = config, requirements = r) - # XXX - if options.before or options.not_before: - policy.solver.extra_restrictions[root_iface] = [ - model.VersionRangeRestriction(model.parse_version(options.before), - model.parse_version(options.not_before))] - from zeroinstall.injector import arch - policy.target_arch = arch.get_architecture(options.os, options.cpu) - - r.os = options.os - r.cpu = options.cpu - if options.offline: config.network_use = model.network_offline diff --git a/zeroinstall/injector/policy.py b/zeroinstall/injector/policy.py index d2c3b9c..f181d21 100644 --- a/zeroinstall/injector/policy.py +++ b/zeroinstall/injector/policy.py @@ -181,6 +181,11 @@ class Policy(object): debug(_("Supported systems: '%s'"), arch.os_ranks) debug(_("Supported processors: '%s'"), arch.machine_ranks) + if requirements.before or requirements.not_before: + self.solver.extra_restrictions[self.interface_uri] = [ + model.VersionRangeRestriction(model.parse_version(requirements.before), + model.parse_version(requirements.not_before))] + @property def fetcher(self): return self.config.fetcher diff --git a/zeroinstall/injector/requirements.py b/zeroinstall/injector/requirements.py index ff2f9e6..6fcd95c 100644 --- a/zeroinstall/injector/requirements.py +++ b/zeroinstall/injector/requirements.py @@ -28,6 +28,22 @@ class Requirements(object): self.os = self.cpu = None self.message = None + def parse_options(self, optioins): + self.not_before = options.not_before + self.before = options.before + + self.source = bool(options.source) + self.message = options.message + + self.cpu = options.cpu + self.os = options.os + + # (None becomes 'run', while '' becomes None) + if options.command is None: + self.command = 'run' + else: + self.command = options.command or None + def get_as_options(self): gui_args = [] if self.not_before: -- 2.11.4.GIT