3 from iface_browser
import InterfaceBrowser
6 from dialog
import Dialog
7 from model
import stable
, testing
, network_levels
, SafeException
8 from freshness
import freshness_levels
, Freshness
10 class MainWindow(Dialog
):
14 def __init__(self
, prog_args
, download_only
):
16 self
.set_title('Dependency Injector')
17 self
.set_default_size(gtk
.gdk
.screen_width() / 3, 300)
22 hbox
= gtk
.HBox(False, 2)
23 self
.vbox
.pack_start(hbox
, False, True, 0)
24 hbox
.set_border_width(4)
26 network
= gtk
.combo_box_new_text()
27 for level
in network_levels
:
28 network
.append_text(level
.capitalize())
29 network
.set_active(list(network_levels
).index(policy
.network_use
))
30 hbox
.pack_start(gtk
.Label('Network use:'), False, True, 0)
31 hbox
.pack_start(network
, True, True, 2)
32 def set_network_use(combo
):
33 policy
.network_use
= network_levels
[network
.get_active()]
36 network
.connect('changed', set_network_use
)
41 hbox
= gtk
.HBox(False, 2)
42 self
.vbox
.pack_start(hbox
, False, True, 0)
43 hbox
.set_border_width(4)
45 times
= [x
.time
for x
in freshness_levels
]
46 if policy
.freshness
not in times
:
47 freshness_levels
.append(Freshness(policy
.freshness
,
48 '%d seconds' % policy
.freshness
))
49 times
.append(policy
.freshness
)
50 freshness
= gtk
.combo_box_new_text()
51 for level
in freshness_levels
:
52 freshness
.append_text(str(level
))
53 freshness
.set_active(times
.index(policy
.freshness
))
54 hbox
.pack_start(gtk
.Label('Freshness:'), False, True, 0)
55 hbox
.pack_start(freshness
, True, True, 2)
56 def set_freshness(combo
):
57 policy
.freshness
= freshness_levels
[freshness
.get_active()].time
60 freshness
.connect('changed', set_freshness
)
62 button
= gtk
.Button('Refresh all now')
64 for x
in policy
.walk_interfaces():
65 policy
.begin_iface_download(x
, True)
66 button
.connect('clicked', refresh_all
)
67 hbox
.pack_start(button
, False, True, 2)
72 self
.browser
= InterfaceBrowser()
73 self
.vbox
.pack_start(self
.browser
, True, True, 0)
77 hbox
= gtk
.HBox(False, 2)
78 self
.vbox
.pack_start(hbox
, False, True, 0)
79 hbox
.set_border_width(4)
81 button
= gtk
.Button('Interface Properties...')
82 self
.browser
.edit_properties
.connect_proxy(button
)
83 hbox
.pack_start(button
, False, True, 0)
85 stable_toggle
= gtk
.CheckButton('Help test new versions')
86 hbox
.pack_start(stable_toggle
, False, True, 0)
87 tips
.set_tip(stable_toggle
,
88 "Try out new versions as soon as they are available, instead of "
89 "waiting for them to be marked as 'stable'. "
90 "This sets the default policy. Click on 'Interface Properties...' "
91 "to set the policy for an individual interface.")
92 stable_toggle
.set_active(policy
.help_with_testing
)
93 def toggle_stability(toggle
):
94 policy
.help_with_testing
= toggle
.get_active()
97 stable_toggle
.connect('toggled', toggle_stability
)
102 self
.progress
= gtk
.ProgressBar()
103 self
.vbox
.pack_start(self
.progress
, False, True, 0)
107 self
.add_button(gtk
.STOCK_HELP
, gtk
.RESPONSE_HELP
)
108 self
.add_button(gtk
.STOCK_CANCEL
, gtk
.RESPONSE_CANCEL
)
110 self
.add_mixed_button('Download', gtk
.STOCK_NETWORK
, gtk
.RESPONSE_OK
)
112 self
.add_button(gtk
.STOCK_EXECUTE
, gtk
.RESPONSE_OK
)
113 self
.set_default_response(gtk
.RESPONSE_OK
)
115 def response(dialog
, resp
):
117 if resp
== gtk
.RESPONSE_CANCEL
:
120 elif resp
== gtk
.RESPONSE_OK
:
121 download_box
.download_with_gui(self
, prog_args
,
122 run_afterwards
= not download_only
)
123 elif resp
== gtk
.RESPONSE_HELP
:
125 self
.connect('response', response
)
127 gui_help
= help_box
.HelpBox("Injector Help",
129 A program is made up of many different components, typically written by different \
130 groups of people. Each component is available in multiple versions. The injector is \
131 used when starting a program. Its job is to decide which implementation of each required \
134 An interface describes what a component does. The injector starts with \
135 the interface for the program you want to run (like 'The Gimp') and chooses an \
136 implementation (like 'The Gimp 2.2.0'). However, this implementation \
137 will in turn depend on other interfaces, such as 'GTK' (which draws the menus \
138 and buttons). Thus, the injector must choose implementations of \
139 each dependancy (each of which may require further interfaces, and so on)."""),
141 ('List of interfaces', """
142 The main window displays all these interfaces, and the version of each chosen \
143 implementation. The top-most one represents the program you tried to run, and each direct \
144 child is a dependancy. The 'Fetch' column shows amount of data that needs to be \
145 downloaded, or '(cached)' if it is already on this computer.
147 If you are happy with the choices shown, click on the Download (or Execute) button to \
148 download (and run) the program."""),
150 ('Choosing different versions', """
151 There are three ways to control which implementations are chosen. You can adjust the \
152 network policy and the overall stability policy, which affect all interfaces, or you \
153 can edit the policy of individual interfaces.
155 The 'Network use' option controls how the injector uses the network. If off-line, \
156 the network is not used at all. If 'Minimal' is selected then the injector will use \
157 the network if needed, but only if it has no choice. It will run an out-of-date \
158 version rather than download a newer one. If 'Full' is selected, the injector won't \
159 worry about how much it downloads, but will always pick the version it thinks is best.
161 The overall stability policy can either be to prefer stable versions, or to help test \
162 new versions. Choose whichever suits you. Since different programmers have different \
163 ideas of what 'stable' means, you may wish to override this on a per-interface basis \
166 To set the policy for an interface individually, select it and click on 'Interface \
167 Properties'. See that dialog's help text for more information."""),
170 The interface files, which provide the information about which versions are \
171 available, are also cached. To update them, click on 'Refresh all now'. You can also \
172 get the injector to check for new versions automatically from time to time using \
173 the Freshness setting."""))