~usb-creator-hackers/usb-creator/trunk

« back to all changes in this revision

Viewing changes to usbcreator/frontends/gtk/frontend.py

  • Committer: Dmitrijs Ledkovs
  • Date: 2013-01-28 12:45:42 UTC
  • mfrom: (406.1.2 nexus7)
  • Revision ID: dmitrijs.ledkovs@canonical.com-20130128124542-2y05i9bb622d3uob
Support flashing devices using fastboot (e.g. Nexus7).

Show diffs side-by-side

added added

removed removed

Lines of Context:
30
30
 
31
31
if 'USBCREATOR_LOCAL' in os.environ:
32
32
    ui_path = os.path.join(os.getcwd(), 'gui/usbcreator-gtk.ui')
 
33
    eula_path = os.path.join(os.getcwd(), 'gui/ubuntu-nexus7-USAGE-NOTICE-en.txt')
33
34
else:
34
35
    ui_path = '/usr/share/usb-creator/usbcreator-gtk.ui'
 
36
    eula_path = '/usr/share/usb-creator/ubuntu-nexus7-USAGE-NOTICE-en.txt'
35
37
 
36
38
GObject.threads_init()
37
39
Gdk.threads_init()
63
65
                 allow_system_internal=False):
64
66
 
65
67
        self.allow_system_internal = allow_system_internal
 
68
        self.fastboot_mode = backend.__class__.__name__ == 'FastbootBackend'
66
69
 
67
70
        self.all_widgets = set()
68
71
 
98
101
        self.finished_exit.connect('clicked', lambda x: self.finished_dialog.hide())
99
102
        self.failed_exit.connect('clicked', lambda x: self.failed_exit.hide())
100
103
        self.progress_cancel_button.connect('clicked', lambda x: self.warning_dialog.show())
101
 
        # we currently do not have help
102
 
        self.button_help.hide()
103
 
        #self.button_help.connect('clicked', lambda x: Gtk.show_uri(self.button_help.get_screen(),
104
 
        #                                                           'ghelp:usb-creator',
105
 
        #                                                           Gtk.get_current_event_time()))
106
104
 
107
105
        def format_value(scale, value):
108
106
            return misc.format_mb_size(value)
129
127
        # Pulse state.
130
128
        self.pulsing = False
131
129
 
 
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
 
143
            )
 
144
            with open(eula_path, 'r') as f:
 
145
                text = ''.join(f.readlines())
 
146
            self.eula_text.get_buffer().set_text(text)
 
147
        else:
 
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()))
 
153
            
132
154
        self.setup_sources_treeview()
133
155
        self.setup_targets_treeview()
134
156
        self.persist_vbox.set_sensitive(False)
345
367
        cell_name.set_property('ellipsize', Pango.EllipsizeMode.END)
346
368
        cell_pixbuf = Gtk.CellRendererPixbuf()
347
369
        column_name = Gtk.TreeViewColumn(_('CD-Drive/Image'))
 
370
        if self.fastboot_mode:
 
371
            column_name = Gtk.TreeViewColumn(_('Image'))
348
372
        column_name.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
349
373
        column_name.set_resizable(True)
350
374
        column_name.set_expand(True)
355
379
        column_name.set_cell_data_func(cell_name, column_data_func, 0)
356
380
        column_name.set_cell_data_func(cell_pixbuf, pixbuf_data_func, None)
357
381
 
358
 
        cell_version = Gtk.CellRendererText()
359
 
        cell_version.set_property('ellipsize', Pango.EllipsizeMode.END)
360
 
        column_name = Gtk.TreeViewColumn(_('OS Version'), cell_version)
361
 
        column_name.set_cell_data_func(cell_version, column_data_func, 1)
362
 
        column_name.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
363
 
        column_name.set_resizable(True)
364
 
        column_name.set_expand(True)
365
 
        column_name.set_min_width(75)
366
 
        self.source_treeview.append_column(column_name)
 
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)
367
392
 
368
393
        cell_size = Gtk.CellRendererText()
369
394
        cell_size.set_property('ellipsize', Pango.EllipsizeMode.END)
416
441
                m.row_changed(m.get_path(iterator), iterator)
417
442
                break
418
443
            iterator = m.iter_next(iterator)
 
444
 
 
445
        target = self.backend.targets[udi]
 
446
 
419
447
        # Update persistence maximum value.
420
 
        self.persist_vbox.set_sensitive(False)
421
 
        self.persist_enabled_vbox.set_sensitive(False)
422
 
        target = self.backend.targets[udi]
423
 
        persist_mb = target['persist'] / 1024 / 1024
424
 
        if persist_mb > misc.MIN_PERSISTENCE:
425
 
                self.persist_vbox.set_sensitive(True)
426
 
                self.persist_enabled_vbox.set_sensitive(True)
427
 
                self.persist_value.set_range(misc.MIN_PERSISTENCE, persist_mb)
428
 
                self.persist_value.set_value(misc.MIN_PERSISTENCE)
 
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)
 
457
 
429
458
        # Update install button state.
430
459
        status = target['status']
431
460
        source = self.backend.get_current_source()
467
496
        if udi:
468
497
            self.update_target(udi)
469
498
 
 
499
        if self.fastboot_mode:
 
500
            return
 
501
 
470
502
        dev = self.backend.targets[udi]
471
503
        p = dev['parent']
472
504
        if p and p in self.backend.targets:
546
578
        column_name.set_cell_data_func(cell_name, column_data_func, 0)
547
579
        column_name.set_cell_data_func(cell_pixbuf, pixbuf_data_func, None)
548
580
 
549
 
        cell_name = Gtk.CellRendererText()
550
 
        cell_name.set_property('ellipsize', Pango.EllipsizeMode.END)
