Merge lp:~dylanmccall/update-manager/dialogs-refactor into lp:update-manager
- dialogs-refactor
- Merge into main
Status: | Merged |
---|---|
Merged at revision: | 2631 |
Proposed branch: | lp:~dylanmccall/update-manager/dialogs-refactor |
Merge into: | lp:update-manager |
Diff against target: |
3504 lines (+976/-1517) 14 files modified
UpdateManager/Dialogs.py (+94/-52) UpdateManager/InstallProgress.py (+0/-100) UpdateManager/SimpleGtkbuilderApp.py (+0/-63) UpdateManager/UpdateManager.py (+78/-47) UpdateManager/UpdateProgress.py (+0/-81) UpdateManager/UpdatesAvailable.py (+94/-123) UpdateManager/backend/InstallBackendAptdaemon.py (+63/-66) UpdateManager/backend/InstallBackendSynaptic.py (+34/-28) UpdateManager/backend/__init__.py (+66/-28) data/gtkbuilder/Dialog.ui (+49/-50) data/gtkbuilder/UpdateManager.ui (+276/-444) debian/update-manager.install (+0/-3) po/POTFILES.in (+0/-2) po/update-manager.pot (+222/-430) |
To merge this branch: | bzr merge lp:~dylanmccall/update-manager/dialogs-refactor |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Dimitri John Ledkov | Approve | ||
Review via email: mp+164673@code.launchpad.net |
Commit message
Description of the change
With this branch, I am proposing some refactoring of update-manager's various screens so they all use the same base class, "Dialog", which is typically a Gtk widget that can be added as a child of the application's main window.
Previously, the design of the application meant we used Dialog sometimes, but not always, with the UpdatesAvailable screen being a particularly noteworthy omission. To deal with all these different screens, whenever UpdateManager wanted to show a new screen it would call that screen's start method, and then the screen itself would effectively take control of the main window. This meant adding new widgets, hiding the main window, making it resizable, and the like; which also meant code duplication, several calls to Gtk.main, and a strong smell of feature envy :) With my design, I'm trying to adopt a more conventional layout, using the Dialog class throughout, as a GTK widget wherever possible. (The settings dialog and InstallBackendS
There is now a little less code (diffstat: 11 files changed, 747 insertions(+), 1074 deletions(-)), and it should be much easier to make a single change and have it apply logically across the application. In addition, because the main window has a better handle on its children, this paves the way for us to implement pretty transitions between screens, for example using the new-fangled GtkRevealer widget. Originally this would have meant changing every screen to deal with a new container in the main window. With this change, we can do it all in UpdateManager.py.
- 2634. By Dylan McCall
-
Put back the "backend" module. It wasn't necessary to move it in this branch.
- 2635. By Dylan McCall
-
Removed unnecessary layout changes in InstallBackendA
ptdaemon. Progress dialog should not wiggle when it first appears, now. - 2636. By Dylan McCall
-
Fix packaging and pot files.
Put back the 6px margin above header label in each dialog. - 2637. By Dylan McCall
-
Progress dialog is resizable while downloading packages, too.
Sebastien Bacher (seb128) wrote : | # |
Those changes seem to have a created https:/
Sebastien Bacher (seb128) wrote : | # |
That merge is also creating https:/
_action_done() is calling "self.window_
Dylan, do you think you could look at that?
Sebastien Bacher (seb128) wrote : | # |
I've opened https:/
Preview Diff
1 | === modified file 'UpdateManager/Dialogs.py' |
2 | --- UpdateManager/Dialogs.py 2013-01-09 21:04:35 +0000 |
3 | +++ UpdateManager/Dialogs.py 2013-05-21 05:43:25 +0000 |
4 | @@ -24,6 +24,7 @@ |
5 | |
6 | from gi.repository import Gtk |
7 | from gi.repository import Gdk |
8 | +from gi.repository import GLib |
9 | from gi.repository import GObject |
10 | GObject.threads_init() |
11 | |
12 | @@ -31,39 +32,79 @@ |
13 | warnings.filterwarnings( |
14 | "ignore", "Accessed deprecated property", DeprecationWarning) |
15 | |
16 | +import logging |
17 | import dbus |
18 | import os |
19 | import subprocess |
20 | import sys |
21 | -from .SimpleGtkbuilderApp import SimpleGtkbuilderApp |
22 | |
23 | from gettext import gettext as _ |
24 | |
25 | |
26 | -class Dialog(SimpleGtkbuilderApp): |
27 | +class Dialog(object): |
28 | def __init__(self, window_main): |
29 | self.window_main = window_main |
30 | - self.focus_button = None |
31 | - SimpleGtkbuilderApp.__init__( |
32 | - self, |
33 | - self.window_main.datadir + "/gtkbuilder/Dialog.ui", |
34 | - "update-manager") |
35 | - |
36 | - def main(self): |
37 | - self.window_main.push(self.pane_dialog, self) |
38 | - if self.focus_button: |
39 | - self.focus_button.grab_focus() |
40 | - |
41 | - def run(self, parent=None): |
42 | - if self.focus_button: |
43 | - self.focus_button.grab_focus() |
44 | + |
45 | + def start(self): |
46 | + pass |
47 | + |
48 | + def close(self): |
49 | + return self.stop() |
50 | + |
51 | + def stop(self): |
52 | + pass |
53 | + |
54 | + def run(self, parent=None): |
55 | + pass |
56 | + |
57 | + |
58 | +class BuilderDialog(Dialog, Gtk.Alignment): |
59 | + def __init__(self, window_main, ui_path, root_widget): |
60 | + Dialog.__init__(self, window_main) |
61 | + Gtk.Alignment.__init__(self) |
62 | + |
63 | + builder = self._load_ui(ui_path, root_widget) |
64 | + self.add(builder.get_object(root_widget)) |
65 | + self.show() |
66 | + |
67 | + def _load_ui(self, path, root_widget, domain="update-manager"): |
68 | + builder = Gtk.Builder() |
69 | + builder.set_translation_domain(domain) |
70 | + builder.add_objects_from_file(path, [root_widget]) |
71 | + builder.connect_signals(self) |
72 | + |
73 | + for o in builder.get_objects(): |
74 | + if issubclass(type(o), Gtk.Buildable): |
75 | + name = Gtk.Buildable.get_name(o) |
76 | + setattr(self, name, o) |
77 | + else: |
78 | + logging.debug("WARNING: can not get name for '%s'" % o) |
79 | + |
80 | + return builder |
81 | + |
82 | + def run(self, parent=None): |
83 | + # FIXME: THIS WILL CRASH! |
84 | if parent: |
85 | self.window_dialog.set_transient_for(parent) |
86 | self.window_dialog.set_modal(True) |
87 | self.window_dialog.run() |
88 | |
89 | - def close(self): |
90 | - sys.exit(0) # By default, exit the app |
91 | + |
92 | +class InternalDialog(BuilderDialog): |
93 | + def __init__(self, window_main, content_widget=None): |
94 | + ui_path = os.path.join(window_main.datadir, "gtkbuilder/Dialog.ui") |
95 | + BuilderDialog.__init__(self, window_main, ui_path, "pane_dialog") |
96 | + |
97 | + self.focus_button = None |
98 | + self.set_content_widget(content_widget) |
99 | + self.connect("realize", self._on_realize) |
100 | + |
101 | + def _on_realize(self, user_data): |
102 | + if self.focus_button: |
103 | + self.focus_button.set_can_default(True) |
104 | + self.focus_button.set_can_focus(True) |
105 | + self.focus_button.grab_default() |
106 | + self.focus_button.grab_focus() |
107 | |
108 | def add_button(self, label, callback, secondary=False): |
109 | # from_stock tries stock first and falls back to mnemonic |
110 | @@ -83,48 +124,50 @@ |
111 | return None |
112 | |
113 | def on_settings_button_clicked(self): |
114 | - cmd = ["/usr/bin/software-properties-gtk", |
115 | - "--open-tab", "2", |
116 | - # FIXME: once get_xid() is available via introspections, add |
117 | - # this back |
118 | - #"--toplevel", "%s" % self.window_main.get_window().get_xid() |
119 | - ] |
120 | - subprocess.Popen(cmd) |
121 | + self.window_main.show_settings() |
122 | |
123 | def set_header(self, label): |
124 | - self.label_header.set_label(label) |
125 | + if label: |
126 | + self.label_header.set_markup( |
127 | + "<span size='larger' weight='bold'>%s</span>" % label) |
128 | + self.label_header.set_visible(bool(label)) |
129 | |
130 | def set_desc(self, label): |
131 | - self.label_desc.set_label(label) |
132 | + if label: |
133 | + self.label_desc.set_markup(label) |
134 | self.label_desc.set_visible(bool(label)) |
135 | |
136 | + def set_content_widget(self, content_widget): |
137 | + if content_widget: |
138 | + self.main_container.add(content_widget) |
139 | + self.main_container.set_visible(bool(content_widget)) |
140 | |
141 | -class StoppedUpdatesDialog(Dialog): |
142 | +class StoppedUpdatesDialog(InternalDialog): |
143 | def __init__(self, window_main): |
144 | - Dialog.__init__(self, window_main) |
145 | + InternalDialog.__init__(self, window_main) |
146 | self.set_header(_("You stopped the check for updates.")) |
147 | self.add_settings_button() |
148 | self.add_button(_("_Check Again"), self.check) |
149 | - self.focus_button = self.add_button(Gtk.STOCK_OK, self.close) |
150 | + self.focus_button = self.add_button(Gtk.STOCK_OK, self.window_main.close) |
151 | |
152 | def check(self): |
153 | self.window_main.start_update() |
154 | |
155 | |
156 | -class NoUpdatesDialog(Dialog): |
157 | +class NoUpdatesDialog(InternalDialog): |
158 | def __init__(self, window_main, error_occurred=False): |
159 | - Dialog.__init__(self, window_main) |
160 | + InternalDialog.__init__(self, window_main) |
161 | if error_occurred: |
162 | self.set_header(_("No software updates are available.")) |
163 | else: |
164 | self.set_header(_("The software on this computer is up to date.")) |
165 | self.add_settings_button() |
166 | - self.focus_button = self.add_button(Gtk.STOCK_OK, self.close) |
167 | - |
168 | - |
169 | -class DistUpgradeDialog(Dialog): |
170 | + self.focus_button = self.add_button(Gtk.STOCK_OK, self.window_main.close) |
171 | + |
172 | + |
173 | +class DistUpgradeDialog(InternalDialog): |
174 | def __init__(self, window_main, meta_release): |
175 | - Dialog.__init__(self, window_main) |
176 | + InternalDialog.__init__(self, window_main) |
177 | self.meta_release = meta_release |
178 | self.set_header(_("The software on this computer is up to date.")) |
179 | # Translators: these are Ubuntu version names like "Ubuntu 12.04" |
180 | @@ -134,7 +177,7 @@ |
181 | meta_release.current_dist_version)) |
182 | self.add_settings_button() |
183 | self.add_button(_("Upgrade…"), self.upgrade) |
184 | - self.focus_button = self.add_button(Gtk.STOCK_OK, self.close) |
185 | + self.focus_button = self.add_button(Gtk.STOCK_OK, self.window_main.close) |
186 | |
187 | def upgrade(self): |
188 | # Pass on several arguments |
189 | @@ -169,9 +212,9 @@ |
190 | DistUpgradeDialog.run(self, parent) |
191 | |
192 | |
193 | -class PartialUpgradeDialog(Dialog): |
194 | +class PartialUpgradeDialog(InternalDialog): |
195 | def __init__(self, window_main): |
196 | - Dialog.__init__(self, window_main) |
197 | + InternalDialog.__init__(self, window_main) |
198 | self.set_header(_("Not all updates can be installed")) |
199 | self.set_desc(_( |
200 | """Run a partial upgrade, to install as many updates as possible. |
201 | @@ -191,24 +234,24 @@ |
202 | "/usr/lib/ubuntu-release-upgrader/do-partial-upgrade " |
203 | "--frontend=DistUpgradeViewGtk3") |
204 | |
205 | - def main(self): |
206 | - Dialog.main(self) |
207 | + def start(self): |
208 | + Dialog.start(self) |
209 | # Block progress until user has answered this question |
210 | Gtk.main() |
211 | |
212 | |
213 | -class ErrorDialog(Dialog): |
214 | +class ErrorDialog(InternalDialog): |
215 | def __init__(self, window_main, header, desc=None): |
216 | - Dialog.__init__(self, window_main) |
217 | + InternalDialog.__init__(self, window_main) |
218 | self.set_header(header) |
219 | if desc: |
220 | self.set_desc(desc) |
221 | self.label_desc.set_selectable(True) |
222 | self.add_settings_button() |
223 | - self.focus_button = self.add_button(Gtk.STOCK_OK, self.close) |
224 | + self.focus_button = self.add_button(Gtk.STOCK_OK, self.window_main.close) |
225 | |
226 | - def main(self): |
227 | - Dialog.main(self) |
228 | + def start(self): |
229 | + Dialog.start(self) |
230 | # The label likes to start selecting everything (b/c it got focus |
231 | # before we switched to our default button). |
232 | self.label_desc.select_region(0, 0) |
233 | @@ -229,17 +272,16 @@ |
234 | self.window_main.start_available(error_occurred=True) |
235 | |
236 | |
237 | -class NeedRestartDialog(Dialog): |
238 | +class NeedRestartDialog(InternalDialog): |
239 | def __init__(self, window_main): |
240 | - Dialog.__init__(self, window_main) |
241 | + InternalDialog.__init__(self, window_main) |
242 | self.set_header( |
243 | _("The computer needs to restart to finish installing updates.")) |
244 | self.focus_button = self.add_button(_("_Restart"), self.restart) |
245 | |
246 | - def main(self): |
247 | - Dialog.main(self) |
248 | + def start(self): |
249 | + Dialog.start(self) |
250 | # Turn off close button |
251 | - self.window_main.realize() |
252 | self.window_main.get_window().set_functions(Gdk.WMFunction.MOVE | |
253 | Gdk.WMFunction.MINIMIZE) |
254 | |
255 | |
256 | === removed file 'UpdateManager/InstallProgress.py' |
257 | --- UpdateManager/InstallProgress.py 2012-12-13 20:39:37 +0000 |
258 | +++ UpdateManager/InstallProgress.py 1970-01-01 00:00:00 +0000 |
259 | @@ -1,100 +0,0 @@ |
260 | -# InstallProgress.py |
261 | -# -*- Mode: Python; indent-tabs-mode: nil; tab-width: 4; coding: utf-8 -*- |
262 | -# |
263 | -# Copyright (c) 2004-2012 Canonical |
264 | -# 2004 Michiel Sikkes |
265 | -# 2005 Martin Willemoes Hansen |
266 | -# 2010 Mohamed Amine IL Idrissi |
267 | -# |
268 | -# Author: Michiel Sikkes <michiel@eyesopened.nl> |
269 | -# Michael Vogt <mvo@debian.org> |
270 | -# Martin Willemoes Hansen <mwh@sysrq.dk> |
271 | -# Mohamed Amine IL Idrissi <ilidrissiamine@gmail.com> |
272 | -# Alex Launi <alex.launi@canonical.com> |
273 | -# Michael Terry <michael.terry@canonical.com> |
274 | -# |
275 | -# This program is free software; you can redistribute it and/or |
276 | -# modify it under the terms of the GNU General Public License as |
277 | -# published by the Free Software Foundation; either version 2 of the |
278 | -# License, or (at your option) any later version. |
279 | -# |
280 | -# This program is distributed in the hope that it will be useful, |
281 | -# but WITHOUT ANY WARRANTY; without even the implied warranty of |
282 | -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
283 | -# GNU General Public License for more details. |
284 | -# |
285 | -# You should have received a copy of the GNU General Public License |
286 | -# along with this program; if not, write to the Free Software |
287 | -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 |
288 | -# USA |
289 | - |
290 | -from __future__ import absolute_import, print_function |
291 | - |
292 | -import warnings |
293 | -warnings.filterwarnings("ignore", "Accessed deprecated property", |
294 | - DeprecationWarning) |
295 | - |
296 | -import os |
297 | -import sys |
298 | - |
299 | -from .backend import get_backend |
300 | - |
301 | -from .Core.utils import (inhibit_sleep, |
302 | - allow_sleep) |
303 | - |
304 | - |
305 | -class InstallProgress(object): |
306 | - |
307 | - def __init__(self, app): |
308 | - self.window_main = app |
309 | - self.datadir = app.datadir |
310 | - self.options = app.options |
311 | - |
312 | - # Used for inhibiting power management |
313 | - self.sleep_cookie = None |
314 | - self.sleep_dev = None |
315 | - |
316 | - # get the install backend |
317 | - self.install_backend = get_backend(self.datadir, self.window_main) |
318 | - self.install_backend.connect("action-done", self._on_backend_done) |
319 | - |
320 | - def invoke_manager(self): |
321 | - # don't display apt-listchanges, we already showed the changelog |
322 | - os.environ["APT_LISTCHANGES_FRONTEND"] = "none" |
323 | - |
324 | - # Do not suspend during the update process |
325 | - (self.sleep_dev, self.sleep_cookie) = inhibit_sleep() |
326 | - |
327 | - # If the progress dialog should be closed automatically afterwards |
328 | - #settings = Gio.Settings("com.ubuntu.update-manager") |
329 | - #close_on_done = settings.get_boolean("autoclose-install-window") |
330 | - # FIXME: confirm with mpt whether this should still be a setting |
331 | - close_on_done = False |
332 | - |
333 | - # Get the packages which should be installed and update |
334 | - pkgs_install = [] |
335 | - pkgs_upgrade = [] |
336 | - for pkg in self.window_main.cache: |
337 | - if pkg.marked_install: |
338 | - pkgs_install.append(pkg.name) |
339 | - elif pkg.marked_upgrade: |
340 | - pkgs_upgrade.append(pkg.name) |
341 | - self.install_backend.commit(pkgs_install, pkgs_upgrade, close_on_done) |
342 | - |
343 | - def _on_backend_done(self, backend, action, authorized, success, |
344 | - error_string, error_desc): |
345 | - # Allow suspend after synaptic is finished |
346 | - if self.sleep_cookie: |
347 | - allow_sleep(self.sleep_dev, self.sleep_cookie) |
348 | - self.sleep_cookie = self.sleep_dev = None |
349 | - |
350 | - # Either launch main dialog and continue or quit altogether |
351 | - if success: |
352 | - self.window_main.start_available() |
353 | - elif error_string: |
354 | - self.window_main.start_error(False, error_string, error_desc) |
355 | - else: |
356 | - sys.exit(0) |
357 | - |
358 | - def main(self): |
359 | - self.invoke_manager() |
360 | |
361 | === removed file 'UpdateManager/SimpleGtkbuilderApp.py' |
362 | --- UpdateManager/SimpleGtkbuilderApp.py 2012-11-19 16:33:28 +0000 |
363 | +++ UpdateManager/SimpleGtkbuilderApp.py 1970-01-01 00:00:00 +0000 |
364 | @@ -1,63 +0,0 @@ |
365 | -# -*- Mode: Python; indent-tabs-mode: nil; tab-width: 4; coding: utf-8 -*- |
366 | - |
367 | -""" |
368 | - SimpleGladeApp.py |
369 | - Module that provides an object oriented abstraction to pygtk and libglade. |
370 | - Copyright (C) 2004 Sandino Flores Moreno |
371 | -""" |
372 | - |
373 | -# This library is free software; you can redistribute it and/or |
374 | -# modify it under the terms of the GNU Lesser General Public |
375 | -# License as published by the Free Software Foundation; either |
376 | -# version 2.1 of the License, or (at your option) any later version. |
377 | -# |
378 | -# This library is distributed in the hope that it will be useful, |
379 | -# but WITHOUT ANY WARRANTY; without even the implied warranty of |
380 | -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
381 | -# Lesser General Public License for more details. |
382 | -# |
383 | -# You should have received a copy of the GNU Lesser General Public |
384 | -# License along with this library; if not, write to the Free Software |
385 | -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 |
386 | -# USA |
387 | - |
388 | -import logging |
389 | - |
390 | -from gi.repository import Gtk |
391 | - |
392 | - |
393 | -# based on SimpleGladeApp |
394 | -class SimpleGtkbuilderApp: |
395 | - |
396 | - def __init__(self, path, domain): |
397 | - self.builder = Gtk.Builder() |
398 | - self.builder.set_translation_domain(domain) |
399 | - self.builder.add_from_file(path) |
400 | - self.builder.connect_signals(self) |
401 | - for o in self.builder.get_objects(): |
402 | - if issubclass(type(o), Gtk.Buildable): |
403 | - name = Gtk.Buildable.get_name(o) |
404 | - setattr(self, name, o) |
405 | - else: |
406 | - logging.debug("WARNING: can not get name for '%s'" % o) |
407 | - |
408 | - def run(self): |
409 | - """ |
410 | - Starts the main loop of processing events checking for Control-C. |
411 | - |
412 | - The default implementation checks wheter a Control-C is pressed, |
413 | - then calls on_keyboard_interrupt(). |
414 | - |
415 | - Use this method for starting programs. |
416 | - """ |
417 | - try: |
418 | - Gtk.main() |
419 | - except KeyboardInterrupt: |
420 | - self.on_keyboard_interrupt() |
421 | - |
422 | - def on_keyboard_interrupt(self): |
423 | - """ |
424 | - This method is called by the default implementation of run() |
425 | - after a program is finished by pressing Control-C. |
426 | - """ |
427 | - pass |
428 | |
429 | === modified file 'UpdateManager/UpdateManager.py' |
430 | --- UpdateManager/UpdateManager.py 2013-03-01 18:21:56 +0000 |
431 | +++ UpdateManager/UpdateManager.py 2013-05-21 05:43:25 +0000 |
432 | @@ -23,7 +23,7 @@ |
433 | from __future__ import absolute_import, print_function |
434 | |
435 | from gi.repository import Gtk |
436 | -from gi.repository import Gdk |
437 | +from gi.repository import Gdk, GdkX11 |
438 | from gi.repository import Gio |
439 | from gi.repository import GLib |
440 | |
441 | @@ -33,7 +33,9 @@ |
442 | |
443 | import apt_pkg |
444 | import os |
445 | +import subprocess |
446 | import sys |
447 | +import time |
448 | from gettext import gettext as _ |
449 | |
450 | import dbus |
451 | @@ -50,22 +52,22 @@ |
452 | PartialUpgradeDialog, |
453 | UnsupportedDialog, |
454 | UpdateErrorDialog) |
455 | -from .InstallProgress import InstallProgress |
456 | from .MetaReleaseGObject import MetaRelease |
457 | -from .UpdateProgress import UpdateProgress |
458 | from .UpdatesAvailable import UpdatesAvailable |
459 | from .Core.AlertWatcher import AlertWatcher |
460 | from .Core.MyCache import MyCache |
461 | from .Core.roam import NetworkManagerHelper |
462 | from .Core.UpdateList import UpdateList |
463 | +from .backend import (InstallBackend, |
464 | + get_backend) |
465 | |
466 | # file that signals if we need to reboot |
467 | REBOOT_REQUIRED_FILE = "/var/run/reboot-required" |
468 | |
469 | |
470 | class UpdateManager(Gtk.Window): |
471 | - """ This class is the main window and work flow controller. Panes will add |
472 | - themselves to the main window and it will morph between them.""" |
473 | + """ This class is the main window and work flow controller. The main |
474 | + window will show panes, and it will morph between them. """ |
475 | |
476 | def __init__(self, datadir, options): |
477 | Gtk.Window.__init__(self) |
478 | @@ -82,16 +84,14 @@ |
479 | # Basic GTK+ parameters |
480 | self.set_title(_("Software Updater")) |
481 | self.set_icon_name("system-software-update") |
482 | - self.set_resizable(False) |
483 | self.set_position(Gtk.WindowPosition.CENTER) |
484 | |
485 | # Keep window at a constant size |
486 | ctx = self.get_style_context() |
487 | ctx.connect("changed", lambda ctx: self.resize_to_standard_width()) |
488 | - self.resize_to_standard_width() |
489 | |
490 | # Signals |
491 | - self.connect("delete-event", self.close) |
492 | + self.connect("delete-event", self._on_close) |
493 | |
494 | self._setup_dbus() |
495 | |
496 | @@ -110,6 +110,17 @@ |
497 | self.options and self.options.devel_release, |
498 | self.options and self.options.use_proposed) |
499 | |
500 | + def begin_user_resizable(self, stored_width=0, stored_height=0): |
501 | + self.set_resizable(True) |
502 | + if stored_width > 0 and stored_height > 0: |
503 | + # There is a race here. If we immediately resize, it often doesn't |
504 | + # take. Using idle_add helps, but we *still* occasionally don't |
505 | + # restore the size correctly. Help needed to track this down! |
506 | + GLib.idle_add(lambda: self.resize(stored_width, stored_height)) |
507 | + |
508 | + def end_user_resizable(self): |
509 | + self.set_resizable(False) |
510 | + |
511 | def resize_to_standard_width(self): |
512 | if self.get_resizable(): |
513 | return # only size to a specific em if we are a static size |
514 | @@ -130,56 +141,77 @@ |
515 | self.disconnect(self.initial_focus_id) |
516 | return False |
517 | |
518 | - def push(self, pane, controller): |
519 | - child = self.get_child() |
520 | - if child is not None: |
521 | - if self.controller and hasattr(self.controller, "save_state"): |
522 | - self.controller.save_state() |
523 | - child.destroy() |
524 | + def _start_pane(self, pane): |
525 | + if self.controller is not None: |
526 | + self.controller.stop() |
527 | + if isinstance(self.controller, Gtk.Widget): |
528 | + self.controller.destroy() |
529 | + |
530 | + self.controller = pane |
531 | + self._look_ready() |
532 | + self.end_user_resizable() |
533 | |
534 | if pane is None: |
535 | - self.controller = None |
536 | return |
537 | |
538 | - pane.reparent(self) |
539 | - self.controller = controller |
540 | - |
541 | - # Reset state |
542 | - self.set_resizable(False) |
543 | - self.resize_to_standard_width() |
544 | - self.set_sensitive(True) |
545 | - if self.get_window() is not None: |
546 | - self.get_window().set_cursor(None) |
547 | - self.get_window().set_functions(Gdk.WMFunction.ALL) |
548 | - |
549 | - if self.controller and hasattr(self.controller, "restore_state"): |
550 | - self.controller.restore_state() |
551 | - |
552 | - pane.show() |
553 | - self.show() |
554 | - |
555 | - def close(self, widget, data=None): |
556 | + if isinstance(pane, Gtk.Widget): |
557 | + self.add(pane) |
558 | + pane.start() |
559 | + self.show_all() |
560 | + else: |
561 | + pane.start() |
562 | + self.hide() |
563 | + |
564 | + def _on_close(self, widget, data=None): |
565 | + self.close() |
566 | + |
567 | + def close(self): |
568 | if not self.get_sensitive(): |
569 | return True |
570 | |
571 | - if self.controller and hasattr(self.controller, "close"): |
572 | - # let controller handle it as they will |
573 | - if self.controller.close(): |
574 | - return |
575 | - |
576 | + controller_close = self.controller.close() |
577 | + if controller_close: |
578 | + return controller_close |
579 | self.exit() |
580 | |
581 | def exit(self): |
582 | """ exit the application, save the state """ |
583 | - self.push(None, None) |
584 | + self._start_pane(None) |
585 | sys.exit(0) |
586 | |
587 | + def show_settings(self): |
588 | + try: |
589 | + apt_pkg.pkgsystem_unlock() |
590 | + except SystemError: |
591 | + pass |
592 | + cmd = ["/usr/bin/software-properties-gtk", |
593 | + "--open-tab", "2", |
594 | + "--toplevel", "%s" % self.get_window().get_xid() |
595 | + ] |
596 | + self._look_busy() |
597 | + try: |
598 | + p = subprocess.Popen(cmd) |
599 | + except OSError: |
600 | + pass |
601 | + else: |
602 | + while p.poll() is None: |
603 | + while Gtk.events_pending(): |
604 | + Gtk.main_iteration() |
605 | + time.sleep(0.05) |
606 | + finally: |
607 | + self.start_available() |
608 | + |
609 | def start_update(self): |
610 | if self.options.no_update: |
611 | self.start_available() |
612 | return |
613 | |
614 | - self._start_pane(UpdateProgress(self)) |
615 | + update_backend = get_backend(self, InstallBackend.ACTION_UPDATE) |
616 | + self._start_pane(update_backend) |
617 | + |
618 | + def start_install(self): |
619 | + install_backend = get_backend(self, InstallBackend.ACTION_INSTALL) |
620 | + self._start_pane(install_backend) |
621 | |
622 | def start_available(self, cancelled_update=False, error_occurred=False): |
623 | self._look_busy() |
624 | @@ -214,24 +246,23 @@ |
625 | "a previous check.") |
626 | return UpdatesAvailable(self, header, desc) |
627 | |
628 | - def start_install(self): |
629 | - self._start_pane(InstallProgress(self)) |
630 | - |
631 | def start_error(self, is_update_error, header, desc): |
632 | if is_update_error: |
633 | self._start_pane(UpdateErrorDialog(self, header, desc)) |
634 | else: |
635 | self._start_pane(ErrorDialog(self, header, desc)) |
636 | |
637 | - def _start_pane(self, pane): |
638 | - self._look_busy() |
639 | - pane.main() |
640 | - |
641 | def _look_busy(self): |
642 | self.set_sensitive(False) |
643 | if self.get_window() is not None: |
644 | self.get_window().set_cursor(Gdk.Cursor.new(Gdk.CursorType.WATCH)) |
645 | |
646 | + def _look_ready(self): |
647 | + self.set_sensitive(True) |
648 | + if self.get_window() is not None: |
649 | + self.get_window().set_cursor(None) |
650 | + self.get_window().set_functions(Gdk.WMFunction.ALL) |
651 | + |
652 | def _check_meta_release(self): |
653 | if self.meta_release is None: |
654 | return None |
655 | |
656 | === removed file 'UpdateManager/UpdateProgress.py' |
657 | --- UpdateManager/UpdateProgress.py 2012-12-13 20:39:37 +0000 |
658 | +++ UpdateManager/UpdateProgress.py 1970-01-01 00:00:00 +0000 |
659 | @@ -1,81 +0,0 @@ |
660 | -# UpdateProgress.py |
661 | -# -*- Mode: Python; indent-tabs-mode: nil; tab-width: 4; coding: utf-8 -*- |
662 | -# |
663 | -# Copyright (c) 2004-2012 Canonical |
664 | -# 2004 Michiel Sikkes |
665 | -# 2005 Martin Willemoes Hansen |
666 | -# 2010 Mohamed Amine IL Idrissi |
667 | -# |
668 | -# Author: Michiel Sikkes <michiel@eyesopened.nl> |
669 | -# Michael Vogt <mvo@debian.org> |
670 | -# Martin Willemoes Hansen <mwh@sysrq.dk> |
671 | -# Mohamed Amine IL Idrissi <ilidrissiamine@gmail.com> |
672 | -# Alex Launi <alex.launi@canonical.com> |
673 | -# Michael Terry <michael.terry@canonical.com> |
674 | -# |
675 | -# This program is free software; you can redistribute it and/or |
676 | -# modify it under the terms of the GNU General Public License as |
677 | -# published by the Free Software Foundation; either version 2 of the |
678 | -# License, or (at your option) any later version. |
679 | -# |
680 | -# This program is distributed in the hope that it will be useful, |
681 | -# but WITHOUT ANY WARRANTY; without even the implied warranty of |
682 | -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
683 | -# GNU General Public License for more details. |
684 | -# |
685 | -# You should have received a copy of the GNU General Public License |
686 | -# along with this program; if not, write to the Free Software |
687 | -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 |
688 | -# USA |
689 | - |
690 | -from __future__ import absolute_import, print_function |
691 | - |
692 | -import warnings |
693 | -warnings.filterwarnings("ignore", "Accessed deprecated property", |
694 | - DeprecationWarning) |
695 | - |
696 | -import os |
697 | - |
698 | -from .backend import get_backend |
699 | - |
700 | -from .Core.utils import inhibit_sleep, allow_sleep |
701 | - |
702 | - |
703 | -class UpdateProgress(object): |
704 | - |
705 | - def __init__(self, app): |
706 | - self.window_main = app |
707 | - self.datadir = app.datadir |
708 | - self.options = app.options |
709 | - |
710 | - # Used for inhibiting power management |
711 | - self.sleep_cookie = None |
712 | - self.sleep_dev = None |
713 | - |
714 | - # get the install backend |
715 | - self.install_backend = get_backend(self.datadir, self.window_main) |
716 | - self.install_backend.connect("action-done", self._on_backend_done) |
717 | - |
718 | - def invoke_manager(self): |
719 | - # don't display apt-listchanges |
720 | - os.environ["APT_LISTCHANGES_FRONTEND"] = "none" |
721 | - |
722 | - # Do not suspend during the update process |
723 | - (self.sleep_dev, self.sleep_cookie) = inhibit_sleep() |
724 | - |
725 | - self.install_backend.update() |
726 | - |
727 | - def _on_backend_done(self, backend, action, authorized, success, |
728 | - error_string, error_desc): |
729 | - # Allow suspend after synaptic is finished |
730 | - if self.sleep_cookie: |
731 | - allow_sleep(self.sleep_dev, self.sleep_cookie) |
732 | - self.sleep_cookie = self.sleep_dev = None |
733 | - |
734 | - if error_string: |
735 | - self.window_main.start_error(True, error_string, error_desc) |
736 | - else: |
737 | - self.window_main.start_available(not success) |
738 | - |
739 | - def main(self): |
740 | - self.invoke_manager() |
741 | |
742 | === modified file 'UpdateManager/UpdatesAvailable.py' |
743 | --- UpdateManager/UpdatesAvailable.py 2013-03-05 18:02:34 +0000 |
744 | +++ UpdateManager/UpdatesAvailable.py 2013-05-21 05:43:25 +0000 |
745 | @@ -48,22 +48,20 @@ |
746 | import os |
747 | import re |
748 | import logging |
749 | -import subprocess |
750 | import time |
751 | import threading |
752 | |
753 | from gettext import gettext as _ |
754 | from gettext import ngettext |
755 | |
756 | - |
757 | from .Core.utils import humanize_size |
758 | from .Core.AlertWatcher import AlertWatcher |
759 | from .Core.UpdateList import UpdateSystemGroup |
760 | +from .Dialogs import InternalDialog |
761 | |
762 | from DistUpgrade.DistUpgradeCache import NotEnoughFreeSpaceError |
763 | |
764 | from .ChangelogViewer import ChangelogViewer |
765 | -from .SimpleGtkbuilderApp import SimpleGtkbuilderApp |
766 | from .UnitySupport import UnitySupport |
767 | |
768 | |
769 | @@ -205,40 +203,52 @@ |
770 | return cell_start |
771 | |
772 | |
773 | -class UpdatesAvailable(SimpleGtkbuilderApp): |
774 | +class UpdatesAvailable(InternalDialog): |
775 | APP_INSTALL_ICONS_PATH = "/usr/share/app-install/icons" |
776 | |
777 | - def __init__(self, app, header=None, desc=None): |
778 | - self.window_main = app |
779 | - self.datadir = app.datadir |
780 | - self.options = app.options |
781 | - self.cache = app.cache |
782 | - self.list = app.update_list |
783 | - SimpleGtkbuilderApp.__init__( |
784 | - self, |
785 | - self.datadir + "/gtkbuilder/UpdateManager.ui", |
786 | - "update-manager") |
787 | + def __init__(self, window_main, header=None, desc=None): |
788 | + InternalDialog.__init__(self, window_main) |
789 | + |
790 | + self.window_main = window_main |
791 | + self.datadir = window_main.datadir |
792 | + self.cache = window_main.cache |
793 | + |
794 | + self.custom_header = header |
795 | + self.custom_desc = desc |
796 | + |
797 | + content_ui_path = os.path.join(self.datadir, "gtkbuilder/UpdateManager.ui") |
798 | + self._load_ui(content_ui_path, "pane_updates_available") |
799 | + self.set_content_widget(self.pane_updates_available) |
800 | + |
801 | + self.dl_size = 0 |
802 | + self.connected = True |
803 | |
804 | # Used for inhibiting power management |
805 | self.sleep_cookie = None |
806 | self.sleep_dev = None |
807 | |
808 | - # workaround for LP: #945536 |
809 | - self.clearing_store = False |
810 | - |
811 | - self.custom_header = header |
812 | - self.custom_desc = desc |
813 | - |
814 | - self.button_close.grab_focus() |
815 | - self.dl_size = 0 |
816 | - self.connected = True |
817 | - |
818 | self.settings = Gio.Settings("com.ubuntu.update-manager") |
819 | |
820 | # Special icon theme for looking up app-install-data icons |
821 | self.app_icons = Gtk.IconTheme() |
822 | self.app_icons.append_search_path(self.APP_INSTALL_ICONS_PATH) |
823 | |
824 | + # Create Unity launcher quicklist |
825 | + # FIXME: instead of passing parent we really should just send signals |
826 | + self.unity = UnitySupport(parent=self) |
827 | + |
828 | + # setup the help viewer and disable the help button if there |
829 | + # is no viewer available |
830 | + #self.help_viewer = HelpViewer("update-manager") |
831 | + #if self.help_viewer.check() == False: |
832 | + # self.button_help.set_sensitive(False) |
833 | + |
834 | + self.add_settings_button() |
835 | + self.button_close = self.add_button(Gtk.STOCK_CANCEL, self.window_main.close) |
836 | + self.button_install = self.add_button(_("Install Now"), |
837 | + self.on_button_install_clicked) |
838 | + self.focus_button = self.button_install |
839 | + |
840 | # create text view |
841 | self.textview_changes = ChangelogViewer() |
842 | self.textview_changes.show() |
843 | @@ -246,27 +256,9 @@ |
844 | changes_buffer = self.textview_changes.get_buffer() |
845 | changes_buffer.create_tag("versiontag", weight=Pango.Weight.BOLD) |
846 | |
847 | - # expander |
848 | - self.expander_details.set_expanded( |
849 | - self.settings.get_boolean("show-details")) |
850 | - self.expander_details.connect("activate", self.pre_activate_details) |
851 | - self.expander_details.connect("notify::expanded", |
852 | - self.activate_details) |
853 | - self.expander_desc.connect("notify::expanded", self.activate_desc) |
854 | - |
855 | - # useful exit stuff |
856 | - self.button_close.connect("clicked", lambda w: self.window_main.exit()) |
857 | - |
858 | - # If auto-updates are on, change cancel label |
859 | - self.notifier_settings = Gio.Settings("com.ubuntu.update-notifier") |
860 | - self.notifier_settings.connect( |
861 | - "changed::auto-launch", |
862 | - lambda s, p: self.update_close_button()) |
863 | - self.update_close_button() |
864 | - |
865 | # the treeview (move into it's own code!) |
866 | self.store = Gtk.TreeStore(str, GObject.TYPE_PYOBJECT, str, bool) |
867 | - self.treeview_update.set_model(self.store) |
868 | + self.treeview_update.set_model(None) |
869 | |
870 | restart_icon_renderer = Gtk.CellRendererPixbuf() |
871 | restart_icon_renderer.set_property("xpad", 4) |
872 | @@ -280,9 +272,9 @@ |
873 | restart_column.set_cell_data_func(restart_icon_renderer, |
874 | self.restart_icon_renderer_data_func) |
875 | |
876 | - pkg_area = CellAreaPackage(bool(self.list.security_groups)) |
877 | - pkg_column = Gtk.TreeViewColumn.new_with_area(pkg_area) |
878 | - pkg_area.column = pkg_column |
879 | + self.pkg_cell_area = CellAreaPackage(False) |
880 | + pkg_column = Gtk.TreeViewColumn.new_with_area(self.pkg_cell_area) |
881 | + self.pkg_cell_area.column = pkg_column |
882 | pkg_column.set_title(_("Install")) |
883 | pkg_column.set_property("spacing", 4) |
884 | pkg_column.set_expand(True) |
885 | @@ -331,24 +323,26 @@ |
886 | self.treeview_update.connect("button-press-event", |
887 | self.on_treeview_button_press) |
888 | |
889 | - # setup the help viewer and disable the help button if there |
890 | - # is no viewer available |
891 | - #self.help_viewer = HelpViewer("update-manager") |
892 | - #if self.help_viewer.check() == False: |
893 | - # self.button_help.set_sensitive(False) |
894 | - |
895 | - if not os.path.exists("/usr/bin/software-properties-gtk"): |
896 | - self.button_settings.set_sensitive(False) |
897 | - |
898 | # init show version |
899 | self.show_versions = self.settings.get_boolean("show-versions") |
900 | # init summary_before_name |
901 | self.summary_before_name = self.settings.get_boolean( |
902 | "summary-before-name") |
903 | |
904 | - # Create Unity launcher quicklist |
905 | - # FIXME: instead of passing parent we really should just send signals |
906 | - self.unity = UnitySupport(parent=self) |
907 | + # expander |
908 | + self.expander_details.set_expanded( |
909 | + self.settings.get_boolean("show-details")) |
910 | + self.expander_details.connect("activate", self.pre_activate_details) |
911 | + self.expander_details.connect("notify::expanded", |
912 | + self.activate_details) |
913 | + self.expander_desc.connect("notify::expanded", self.activate_desc) |
914 | + |
915 | + # If auto-updates are on, change cancel label |
916 | + self.notifier_settings = Gio.Settings("com.ubuntu.update-notifier") |
917 | + self.notifier_settings.connect( |
918 | + "changed::auto-launch", |
919 | + lambda s, p: self.update_close_button()) |
920 | + self.update_close_button() |
921 | |
922 | # Alert watcher |
923 | self.alert_watcher = AlertWatcher() |
924 | @@ -357,6 +351,16 @@ |
925 | self.alert_watcher.connect("network-3g-alert", |
926 | self._on_network_3g_alert) |
927 | |
928 | + def stop(self): |
929 | + InternalDialog.stop(self) |
930 | + self._save_state() |
931 | + |
932 | + def start(self): |
933 | + InternalDialog.start(self) |
934 | + self.set_update_list(self.window_main.update_list) |
935 | + self.alert_watcher.check_alert_state() |
936 | + self._restore_state() |
937 | + |
938 | def is_auto_update(self): |
939 | update_days = apt_pkg.config.find_i( |
940 | "APT::Periodic::Update-Package-Lists") |
941 | @@ -378,22 +382,25 @@ |
942 | self.on_button_install_clicked(None) |
943 | |
944 | def restart_icon_renderer_data_func(self, cell_layout, renderer, model, |
945 | - iter, data): |
946 | + iter, user_data): |
947 | def pkg_requires_restart(pkg): |
948 | - restart_condition = pkg.candidate.record.get('XB-Restart-Required') |
949 | + if pkg is None or pkg.candidate is None: |
950 | + return False |
951 | + restart_condition = pkg.candidate.record.get( |
952 | + 'XB-Restart-Required') |
953 | return restart_condition == 'system' |
954 | |
955 | data = model.get_value(iter, LIST_UPDATE_DATA) |
956 | path = model.get_path(iter) |
957 | |
958 | requires_restart = False |
959 | - if data.item: |
960 | + if data.item and data.item.pkg: |
961 | requires_restart = pkg_requires_restart(data.item.pkg) |
962 | elif data.group: |
963 | if not self.treeview_update.row_expanded(path): |
964 | # A package in the group requires restart |
965 | for group_item in data.group.items: |
966 | - if pkg_requires_restart(group_item.pkg): |
967 | + if group_item.pkg and pkg_requires_restart(group_item.pkg): |
968 | requires_restart = True |
969 | break |
970 | |
971 | @@ -408,8 +415,8 @@ |
972 | gicon = None |
973 | renderer.set_property("gicon", gicon) |
974 | |
975 | - def pkg_toggle_renderer_data_func(self, cell_layout, renderer, model, iter, |
976 | - data): |
977 | + def pkg_toggle_renderer_data_func(self, cell_layout, renderer, model, |
978 | + iter, user_data): |
979 | data = model.get_value(iter, LIST_UPDATE_DATA) |
980 | |
981 | activatable = False |
982 | @@ -439,8 +446,8 @@ |
983 | renderer.set_property("activatable", activatable) |
984 | renderer.set_property("inconsistent", inconsistent) |
985 | |
986 | - def pkg_icon_renderer_data_func(self, cell_layout, renderer, model, iter, |
987 | - data): |
988 | + def pkg_icon_renderer_data_func(self, cell_layout, renderer, model, |
989 | + iter, user_data): |
990 | data = model.get_value(iter, LIST_UPDATE_DATA) |
991 | |
992 | gicon = None |
993 | @@ -466,8 +473,8 @@ |
994 | else: |
995 | return icon # Assume it's in one of the user's themes |
996 | |
997 | - def pkg_label_renderer_data_func(self, cell_layout, renderer, model, iter, |
998 | - data): |
999 | + def pkg_label_renderer_data_func(self, cell_layout, renderer, model, |
1000 | + iter, user_data): |
1001 | data = model.get_value(iter, LIST_UPDATE_DATA) |
1002 | name = GLib.markup_escape_text(model.get_value(iter, LIST_NAME)) |
1003 | |
1004 | @@ -742,6 +749,9 @@ |
1005 | |
1006 | if self.custom_header is not None: |
1007 | text_header = self.custom_header |
1008 | + if self.custom_desc is not None: |
1009 | + text_desc = self.custom_desc |
1010 | + |
1011 | # show different text on first run (UX team suggestion) |
1012 | elif self.settings.get_boolean("first-run"): |
1013 | flavor = self.window_main.meta_release.flavor_name |
1014 | @@ -754,19 +764,10 @@ |
1015 | text_header = _("Updated software is available for this " |
1016 | "computer. Do you want to install it now?") |
1017 | |
1018 | - if self.custom_desc is not None: |
1019 | - text_desc = self.custom_desc |
1020 | - |
1021 | self.notebook_details.set_sensitive(True) |
1022 | self.treeview_update.set_sensitive(True) |
1023 | - self.button_install.grab_default() |
1024 | - self.label_header.set_label(text_header) |
1025 | - |
1026 | - if text_desc is not None: |
1027 | - self.label_desc.set_label(text_desc) |
1028 | - self.label_desc.show() |
1029 | - else: |
1030 | - self.label_desc.hide() |
1031 | + self.set_header(text_header) |
1032 | + self.set_desc(text_desc) |
1033 | |
1034 | return True |
1035 | |
1036 | @@ -774,47 +775,20 @@ |
1037 | def pre_activate_details(self, expander): |
1038 | expanded = self.expander_details.get_expanded() |
1039 | if expanded: |
1040 | - self.save_state() |
1041 | + self._save_state() |
1042 | |
1043 | def activate_details(self, expander, data): |
1044 | expanded = self.expander_details.get_expanded() |
1045 | self.settings.set_boolean("show-details", expanded) |
1046 | if expanded: |
1047 | self.on_treeview_update_cursor_changed(self.treeview_update) |
1048 | - self.restore_state() |
1049 | + self._restore_state() |
1050 | |
1051 | def activate_desc(self, expander, data): |
1052 | expanded = self.expander_desc.get_expanded() |
1053 | self.expander_desc.set_vexpand(expanded) |
1054 | |
1055 | - #def on_button_help_clicked(self, widget): |
1056 | - # self.help_viewer.run() |
1057 | - |
1058 | - def on_button_settings_clicked(self, widget): |
1059 | - #print("on_button_settings_clicked") |
1060 | - try: |
1061 | - apt_pkg.pkgsystem_unlock() |
1062 | - except SystemError: |
1063 | - pass |
1064 | - cmd = ["/usr/bin/software-properties-gtk", |
1065 | - "--open-tab", "2", |
1066 | - # FIXME: once get_xid() is available via introspections, add |
1067 | - # this back |
1068 | - #"--toplevel", "%s" % self.window_main.get_window().get_xid() |
1069 | - ] |
1070 | - self.window_main.set_sensitive(False) |
1071 | - p = subprocess.Popen(cmd) |
1072 | - while p.poll() is None: |
1073 | - while Gtk.events_pending(): |
1074 | - Gtk.main_iteration() |
1075 | - time.sleep(0.05) |
1076 | - apt_pkg.init_config() |
1077 | - self.window_main.refresh_cache() |
1078 | - self.fillstore() |
1079 | - self.update_close_button() |
1080 | - self.window_main.set_sensitive(True) |
1081 | - |
1082 | - def on_button_install_clicked(self, widget): |
1083 | + def on_button_install_clicked(self): |
1084 | self.unity.set_install_menuitem_visible(False) |
1085 | #print("on_button_install_clicked") |
1086 | err_sum = _("Not enough free disk space") |
1087 | @@ -930,24 +904,22 @@ |
1088 | del actiongroup |
1089 | self.setBusy(False) |
1090 | |
1091 | - def save_state(self): |
1092 | + def _save_state(self): |
1093 | """ save the state (window-size for now) """ |
1094 | if self.expander_details.get_expanded(): |
1095 | (w, h) = self.window_main.get_size() |
1096 | self.settings.set_int("window-width", w) |
1097 | self.settings.set_int("window-height", h) |
1098 | |
1099 | - def restore_state(self): |
1100 | + def _restore_state(self): |
1101 | """ restore the state (window-size for now) """ |
1102 | w = self.settings.get_int("window-width") |
1103 | h = self.settings.get_int("window-height") |
1104 | expanded = self.expander_details.get_expanded() |
1105 | - self.window_main.set_resizable(expanded) |
1106 | - if w > 0 and h > 0 and expanded: |
1107 | - # There is a race here. If we immediately resize, it often doesn't |
1108 | - # take. Using idle_add helps, but we *still* occasionally don't |
1109 | - # restore the size correctly. Help needed to track this down! |
1110 | - GLib.idle_add(lambda: self.window_main.resize(w, h)) |
1111 | + if expanded: |
1112 | + self.window_main.begin_user_resizable(w, h) |
1113 | + else: |
1114 | + self.window_main.end_user_resizable() |
1115 | return False |
1116 | |
1117 | def _add_header(self, name, groups): |
1118 | @@ -996,7 +968,9 @@ |
1119 | ] |
1120 | self.store.append(group_iter, item_row) |
1121 | |
1122 | - def fillstore(self): |
1123 | + def set_update_list(self, update_list): |
1124 | + self.list = update_list |
1125 | + |
1126 | # use the watch cursor |
1127 | self.setBusy(True) |
1128 | # disconnect the view first |
1129 | @@ -1017,14 +991,11 @@ |
1130 | self._add_groups(self.list.update_groups) |
1131 | |
1132 | self.treeview_update.set_model(self.store) |
1133 | + self.pkg_cell_area.indent_toplevel = bool(self.list.security_groups) |
1134 | + self.update_close_button() |
1135 | self.update_count() |
1136 | self.setBusy(False) |
1137 | while Gtk.events_pending(): |
1138 | Gtk.main_iteration() |
1139 | self.updates_changed() |
1140 | return False |
1141 | - |
1142 | - def main(self): |
1143 | - self.window_main.push(self.pane_updates_available, self) |
1144 | - self.fillstore() |
1145 | - self.alert_watcher.check_alert_state() |
1146 | |
1147 | === modified file 'UpdateManager/backend/InstallBackendAptdaemon.py' |
1148 | --- UpdateManager/backend/InstallBackendAptdaemon.py 2013-02-06 21:12:16 +0000 |
1149 | +++ UpdateManager/backend/InstallBackendAptdaemon.py 2013-05-21 05:43:25 +0000 |
1150 | @@ -24,20 +24,25 @@ |
1151 | |
1152 | from UpdateManager.backend import InstallBackend |
1153 | from UpdateManager.UnitySupport import UnitySupport |
1154 | +from UpdateManager.Dialogs import BuilderDialog |
1155 | |
1156 | from gettext import gettext as _ |
1157 | |
1158 | import apt |
1159 | import dbus |
1160 | -import sys |
1161 | - |
1162 | - |
1163 | -class InstallBackendAptdaemon(InstallBackend): |
1164 | - |
1165 | +import os |
1166 | + |
1167 | + |
1168 | +class InstallBackendAptdaemon(InstallBackend, BuilderDialog): |
1169 | """Makes use of aptdaemon to refresh the cache and to install updates.""" |
1170 | |
1171 | - def __init__(self, datadir, window_main): |
1172 | - InstallBackend.__init__(self, datadir, window_main) |
1173 | + def __init__(self, window_main, action): |
1174 | + InstallBackend.__init__(self, window_main, action) |
1175 | + ui_path = os.path.join(window_main.datadir, |
1176 | + "gtkbuilder/UpdateProgress.ui") |
1177 | + BuilderDialog.__init__(self, window_main, ui_path, |
1178 | + "pane_update_progress") |
1179 | + |
1180 | self.client = client.AptClient() |
1181 | self.unity = UnitySupport() |
1182 | self._expanded_size = None |
1183 | @@ -59,17 +64,20 @@ |
1184 | pass |
1185 | try: |
1186 | trans = yield self.client.update_cache(defer=True) |
1187 | - yield self._run_in_dialog(trans, self.UPDATE, |
1188 | - _("Checking for updates…"), |
1189 | - False, False) |
1190 | + yield self._show_transaction(trans, self.ACTION_UPDATE, |
1191 | + _("Checking for updates…"), False) |
1192 | except errors.NotAuthorizedError: |
1193 | - self.emit("action-done", self.UPDATE, False, False, None, None) |
1194 | + self._action_done(self.ACTION_UPDATE, |
1195 | + authorized=False, success=False, |
1196 | + error_string=None, error_desc=None) |
1197 | except: |
1198 | - self.emit("action-done", self.UPDATE, True, False, None, None) |
1199 | + self._action_done(self.ACTION_UPDATE, |
1200 | + authorized=True, success=False, |
1201 | + error_string=None, error_desc=None) |
1202 | raise |
1203 | |
1204 | @inline_callbacks |
1205 | - def commit(self, pkgs_install, pkgs_upgrade, close_on_done): |
1206 | + def commit(self, pkgs_install, pkgs_upgrade): |
1207 | """Commit a list of package adds and removes""" |
1208 | try: |
1209 | apt.apt_pkg.pkgsystem_unlock() |
1210 | @@ -81,18 +89,23 @@ |
1211 | pkgs_install, reinstall, remove, purge, pkgs_upgrade, |
1212 | downgrade, defer=True) |
1213 | trans.connect("progress-changed", self._on_progress_changed) |
1214 | - yield self._run_in_dialog(trans, self.INSTALL, |
1215 | - _("Installing updates…"), |
1216 | - True, close_on_done) |
1217 | + yield self._show_transaction(trans, self.ACTION_INSTALL, |
1218 | + _("Installing updates…"), True) |
1219 | except errors.NotAuthorizedError as e: |
1220 | - self.emit("action-done", self.INSTALL, False, False, None, None) |
1221 | + self._action_done(self.ACTION_INSTALL, |
1222 | + authorized=False, success=False, |
1223 | + error_string=None, error_desc=None) |
1224 | except dbus.DBusException as e: |
1225 | #print(e, e.get_dbus_name()) |
1226 | if e.get_dbus_name() != "org.freedesktop.DBus.Error.NoReply": |
1227 | raise |
1228 | - self.emit("action-done", self.INSTALL, False, False, None, None) |
1229 | + self._action_done(self.ACTION_INSTALL, |
1230 | + authorized=False, success=False, |
1231 | + error_string=None, error_desc=None) |
1232 | except Exception as e: |
1233 | - self.emit("action-done", self.INSTALL, True, False, None, None) |
1234 | + self._action_done(self.ACTION_INSTALL, |
1235 | + authorized=True, success=False, |
1236 | + error_string=None, error_desc=None) |
1237 | raise |
1238 | |
1239 | def _on_progress_changed(self, trans, progress): |
1240 | @@ -111,28 +124,18 @@ |
1241 | self._resize_to_show_details(expander) |
1242 | |
1243 | @inline_callbacks |
1244 | - def _run_in_dialog(self, trans, action, header, show_details, |
1245 | - close_on_done): |
1246 | - builder = Gtk.Builder() |
1247 | - builder.set_translation_domain("update-manager") |
1248 | - builder.add_from_file(self.datadir + "/gtkbuilder/UpdateProgress.ui") |
1249 | - |
1250 | - label_header = builder.get_object("label_header") |
1251 | - label_header.set_label(header) |
1252 | + def _show_transaction(self, trans, action, header, show_details): |
1253 | + self.label_header.set_label(header) |
1254 | |
1255 | progressbar = AptProgressBar(trans) |
1256 | progressbar.show() |
1257 | - progressbar_slot = builder.get_object("progressbar_slot") |
1258 | - progressbar_slot.add(progressbar) |
1259 | + self.progressbar_slot.add(progressbar) |
1260 | |
1261 | self.button_cancel = AptCancelButton(trans) |
1262 | - if action == self.UPDATE: |
1263 | + if action == self.ACTION_UPDATE: |
1264 | self.button_cancel.set_label(Gtk.STOCK_STOP) |
1265 | self.button_cancel.show() |
1266 | - button_cancel_slot = builder.get_object("button_cancel_slot") |
1267 | - button_cancel_slot.add(self.button_cancel) |
1268 | - |
1269 | - label_details = builder.get_object("label_details") |
1270 | + self.button_cancel_slot.add(self.button_cancel) |
1271 | |
1272 | if show_details: |
1273 | expander = AptDetailsExpander(trans) |
1274 | @@ -140,39 +143,30 @@ |
1275 | expander.set_hexpand(True) |
1276 | expander.show_all() |
1277 | expander.connect("notify::expanded", self._on_expanded) |
1278 | - expander_slot = builder.get_object("expander_slot") |
1279 | - expander_slot.add(expander) |
1280 | - expander_slot.show() |
1281 | + self.expander_slot.add(expander) |
1282 | + self.expander_slot.show() |
1283 | else: |
1284 | expander = None |
1285 | |
1286 | trans.connect("status-details-changed", self._on_details_changed, |
1287 | - label_details) |
1288 | - trans.connect("status-changed", self._on_status_changed, label_details, |
1289 | + self.label_details) |
1290 | + trans.connect("status-changed", self._on_status_changed, self.label_details, |
1291 | expander) |
1292 | - trans.connect("finished", self._on_finished, action, close_on_done) |
1293 | + trans.connect("finished", self._on_finished, action) |
1294 | trans.connect("medium-required", self._on_medium_required) |
1295 | trans.connect("config-file-conflict", self._on_config_file_conflict) |
1296 | |
1297 | yield trans.set_debconf_frontend("gnome") |
1298 | yield trans.run() |
1299 | |
1300 | - self.window_main.push(builder.get_object("pane_update_progress"), |
1301 | - self) |
1302 | - |
1303 | - self.window_main.get_window().set_functions(Gdk.WMFunction.MOVE | |
1304 | - Gdk.WMFunction.RESIZE | |
1305 | - Gdk.WMFunction.MINIMIZE) |
1306 | - |
1307 | def _on_expanded(self, expander, param): |
1308 | # Make the dialog resizable if the expander is expanded |
1309 | # try to restore a previous size |
1310 | if not expander.get_expanded(): |
1311 | self._expanded_size = (expander.terminal.get_visible(), |
1312 | self.window_main.get_size()) |
1313 | - self.window_main.set_resizable(False) |
1314 | + self.window_main.end_user_resizable() |
1315 | elif self._expanded_size: |
1316 | - self.window_main.set_resizable(True) |
1317 | term_visible, (stored_width, stored_height) = self._expanded_size |
1318 | # Check if the stored size was for the download details or |
1319 | # the terminal widget |
1320 | @@ -181,9 +175,8 @@ |
1321 | # get a new size for the terminal widget |
1322 | self._resize_to_show_details(expander) |
1323 | else: |
1324 | - self.window_main.resize(stored_width, stored_height) |
1325 | + self.window_main.begin_user_resizable(stored_width, stored_height) |
1326 | else: |
1327 | - self.window_main.set_resizable(True) |
1328 | self._resize_to_show_details(expander) |
1329 | |
1330 | def _resize_to_show_details(self, expander): |
1331 | @@ -195,16 +188,19 @@ |
1332 | If the expander is expanded afterwards the window won't change its |
1333 | size anymore. So we have to do this manually. See LP#840942 |
1334 | """ |
1335 | - win_width, win_height = self.window_main.get_size() |
1336 | - exp_width = expander.get_allocation().width |
1337 | - exp_height = expander.get_allocation().height |
1338 | - if expander.terminal.get_visible(): |
1339 | - terminal_width = expander.terminal.get_char_width() * 80 |
1340 | - terminal_height = expander.terminal.get_char_height() * 24 |
1341 | - self.window_main.resize(terminal_width - exp_width + win_width, |
1342 | - terminal_height - exp_height + win_height) |
1343 | - else: |
1344 | - self.window_main.resize(win_width + 100, win_height + 200) |
1345 | + if expander.get_expanded(): |
1346 | + win_width, win_height = self.window_main.get_size() |
1347 | + exp_width = expander.get_allocation().width |
1348 | + exp_height = expander.get_allocation().height |
1349 | + if expander.terminal.get_visible(): |
1350 | + terminal_width = expander.terminal.get_char_width() * 80 |
1351 | + terminal_height = expander.terminal.get_char_height() * 24 |
1352 | + new_width = terminal_width - exp_width + win_width |
1353 | + new_height = terminal_height - exp_height + win_height |
1354 | + else: |
1355 | + new_width = win_width + 100 |
1356 | + new_height = win_height + 200 |
1357 | + self.window_main.begin_user_resizable(new_width, new_height) |
1358 | |
1359 | def _on_medium_required(self, transaction, medium, drive): |
1360 | dialog = AptMediumRequiredDialog(medium, drive, self.window_main) |
1361 | @@ -224,18 +220,19 @@ |
1362 | else: |
1363 | transaction.resolve_config_file_conflict(old, "keep") |
1364 | |
1365 | - def _on_finished(self, trans, status, action, close_on_done): |
1366 | + def _on_finished(self, trans, status, action): |
1367 | error_string = None |
1368 | error_desc = None |
1369 | if status == EXIT_FAILED: |
1370 | error_string = get_error_string_from_enum(trans.error.code) |
1371 | error_desc = get_error_description_from_enum(trans.error.code) |
1372 | - elif status == EXIT_SUCCESS and close_on_done: |
1373 | - sys.exit(0) |
1374 | # tell unity to hide the progress again |
1375 | self.unity.set_progress(-1) |
1376 | - self.emit("action-done", action, True, status == EXIT_SUCCESS, |
1377 | - error_string, error_desc) |
1378 | + is_success = (status == EXIT_SUCCESS) |
1379 | + self._action_done(action, |
1380 | + authorized=True, success=is_success, |
1381 | + error_string=error_string, error_desc=error_desc) |
1382 | + |
1383 | |
1384 | if __name__ == "__main__": |
1385 | b = InstallBackendAptdaemon(None) |
1386 | |
1387 | === modified file 'UpdateManager/backend/InstallBackendSynaptic.py' |
1388 | --- UpdateManager/backend/InstallBackendSynaptic.py 2012-12-13 20:39:37 +0000 |
1389 | +++ UpdateManager/backend/InstallBackendSynaptic.py 2013-05-21 05:43:25 +0000 |
1390 | @@ -8,13 +8,43 @@ |
1391 | from gettext import gettext as _ |
1392 | |
1393 | from gi.repository import GObject |
1394 | +# Extra GdkX11 import for pygobject bug #673396 |
1395 | +# https://bugzilla.gnome.org/show_bug.cgi?id=673396 |
1396 | +from gi.repository import GdkX11 |
1397 | |
1398 | from UpdateManager.backend import InstallBackend |
1399 | +from UpdateManager.Dialogs import Dialog |
1400 | |
1401 | |
1402 | class InstallBackendSynaptic(InstallBackend): |
1403 | """ Install backend based on synaptic """ |
1404 | |
1405 | + def update(self): |
1406 | + opt = ["--update-at-startup"] |
1407 | + tempf = None |
1408 | + self._run_synaptic(self.ACTION_UPDATE, opt, tempf) |
1409 | + |
1410 | + def commit(self, pkgs_install, pkgs_upgrade, close_on_done=False): |
1411 | + # close when update was successful (its ok to use a Synaptic:: |
1412 | + # option here, it will not get auto-saved, because synaptic does |
1413 | + # not save options in non-interactive mode) |
1414 | + opt = [] |
1415 | + if close_on_done: |
1416 | + opt.append("-o") |
1417 | + opt.append("Synaptic::closeZvt=true") |
1418 | + # custom progress strings |
1419 | + opt.append("--progress-str") |
1420 | + opt.append("%s" % _("Please wait, this can take some time.")) |
1421 | + opt.append("--finish-str") |
1422 | + opt.append("%s" % _("Update is complete")) |
1423 | + tempf = tempfile.NamedTemporaryFile(mode="w+") |
1424 | + for pkg_name in pkgs_install + pkgs_upgrade: |
1425 | + tempf.write("%s\tinstall\n" % pkg_name) |
1426 | + opt.append("--set-selections-file") |
1427 | + opt.append("%s" % tempf.name) |
1428 | + tempf.flush() |
1429 | + self._run_synaptic(self.ACTION_INSTALL, opt, tempf) |
1430 | + |
1431 | def _run_synaptic(self, action, opt, tempf): |
1432 | """Execute synaptic.""" |
1433 | try: |
1434 | @@ -42,31 +72,7 @@ |
1435 | action, tempf = data |
1436 | if tempf: |
1437 | tempf.close() |
1438 | - self.emit("action-done", action, True, os.WEXITSTATUS(condition) == 0, |
1439 | - None, None) |
1440 | - |
1441 | - def update(self): |
1442 | - opt = ["--update-at-startup"] |
1443 | - tempf = None |
1444 | - self._run_synaptic(self.UPDATE, opt, tempf) |
1445 | - |
1446 | - def commit(self, pkgs_install, pkgs_upgrade, close_on_done): |
1447 | - # close when update was successful (its ok to use a Synaptic:: |
1448 | - # option here, it will not get auto-saved, because synaptic does |
1449 | - # not save options in non-interactive mode) |
1450 | - opt = [] |
1451 | - if close_on_done: |
1452 | - opt.append("-o") |
1453 | - opt.append("Synaptic::closeZvt=true") |
1454 | - # custom progress strings |
1455 | - opt.append("--progress-str") |
1456 | - opt.append("%s" % _("Please wait, this can take some time.")) |
1457 | - opt.append("--finish-str") |
1458 | - opt.append("%s" % _("Update is complete")) |
1459 | - tempf = tempfile.NamedTemporaryFile(mode="w+") |
1460 | - for pkg_name in pkgs_install + pkgs_upgrade: |
1461 | - tempf.write("%s\tinstall\n" % pkg_name) |
1462 | - opt.append("--set-selections-file") |
1463 | - opt.append("%s" % tempf.name) |
1464 | - tempf.flush() |
1465 | - self._run_synaptic(self.INSTALL, opt, tempf) |
1466 | + self._action_done(action, |
1467 | + authorized=True, |
1468 | + success=os.WEXITSTATUS(condition) == 0, |
1469 | + error_string=None, error_desc=None) |
1470 | |
1471 | === modified file 'UpdateManager/backend/__init__.py' |
1472 | --- UpdateManager/backend/__init__.py 2012-12-13 20:39:37 +0000 |
1473 | +++ UpdateManager/backend/__init__.py 2013-05-21 05:43:25 +0000 |
1474 | @@ -7,41 +7,79 @@ |
1475 | from __future__ import absolute_import |
1476 | |
1477 | import os |
1478 | +import sys |
1479 | |
1480 | from gi.repository import GObject |
1481 | - |
1482 | - |
1483 | -class InstallBackend(GObject.GObject): |
1484 | - """The abstract backend that can install/remove packages""" |
1485 | - |
1486 | - __gsignals__ = {"action-done": (GObject.SignalFlags.RUN_FIRST, |
1487 | - None, |
1488 | - (GObject.TYPE_INT, # action id |
1489 | - GObject.TYPE_BOOLEAN, # authorized |
1490 | - GObject.TYPE_BOOLEAN, # success |
1491 | - GObject.TYPE_STRING, # error string |
1492 | - GObject.TYPE_STRING) # error desc |
1493 | - ), |
1494 | - } |
1495 | - |
1496 | - (INSTALL, UPDATE) = range(2) |
1497 | - |
1498 | - def __init__(self, datadir, window_main): |
1499 | - """init backend |
1500 | - takes a gtk main window as parameter |
1501 | - """ |
1502 | - GObject.GObject.__init__(self) |
1503 | - self.datadir = datadir |
1504 | - self.window_main = window_main |
1505 | - |
1506 | - def commit(self, pkgs_install, pkgs_upgrade, close_on_done): |
1507 | - """Commit the cache changes """ |
1508 | - raise NotImplemented |
1509 | +from UpdateManager.Core.utils import (inhibit_sleep, |
1510 | + allow_sleep) |
1511 | +from UpdateManager.Dialogs import Dialog |
1512 | + |
1513 | + |
1514 | +class InstallBackend(Dialog): |
1515 | + ACTION_UPDATE = 0 |
1516 | + ACTION_INSTALL = 1 |
1517 | + |
1518 | + def __init__(self, window_main, action): |
1519 | + Dialog.__init__(self, window_main) |
1520 | + self.action = action |
1521 | + self.sleep_cookie = None |
1522 | + self.sleep_dev = None |
1523 | + |
1524 | + def start(self): |
1525 | + os.environ["APT_LISTCHANGES_FRONTEND"] = "none" |
1526 | + |
1527 | + # Do not suspend during the update process |
1528 | + (self.sleep_dev, self.sleep_cookie) = inhibit_sleep() |
1529 | + |
1530 | + if self.action == self.ACTION_INSTALL: |
1531 | + # Get the packages which should be installed and update |
1532 | + pkgs_install = [] |
1533 | + pkgs_upgrade = [] |
1534 | + for pkg in self.window_main.cache: |
1535 | + if pkg.marked_install: |
1536 | + pkgs_install.append(pkg.name) |
1537 | + elif pkg.marked_upgrade: |
1538 | + pkgs_upgrade.append(pkg.name) |
1539 | + self.commit(pkgs_install, pkgs_upgrade) |
1540 | + else: |
1541 | + self.update() |
1542 | |
1543 | def update(self): |
1544 | """Run a update to refresh the package list""" |
1545 | raise NotImplemented |
1546 | |
1547 | + def commit(self, pkgs_install, pkgs_upgrade): |
1548 | + """Commit the cache changes """ |
1549 | + raise NotImplemented |
1550 | + |
1551 | + def _action_done(self, action, authorized, success, error_string, |
1552 | + error_desc): |
1553 | + # Allow suspend after update is finished |
1554 | + if self.sleep_cookie: |
1555 | + allow_sleep(self.sleep_dev, self.sleep_cookie) |
1556 | + self.sleep_cookie = self.sleep_dev = None |
1557 | + |
1558 | + # If the progress dialog should be closed automatically afterwards |
1559 | + #settings = Gio.Settings("com.ubuntu.update-manager") |
1560 | + #close_after_install = settings.get_boolean( |
1561 | + # "autoclose-install-window") |
1562 | + # FIXME: confirm with mpt whether this should still be a setting |
1563 | + close_after_install = False |
1564 | + |
1565 | + if action == self.ACTION_INSTALL: |
1566 | + if success: |
1567 | + self.window_main.start_available() |
1568 | + elif error_string: |
1569 | + self.window_main.start_error(False, error_string, error_desc) |
1570 | + else: |
1571 | + self.window_main.exit() |
1572 | + else: |
1573 | + if error_string: |
1574 | + self.window_main.start_error(True, error_string, error_desc) |
1575 | + else: |
1576 | + is_cancelled_update = not success |
1577 | + self.window_main.start_available(is_cancelled_update) |
1578 | + |
1579 | |
1580 | def get_backend(*args, **kwargs): |
1581 | """Select and return a package manager backend.""" |
1582 | |
1583 | === modified file 'data/gtkbuilder/Dialog.ui' |
1584 | --- data/gtkbuilder/Dialog.ui 2013-01-25 16:41:01 +0000 |
1585 | +++ data/gtkbuilder/Dialog.ui 2013-05-21 05:43:25 +0000 |
1586 | @@ -1,36 +1,23 @@ |
1587 | <?xml version="1.0" encoding="UTF-8"?> |
1588 | <interface> |
1589 | <!-- interface-requires gtk+ 3.0 --> |
1590 | - <object class="GtkDialog" id="window_dialog"> |
1591 | + <object class="GtkWindow" id="window_dialog"> |
1592 | <property name="can_focus">False</property> |
1593 | - <property name="type_hint">dialog</property> |
1594 | - <child internal-child="vbox"> |
1595 | - <object class="GtkBox" id="dialog-vbox1"> |
1596 | + <child> |
1597 | + <object class="GtkBox" id="pane_dialog"> |
1598 | + <property name="visible">True</property> |
1599 | <property name="can_focus">False</property> |
1600 | + <property name="hexpand">True</property> |
1601 | + <property name="vexpand">True</property> |
1602 | + <property name="border_width">12</property> |
1603 | <property name="orientation">vertical</property> |
1604 | - <child internal-child="action_area"> |
1605 | - <object class="GtkButtonBox" id="dialog-action_area1"> |
1606 | - <property name="can_focus">False</property> |
1607 | - <property name="layout_style">end</property> |
1608 | - <child> |
1609 | - <placeholder/> |
1610 | - </child> |
1611 | - </object> |
1612 | - <packing> |
1613 | - <property name="expand">False</property> |
1614 | - <property name="fill">True</property> |
1615 | - <property name="pack_type">end</property> |
1616 | - <property name="position">0</property> |
1617 | - </packing> |
1618 | - </child> |
1619 | <child> |
1620 | - <object class="GtkGrid" id="pane_dialog"> |
1621 | + <object class="GtkGrid" id="header_grid"> |
1622 | <property name="visible">True</property> |
1623 | <property name="can_focus">False</property> |
1624 | + <property name="margin_bottom">12</property> |
1625 | <property name="hexpand">True</property> |
1626 | - <property name="vexpand">True</property> |
1627 | - <property name="border_width">12</property> |
1628 | - <property name="row_spacing">12</property> |
1629 | + <property name="row_spacing">2</property> |
1630 | <property name="column_spacing">12</property> |
1631 | <child> |
1632 | <object class="GtkImage" id="image_logo"> |
1633 | @@ -44,23 +31,21 @@ |
1634 | <property name="left_attach">0</property> |
1635 | <property name="top_attach">0</property> |
1636 | <property name="width">1</property> |
1637 | - <property name="height">1</property> |
1638 | + <property name="height">2</property> |
1639 | </packing> |
1640 | </child> |
1641 | <child> |
1642 | <object class="GtkLabel" id="label_header"> |
1643 | - <property name="visible">True</property> |
1644 | <property name="can_focus">False</property> |
1645 | + <property name="no_show_all">True</property> |
1646 | <property name="margin_top">6</property> |
1647 | <property name="hexpand">True</property> |
1648 | <property name="xalign">0</property> |
1649 | <property name="yalign">0</property> |
1650 | <property name="wrap">True</property> |
1651 | - <property name="width_chars">20</property> |
1652 | <property name="max_width_chars">20</property> |
1653 | <attributes> |
1654 | <attribute name="weight" value="bold"/> |
1655 | - <attribute name="scale" value="1.25"/> |
1656 | </attributes> |
1657 | </object> |
1658 | <packing> |
1659 | @@ -75,7 +60,6 @@ |
1660 | <property name="can_focus">False</property> |
1661 | <property name="no_show_all">True</property> |
1662 | <property name="hexpand">True</property> |
1663 | - <property name="vexpand">True</property> |
1664 | <property name="xalign">0</property> |
1665 | <property name="yalign">0</property> |
1666 | <property name="wrap">True</property> |
1667 | @@ -88,37 +72,52 @@ |
1668 | <property name="height">1</property> |
1669 | </packing> |
1670 | </child> |
1671 | - <child> |
1672 | - <object class="GtkButtonBox" id="buttonbox"> |
1673 | - <property name="visible">True</property> |
1674 | - <property name="can_focus">False</property> |
1675 | - <property name="valign">end</property> |
1676 | - <property name="hexpand">True</property> |
1677 | - <property name="vexpand">True</property> |
1678 | - <property name="spacing">6</property> |
1679 | - <property name="homogeneous">True</property> |
1680 | - <property name="layout_style">end</property> |
1681 | - <child> |
1682 | - <placeholder/> |
1683 | - </child> |
1684 | - </object> |
1685 | - <packing> |
1686 | - <property name="left_attach">0</property> |
1687 | - <property name="top_attach">2</property> |
1688 | - <property name="width">2</property> |
1689 | - <property name="height">1</property> |
1690 | - </packing> |
1691 | - </child> |
1692 | + </object> |
1693 | + <packing> |
1694 | + <property name="expand">False</property> |
1695 | + <property name="fill">True</property> |
1696 | + <property name="position">0</property> |
1697 | + </packing> |
1698 | + </child> |
1699 | + <child> |
1700 | + <object class="GtkBox" id="main_container"> |
1701 | + <property name="can_focus">False</property> |
1702 | + <property name="no_show_all">True</property> |
1703 | + <property name="margin_bottom">12</property> |
1704 | + <property name="hexpand">True</property> |
1705 | + <property name="vexpand">True</property> |
1706 | + <property name="orientation">vertical</property> |
1707 | <child> |
1708 | <placeholder/> |
1709 | </child> |
1710 | </object> |
1711 | <packing> |
1712 | - <property name="expand">False</property> |
1713 | + <property name="expand">True</property> |
1714 | <property name="fill">True</property> |
1715 | + <property name="padding">4</property> |
1716 | <property name="position">1</property> |
1717 | </packing> |
1718 | </child> |
1719 | + <child> |
1720 | + <object class="GtkButtonBox" id="buttonbox"> |
1721 | + <property name="visible">True</property> |
1722 | + <property name="can_focus">False</property> |
1723 | + <property name="valign">end</property> |
1724 | + <property name="hexpand">True</property> |
1725 | + <property name="spacing">6</property> |
1726 | + <property name="homogeneous">True</property> |
1727 | + <property name="layout_style">end</property> |
1728 | + <child> |
1729 | + <placeholder/> |
1730 | + </child> |
1731 | + </object> |
1732 | + <packing> |
1733 | + <property name="expand">False</property> |
1734 | + <property name="fill">True</property> |
1735 | + <property name="pack_type">end</property> |
1736 | + <property name="position">2</property> |
1737 | + </packing> |
1738 | + </child> |
1739 | </object> |
1740 | </child> |
1741 | </object> |
1742 | |
1743 | === modified file 'data/gtkbuilder/UpdateManager.ui' |
1744 | --- data/gtkbuilder/UpdateManager.ui 2012-12-18 02:30:27 +0000 |
1745 | +++ data/gtkbuilder/UpdateManager.ui 2013-05-21 05:43:25 +0000 |
1746 | @@ -1,533 +1,365 @@ |
1747 | <?xml version="1.0" encoding="UTF-8"?> |
1748 | <interface> |
1749 | <!-- interface-requires gtk+ 3.0 --> |
1750 | - <object class="GtkImage" id="image-apply"> |
1751 | + <object class="GtkVBox" id="pane_updates_available"> |
1752 | <property name="visible">True</property> |
1753 | <property name="can_focus">False</property> |
1754 | - <property name="stock">gtk-apply</property> |
1755 | - </object> |
1756 | - <object class="GtkWindow" id="window_updates_available"> |
1757 | - <property name="can_focus">False</property> |
1758 | + <property name="spacing">12</property> |
1759 | <child> |
1760 | - <object class="GtkVBox" id="pane_updates_available"> |
1761 | + <object class="GtkExpander" id="expander_details"> |
1762 | <property name="visible">True</property> |
1763 | - <property name="can_focus">False</property> |
1764 | - <property name="border_width">6</property> |
1765 | + <property name="can_focus">True</property> |
1766 | <property name="spacing">6</property> |
1767 | + <property name="resize_toplevel">True</property> |
1768 | <child> |
1769 | - <object class="GtkVBox" id="vbox_updates"> |
1770 | + <object class="GtkVBox" id="vbox4"> |
1771 | <property name="visible">True</property> |
1772 | <property name="can_focus">False</property> |
1773 | - <property name="border_width">6</property> |
1774 | - <property name="spacing">12</property> |
1775 | + <property name="spacing">6</property> |
1776 | <child> |
1777 | - <object class="GtkHBox" id="hbox3"> |
1778 | + <object class="GtkScrolledWindow" id="scrolledwindow_update"> |
1779 | <property name="visible">True</property> |
1780 | - <property name="can_focus">False</property> |
1781 | - <property name="spacing">12</property> |
1782 | - <child> |
1783 | - <object class="GtkImage" id="image_logo"> |
1784 | - <property name="visible">True</property> |
1785 | - <property name="can_focus">False</property> |
1786 | - <property name="yalign">0</property> |
1787 | - <property name="pixel_size">48</property> |
1788 | - <property name="icon_name">system-software-update</property> |
1789 | - </object> |
1790 | - <packing> |
1791 | - <property name="expand">False</property> |
1792 | - <property name="fill">False</property> |
1793 | - <property name="position">0</property> |
1794 | - </packing> |
1795 | - </child> |
1796 | - <child> |
1797 | - <object class="GtkGrid" id="grid1"> |
1798 | - <property name="visible">True</property> |
1799 | - <property name="can_focus">False</property> |
1800 | - <property name="margin_bottom">6</property> |
1801 | - <property name="row_spacing">6</property> |
1802 | - <property name="column_spacing">12</property> |
1803 | - <child> |
1804 | - <object class="GtkLabel" id="label_header"> |
1805 | - <property name="visible">True</property> |
1806 | - <property name="can_focus">False</property> |
1807 | - <property name="hexpand">True</property> |
1808 | - <property name="xalign">0</property> |
1809 | - <property name="wrap">True</property> |
1810 | - <property name="max_width_chars">20</property> |
1811 | - <attributes> |
1812 | - <attribute name="weight" value="bold"/> |
1813 | - <attribute name="scale" value="1.25"/> |
1814 | - </attributes> |
1815 | - </object> |
1816 | - <packing> |
1817 | - <property name="left_attach">0</property> |
1818 | - <property name="top_attach">0</property> |
1819 | - <property name="width">1</property> |
1820 | - <property name="height">1</property> |
1821 | - </packing> |
1822 | - </child> |
1823 | - <child> |
1824 | - <object class="GtkLabel" id="label_desc"> |
1825 | - <property name="can_focus">False</property> |
1826 | - <property name="no_show_all">True</property> |
1827 | - <property name="hexpand">True</property> |
1828 | - <property name="xalign">0</property> |
1829 | - <property name="wrap">True</property> |
1830 | - <property name="max_width_chars">20</property> |
1831 | - </object> |
1832 | - <packing> |
1833 | - <property name="left_attach">0</property> |
1834 | - <property name="top_attach">1</property> |
1835 | - <property name="width">1</property> |
1836 | - <property name="height">1</property> |
1837 | - </packing> |
1838 | - </child> |
1839 | - </object> |
1840 | - <packing> |
1841 | - <property name="expand">False</property> |
1842 | - <property name="fill">True</property> |
1843 | - <property name="position">1</property> |
1844 | - </packing> |
1845 | + <property name="can_focus">True</property> |
1846 | + <property name="shadow_type">in</property> |
1847 | + <property name="min_content_height">100</property> |
1848 | + <child> |
1849 | + <object class="GtkTreeView" id="treeview_update"> |
1850 | + <property name="visible">True</property> |
1851 | + <property name="can_focus">True</property> |
1852 | + <property name="headers_visible">False</property> |
1853 | + <property name="headers_clickable">False</property> |
1854 | + <property name="rules_hint">True</property> |
1855 | + <child internal-child="accessible"> |
1856 | + <object class="AtkObject" id="treeview_update-atkobject"> |
1857 | + <property name="AtkObject::accessible-name" translatable="yes">updates</property> |
1858 | + </object> |
1859 | + </child> |
1860 | + <signal name="cursor-changed" handler="on_treeview_update_cursor_changed" swapped="no"/> |
1861 | + <signal name="row-activated" handler="on_treeview_update_row_activated" swapped="no"/> |
1862 | + </object> |
1863 | </child> |
1864 | </object> |
1865 | <packing> |
1866 | - <property name="expand">False</property> |
1867 | + <property name="expand">True</property> |
1868 | <property name="fill">True</property> |
1869 | <property name="position">0</property> |
1870 | </packing> |
1871 | </child> |
1872 | <child> |
1873 | - <object class="GtkExpander" id="expander_details"> |
1874 | + <object class="GtkExpander" id="expander_desc"> |
1875 | <property name="visible">True</property> |
1876 | <property name="can_focus">True</property> |
1877 | - <property name="spacing">6</property> |
1878 | - <property name="resize_toplevel">True</property> |
1879 | <child> |
1880 | - <object class="GtkVBox" id="vbox4"> |
1881 | + <object class="GtkNotebook" id="notebook_details"> |
1882 | <property name="visible">True</property> |
1883 | - <property name="can_focus">False</property> |
1884 | - <property name="spacing">6</property> |
1885 | - <child> |
1886 | - <object class="GtkScrolledWindow" id="scrolledwindow_update"> |
1887 | + <property name="can_focus">True</property> |
1888 | + <property name="show_border">False</property> |
1889 | + <child> |
1890 | + <object class="GtkVBox" id="vbox5"> |
1891 | + <property name="visible">True</property> |
1892 | + <property name="can_focus">False</property> |
1893 | + <property name="border_width">6</property> |
1894 | + <property name="spacing">6</property> |
1895 | + <child> |
1896 | + <object class="GtkScrolledWindow" id="scrolledwindow_changes"> |
1897 | + <property name="visible">True</property> |
1898 | + <property name="can_focus">True</property> |
1899 | + <property name="shadow_type">in</property> |
1900 | + <child> |
1901 | + <placeholder/> |
1902 | + </child> |
1903 | + </object> |
1904 | + <packing> |
1905 | + <property name="expand">True</property> |
1906 | + <property name="fill">True</property> |
1907 | + <property name="position">0</property> |
1908 | + </packing> |
1909 | + </child> |
1910 | + </object> |
1911 | + </child> |
1912 | + <child type="tab"> |
1913 | + <object class="GtkLabel" id="label8"> |
1914 | + <property name="visible">True</property> |
1915 | + <property name="can_focus">False</property> |
1916 | + <property name="label" translatable="yes">Changes</property> |
1917 | + </object> |
1918 | + <packing> |
1919 | + <property name="tab_fill">False</property> |
1920 | + </packing> |
1921 | + </child> |
1922 | + <child> |
1923 | + <object class="GtkScrolledWindow" id="scrolledwindow3"> |
1924 | <property name="visible">True</property> |
1925 | <property name="can_focus">True</property> |
1926 | + <property name="border_width">6</property> |
1927 | <property name="shadow_type">in</property> |
1928 | - <property name="min_content_height">100</property> |
1929 | <child> |
1930 | - <object class="GtkTreeView" id="treeview_update"> |
1931 | + <object class="GtkTextView" id="textview_descr"> |
1932 | <property name="visible">True</property> |
1933 | <property name="can_focus">True</property> |
1934 | - <property name="headers_visible">False</property> |
1935 | - <property name="headers_clickable">False</property> |
1936 | - <property name="rules_hint">True</property> |
1937 | + <property name="pixels_above_lines">6</property> |
1938 | + <property name="editable">False</property> |
1939 | + <property name="wrap_mode">word</property> |
1940 | + <property name="left_margin">6</property> |
1941 | + <property name="right_margin">6</property> |
1942 | + <property name="cursor_visible">False</property> |
1943 | + <property name="accepts_tab">False</property> |
1944 | <child internal-child="accessible"> |
1945 | - <object class="AtkObject" id="treeview_update-atkobject"> |
1946 | - <property name="AtkObject::accessible-name" translatable="yes">updates</property> |
1947 | + <object class="AtkObject" id="textview_descr-atkobject"> |
1948 | + <property name="AtkObject::accessible-name" translatable="yes">Description</property> |
1949 | </object> |
1950 | </child> |
1951 | - <signal name="cursor-changed" handler="on_treeview_update_cursor_changed" swapped="no"/> |
1952 | - <signal name="row-activated" handler="on_treeview_update_row_activated" swapped="no"/> |
1953 | - <child internal-child="selection"> |
1954 | - <object class="GtkTreeSelection" id="treeview-selection"/> |
1955 | - </child> |
1956 | </object> |
1957 | </child> |
1958 | </object> |
1959 | <packing> |
1960 | - <property name="expand">True</property> |
1961 | - <property name="fill">True</property> |
1962 | - <property name="position">0</property> |
1963 | + <property name="position">1</property> |
1964 | </packing> |
1965 | </child> |
1966 | - <child> |
1967 | - <object class="GtkExpander" id="expander_desc"> |
1968 | + <child type="tab"> |
1969 | + <object class="GtkLabel" id="label9"> |
1970 | <property name="visible">True</property> |
1971 | - <property name="can_focus">True</property> |
1972 | - <child> |
1973 | - <object class="GtkNotebook" id="notebook_details"> |
1974 | - <property name="visible">True</property> |
1975 | - <property name="can_focus">True</property> |
1976 | - <property name="show_border">False</property> |
1977 | - <child> |
1978 | - <object class="GtkVBox" id="vbox5"> |
1979 | - <property name="visible">True</property> |
1980 | - <property name="can_focus">False</property> |
1981 | - <property name="border_width">6</property> |
1982 | - <property name="spacing">6</property> |
1983 | - <child> |
1984 | - <object class="GtkScrolledWindow" id="scrolledwindow_changes"> |
1985 | - <property name="visible">True</property> |
1986 | - <property name="can_focus">True</property> |
1987 | - <property name="shadow_type">in</property> |
1988 | - <child> |
1989 | - <placeholder/> |
1990 | - </child> |
1991 | - </object> |
1992 | - <packing> |
1993 | - <property name="expand">True</property> |
1994 | - <property name="fill">True</property> |
1995 | - <property name="position">0</property> |
1996 | - </packing> |
1997 | - </child> |
1998 | - </object> |
1999 | - </child> |
2000 | - <child type="tab"> |
2001 | - <object class="GtkLabel" id="label8"> |
2002 | - <property name="visible">True</property> |
2003 | - <property name="can_focus">False</property> |
2004 | - <property name="label" translatable="yes">Changes</property> |
2005 | - </object> |
2006 | - <packing> |
2007 | - <property name="tab_fill">False</property> |
2008 | - </packing> |
2009 | - </child> |
2010 | - <child> |
2011 | - <object class="GtkScrolledWindow" id="scrolledwindow3"> |
2012 | - <property name="visible">True</property> |
2013 | - <property name="can_focus">True</property> |
2014 | - <property name="border_width">6</property> |
2015 | - <property name="shadow_type">in</property> |
2016 | - <child> |
2017 | - <object class="GtkTextView" id="textview_descr"> |
2018 | - <property name="visible">True</property> |
2019 | - <property name="can_focus">True</property> |
2020 | - <property name="pixels_above_lines">6</property> |
2021 | - <property name="editable">False</property> |
2022 | - <property name="wrap_mode">word</property> |
2023 | - <property name="left_margin">6</property> |
2024 | - <property name="right_margin">6</property> |
2025 | - <property name="cursor_visible">False</property> |
2026 | - <property name="accepts_tab">False</property> |
2027 | - <child internal-child="accessible"> |
2028 | - <object class="AtkObject" id="textview_descr-atkobject"> |
2029 | - <property name="AtkObject::accessible-name" translatable="yes">Description</property> |
2030 | - </object> |
2031 | - </child> |
2032 | - </object> |
2033 | - </child> |
2034 | - </object> |
2035 | - <packing> |
2036 | - <property name="position">1</property> |
2037 | - </packing> |
2038 | - </child> |
2039 | - <child type="tab"> |
2040 | - <object class="GtkLabel" id="label9"> |
2041 | - <property name="visible">True</property> |
2042 | - <property name="can_focus">False</property> |
2043 | - <property name="label" translatable="yes">Description</property> |
2044 | - <child internal-child="accessible"> |
2045 | - <object class="AtkObject" id="label9-atkobject"> |
2046 | - <property name="AtkObject::accessible-name" translatable="yes">Description</property> |
2047 | - </object> |
2048 | - </child> |
2049 | - </object> |
2050 | - <packing> |
2051 | - <property name="position">1</property> |
2052 | - <property name="tab_fill">False</property> |
2053 | - </packing> |
2054 | - </child> |
2055 | - </object> |
2056 | - </child> |
2057 | - <child type="label"> |
2058 | - <object class="GtkLabel" id="label13"> |
2059 | - <property name="visible">True</property> |
2060 | - <property name="can_focus">False</property> |
2061 | - <property name="label" translatable="yes">Technical description</property> |
2062 | + <property name="can_focus">False</property> |
2063 | + <property name="label" translatable="yes">Description</property> |
2064 | + <child internal-child="accessible"> |
2065 | + <object class="AtkObject" id="label9-atkobject"> |
2066 | + <property name="AtkObject::accessible-name" translatable="yes">Description</property> |
2067 | </object> |
2068 | </child> |
2069 | </object> |
2070 | <packing> |
2071 | - <property name="expand">False</property> |
2072 | - <property name="fill">True</property> |
2073 | <property name="position">1</property> |
2074 | + <property name="tab_fill">False</property> |
2075 | </packing> |
2076 | </child> |
2077 | </object> |
2078 | </child> |
2079 | <child type="label"> |
2080 | - <object class="GtkLabel" id="label12"> |
2081 | + <object class="GtkLabel" id="label13"> |
2082 | <property name="visible">True</property> |
2083 | <property name="can_focus">False</property> |
2084 | - <property name="label" translatable="yes">Details of updates</property> |
2085 | - <property name="use_markup">True</property> |
2086 | + <property name="label" translatable="yes">Technical description</property> |
2087 | </object> |
2088 | </child> |
2089 | </object> |
2090 | <packing> |
2091 | - <property name="expand">True</property> |
2092 | - <property name="fill">True</property> |
2093 | - <property name="position">2</property> |
2094 | - </packing> |
2095 | - </child> |
2096 | - <child> |
2097 | - <object class="GtkVBox" id="vbox_alerts"> |
2098 | - <property name="can_focus">False</property> |
2099 | - <property name="spacing">3</property> |
2100 | - <child> |
2101 | - <object class="GtkHBox" id="hbox_downsize"> |
2102 | - <property name="can_focus">False</property> |
2103 | - <property name="spacing">12</property> |
2104 | - <child> |
2105 | - <object class="GtkImage" id="image_downsize"> |
2106 | - <property name="visible">True</property> |
2107 | - <property name="can_focus">False</property> |
2108 | - <property name="icon_name">aptdaemon-download</property> |
2109 | - </object> |
2110 | - <packing> |
2111 | - <property name="expand">False</property> |
2112 | - <property name="fill">True</property> |
2113 | - <property name="position">0</property> |
2114 | - </packing> |
2115 | - </child> |
2116 | - <child> |
2117 | - <object class="GtkLabel" id="label_downsize"> |
2118 | - <property name="visible">True</property> |
2119 | - <property name="can_focus">False</property> |
2120 | - <property name="xalign">0</property> |
2121 | - <property name="label"> |
2122 | + <property name="expand">False</property> |
2123 | + <property name="fill">True</property> |
2124 | + <property name="position">1</property> |
2125 | + </packing> |
2126 | + </child> |
2127 | + </object> |
2128 | + </child> |
2129 | + <child type="label"> |
2130 | + <object class="GtkLabel" id="label12"> |
2131 | + <property name="visible">True</property> |
2132 | + <property name="can_focus">False</property> |
2133 | + <property name="label" translatable="yes">Details of updates</property> |
2134 | + <property name="use_markup">True</property> |
2135 | + </object> |
2136 | + </child> |
2137 | + </object> |
2138 | + <packing> |
2139 | + <property name="expand">True</property> |
2140 | + <property name="fill">True</property> |
2141 | + <property name="position">2</property> |
2142 | + </packing> |
2143 | + </child> |
2144 | + <child> |
2145 | + <object class="GtkVBox" id="vbox_alerts"> |
2146 | + <property name="can_focus">False</property> |
2147 | + <property name="spacing">3</property> |
2148 | + <child> |
2149 | + <object class="GtkHBox" id="hbox_downsize"> |
2150 | + <property name="can_focus">False</property> |
2151 | + <property name="spacing">12</property> |
2152 | + <child> |
2153 | + <object class="GtkImage" id="image_downsize"> |
2154 | + <property name="visible">True</property> |
2155 | + <property name="can_focus">False</property> |
2156 | + <property name="icon_name">aptdaemon-download</property> |
2157 | + </object> |
2158 | + <packing> |
2159 | + <property name="expand">False</property> |
2160 | + <property name="fill">True</property> |
2161 | + <property name="position">0</property> |
2162 | + </packing> |
2163 | + </child> |
2164 | + <child> |
2165 | + <object class="GtkLabel" id="label_downsize"> |
2166 | + <property name="visible">True</property> |
2167 | + <property name="can_focus">False</property> |
2168 | + <property name="xalign">0</property> |
2169 | + <property name="label"> |
2170 | </property> |
2171 | - <property name="wrap">True</property> |
2172 | - </object> |
2173 | - <packing> |
2174 | - <property name="expand">True</property> |
2175 | - <property name="fill">True</property> |
2176 | - <property name="position">1</property> |
2177 | - </packing> |
2178 | - </child> |
2179 | - </object> |
2180 | - <packing> |
2181 | - <property name="expand">False</property> |
2182 | - <property name="fill">False</property> |
2183 | - <property name="position">0</property> |
2184 | - </packing> |
2185 | - </child> |
2186 | - <child> |
2187 | - <object class="GtkHBox" id="hbox_roaming"> |
2188 | - <property name="can_focus">False</property> |
2189 | - <property name="spacing">12</property> |
2190 | - <child> |
2191 | - <object class="GtkImage" id="image_roaming"> |
2192 | - <property name="visible">True</property> |
2193 | - <property name="can_focus">False</property> |
2194 | - <property name="icon_name">dialog-warning</property> |
2195 | - </object> |
2196 | - <packing> |
2197 | - <property name="expand">False</property> |
2198 | - <property name="fill">True</property> |
2199 | - <property name="position">0</property> |
2200 | - </packing> |
2201 | - </child> |
2202 | - <child> |
2203 | - <object class="GtkLabel" id="label_roaming"> |
2204 | - <property name="visible">True</property> |
2205 | - <property name="can_focus">False</property> |
2206 | - <property name="xalign">0</property> |
2207 | - <property name="label" translatable="yes">You are connected via roaming and may be charged for the data consumed by this update.</property> |
2208 | - <property name="wrap">True</property> |
2209 | - </object> |
2210 | - <packing> |
2211 | - <property name="expand">True</property> |
2212 | - <property name="fill">True</property> |
2213 | - <property name="position">1</property> |
2214 | - </packing> |
2215 | - </child> |
2216 | - </object> |
2217 | - <packing> |
2218 | - <property name="expand">False</property> |
2219 | - <property name="fill">False</property> |
2220 | - <property name="position">1</property> |
2221 | - </packing> |
2222 | - </child> |
2223 | - <child> |
2224 | - <object class="GtkHBox" id="hbox_on_3g"> |
2225 | - <property name="can_focus">False</property> |
2226 | - <property name="spacing">12</property> |
2227 | - <child> |
2228 | - <object class="GtkImage" id="image_on_3g"> |
2229 | - <property name="visible">True</property> |
2230 | - <property name="can_focus">False</property> |
2231 | - <property name="icon_name">modem</property> |
2232 | - </object> |
2233 | - <packing> |
2234 | - <property name="expand">False</property> |
2235 | - <property name="fill">True</property> |
2236 | - <property name="position">0</property> |
2237 | - </packing> |
2238 | - </child> |
2239 | - <child> |
2240 | - <object class="GtkLabel" id="label_on_3g"> |
2241 | - <property name="visible">True</property> |
2242 | - <property name="can_focus">False</property> |
2243 | - <property name="xalign">0</property> |
2244 | - <property name="label" translatable="yes">You may want to wait until you’re not using a mobile broadband connection.</property> |
2245 | - <property name="wrap">True</property> |
2246 | - </object> |
2247 | - <packing> |
2248 | - <property name="expand">True</property> |
2249 | - <property name="fill">True</property> |
2250 | - <property name="position">1</property> |
2251 | - </packing> |
2252 | - </child> |
2253 | - </object> |
2254 | - <packing> |
2255 | - <property name="expand">False</property> |
2256 | - <property name="fill">False</property> |
2257 | - <property name="position">2</property> |
2258 | - </packing> |
2259 | - </child> |
2260 | - <child> |
2261 | - <object class="GtkHBox" id="hbox_battery"> |
2262 | - <property name="can_focus">False</property> |
2263 | - <property name="spacing">12</property> |
2264 | - <child> |
2265 | - <object class="GtkImage" id="image_battery"> |
2266 | - <property name="visible">True</property> |
2267 | - <property name="can_focus">False</property> |
2268 | - <property name="icon_name">battery</property> |
2269 | - </object> |
2270 | - <packing> |
2271 | - <property name="expand">False</property> |
2272 | - <property name="fill">True</property> |
2273 | - <property name="position">0</property> |
2274 | - </packing> |
2275 | - </child> |
2276 | - <child> |
2277 | - <object class="GtkLabel" id="label_battery"> |
2278 | - <property name="visible">True</property> |
2279 | - <property name="can_focus">False</property> |
2280 | - <property name="xalign">0</property> |
2281 | - <property name="label" translatable="yes">It’s safer to connect the computer to AC power before updating.</property> |
2282 | - <property name="wrap">True</property> |
2283 | - </object> |
2284 | - <packing> |
2285 | - <property name="expand">True</property> |
2286 | - <property name="fill">True</property> |
2287 | - <property name="position">1</property> |
2288 | - </packing> |
2289 | - </child> |
2290 | - </object> |
2291 | - <packing> |
2292 | - <property name="expand">False</property> |
2293 | - <property name="fill">False</property> |
2294 | - <property name="position">3</property> |
2295 | - </packing> |
2296 | - </child> |
2297 | - <child> |
2298 | - <object class="GtkHBox" id="hbox_offline"> |
2299 | - <property name="can_focus">False</property> |
2300 | - <property name="spacing">12</property> |
2301 | - <child> |
2302 | - <object class="GtkImage" id="image_offline"> |
2303 | - <property name="visible">True</property> |
2304 | - <property name="can_focus">False</property> |
2305 | - <property name="icon_name">network-offline</property> |
2306 | - </object> |
2307 | - <packing> |
2308 | - <property name="expand">False</property> |
2309 | - <property name="fill">True</property> |
2310 | - <property name="position">0</property> |
2311 | - </packing> |
2312 | - </child> |
2313 | - <child> |
2314 | - <object class="GtkLabel" id="label_offline"> |
2315 | - <property name="visible">True</property> |
2316 | - <property name="can_focus">False</property> |
2317 | - <property name="xalign">0</property> |
2318 | - <property name="wrap">True</property> |
2319 | - </object> |
2320 | - <packing> |
2321 | - <property name="expand">True</property> |
2322 | - <property name="fill">True</property> |
2323 | - <property name="position">1</property> |
2324 | - </packing> |
2325 | - </child> |
2326 | - </object> |
2327 | - <packing> |
2328 | - <property name="expand">False</property> |
2329 | - <property name="fill">False</property> |
2330 | - <property name="position">4</property> |
2331 | - </packing> |
2332 | - </child> |
2333 | + <property name="wrap">True</property> |
2334 | </object> |
2335 | <packing> |
2336 | - <property name="expand">False</property> |
2337 | + <property name="expand">True</property> |
2338 | <property name="fill">True</property> |
2339 | - <property name="position">3</property> |
2340 | + <property name="position">1</property> |
2341 | </packing> |
2342 | </child> |
2343 | </object> |
2344 | <packing> |
2345 | - <property name="expand">True</property> |
2346 | - <property name="fill">True</property> |
2347 | + <property name="expand">False</property> |
2348 | + <property name="fill">False</property> |
2349 | <property name="position">0</property> |
2350 | </packing> |
2351 | </child> |
2352 | <child> |
2353 | - <object class="GtkHButtonBox" id="hbuttonbox6"> |
2354 | - <property name="visible">True</property> |
2355 | + <object class="GtkHBox" id="hbox_roaming"> |
2356 | <property name="can_focus">False</property> |
2357 | - <property name="border_width">5</property> |
2358 | - <property name="spacing">6</property> |
2359 | - <property name="layout_style">end</property> |
2360 | + <property name="spacing">12</property> |
2361 | <child> |
2362 | - <object class="GtkButton" id="button_settings"> |
2363 | - <property name="label" translatable="yes">_Settings...</property> |
2364 | + <object class="GtkImage" id="image_roaming"> |
2365 | <property name="visible">True</property> |
2366 | - <property name="can_focus">True</property> |
2367 | - <property name="receives_default">True</property> |
2368 | - <property name="use_underline">True</property> |
2369 | - <signal name="clicked" handler="on_button_settings_clicked" swapped="no"/> |
2370 | + <property name="can_focus">False</property> |
2371 | + <property name="icon_name">dialog-warning</property> |
2372 | </object> |
2373 | <packing> |
2374 | <property name="expand">False</property> |
2375 | - <property name="fill">False</property> |
2376 | + <property name="fill">True</property> |
2377 | <property name="position">0</property> |
2378 | - <property name="secondary">True</property> |
2379 | - </packing> |
2380 | - </child> |
2381 | - <child> |
2382 | - <object class="GtkButton" id="button_close"> |
2383 | - <property name="label">gtk-cancel</property> |
2384 | - <property name="visible">True</property> |
2385 | - <property name="can_focus">True</property> |
2386 | - <property name="can_default">True</property> |
2387 | - <property name="receives_default">True</property> |
2388 | - <property name="use_stock">True</property> |
2389 | - <accelerator key="W" signal="clicked" modifiers="GDK_CONTROL_MASK"/> |
2390 | - <accelerator key="Q" signal="clicked" modifiers="GDK_CONTROL_MASK"/> |
2391 | - </object> |
2392 | - <packing> |
2393 | - <property name="expand">False</property> |
2394 | - <property name="fill">False</property> |
2395 | - <property name="position">2</property> |
2396 | - </packing> |
2397 | - </child> |
2398 | - <child> |
2399 | - <object class="GtkButton" id="button_install"> |
2400 | - <property name="label" translatable="yes">_Install Now</property> |
2401 | - <property name="visible">True</property> |
2402 | - <property name="can_focus">True</property> |
2403 | - <property name="can_default">True</property> |
2404 | - <property name="has_default">True</property> |
2405 | - <property name="receives_default">True</property> |
2406 | - <property name="image">image-apply</property> |
2407 | - <property name="use_underline">True</property> |
2408 | - <signal name="clicked" handler="on_button_install_clicked" swapped="no"/> |
2409 | - </object> |
2410 | - <packing> |
2411 | - <property name="expand">False</property> |
2412 | + </packing> |
2413 | + </child> |
2414 | + <child> |
2415 | + <object class="GtkLabel" id="label_roaming"> |
2416 | + <property name="visible">True</property> |
2417 | + <property name="can_focus">False</property> |
2418 | + <property name="xalign">0</property> |
2419 | + <property name="label" translatable="yes">You are connected via roaming and may be charged for the data consumed by this update.</property> |
2420 | + <property name="wrap">True</property> |
2421 | + </object> |
2422 | + <packing> |
2423 | + <property name="expand">True</property> |
2424 | <property name="fill">True</property> |
2425 | - <property name="position">3</property> |
2426 | + <property name="position">1</property> |
2427 | </packing> |
2428 | </child> |
2429 | </object> |
2430 | <packing> |
2431 | <property name="expand">False</property> |
2432 | - <property name="fill">True</property> |
2433 | + <property name="fill">False</property> |
2434 | <property name="position">1</property> |
2435 | </packing> |
2436 | </child> |
2437 | + <child> |
2438 | + <object class="GtkHBox" id="hbox_on_3g"> |
2439 | + <property name="can_focus">False</property> |
2440 | + <property name="spacing">12</property> |
2441 | + <child> |
2442 | + <object class="GtkImage" id="image_on_3g"> |
2443 | + <property name="visible">True</property> |
2444 | + <property name="can_focus">False</property> |
2445 | + <property name="icon_name">modem</property> |
2446 | + </object> |
2447 | + <packing> |
2448 | + <property name="expand">False</property> |
2449 | + <property name="fill">True</property> |
2450 | + <property name="position">0</property> |
2451 | + </packing> |
2452 | + </child> |
2453 | + <child> |
2454 | + <object class="GtkLabel" id="label_on_3g"> |
2455 | + <property name="visible">True</property> |
2456 | + <property name="can_focus">False</property> |
2457 | + <property name="xalign">0</property> |
2458 | + <property name="label" translatable="yes">You may want to wait until you’re not using a mobile broadband connection.</property> |
2459 | + <property name="wrap">True</property> |
2460 | + </object> |
2461 | + <packing> |
2462 | + <property name="expand">True</property> |
2463 | + <property name="fill">True</property> |
2464 | + <property name="position">1</property> |
2465 | + </packing> |
2466 | + </child> |
2467 | + </object> |
2468 | + <packing> |
2469 | + <property name="expand">False</property> |
2470 | + <property name="fill">False</property> |
2471 | + <property name="position">2</property> |
2472 | + </packing> |
2473 | + </child> |
2474 | + <child> |
2475 | + <object class="GtkHBox" id="hbox_battery"> |
2476 | + <property name="can_focus">False</property> |
2477 | + <property name="spacing">12</property> |
2478 | + <child> |
2479 | + <object class="GtkImage" id="image_battery"> |
2480 | + <property name="visible">True</property> |
2481 | + <property name="can_focus">False</property> |
2482 | + <property name="icon_name">battery</property> |
2483 | + </object> |
2484 | + <packing> |
2485 | + <property name="expand">False</property> |
2486 | + <property name="fill">True</property> |
2487 | + <property name="position">0</property> |
2488 | + </packing> |
2489 | + </child> |
2490 | + <child> |
2491 | + <object class="GtkLabel" id="label_battery"> |
2492 | + <property name="visible">True</property> |
2493 | + <property name="can_focus">False</property> |
2494 | + <property name="xalign">0</property> |
2495 | + <property name="label" translatable="yes">It’s safer to connect the computer to AC power before updating.</property> |
2496 | + <property name="wrap">True</property> |
2497 | + </object> |
2498 | + <packing> |
2499 | + <property name="expand">True</property> |
2500 | + <property name="fill">True</property> |
2501 | + <property name="position">1</property> |
2502 | + </packing> |
2503 | + </child> |
2504 | + </object> |
2505 | + <packing> |
2506 | + <property name="expand">False</property> |
2507 | + <property name="fill">False</property> |
2508 | + <property name="position">3</property> |
2509 | + </packing> |
2510 | + </child> |
2511 | + <child> |
2512 | + <object class="GtkHBox" id="hbox_offline"> |
2513 | + <property name="can_focus">False</property> |
2514 | + <property name="spacing">12</property> |
2515 | + <child> |
2516 | + <object class="GtkImage" id="image_offline"> |
2517 | + <property name="visible">True</property> |
2518 | + <property name="can_focus">False</property> |
2519 | + <property name="icon_name">network-offline</property> |
2520 | + </object> |
2521 | + <packing> |
2522 | + <property name="expand">False</property> |
2523 | + <property name="fill">True</property> |
2524 | + <property name="position">0</property> |
2525 | + </packing> |
2526 | + </child> |
2527 | + <child> |
2528 | + <object class="GtkLabel" id="label_offline"> |
2529 | + <property name="visible">True</property> |
2530 | + <property name="can_focus">False</property> |
2531 | + <property name="xalign">0</property> |
2532 | + <property name="wrap">True</property> |
2533 | + </object> |
2534 | + <packing> |
2535 | + <property name="expand">True</property> |
2536 | + <property name="fill">True</property> |
2537 | + <property name="position">1</property> |
2538 | + </packing> |
2539 | + </child> |
2540 | + </object> |
2541 | + <packing> |
2542 | + <property name="expand">False</property> |
2543 | + <property name="fill">False</property> |
2544 | + <property name="position">4</property> |
2545 | + </packing> |
2546 | + </child> |
2547 | </object> |
2548 | + <packing> |
2549 | + <property name="expand">False</property> |
2550 | + <property name="fill">True</property> |
2551 | + <property name="position">3</property> |
2552 | + </packing> |
2553 | </child> |
2554 | </object> |
2555 | </interface> |
2556 | |
2557 | === modified file 'debian/update-manager.install' |
2558 | --- debian/update-manager.install 2012-11-19 16:33:28 +0000 |
2559 | +++ debian/update-manager.install 2013-05-21 05:43:25 +0000 |
2560 | @@ -8,10 +8,7 @@ |
2561 | debian/tmp/usr/share/applications/update-manager.desktop |
2562 | debian/tmp/usr/lib/python3*/dist-packages/UpdateManager/ChangelogViewer.py |
2563 | debian/tmp/usr/lib/python3*/dist-packages/UpdateManager/Dialogs.py |
2564 | -debian/tmp/usr/lib/python3*/dist-packages/UpdateManager/InstallProgress.py |
2565 | debian/tmp/usr/lib/python3*/dist-packages/UpdateManager/MetaReleaseGObject.py |
2566 | debian/tmp/usr/lib/python3*/dist-packages/UpdateManager/UpdateManager.py |
2567 | -debian/tmp/usr/lib/python3*/dist-packages/UpdateManager/UpdateProgress.py |
2568 | debian/tmp/usr/lib/python3*/dist-packages/UpdateManager/UpdatesAvailable.py |
2569 | -debian/tmp/usr/lib/python3*/dist-packages/UpdateManager/SimpleGtkbuilderApp.py |
2570 | debian/tmp/usr/lib/python3*/dist-packages/UpdateManager/HelpViewer.py |
2571 | |
2572 | === modified file 'po/POTFILES.in' |
2573 | --- po/POTFILES.in 2012-09-25 07:36:24 +0000 |
2574 | +++ po/POTFILES.in 2013-05-21 05:43:25 +0000 |
2575 | @@ -4,9 +4,7 @@ |
2576 | UpdateManager/ChangelogViewer.py |
2577 | UpdateManager/MetaReleaseGObject.py |
2578 | UpdateManager/Dialogs.py |
2579 | -UpdateManager/InstallProgress.py |
2580 | UpdateManager/UpdateManager.py |
2581 | -UpdateManager/UpdateProgress.py |
2582 | UpdateManager/UpdatesAvailable.py |
2583 | UpdateManager/UnitySupport.py |
2584 | UpdateManagerText/UpdateManagerText.py |
2585 | |
2586 | === modified file 'po/update-manager.pot' |
2587 | --- po/update-manager.pot 2012-06-25 16:25:51 +0000 |
2588 | +++ po/update-manager.pot 2013-05-21 05:43:25 +0000 |
2589 | @@ -8,7 +8,7 @@ |
2590 | msgstr "" |
2591 | "Project-Id-Version: PACKAGE VERSION\n" |
2592 | "Report-Msgid-Bugs-To: \n" |
2593 | -"POT-Creation-Date: 2012-06-25 12:22-0400\n" |
2594 | +"POT-Creation-Date: 2013-05-20 10:14-0700\n" |
2595 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
2596 | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" |
2597 | "Language-Team: LANGUAGE <LL@li.org>\n" |
2598 | @@ -18,176 +18,235 @@ |
2599 | "Content-Transfer-Encoding: 8bit\n" |
2600 | "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" |
2601 | |
2602 | -#: ../UpdateManager/backend/InstallBackendSynaptic.py:64 |
2603 | +#: ../UpdateManager/backend/InstallBackendAptdaemon.py:68 |
2604 | +msgid "Checking for updates…" |
2605 | +msgstr "" |
2606 | + |
2607 | +#: ../UpdateManager/backend/InstallBackendAptdaemon.py:93 |
2608 | +msgid "Installing updates…" |
2609 | +msgstr "" |
2610 | + |
2611 | +#: ../UpdateManager/backend/InstallBackendSynaptic.py:37 |
2612 | msgid "Please wait, this can take some time." |
2613 | msgstr "" |
2614 | |
2615 | -#: ../UpdateManager/backend/InstallBackendSynaptic.py:66 |
2616 | +#: ../UpdateManager/backend/InstallBackendSynaptic.py:39 |
2617 | msgid "Update is complete" |
2618 | msgstr "" |
2619 | |
2620 | -#: ../UpdateManager/DistUpgradeFetcher.py:114 |
2621 | -#: ../UpdateManager/DistUpgradeFetcherKDE.py:109 |
2622 | -msgid "Could not find the release notes" |
2623 | -msgstr "" |
2624 | - |
2625 | -#: ../UpdateManager/DistUpgradeFetcher.py:115 |
2626 | -#: ../UpdateManager/DistUpgradeFetcherKDE.py:110 |
2627 | -msgid "The server may be overloaded. " |
2628 | -msgstr "" |
2629 | - |
2630 | -#: ../UpdateManager/DistUpgradeFetcher.py:125 |
2631 | -#: ../UpdateManager/DistUpgradeFetcherKDE.py:114 |
2632 | -msgid "Could not download the release notes" |
2633 | -msgstr "" |
2634 | - |
2635 | -#: ../UpdateManager/DistUpgradeFetcher.py:126 |
2636 | -#: ../UpdateManager/DistUpgradeFetcherKDE.py:115 |
2637 | -msgid "Please check your internet connection." |
2638 | -msgstr "" |
2639 | - |
2640 | -#: ../UpdateManager/DistUpgradeFetcherKDE.py:68 |
2641 | -#: ../UpdateManager/DistUpgradeFetcherKDE.py:91 |
2642 | -msgid "Upgrade" |
2643 | -msgstr "" |
2644 | - |
2645 | -#: ../UpdateManager/DistUpgradeFetcherKDE.py:95 |
2646 | -#: ../data/gtkbuilder/UpdateManager.ui.h:15 |
2647 | -msgid "Release Notes" |
2648 | -msgstr "" |
2649 | - |
2650 | -#: ../UpdateManager/DistUpgradeFetcherKDE.py:134 |
2651 | -#: ../UpdateManager/DistUpgradeFetcherKDE.py:148 |
2652 | -#: ../UpdateManager/DistUpgradeFetcherKDE.py:150 |
2653 | -msgid "Downloading additional package files..." |
2654 | -msgstr "" |
2655 | - |
2656 | -#: ../UpdateManager/DistUpgradeFetcherKDE.py:148 |
2657 | -#, python-format |
2658 | -msgid "File %s of %s at %sB/s" |
2659 | -msgstr "" |
2660 | - |
2661 | -#: ../UpdateManager/DistUpgradeFetcherKDE.py:150 |
2662 | -#, python-format |
2663 | -msgid "File %s of %s" |
2664 | -msgstr "" |
2665 | - |
2666 | -#: ../UpdateManager/DistUpgradeFetcherKDE.py:155 |
2667 | -#, python-format |
2668 | -msgid "Please insert '%s' into the drive '%s'" |
2669 | -msgstr "" |
2670 | - |
2671 | -#. change = QMessageBox.question(None, _("Media Change"), msg, QMessageBox.Ok, QMessageBox.Cancel) |
2672 | -#: ../UpdateManager/DistUpgradeFetcherKDE.py:157 |
2673 | -msgid "Media Change" |
2674 | -msgstr "" |
2675 | - |
2676 | -#: ../UpdateManager/ChangelogViewer.py:75 |
2677 | +#: ../UpdateManager/ChangelogViewer.py:79 |
2678 | msgid "Open Link in Browser" |
2679 | msgstr "" |
2680 | |
2681 | -#: ../UpdateManager/ChangelogViewer.py:78 |
2682 | +#: ../UpdateManager/ChangelogViewer.py:83 |
2683 | msgid "Copy Link to Clipboard" |
2684 | msgstr "" |
2685 | |
2686 | -#: ../UpdateManager/GtkProgress.py:162 |
2687 | -#, python-format |
2688 | -msgid "Downloading file %(current)li of %(total)li with %(speed)s/s" |
2689 | -msgstr "" |
2690 | - |
2691 | -#: ../UpdateManager/GtkProgress.py:167 |
2692 | -#, python-format |
2693 | -msgid "Downloading file %(current)li of %(total)li" |
2694 | -msgstr "" |
2695 | - |
2696 | -#: ../UpdateManager/UpdateManager.py:100 |
2697 | -msgid "Your Ubuntu release is not supported anymore." |
2698 | -msgstr "" |
2699 | - |
2700 | -#: ../UpdateManager/UpdateManager.py:101 |
2701 | -msgid "" |
2702 | -"You will not get any further security fixes or critical updates. Please " |
2703 | -"upgrade to a later version of Ubuntu." |
2704 | -msgstr "" |
2705 | - |
2706 | -#: ../UpdateManager/UpdateManager.py:109 |
2707 | -msgid "Upgrade information" |
2708 | -msgstr "" |
2709 | - |
2710 | -#: ../UpdateManager/UpdateManager.py:204 |
2711 | -#: ../UpdateManagerText/UpdateManagerText.py:35 |
2712 | +#: ../UpdateManager/Dialogs.py:120 |
2713 | +msgid "Settings…" |
2714 | +msgstr "" |
2715 | + |
2716 | +#: ../UpdateManager/Dialogs.py:148 ../UpdateManager/UpdateManager.py:244 |
2717 | +msgid "You stopped the check for updates." |
2718 | +msgstr "" |
2719 | + |
2720 | +#: ../UpdateManager/Dialogs.py:150 |
2721 | +msgid "_Check Again" |
2722 | +msgstr "" |
2723 | + |
2724 | +#: ../UpdateManager/Dialogs.py:161 |
2725 | +msgid "No software updates are available." |
2726 | +msgstr "" |
2727 | + |
2728 | +#: ../UpdateManager/Dialogs.py:163 ../UpdateManager/Dialogs.py:172 |
2729 | +msgid "The software on this computer is up to date." |
2730 | +msgstr "" |
2731 | + |
2732 | +#. Translators: these are Ubuntu version names like "Ubuntu 12.04" |
2733 | +#: ../UpdateManager/Dialogs.py:174 |
2734 | +#, python-format |
2735 | +msgid "However, %s %s is now available (you have %s)." |
2736 | +msgstr "" |
2737 | + |
2738 | +#: ../UpdateManager/Dialogs.py:179 |
2739 | +msgid "Upgrade…" |
2740 | +msgstr "" |
2741 | + |
2742 | +#. Translators: this is an Ubuntu version name like "Ubuntu 12.04" |
2743 | +#: ../UpdateManager/Dialogs.py:201 |
2744 | +#, python-format |
2745 | +msgid "Software updates are no longer provided for %s %s." |
2746 | +msgstr "" |
2747 | + |
2748 | +#. Translators: this is an Ubuntu version name like "Ubuntu 12.04" |
2749 | +#: ../UpdateManager/Dialogs.py:205 |
2750 | +#, python-format |
2751 | +msgid "To stay secure, you should upgrade to %s %s." |
2752 | +msgstr "" |
2753 | + |
2754 | +#: ../UpdateManager/Dialogs.py:218 |
2755 | +msgid "Not all updates can be installed" |
2756 | +msgstr "" |
2757 | + |
2758 | +#: ../UpdateManager/Dialogs.py:220 |
2759 | +msgid "" |
2760 | +"Run a partial upgrade, to install as many updates as possible.\n" |
2761 | +"\n" |
2762 | +" This can be caused by:\n" |
2763 | +" * A previous upgrade which didn't complete\n" |
2764 | +" * Problems with some of the installed software\n" |
2765 | +" * Unofficial software packages not provided by Ubuntu\n" |
2766 | +" * Normal changes of a pre-release version of Ubuntu" |
2767 | +msgstr "" |
2768 | + |
2769 | +#: ../UpdateManager/Dialogs.py:228 |
2770 | +msgid "_Partial Upgrade" |
2771 | +msgstr "" |
2772 | + |
2773 | +#: ../UpdateManager/Dialogs.py:229 |
2774 | +msgid "_Continue" |
2775 | +msgstr "" |
2776 | + |
2777 | +#: ../UpdateManager/Dialogs.py:265 |
2778 | +msgid "_Try Again" |
2779 | +msgstr "" |
2780 | + |
2781 | +#: ../UpdateManager/Dialogs.py:279 |
2782 | +msgid "The computer needs to restart to finish installing updates." |
2783 | +msgstr "" |
2784 | + |
2785 | +#: ../UpdateManager/Dialogs.py:280 |
2786 | +msgid "_Restart" |
2787 | +msgstr "" |
2788 | + |
2789 | +#. Basic GTK+ parameters |
2790 | +#: ../UpdateManager/UpdateManager.py:85 ../data/update-manager.desktop.in.h:1 |
2791 | +msgid "Software Updater" |
2792 | +msgstr "" |
2793 | + |
2794 | +#: ../UpdateManager/UpdateManager.py:242 |
2795 | +msgid "Some software couldn’t be checked for updates." |
2796 | +msgstr "" |
2797 | + |
2798 | +#: ../UpdateManager/UpdateManager.py:245 |
2799 | +msgid "Updated software is available from a previous check." |
2800 | +msgstr "" |
2801 | + |
2802 | +#. we assert a clean cache |
2803 | +#: ../UpdateManager/UpdateManager.py:323 |
2804 | +msgid "Software index is broken" |
2805 | +msgstr "" |
2806 | + |
2807 | +#: ../UpdateManager/UpdateManager.py:324 |
2808 | +msgid "" |
2809 | +"It is impossible to install or remove any software. Please use the package " |
2810 | +"manager \"Synaptic\" or run \"sudo apt-get install -f\" in a terminal to fix " |
2811 | +"this issue at first." |
2812 | +msgstr "" |
2813 | + |
2814 | +#: ../UpdateManager/UpdateManager.py:330 |
2815 | +msgid "Could not initialize the package information" |
2816 | +msgstr "" |
2817 | + |
2818 | +#: ../UpdateManager/UpdateManager.py:331 |
2819 | +msgid "" |
2820 | +"An unresolvable problem occurred while initializing the package " |
2821 | +"information.\n" |
2822 | +"\n" |
2823 | +"Please report this bug against the 'update-manager' package and include the " |
2824 | +"following error message:\n" |
2825 | +msgstr "" |
2826 | + |
2827 | +#: ../UpdateManager/UpdateManager.py:348 |
2828 | +msgid "Could not calculate the upgrade" |
2829 | +msgstr "" |
2830 | + |
2831 | +#: ../UpdateManager/UpdateManager.py:349 |
2832 | +msgid "" |
2833 | +"An unresolvable problem occurred while calculating the upgrade.\n" |
2834 | +"\n" |
2835 | +"Please report this bug against the 'update-manager' package and include the " |
2836 | +"following error message:\n" |
2837 | +msgstr "" |
2838 | + |
2839 | +#: ../UpdateManager/UpdatesAvailable.py:248 |
2840 | +msgid "Install Now" |
2841 | +msgstr "" |
2842 | + |
2843 | +#: ../UpdateManager/UpdatesAvailable.py:278 |
2844 | +#: ../UpdateManagerText/UpdateManagerText.py:36 |
2845 | msgid "Install" |
2846 | msgstr "" |
2847 | |
2848 | -#: ../UpdateManager/UpdateManager.py:206 |
2849 | -msgid "Name" |
2850 | +#: ../UpdateManager/UpdatesAvailable.py:312 |
2851 | +msgid "Download" |
2852 | +msgstr "" |
2853 | + |
2854 | +#: ../UpdateManager/UpdatesAvailable.py:372 |
2855 | +msgid "_Remind Me Later" |
2856 | msgstr "" |
2857 | |
2858 | #. upload_archive = version_match.group(2).strip() |
2859 | -#: ../UpdateManager/UpdateManager.py:359 |
2860 | +#: ../UpdateManager/UpdatesAvailable.py:506 |
2861 | #, python-format |
2862 | msgid "Version %s: \n" |
2863 | msgstr "" |
2864 | |
2865 | -#: ../UpdateManager/UpdateManager.py:417 |
2866 | +#: ../UpdateManager/UpdatesAvailable.py:569 |
2867 | msgid "" |
2868 | "No network connection detected, you can not download changelog information." |
2869 | msgstr "" |
2870 | |
2871 | -#: ../UpdateManager/UpdateManager.py:427 |
2872 | +#: ../UpdateManager/UpdatesAvailable.py:579 |
2873 | msgid "Downloading list of changes..." |
2874 | msgstr "" |
2875 | |
2876 | -#: ../UpdateManager/UpdateManager.py:471 |
2877 | +#: ../UpdateManager/UpdatesAvailable.py:623 |
2878 | msgid "_Deselect All" |
2879 | msgstr "" |
2880 | |
2881 | -#: ../UpdateManager/UpdateManager.py:477 |
2882 | +#: ../UpdateManager/UpdatesAvailable.py:629 |
2883 | msgid "Select _All" |
2884 | msgstr "" |
2885 | |
2886 | -#: ../UpdateManager/UpdateManager.py:536 |
2887 | +#: ../UpdateManager/UpdatesAvailable.py:704 |
2888 | #, python-format |
2889 | msgid "%s will be downloaded." |
2890 | msgstr "" |
2891 | |
2892 | -#: ../UpdateManager/UpdateManager.py:548 |
2893 | +#: ../UpdateManager/UpdatesAvailable.py:718 |
2894 | msgid "The update has already been downloaded." |
2895 | msgid_plural "The updates have already been downloaded." |
2896 | msgstr[0] "" |
2897 | msgstr[1] "" |
2898 | |
2899 | -#: ../UpdateManager/UpdateManager.py:553 |
2900 | +#: ../UpdateManager/UpdatesAvailable.py:724 |
2901 | msgid "There are no updates to install." |
2902 | msgstr "" |
2903 | |
2904 | -#: ../UpdateManager/UpdateManager.py:562 |
2905 | +#: ../UpdateManager/UpdatesAvailable.py:733 |
2906 | msgid "Unknown download size." |
2907 | msgstr "" |
2908 | |
2909 | -#: ../UpdateManager/UpdateManager.py:577 |
2910 | -msgid "The software on this computer is up to date." |
2911 | -msgstr "" |
2912 | - |
2913 | -#: ../UpdateManager/UpdateManager.py:591 |
2914 | +#: ../UpdateManager/UpdatesAvailable.py:759 |
2915 | #, python-format |
2916 | msgid "" |
2917 | -"Updated software has been issued since %s was released. Do you want to " |
2918 | +"Updated software has been issued since %s %s was released. Do you want to " |
2919 | "install it now?" |
2920 | msgstr "" |
2921 | |
2922 | -#: ../UpdateManager/UpdateManager.py:594 |
2923 | +#: ../UpdateManager/UpdatesAvailable.py:764 |
2924 | msgid "" |
2925 | "Updated software is available for this computer. Do you want to install it " |
2926 | "now?" |
2927 | msgstr "" |
2928 | |
2929 | #. print("on_button_install_clicked") |
2930 | -#: ../UpdateManager/UpdateManager.py:645 |
2931 | +#: ../UpdateManager/UpdatesAvailable.py:794 |
2932 | msgid "Not enough free disk space" |
2933 | msgstr "" |
2934 | |
2935 | -#: ../UpdateManager/UpdateManager.py:646 |
2936 | +#: ../UpdateManager/UpdatesAvailable.py:795 |
2937 | #, python-format |
2938 | msgid "" |
2939 | "The upgrade needs a total of %s free space on disk '%s'. Please free at " |
2940 | @@ -195,125 +254,46 @@ |
2941 | "temporary packages of former installations using 'sudo apt-get clean'." |
2942 | msgstr "" |
2943 | |
2944 | -#: ../UpdateManager/UpdateManager.py:671 |
2945 | -msgid "" |
2946 | -"The computer needs to restart to finish installing updates. Please save your " |
2947 | -"work before continuing." |
2948 | -msgstr "" |
2949 | - |
2950 | -#: ../UpdateManager/UpdateManager.py:728 |
2951 | -msgid "Reading package information" |
2952 | -msgstr "" |
2953 | - |
2954 | -#: ../UpdateManager/UpdateManager.py:743 |
2955 | +#: ../UpdateManager/UpdatesAvailable.py:821 |
2956 | msgid "Connecting..." |
2957 | msgstr "" |
2958 | |
2959 | -#: ../UpdateManager/UpdateManager.py:758 |
2960 | +#: ../UpdateManager/UpdatesAvailable.py:837 |
2961 | msgid "You may not be able to check for updates or download new updates." |
2962 | msgstr "" |
2963 | |
2964 | -#: ../UpdateManager/UpdateManager.py:880 |
2965 | -msgid "Could not initialize the package information" |
2966 | -msgstr "" |
2967 | - |
2968 | -#: ../UpdateManager/UpdateManager.py:881 |
2969 | -msgid "" |
2970 | -"An unresolvable problem occurred while initializing the package " |
2971 | -"information.\n" |
2972 | -"\n" |
2973 | -"Please report this bug against the 'update-manager' package and include the " |
2974 | -"following error message:\n" |
2975 | -msgstr "" |
2976 | - |
2977 | -#: ../UpdateManager/UpdateManager.py:905 |
2978 | -msgid "Could not calculate the upgrade" |
2979 | -msgstr "" |
2980 | - |
2981 | -#: ../UpdateManager/UpdateManager.py:906 |
2982 | -msgid "" |
2983 | -"An unresolvable problem occurred while calculating the upgrade.\n" |
2984 | -"\n" |
2985 | -"Please report this bug against the 'update-manager' package and include the " |
2986 | -"following error message:" |
2987 | -msgstr "" |
2988 | - |
2989 | -#: ../UpdateManager/UpdateManager.py:930 |
2990 | -msgid " (New install)" |
2991 | -msgstr "" |
2992 | - |
2993 | -#. TRANSLATORS: the b stands for Bytes |
2994 | -#: ../UpdateManager/UpdateManager.py:937 |
2995 | -#, python-format |
2996 | -msgid "(Size: %s)" |
2997 | -msgstr "" |
2998 | - |
2999 | -#: ../UpdateManager/UpdateManager.py:941 |
3000 | -#, python-format |
3001 | -msgid "From version %(old_version)s to %(new_version)s" |
3002 | -msgstr "" |
3003 | - |
3004 | -#: ../UpdateManager/UpdateManager.py:945 |
3005 | -#, python-format |
3006 | -msgid "Version %s" |
3007 | -msgstr "" |
3008 | - |
3009 | -#: ../UpdateManager/UpdateManager.py:978 |
3010 | -msgid "Release upgrade not possible right now" |
3011 | -msgstr "" |
3012 | - |
3013 | -#: ../UpdateManager/UpdateManager.py:979 |
3014 | -#, python-format |
3015 | -msgid "" |
3016 | -"The release upgrade can not be performed currently, please try again later. " |
3017 | -"The server reported: '%s'" |
3018 | -msgstr "" |
3019 | - |
3020 | -#: ../UpdateManager/UpdateManager.py:981 |
3021 | -msgid "Downloading the release upgrade tool" |
3022 | -msgstr "" |
3023 | - |
3024 | -#: ../UpdateManager/UpdateManager.py:988 |
3025 | -#, python-format |
3026 | -msgid "<b>New Ubuntu release '%s' is available</b>" |
3027 | -msgstr "" |
3028 | - |
3029 | -#. we assert a clean cache |
3030 | -#: ../UpdateManager/UpdateManager.py:1027 |
3031 | -msgid "Software index is broken" |
3032 | -msgstr "" |
3033 | - |
3034 | -#: ../UpdateManager/UpdateManager.py:1028 |
3035 | -msgid "" |
3036 | -"It is impossible to install or remove any software. Please use the package " |
3037 | -"manager \"Synaptic\" or run \"sudo apt-get install -f\" in a terminal to fix " |
3038 | -"this issue at first." |
3039 | -msgstr "" |
3040 | - |
3041 | -#: ../UpdateManager/UnitySupport.py:57 |
3042 | +#: ../UpdateManager/UpdatesAvailable.py:986 |
3043 | +msgid "Security updates" |
3044 | +msgstr "" |
3045 | + |
3046 | +#: ../UpdateManager/UpdatesAvailable.py:989 |
3047 | +msgid "Other updates" |
3048 | +msgstr "" |
3049 | + |
3050 | +#: ../UpdateManager/UnitySupport.py:67 |
3051 | msgid "Install All Available Updates" |
3052 | msgstr "" |
3053 | |
3054 | -#: ../UpdateManagerText/UpdateManagerText.py:34 |
3055 | +#: ../UpdateManagerText/UpdateManagerText.py:35 |
3056 | msgid "Cancel" |
3057 | msgstr "" |
3058 | |
3059 | -#: ../UpdateManagerText/UpdateManagerText.py:37 |
3060 | +#: ../UpdateManagerText/UpdateManagerText.py:38 |
3061 | msgid "Changelog" |
3062 | msgstr "" |
3063 | |
3064 | -#: ../UpdateManagerText/UpdateManagerText.py:40 |
3065 | +#: ../UpdateManagerText/UpdateManagerText.py:41 |
3066 | msgid "Updates" |
3067 | msgstr "" |
3068 | |
3069 | -#: ../UpdateManagerText/UpdateManagerText.py:53 |
3070 | +#: ../UpdateManagerText/UpdateManagerText.py:54 |
3071 | msgid "Building Updates List" |
3072 | msgstr "" |
3073 | |
3074 | -#: ../UpdateManagerText/UpdateManagerText.py:56 |
3075 | +#: ../UpdateManagerText/UpdateManagerText.py:57 |
3076 | msgid "" |
3077 | "\n" |
3078 | -"A normal upgrade can not be calculated, please run: \n" |
3079 | +"A normal upgrade can not be calculated, please run:\n" |
3080 | " sudo apt-get dist-upgrade\n" |
3081 | "\n" |
3082 | "\n" |
3083 | @@ -324,35 +304,30 @@ |
3084 | " * Normal changes of a pre-release version of Ubuntu" |
3085 | msgstr "" |
3086 | |
3087 | -#: ../UpdateManagerText/UpdateManagerText.py:125 |
3088 | +#: ../UpdateManagerText/UpdateManagerText.py:127 |
3089 | msgid "Downloading changelog" |
3090 | msgstr "" |
3091 | |
3092 | -#: ../UpdateManager/Core/MyCache.py:147 |
3093 | -#, python-format |
3094 | -msgid "Other updates (%s)" |
3095 | -msgstr "" |
3096 | - |
3097 | -#: ../UpdateManager/Core/MyCache.py:325 |
3098 | +#: ../UpdateManager/Core/MyCache.py:333 |
3099 | msgid "This update does not come from a source that supports changelogs." |
3100 | msgstr "" |
3101 | |
3102 | -#: ../UpdateManager/Core/MyCache.py:331 ../UpdateManager/Core/MyCache.py:359 |
3103 | +#: ../UpdateManager/Core/MyCache.py:339 ../UpdateManager/Core/MyCache.py:376 |
3104 | msgid "" |
3105 | "Failed to download the list of changes. \n" |
3106 | "Please check your Internet connection." |
3107 | msgstr "" |
3108 | |
3109 | -#: ../UpdateManager/Core/MyCache.py:338 |
3110 | +#: ../UpdateManager/Core/MyCache.py:346 |
3111 | #, python-format |
3112 | msgid "" |
3113 | -"Changes for the versions:\n" |
3114 | +"Changes for %s versions:\n" |
3115 | "Installed version: %s\n" |
3116 | "Available version: %s\n" |
3117 | "\n" |
3118 | msgstr "" |
3119 | |
3120 | -#: ../UpdateManager/Core/MyCache.py:348 |
3121 | +#: ../UpdateManager/Core/MyCache.py:362 |
3122 | #, python-format |
3123 | msgid "" |
3124 | "The changelog does not contain any relevant changes.\n" |
3125 | @@ -361,7 +336,7 @@ |
3126 | "until the changes become available or try again later." |
3127 | msgstr "" |
3128 | |
3129 | -#: ../UpdateManager/Core/MyCache.py:353 |
3130 | +#: ../UpdateManager/Core/MyCache.py:369 |
3131 | #, python-format |
3132 | msgid "" |
3133 | "The list of changes is not available yet.\n" |
3134 | @@ -370,124 +345,15 @@ |
3135 | "until the changes become available or try again later." |
3136 | msgstr "" |
3137 | |
3138 | -#: ../UpdateManager/Core/UpdateList.py:51 |
3139 | -msgid "Failed to detect distribution" |
3140 | -msgstr "" |
3141 | - |
3142 | -#: ../UpdateManager/Core/UpdateList.py:52 |
3143 | -#, python-format |
3144 | -msgid "A error '%s' occurred while checking what system you are using." |
3145 | -msgstr "" |
3146 | - |
3147 | -#: ../UpdateManager/Core/UpdateList.py:63 |
3148 | -msgid "Important security updates" |
3149 | -msgstr "" |
3150 | - |
3151 | -#: ../UpdateManager/Core/UpdateList.py:64 |
3152 | -msgid "Recommended updates" |
3153 | -msgstr "" |
3154 | - |
3155 | -#: ../UpdateManager/Core/UpdateList.py:65 |
3156 | -msgid "Proposed updates" |
3157 | -msgstr "" |
3158 | - |
3159 | -#: ../UpdateManager/Core/UpdateList.py:66 |
3160 | -msgid "Backports" |
3161 | -msgstr "" |
3162 | - |
3163 | -#: ../UpdateManager/Core/UpdateList.py:67 |
3164 | -msgid "Distribution updates" |
3165 | -msgstr "" |
3166 | - |
3167 | -#: ../UpdateManager/Core/UpdateList.py:72 |
3168 | -msgid "Other updates" |
3169 | -msgstr "" |
3170 | - |
3171 | -#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:72 |
3172 | -#, python-format |
3173 | -msgid "authenticate '%(file)s' against '%(signature)s' " |
3174 | -msgstr "" |
3175 | - |
3176 | -#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:131 |
3177 | -#, python-format |
3178 | -msgid "extracting '%s'" |
3179 | -msgstr "" |
3180 | - |
3181 | -#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:151 |
3182 | -#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:152 |
3183 | -msgid "Could not run the upgrade tool" |
3184 | -msgstr "" |
3185 | - |
3186 | -#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:152 |
3187 | -msgid "" |
3188 | -"This is most likely a bug in the upgrade tool. Please report it as a bug " |
3189 | -"using the command 'ubuntu-bug update-manager'." |
3190 | -msgstr "" |
3191 | - |
3192 | -#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:227 |
3193 | -msgid "Upgrade tool signature" |
3194 | -msgstr "" |
3195 | - |
3196 | -#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:234 |
3197 | -msgid "Upgrade tool" |
3198 | -msgstr "" |
3199 | - |
3200 | -#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:268 |
3201 | -msgid "Failed to fetch" |
3202 | -msgstr "" |
3203 | - |
3204 | -#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:269 |
3205 | -msgid "Fetching the upgrade failed. There may be a network problem. " |
3206 | -msgstr "" |
3207 | - |
3208 | -#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:273 |
3209 | -msgid "Authentication failed" |
3210 | -msgstr "" |
3211 | - |
3212 | -#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:274 |
3213 | -msgid "" |
3214 | -"Authenticating the upgrade failed. There may be a problem with the network " |
3215 | -"or with the server. " |
3216 | -msgstr "" |
3217 | - |
3218 | -#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:279 |
3219 | -msgid "Failed to extract" |
3220 | -msgstr "" |
3221 | - |
3222 | -#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:280 |
3223 | -msgid "" |
3224 | -"Extracting the upgrade failed. There may be a problem with the network or " |
3225 | -"with the server. " |
3226 | -msgstr "" |
3227 | - |
3228 | -#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:285 |
3229 | -msgid "Verification failed" |
3230 | -msgstr "" |
3231 | - |
3232 | -#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:286 |
3233 | -msgid "" |
3234 | -"Verifying the upgrade failed. There may be a problem with the network or " |
3235 | -"with the server. " |
3236 | -msgstr "" |
3237 | - |
3238 | -#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:300 |
3239 | -#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:306 |
3240 | -msgid "Can not run the upgrade" |
3241 | -msgstr "" |
3242 | - |
3243 | -#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:301 |
3244 | -msgid "" |
3245 | -"This usually is caused by a system where /tmp is mounted noexec. Please " |
3246 | -"remount without noexec and run the upgrade again." |
3247 | -msgstr "" |
3248 | - |
3249 | -#: ../UpdateManager/Core/DistUpgradeFetcherCore.py:307 |
3250 | -#, python-format |
3251 | -msgid "The error message is '%s'." |
3252 | +#. Translators: the %s is a distro name, like 'Ubuntu' and 'base' as in |
3253 | +#. the core components and packages. |
3254 | +#: ../UpdateManager/Core/UpdateList.py:167 |
3255 | +#, python-format |
3256 | +msgid "%s base" |
3257 | msgstr "" |
3258 | |
3259 | #. TRANSLATORS: download size of small updates, e.g. "250 kB" |
3260 | -#: ../UpdateManager/Core/utils.py:433 |
3261 | +#: ../UpdateManager/Core/utils.py:485 |
3262 | #, python-format |
3263 | msgid "%(size).0f kB" |
3264 | msgid_plural "%(size).0f kB" |
3265 | @@ -495,112 +361,46 @@ |
3266 | msgstr[1] "" |
3267 | |
3268 | #. TRANSLATORS: download size of updates, e.g. "2.3 MB" |
3269 | -#: ../UpdateManager/Core/utils.py:436 |
3270 | +#: ../UpdateManager/Core/utils.py:489 |
3271 | #, python-format |
3272 | msgid "%.1f MB" |
3273 | msgstr "" |
3274 | |
3275 | #: ../data/gtkbuilder/UpdateManager.ui.h:1 |
3276 | -msgid "<big><b>Starting Software Updater</b></big>" |
3277 | +msgid "updates" |
3278 | msgstr "" |
3279 | |
3280 | #: ../data/gtkbuilder/UpdateManager.ui.h:2 |
3281 | -msgid "" |
3282 | -"Software updates correct errors, eliminate security vulnerabilities and " |
3283 | -"provide new features." |
3284 | +msgid "Changes" |
3285 | msgstr "" |
3286 | |
3287 | #: ../data/gtkbuilder/UpdateManager.ui.h:3 |
3288 | -msgid "_Partial Upgrade" |
3289 | +msgid "Description" |
3290 | msgstr "" |
3291 | |
3292 | #: ../data/gtkbuilder/UpdateManager.ui.h:4 |
3293 | -msgid "<big><b>Not all updates can be installed</b></big>" |
3294 | +msgid "Technical description" |
3295 | msgstr "" |
3296 | |
3297 | #: ../data/gtkbuilder/UpdateManager.ui.h:5 |
3298 | -msgid "" |
3299 | -"Run a partial upgrade, to install as many updates as possible. \n" |
3300 | -"\n" |
3301 | -"This can be caused by:\n" |
3302 | -" * A previous upgrade which didn't complete\n" |
3303 | -" * Problems with some of the installed software\n" |
3304 | -" * Unofficial software packages not provided by Ubuntu\n" |
3305 | -" * Normal changes of a pre-release version of Ubuntu" |
3306 | -msgstr "" |
3307 | - |
3308 | -#: ../data/gtkbuilder/UpdateManager.ui.h:12 |
3309 | -msgid "Co_ntinue" |
3310 | -msgstr "" |
3311 | - |
3312 | -#: ../data/gtkbuilder/UpdateManager.ui.h:13 |
3313 | -msgid "<big><b>Running on battery</b></big>" |
3314 | -msgstr "" |
3315 | - |
3316 | -#: ../data/gtkbuilder/UpdateManager.ui.h:14 |
3317 | -msgid "Your system is running on battery. Are you sure you want to continue?" |
3318 | -msgstr "" |
3319 | - |
3320 | -#: ../data/gtkbuilder/UpdateManager.ui.h:16 |
3321 | -msgid "_Upgrade" |
3322 | -msgstr "" |
3323 | - |
3324 | -#: ../data/gtkbuilder/UpdateManager.ui.h:17 |
3325 | -msgid "Show progress of individual files" |
3326 | -msgstr "" |
3327 | - |
3328 | -#: ../data/gtkbuilder/UpdateManager.ui.h:18 |
3329 | -#: ../data/update-manager.desktop.in.h:1 |
3330 | -msgid "Software Updater" |
3331 | -msgstr "" |
3332 | - |
3333 | -#: ../data/gtkbuilder/UpdateManager.ui.h:19 |
3334 | -msgid "U_pgrade" |
3335 | -msgstr "" |
3336 | - |
3337 | -#: ../data/gtkbuilder/UpdateManager.ui.h:20 |
3338 | -msgid "_Restart Now" |
3339 | -msgstr "" |
3340 | - |
3341 | -#: ../data/gtkbuilder/UpdateManager.ui.h:21 |
3342 | -msgid "updates" |
3343 | -msgstr "" |
3344 | - |
3345 | -#: ../data/gtkbuilder/UpdateManager.ui.h:22 |
3346 | -msgid "Changes" |
3347 | -msgstr "" |
3348 | - |
3349 | -#: ../data/gtkbuilder/UpdateManager.ui.h:23 |
3350 | -msgid "Description" |
3351 | -msgstr "" |
3352 | - |
3353 | -#: ../data/gtkbuilder/UpdateManager.ui.h:24 |
3354 | msgid "Details of updates" |
3355 | msgstr "" |
3356 | |
3357 | -#: ../data/gtkbuilder/UpdateManager.ui.h:25 |
3358 | +#: ../data/gtkbuilder/UpdateManager.ui.h:6 |
3359 | msgid "" |
3360 | "You are connected via roaming and may be charged for the data consumed by " |
3361 | "this update." |
3362 | msgstr "" |
3363 | |
3364 | -#: ../data/gtkbuilder/UpdateManager.ui.h:26 |
3365 | +#: ../data/gtkbuilder/UpdateManager.ui.h:7 |
3366 | msgid "" |
3367 | "You may want to wait until you’re not using a mobile broadband connection." |
3368 | msgstr "" |
3369 | |
3370 | -#: ../data/gtkbuilder/UpdateManager.ui.h:27 |
3371 | +#: ../data/gtkbuilder/UpdateManager.ui.h:8 |
3372 | msgid "It’s safer to connect the computer to AC power before updating." |
3373 | msgstr "" |
3374 | |
3375 | -#: ../data/gtkbuilder/UpdateManager.ui.h:28 |
3376 | -msgid "_Settings..." |
3377 | -msgstr "" |
3378 | - |
3379 | -#: ../data/gtkbuilder/UpdateManager.ui.h:29 |
3380 | -msgid "_Install Now" |
3381 | -msgstr "" |
3382 | - |
3383 | #: ../data/update-manager.desktop.in.h:2 |
3384 | msgid "Software Updates" |
3385 | msgstr "" |
3386 | @@ -609,46 +409,38 @@ |
3387 | msgid "Show and install available updates" |
3388 | msgstr "" |
3389 | |
3390 | -#: ../update-manager:71 ../update-manager-text:55 |
3391 | +#: ../update-manager:70 ../update-manager-text:55 |
3392 | msgid "Show version and exit" |
3393 | msgstr "" |
3394 | |
3395 | -#: ../update-manager:74 |
3396 | +#: ../update-manager:73 |
3397 | msgid "Directory that contains the data files" |
3398 | msgstr "" |
3399 | |
3400 | -#: ../update-manager:77 |
3401 | +#: ../update-manager:76 |
3402 | msgid "Check if a new Ubuntu release is available" |
3403 | msgstr "" |
3404 | |
3405 | -#: ../update-manager:80 |
3406 | +#: ../update-manager:79 |
3407 | msgid "Check if upgrading to the latest devel release is possible" |
3408 | msgstr "" |
3409 | |
3410 | -#: ../update-manager:84 |
3411 | +#: ../update-manager:83 |
3412 | msgid "Upgrade using the latest proposed version of the release upgrader" |
3413 | msgstr "" |
3414 | |
3415 | -#: ../update-manager:91 |
3416 | +#: ../update-manager:90 |
3417 | msgid "Do not focus on map when starting" |
3418 | msgstr "" |
3419 | |
3420 | -#: ../update-manager:94 |
3421 | -msgid "Try to run a dist-upgrade" |
3422 | +#: ../update-manager:93 |
3423 | +msgid "Do not check for updates when starting" |
3424 | msgstr "" |
3425 | |
3426 | #: ../update-manager:97 |
3427 | -msgid "Do not check for updates when starting" |
3428 | -msgstr "" |
3429 | - |
3430 | -#: ../update-manager:101 |
3431 | msgid "Test upgrade with a sandbox aufs overlay" |
3432 | msgstr "" |
3433 | |
3434 | -#: ../update-manager:121 |
3435 | -msgid "Running partial upgrade" |
3436 | -msgstr "" |
3437 | - |
3438 | #: ../update-manager-text:59 |
3439 | msgid "Show description of the package instead of the changelog" |
3440 | msgstr "" |
3441 | @@ -713,7 +505,7 @@ |
3442 | |
3443 | #. Why do we use %s here instead of $strings or {} format placeholders? |
3444 | #. It's because we don't want to break existing translations. |
3445 | -#: ../janitor/plugincore/exceptions.py:42 |
3446 | +#: ../janitor/plugincore/exceptions.py:43 |
3447 | #, python-format |
3448 | msgid "Unimplemented method: %s" |
3449 | msgstr "" |
3450 | @@ -722,45 +514,45 @@ |
3451 | msgid "A file on disk" |
3452 | msgstr "" |
3453 | |
3454 | -#: ../janitor/plugincore/core/missing_package_cruft.py:39 |
3455 | +#: ../janitor/plugincore/core/missing_package_cruft.py:40 |
3456 | msgid "Install missing package." |
3457 | msgstr "" |
3458 | |
3459 | #. 2012-06-08 BAW: i18n string; don't use {} or PEP 292. |
3460 | -#: ../janitor/plugincore/core/missing_package_cruft.py:49 |
3461 | +#: ../janitor/plugincore/core/missing_package_cruft.py:50 |
3462 | #, python-format |
3463 | msgid "Package %s should be installed." |
3464 | msgstr "" |
3465 | |
3466 | -#: ../janitor/plugincore/core/package_cruft.py:49 |
3467 | +#: ../janitor/plugincore/core/package_cruft.py:50 |
3468 | msgid ".deb package" |
3469 | msgstr "" |
3470 | |
3471 | -#: ../janitor/plugincore/plugins/langpack_manual_plugin.py:46 |
3472 | +#: ../janitor/plugincore/plugins/langpack_manual_plugin.py:47 |
3473 | #, python-format |
3474 | msgid "%s needs to be marked as manually installed." |
3475 | msgstr "" |
3476 | |
3477 | -#: ../janitor/plugincore/plugins/kdelibs4to5_plugin.py:49 |
3478 | +#: ../janitor/plugincore/plugins/kdelibs4to5_plugin.py:50 |
3479 | msgid "" |
3480 | "When upgrading, if kdelibs4-dev is installed, kdelibs5-dev needs to be " |
3481 | "installed. See bugs.launchpad.net, bug #279621 for details." |
3482 | msgstr "" |
3483 | |
3484 | -#: ../janitor/plugincore/plugins/dpkg_status_plugin.py:44 |
3485 | +#: ../janitor/plugincore/plugins/dpkg_status_plugin.py:45 |
3486 | #, python-format |
3487 | msgid "%i obsolete entries in the status file" |
3488 | msgstr "" |
3489 | |
3490 | -#: ../janitor/plugincore/plugins/dpkg_status_plugin.py:47 |
3491 | +#: ../janitor/plugincore/plugins/dpkg_status_plugin.py:48 |
3492 | msgid "Obsolete entries in dpkg status" |
3493 | msgstr "" |
3494 | |
3495 | #. pragma: no cover |
3496 | -#: ../janitor/plugincore/plugins/dpkg_status_plugin.py:50 |
3497 | +#: ../janitor/plugincore/plugins/dpkg_status_plugin.py:51 |
3498 | msgid "Obsolete dpkg status entries" |
3499 | msgstr "" |
3500 | |
3501 | -#: ../janitor/plugincore/plugins/remove_lilo_plugin.py:42 |
3502 | +#: ../janitor/plugincore/plugins/remove_lilo_plugin.py:43 |
3503 | msgid "Remove lilo since grub is also installed.(See bug #314004 for details.)" |
3504 | msgstr "" |
Looks good to me. Installed and running this version of update-manager. Will report any bugs / regression. So far everything looks good.