30
30
def __init__(self, backupsets):
31
31
self.tmpdir = "/tmp"
34
self.widgets = gtk.glade.XML("%s/gui.glade" % os.path.dirname(__file__))
35
except RuntimeError, e:
36
dlg = gtk.MessageDialog(
38
gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE,
39
_("Unable to start %(progname)s:\n%(error)s") % {'progname':version.APPNAME, 'error':e})
40
dlg.connect("response", lambda w: gtk.main_quit())
33
self.widgets = gtk.glade.XML("%s/gui.glade" % os.path.dirname(__file__))
34
self.win_main = self.widgets.get_widget("window_main")
43
36
self.widgets.signal_autoconnect(self)
44
37
self.widgets.get_widget('set_destination').set_model(
49
42
self.backupsets.add_change_hook(self.refresh_set_list)
50
43
self.seteditor = SetEditor(self.backupsets)
51
44
self.statuswin = StatusWindow()
52
self.dialogs = dialogs.Dialogs(self.widgets.get_widget('window_main'))
45
self.cdprogress = CDProgressWindow(self.win_main)
46
self.cdprogress.set_response_cb(self.cdprogress_response_cb)
47
self.dialogs = dialogs.Dialogs(self.win_main)
54
49
# populate the backup set list on the main window
55
50
self.widgets.get_widget('treeview_backup_sets').set_model(
71
66
_("To begin, you need to create a new backup set. Click the 'New' button to get started."))
73
68
# other widget initialisation
74
self.widgets.get_widget('window_main').set_title(_("File Backup Manager"))
69
self.win_main.set_title(_("File Backup Manager"))
75
70
self.widgets.get_widget('lbl_restore_help').set_text(
76
71
self.widgets.get_widget('lbl_restore_help').get_text().
77
72
replace(r'%s', version.APPPATH))
165
160
self.dialogs.showerror(_("You cannot delete this set."))
168
dlg = gtk.MessageDialog(self.widgets.get_widget('window_main'),
163
dlg = gtk.MessageDialog(self.win_main,
169
164
gtk.DIALOG_MODAL, gtk.MESSAGE_WARNING, gtk.BUTTONS_YES_NO,
170
165
_("Are you sure you wish to delete the backup set '%s'?\n"
171
166
"Deleting this backup set will not delete any previous backups, "
177
172
def on_delete_set_dialog_response(self, widget, response, set):
178
173
if response == gtk.RESPONSE_YES:
181
175
self.backupsets.remove(set)
182
176
self.widgets.get_widget('backup_controls').set_sensitive(False)
183
177
self.widgets.get_widget('button_delete_set').set_sensitive(False)
217
211
self.widgets.get_widget('lbl_status').set_text(_("Starting backup..."))
218
212
self.widgets.get_widget('notebook1').set_sensitive(False)
219
213
self.widgets.get_widget('menubar1').set_sensitive(False)
220
self.widgets.get_widget('window_main').window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
214
self.win_main.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
221
215
while gtk.events_pending():
222
216
gtk.main_iteration()
231
225
self.widgets.get_widget('notebook1').set_sensitive(True)
232
226
self.widgets.get_widget('menubar1').set_sensitive(True)
233
self.widgets.get_widget('window_main').window.set_cursor(None)
227
self.win_main.window.set_cursor(None)
235
229
def show_progress(self, progress=0):
236
230
self.widgets.get_widget('progressbar1').set_fraction(progress/100)
301
295
isomaker = Mkisofs()
302
296
isomaker.set_progress_hook(self.show_progress)
303
297
isomaker.create_iso(dest_path, isopath)
304
if isomaker.get_retval() != 0:
298
isoret = isomaker.get_retval()
300
errmsg = os.strerror(isoret)
305
301
self.widgets.get_widget('lbl_status').set_text(_("Ready."))
306
302
self.widgets.get_widget('progressbar1').set_fraction(0)
307
self.statuswin.addmsg(_("Backup failed; could not create CD image %s\n") % isopath)
303
msg = _("Backup failed; could not create CD image %(filename)s: %(error)s\n") %\
304
{'filename':isopath, 'error':errmsg}
305
self.statuswin.addmsg(msg)
306
self.dialogs.showerror(msg)
310
309
# ISO is done, let's write that bad boy...
324
323
cdburner = nautilusburn.Recorder()
325
324
track = nautilusburn.DataTrack()
326
325
track.filename = isopath
327
cdburner.connect('progress-changed', self.on_cdburn_progress_changed)
328
self.widgets.get_widget('window_progress').set_transient_for(self.widgets.get_widget('window_main'))
329
self.widgets.get_widget('window_progress').show()
330
burn_result = cdburner.write_tracks(drive, [track], drive.get_max_speed_write(), nautilusburn.RECORDER_WRITE_EJECT)
326
cdburner.connect('progress-changed', self.cdprogress.on_cdburn_progress_changed)
327
self.cdprogress.show()
328
burn_result = cdburner.write_tracks(drive, [track],
329
drive.get_max_speed_write(),
330
nautilusburn.RECORDER_WRITE_EJECT)
331
331
if burn_result != nautilusburn.RECORDER_RESULT_FINISHED:
332
self.on_window_progress_response(gtk.RESPONSE_OK)
333
self.cdprogress.hide()
334
self.cdprogress.reset()
333
335
self.dialogs.showerror(_("An error occurred while burning the CD."))
334
336
self.widgets.get_widget('lbl_status').set_text("Ready.")
335
337
self.widgets.get_widget('progressbar1').set_fraction(0)
570
572
self.statuswin.addmsg(_("Backup source analysis complete."))
571
573
return (True, filecount)
573
def on_window_progress_response(self, widget, response=None):
574
self.widgets.get_widget('window_progress').hide()
575
self.widgets.get_widget('prog_button').set_sensitive(False)
576
self.widgets.get_widget('prog_status').set_markup("<i>"+_("Waiting for CD...")+"</i>")
577
self.widgets.get_widget('prog_bar').set_fraction(0)
578
self.widgets.get_widget('prog_bar').set_text("")
575
def cdprogress_response_cb(self, response):
576
self.cdprogress.reset()
580
578
def on_backup_local_dest_button_clicked(self, event):
581
579
filechooser = FileChooser()
862
860
##########################
863
861
## MISC HANDLERS ##
864
862
##########################
865
def on_cdburn_progress_changed(self, recorder, fract, somethingelse):
867
self.widgets.get_widget('prog_status').set_markup("<i>"+_("Burning CD...")+"</i>")
868
self.widgets.get_widget('prog_bar').set_fraction(fract)
869
self.widgets.get_widget('prog_bar').set_text("%d%%" % (fract*100))
871
self.widgets.get_widget('prog_status').set_markup("<i>"+_("Waiting for CD...")+"</i>")
872
self.widgets.get_widget('prog_bar').set_fraction(0)
873
self.widgets.get_widget('prog_bar').set_text("0%")
876
self.widgets.get_widget('prog_button').set_sensitive(True)
877
self.widgets.get_widget('prog_status').set_markup("<i>"+_("Finished.")+"</i>")
880
863
def on_recursive_copy_step(self, file):
881
864
self.current_count += 1.0
882
865
self.widgets.get_widget('progressbar1').set_fraction(self.current_count/self.total_count)
927
910
self.widgets.get_widget('cmb_backup_burner').set_active(0)
928
911
self.widgets.get_widget('cmb_backup_burner').set_sensitive(True)
930
def refresh_set_list(self):
913
def refresh_set_list(self, selected=None):
931
914
treeview = self.widgets.get_widget('treeview_backup_sets')
932
915
setlist = treeview.get_model()
940
923
set_type = gtk.STOCK_DIRECTORY
941
924
setlist.append([treeview.render_icon(set_type, gtk.ICON_SIZE_MENU, "TreeView"),
942
925
bset.name, bset])
926
if selected is not None:
927
self.select_set(selected.name)
929
self.widgets.get_widget('button_do_backup').set_sensitive(False)
944
932
def select_set(self, setname):
945
933
"""Iterates through the set list and places the sets treeview cursor
960
class CDProgressWindow():
962
The CD burning progress window.
964
def __init__(self, parent):
966
Load the GUI widgets and connect signal handlers. The parent
967
argument is the parent window of this CDProgressWindow.
969
gladef = "%s/progress_window.glade" % os.path.dirname(__file__)
970
self.widgets = gtk.glade.XML(gladef)
971
self.widgets.signal_autoconnect(self)
972
self.widgets.get_widget("window_progress").set_transient_for(parent)
976
Makes the window visible.
978
self.widgets.get_widget("window_progress").show()
982
Hides this CD progress window
984
self.widgets.get_widget("window_progress").hide()
988
Reset the GUI widgets to their starting states.
990
self.widgets.get_widget('prog_button').set_sensitive(False)
991
self.widgets.get_widget('prog_status').set_markup("<i>"+_("Waiting for CD...")+"</i>")
992
self.widgets.get_widget('prog_bar').set_fraction(0)
993
self.widgets.get_widget('prog_bar').set_text("")
995
def set_response_cb(self, cb):
997
Set a callback function, which must accept one argument, which
998
will be called when a button is clicked by the user.
1000
self.response_cb = cb
1002
def on_cdburn_progress_changed(self, recorder, fract, somethingelse):
1004
Callback function to accept the progress reported by
1008
self.widgets.get_widget('prog_status').set_markup("<i>"+_("Burning CD...")+"</i>")
1009
self.widgets.get_widget('prog_bar').set_fraction(fract)
1010
self.widgets.get_widget('prog_bar').set_text("%d%%" % (fract*100))
1012
self.widgets.get_widget('prog_status').set_markup("<i>"+_("Waiting for CD...")+"</i>")
1013
self.widgets.get_widget('prog_bar').set_fraction(0)
1014
self.widgets.get_widget('prog_bar').set_text("0%")
1017
self.widgets.get_widget('prog_button').set_sensitive(True)
1018
self.widgets.get_widget('prog_status').set_markup("<i>"+_("Finished.")+"</i>")
1019
gtk.main_iteration()
1021
def on_window_progress_response(self, widget, response=None):
1023
A callback function to be attached to the nautilusburn progress
1027
if callable(self.response_cb):
1028
self.response_cb(response)