551
 
        column_name = Gtk.TreeViewColumn(_('Label'), cell_name)
552
 
        column_name.set_cell_data_func(cell_name, column_data_func, 1)
553
 
        column_name.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
554
 
        column_name.set_resizable(True)
555
 
        column_name.set_expand(True)
556
 
        column_name.set_min_width(75)
557
 
        self.dest_treeview.append_column(column_name)
558
 
 
559
 
        cell_capacity = Gtk.CellRendererText()
560
 
        cell_capacity.set_property('ellipsize', Pango.EllipsizeMode.END)
561
 
        column_name = Gtk.TreeViewColumn(_('Capacity'), cell_capacity)
562
 
        column_name.set_cell_data_func(cell_capacity, column_data_func, 2)
563
 
        column_name.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
564
 
        column_name.set_resizable(True)
565
 
        column_name.set_expand(False)
566
 
        column_name.set_min_width(75)
567
 
        self.dest_treeview.append_column(column_name)
568
 
 
569
 
        cell_free = Gtk.CellRendererText()
570
 
        cell_free.set_property('ellipsize', Pango.EllipsizeMode.END)
571
 
        column_name = Gtk.TreeViewColumn(_('Free Space'), cell_free)
572
 
        column_name.set_cell_data_func(cell_free, column_data_func, 3)
573
 
        column_name.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
574
 
        column_name.set_resizable(True)
575
 
        column_name.set_expand(False)
576
 
        column_name.set_min_width(75)
577
 
        self.dest_treeview.append_column(column_name)
 
581
        if not self.fastboot_mode:
 
582
            cell_name = Gtk.CellRendererText()
 
583
            cell_name.set_property('ellipsize', Pango.EllipsizeMode.END)
 
584
            column_name = Gtk.TreeViewColumn(_('Label'), cell_name)
 
585
            column_name.set_cell_data_func(cell_name, column_data_func, 1)
 
586
            column_name.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
 
587
            column_name.set_resizable(True)
 
588
            column_name.set_expand(True)
 
589
            column_name.set_min_width(75)
 
590
            self.dest_treeview.append_column(column_name)
 
591
 
 
592
            cell_capacity = Gtk.CellRendererText()
 
593
            cell_capacity.set_property('ellipsize', Pango.EllipsizeMode.END)
 
594
            column_name = Gtk.TreeViewColumn(_('Capacity'), cell_capacity)
 
595
            column_name.set_cell_data_func(cell_capacity, column_data_func, 2)
 
596
            column_name.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
 
597
            column_name.set_resizable(True)
 
598
            column_name.set_expand(False)
 
599
            column_name.set_min_width(75)
 
600
            self.dest_treeview.append_column(column_name)
 
601
 
 
602
            cell_free = Gtk.CellRendererText()
 
603
            cell_free.set_property('ellipsize', Pango.EllipsizeMode.END)
 
604
            column_name = Gtk.TreeViewColumn(_('Free Space'), cell_free)
 
605
            column_name.set_cell_data_func(cell_free, column_data_func, 3)
 
606
            column_name.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE)
 
607
            column_name.set_resizable(True)
 
608
            column_name.set_expand(False)
 
609
            column_name.set_min_width(75)
 
610
            self.dest_treeview.append_column(column_name)
578
611
 
579
612
    def add_file_source_dialog(self, *args):
580
613
        filename = ''
581
614
        chooser = Gtk.FileChooserDialog(title=None,action=Gtk.FileChooserAction.OPEN,
582
615
            buttons=(Gtk.STOCK_CANCEL,Gtk.ResponseType.CANCEL,Gtk.STOCK_OPEN,Gtk.ResponseType.OK))
583
 
        for p, n in (('*.iso', _('CD Images')), ('*.img', _('Disk Images'))):
 
616
        def _add_filter(p, n):
584
617
            filter = Gtk.FileFilter()
585
618
            filter.add_pattern(p)
586
619
            filter.set_name(n)
587
620
            chooser.add_filter(filter)
 
621
 
 
622
        if not self.fastboot_mode:
 
623
            _add_filter('*.iso', _('CD Images'))
 
624
        _add_filter('*.img', _('Disk Images'))            
 
625
 
588
626
        folder = os.path.expanduser('~')
589
627
        chooser.set_current_folder(folder)
590
628
        response = chooser.run()
599
637
        source = self.get_source()
600
638
        target = self.get_target()
601
639
        persist = self.get_persistence()
 
640
        if self.fastboot_mode and not misc.check_eula():    
 
641
            if self.show_eula() == Gtk.ResponseType.CANCEL:
 
642
                return
602
643
        # TODO evand 2009-07-31: Make these the default values in the
603
644
        # GtkBuilder file.
604
645
        starting_up = _('Starting up...')
663
704
        retry_dialog.destroy()
664
705
        return response == Gtk.ResponseType.YES
665
706
 
 
707
    def show_eula(self, unused=None):
 
708
        response = self.eula_dialog.run()
 
709
        if response == Gtk.ResponseType.OK:
 
710
            misc.check_eula(True)
 
711
        self.eula_dialog.hide()
 
712
        return response
666
713
 
667
714
    def quit(self, *args):
668
715
        self.backend.cancel_install()
706
753
        except dbus.DBusException:
707
754
            logging.exception('Error checking for kvm:')
708
755
 
 
756
        if self.fastboot_mode:
 
757
            self.finished_dialog_label.set_text(
 
758
                _('Installation is complete. Your device is rebooting into Ubuntu Core.'))
 
759
            self.kvm_test.hide()
709
760
        self.finished_dialog.run()
710
761
        self.backend.shutdown()
711
762
        Gtk.main_quit()