101
97
self.failed_exit.connect('clicked', lambda x: self.failed_exit.hide())
102
98
self.progress_cancel_button.connect('clicked', lambda x: self.warning_dialog.show())
100
# Set warning dialog transient window
101
self.warning_dialog.set_transient_for(self.install_window)
104
103
def format_value(scale, value):
105
104
return misc.format_mb_size(value)
106
self.persist_value.set_adjustment(
107
Gtk.Adjustment.new(0, 0, 100, 1, 10, 0))
108
self.persist_value.connect('format-value', format_value)
106
# TODO: remove format button
107
self.format_dest.hide()
110
109
# Connect to backend signals.
111
110
self.backend = backend
121
120
self.backend.install_progress_pulse_stop_cb = self.progress_pulse_stop
122
121
self.backend.retry_cb = self.retry
123
122
self.backend.target_changed_cb = self.update_target
124
self.backend.format_ended_cb = self.format_ended
125
self.backend.format_failed_cb = self.format_failed
128
125
self.pulsing = False
130
# Hide erase in fastboot mode
131
if self.fastboot_mode:
132
self.format_dest.hide()
133
self.intro_label.set_text(_('To run Ubuntu on a portable device, it needs to be set up first.'))
134
self.label2.set_text(_('Source disc image (.img):'))
135
self.label3.set_text(_('Target device:'))
136
self.window.set_title(_('Ubuntu Core Installer'))
137
self.button_install.set_label(_('Install Ubuntu Core'))
138
self.button_help.set_label(_('Legal'))
139
self.button_help.connect('clicked', self.show_eula)
140
self.eula_dialog.add_buttons(
141
Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
142
Gtk.STOCK_OK, Gtk.ResponseType.OK
144
with open(eula_path, 'r') as f:
145
text = ''.join(f.readlines())
146
self.eula_text.get_buffer().set_text(text)
148
# we currently do not have help
149
self.button_help.hide()
150
#self.button_help.connect('clicked', lambda x: Gtk.show_uri(self.button_help.get_screen(),
151
# 'ghelp:usb-creator',
152
# Gtk.get_current_event_time()))
127
# we currently do not have help
128
self.button_help.hide()
129
#self.button_help.connect('clicked', lambda x: Gtk.show_uri(self.button_help.get_screen(),
130
# 'ghelp:usb-creator',
131
# Gtk.get_current_event_time()))
154
133
self.setup_sources_treeview()
155
134
self.setup_targets_treeview()
156
self.persist_vbox.set_sensitive(False)
158
136
# Pre-populate the source view.
159
137
if img is not None:
379
343
column_name.set_cell_data_func(cell_name, column_data_func, 0)
380
344
column_name.set_cell_data_func(cell_pixbuf, pixbuf_data_func, None)
382
if not self.fastboot_mode:
383
cell_version = Gtk.CellRendererText()
384
cell_version.set_property('ellipsize', Pango.EllipsizeMode.END)
385
column_name = Gtk.TreeViewColumn(_('OS Version'), cell_version)
386
column_name.set_cell_data_func(cell_version, column_data_func, 1)
387
column_name.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
388
column_name.set_resizable(True)
389
column_name.set_expand(True)
390
column_name.set_min_width(75)
391
self.source_treeview.append_column(column_name)
346
cell_version = Gtk.CellRendererText()
347
cell_version.set_property('ellipsize', Pango.EllipsizeMode.END)
348
column_name = Gtk.TreeViewColumn(_('OS Version'), cell_version)
349
column_name.set_cell_data_func(cell_version, column_data_func, 1)
350
column_name.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
351
column_name.set_resizable(True)
352
column_name.set_expand(True)
353
column_name.set_min_width(75)
354
self.source_treeview.append_column(column_name)
393
356
cell_size = Gtk.CellRendererText()
394
357
cell_size.set_property('ellipsize', Pango.EllipsizeMode.END)
445
408
target = self.backend.targets[udi]
447
# Update persistence maximum value.
448
if not self.fastboot_mode:
449
self.persist_vbox.set_sensitive(False)
450
self.persist_enabled_vbox.set_sensitive(False)
451
persist_mb = target['persist'] / 1024 / 1024
452
if persist_mb > misc.MIN_PERSISTENCE:
453
self.persist_vbox.set_sensitive(True)
454
self.persist_enabled_vbox.set_sensitive(True)
455
self.persist_value.set_range(misc.MIN_PERSISTENCE, persist_mb)
456
self.persist_value.set_value(misc.MIN_PERSISTENCE)
458
410
# Update install button state.
459
411
status = target['status']
460
412
source = self.backend.get_current_source()
501
442
self.update_target(udi)
503
if self.fastboot_mode:
506
444
dev = self.backend.targets[udi]
507
445
p = dev['parent']
508
446
if p and p in self.backend.targets:
509
447
dev = self.backend.targets[p]
510
if dev['formatting']:
511
self.format_dest.set_sensitive(False)
512
self.format_dest_label.set_text(_('Erasing...'))
513
self.format_dest_spinner.show()
514
self.format_dest_spinner.start()
516
self.format_dest.set_sensitive(True)
517
self.format_dest_label.set_text(_('Erase Disk'))
518
self.format_dest_spinner.hide()
519
self.format_dest_spinner.stop()
521
449
def setup_targets_treeview(self):
522
450
def column_data_func(layout, cell, model, iterator, column):
582
504
column_name.set_cell_data_func(cell_name, column_data_func, 0)
583
505
column_name.set_cell_data_func(cell_pixbuf, pixbuf_data_func, None)
585
if not self.fastboot_mode:
586
cell_name = Gtk.CellRendererText()
587
cell_name.set_property('ellipsize', Pango.EllipsizeMode.END)
588
column_name = Gtk.TreeViewColumn(_('Label'), cell_name)
589
column_name.set_cell_data_func(cell_name, column_data_func, 1)
590
column_name.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
591
column_name.set_resizable(True)
592
column_name.set_expand(True)
593
column_name.set_min_width(75)
594
self.dest_treeview.append_column(column_name)
596
cell_capacity = Gtk.CellRendererText()
597
cell_capacity.set_property('ellipsize', Pango.EllipsizeMode.END)
598
column_name = Gtk.TreeViewColumn(_('Capacity'), cell_capacity)
599
column_name.set_cell_data_func(cell_capacity, column_data_func, 2)
600
column_name.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
601
column_name.set_resizable(True)
602
column_name.set_expand(False)
603
column_name.set_min_width(75)
604
self.dest_treeview.append_column(column_name)
606
cell_free = Gtk.CellRendererText()
607
cell_free.set_property('ellipsize', Pango.EllipsizeMode.END)
608
column_name = Gtk.TreeViewColumn(_('Free Space'), cell_free)
609
column_name.set_cell_data_func(cell_free, column_data_func, 3)
610
column_name.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
611
column_name.set_resizable(True)
612
column_name.set_expand(False)
613
column_name.set_min_width(75)
614
self.dest_treeview.append_column(column_name)
507
cell_name = Gtk.CellRendererText()
508
cell_name.set_property('ellipsize', Pango.EllipsizeMode.END)
509
column_name = Gtk.TreeViewColumn(_('Label'), cell_name)
510
column_name.set_cell_data_func(cell_name, column_data_func, 1)
511
column_name.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
512
column_name.set_resizable(True)
513
column_name.set_expand(True)
514
column_name.set_min_width(75)
515
self.dest_treeview.append_column(column_name)
517
cell_capacity = Gtk.CellRendererText()
518
cell_capacity.set_property('ellipsize', Pango.EllipsizeMode.END)
519
column_name = Gtk.TreeViewColumn(_('Capacity'), cell_capacity)
520
column_name.set_cell_data_func(cell_capacity, column_data_func, 2)
521
column_name.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
522
column_name.set_resizable(True)
523
column_name.set_expand(False)
524
column_name.set_min_width(75)
525
self.dest_treeview.append_column(column_name)
616
527
def add_file_source_dialog(self, *args):
618
chooser = Gtk.FileChooserDialog(title=None,action=Gtk.FileChooserAction.OPEN,
619
buttons=(Gtk.STOCK_CANCEL,Gtk.ResponseType.CANCEL,Gtk.STOCK_OPEN,Gtk.ResponseType.OK))
529
chooser = Gtk.FileChooserDialog(title=None, parent=self.window,
530
action=Gtk.FileChooserAction.OPEN,
531
buttons=(Gtk.STOCK_CANCEL,
532
Gtk.ResponseType.CANCEL,
534
Gtk.ResponseType.OK))
620
535
def _add_filter(p, n):
621
536
filter = Gtk.FileFilter()
622
537
filter.add_pattern(p)
623
538
filter.set_name(n)
624
539
chooser.add_filter(filter)
626
if not self.fastboot_mode:
627
_add_filter('*.iso', _('CD Images'))
541
_add_filter('*.iso', _('CD Images'))
628
542
_add_filter('*.img', _('Disk Images'))
630
544
folder = os.path.expanduser('~')
645
559
iterator = model.iter_next(iterator)
646
560
self.backend.add_image(filename)
647
elif response == Gtk.ResponseType.CANCEL:
648
562
chooser.destroy()
650
564
def install(self, widget):
651
565
source = self.get_source()
652
566
target = self.get_target()
653
persist = self.get_persistence()
654
if self.fastboot_mode and not misc.check_eula():
655
if self.show_eula() == Gtk.ResponseType.CANCEL:
657
# TODO evand 2009-07-31: Make these the default values in the
659
starting_up = _('Starting up...')
660
self.progress_title.set_markup('<big><b>' + starting_up + '</b></big>')
661
self.progress_info.set_text('')
662
567
if source and target:
568
d = Gtk.MessageDialog(transient_for=self.window, modal=True,
569
message_type=Gtk.MessageType.QUESTION, buttons=Gtk.ButtonsType.YES_NO)
570
d.set_markup(_('Are you sure you want to write the disc image to the device?'))
571
d.format_secondary_markup(_('All existing data will be lost.'))
574
if response != Gtk.ResponseType.YES:
577
starting_up = _('Starting up...')
578
self.progress_title.set_markup('<big><b>' + starting_up + '</b></big>')
579
self.progress_info.set_text('')
663
581
self.install_window.show()
664
582
self.window.hide()
665
583
self.unity.show_progress()
666
584
self.delete_timeout(self.update_loop)
668
self.backend.install(source, target, persist,
586
self.backend.install(source, target,
669
587
allow_system_internal=self.allow_system_internal)
674
def progress(self, complete, remaining, speed):
592
def progress(self, complete):
676
594
self.progress_info.set_text('')
785
def format_failed(self, message):
786
# TODO sort through error types (message.get_dbus_name()) in backend,
787
# individual functions in frontend for each error type.
788
d = Gtk.MessageDialog(transient_for=self.window, modal=True,
789
message_type=Gtk.MessageType.ERROR,
790
buttons=Gtk.ButtonsType.CLOSE)
791
d.set_markup(str(message))
795
686
def format_dest_clicked(self, *args):
796
model, iterator = self.dest_treeview.get_selection().get_selected()
799
udi = model[iterator][0]
800
d = Gtk.MessageDialog(transient_for=self.window, modal=True,
801
message_type=Gtk.MessageType.QUESTION, buttons=Gtk.ButtonsType.YES_NO)
802
# TODO information about the device we're about to format.
803
d.set_markup(_('Are you sure you want to erase the entire disk?'))
806
if response == Gtk.ResponseType.YES:
807
self.format_dest.set_sensitive(False)
808
self.format_dest_label.set_text(_('Erasing...'))
809
self.format_dest_spinner.show()
810
self.format_dest_spinner.start()
811
self.backend.format(udi)
813
689
def open_dest_folder(self, *args):
814
690
model, iterator = self.dest_treeview.get_selection().get_selected()