home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / lib / python2.6 / dist-packages / usbcreator / gtk_frontend.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-04-20  |  17.4 KB  |  480 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import sys
  5. import os
  6. from usbcreator.backend import Backend
  7. import gettext
  8. import locale
  9. import pygtk
  10. import gtk.glade as gtk
  11. import gobject
  12. import dbus
  13. import gnomevfs
  14. MIN_PERSIST = 128 * 1024 * 1024
  15. LOCALEDIR = '/usr/share/locale'
  16.  
  17. class GtkFrontend:
  18.     
  19.     def __init__(self, iso = None, persistent = True):
  20.         (self.YES, self.MAYBE, self.NO) = range(3)
  21.         locale.setlocale(locale.LC_ALL, '')
  22.         for module in (gtk.glade, gettext):
  23.             module.bindtextdomain('usbcreator', LOCALEDIR)
  24.             module.textdomain('usbcreator')
  25.         
  26.         import __builtin__
  27.         __builtin__._ = gettext.gettext
  28.         self.all_widgets = set()
  29.         self.glade = gtk.glade.XML('/usr/share/usb-creator/usbcreator.glade')
  30.         for widget in self.glade.get_widget_prefix(''):
  31.             if isinstance(widget, gtk.Label):
  32.                 widget.set_property('can-focus', False)
  33.             
  34.             self.all_widgets.add(widget)
  35.             setattr(self, widget.get_name(), widget)
  36.         
  37.         self.backend = Backend(self)
  38.         gtk.window_set_default_icon_from_file('/usr/share/pixmaps/usb-creator.png')
  39.         self.glade.signal_autoconnect(self)
  40.         self.cancelbutton.connect(('clicked',), (lambda x: self.warning_dialog.hide()))
  41.         self.exitbutton.connect(('clicked',), (lambda x: self.abort()))
  42.         self.progress_cancel_button.connect(('clicked',), (lambda x: self.warning_dialog.show()))
  43.         
  44.         def format_value(scale, value):
  45.             return format_size(value)
  46.  
  47.         self.persist_value.set_adjustment(gtk.Adjustment(0, 0, 100, 1, 10, 0))
  48.         self.persist_value.connect('format-value', format_value)
  49.         self.setup_source()
  50.         self.setup_dest()
  51.         m = self.dest_treeview.get_model()
  52.         self.update_row_state(m, None)
  53.         self.persist_vbox.set_sensitive(False)
  54.         self.button_install.set_sensitive(False)
  55.         self.backend.detect_devices()
  56.         self.window.show()
  57.         if iso is not None:
  58.             self.backend.mount_iso(iso)
  59.         
  60.         if not persistent:
  61.             self.persist_disabled.set_active(True)
  62.         
  63.         gtk.main()
  64.  
  65.     
  66.     def abort(self, *args):
  67.         self.backend.shutdown()
  68.         sys.exit(0)
  69.  
  70.     
  71.     def quit(self, *args):
  72.         self.backend.quit()
  73.         sys.exit(0)
  74.  
  75.     
  76.     def failed(self, title = None):
  77.         self.backend.shutdown()
  78.         self.warning_dialog.hide()
  79.         self.install_window.hide()
  80.         if title:
  81.             self.failed_dialog_label.set_text(title)
  82.             self.backend.log('Install failed: ' + title)
  83.         else:
  84.             self.backend.log('Install failed.')
  85.         self.failed_dialog.run()
  86.         sys.exit(1)
  87.  
  88.     
  89.     def finished(self, *args):
  90.         self.warning_dialog.hide()
  91.         self.install_window.hide()
  92.         self.finished_dialog.run()
  93.         sys.exit(0)
  94.  
  95.     
  96.     def notify(self, message):
  97.         dialog = gtk.MessageDialog(None, 0, gtk.MESSAGE_WARNING, gtk.BUTTONS_CLOSE, message)
  98.         dialog.run()
  99.         dialog.destroy()
  100.  
  101.     
  102.     def format_dest_clicked(self, *args):
  103.         (model, iterator) = self.dest_treeview.get_selection().get_selected()
  104.         if not iterator:
  105.             return None
  106.         disk = model[iterator][0]
  107.         self.backend.format_device(disk)
  108.  
  109.     
  110.     def open_dest_folder(self, *args):
  111.         (model, iterator) = self.dest_treeview.get_selection().get_selected()
  112.         if not iterator:
  113.             return None
  114.         disk = model[iterator][0]
  115.         mp = self.backend.devices[disk]['mountpoint']
  116.         if mp:
  117.             cmd = [
  118.                 'gnome-open',
  119.                 mp]
  120.             popen = popen
  121.             import usbcreator.backend
  122.             popen(cmd)
  123.         
  124.  
  125.     
  126.     def add_source(self, source):
  127.         ni = self.source_treeview.get_model().append([
  128.             source])
  129.         sel = self.source_treeview.get_selection()
  130.         (m, i) = sel.get_selected()
  131.         if not i:
  132.             sel.select_iter(ni)
  133.         
  134.  
  135.     
  136.     def device_removed(self, d, source):
  137.         '''The backend has removed a device from its list and the frontend now
  138.         needs to do the same.
  139.  
  140.         Keyword arguments:
  141.         d      -- the key (a udi string) of the item to delete.
  142.         source -- if True, then the frontend needs to remove a source device
  143.                   (CD), otherwise it needs to remove a destination device (USB
  144.                   drive).
  145.         '''
  146.         to_delete = None
  147.         if source:
  148.             m = self.source_treeview.get_model()
  149.         else:
  150.             m = self.dest_treeview.get_model()
  151.         iterator = m.get_iter_first()
  152.         while iterator is not None:
  153.             if m.get_value(iterator, 0) == d:
  154.                 to_delete = iterator
  155.                 self.backend.log('deleting %s from the ui' % d)
  156.             
  157.             iterator = m.iter_next(iterator)
  158.         if to_delete is not None:
  159.             m.remove(to_delete)
  160.         
  161.         if len(m) == 0:
  162.             self.backend.log('device removed and none left.  source = %s' % str(source))
  163.             self.persist_vbox.set_sensitive(False)
  164.             self.button_install.set_sensitive(False)
  165.         
  166.  
  167.     
  168.     def update_all_rows(self, selection):
  169.         m = self.dest_treeview.get_model()
  170.         iterator = m.get_iter_first()
  171.         while iterator is not None:
  172.             self.update_row_state(m, iterator)
  173.             iterator = m.iter_next(iterator)
  174.  
  175.     
  176.     def get_gnome_drive(self, udi):
  177.         monitor = gnomevfs.VolumeMonitor()
  178.         for drive in monitor.get_connected_drives():
  179.             if drive.get_hal_udi() == udi:
  180.                 return drive
  181.         
  182.  
  183.     
  184.     def setup_source(self):
  185.         
  186.         def column_data_func(column, cell, model, iterator, pos):
  187.             val = model[iterator][0]
  188.             dev = self.backend.cds[val]
  189.             if pos == 0:
  190.                 if dev['udi']:
  191.                     drive = self.get_gnome_drive(dev['udi'])
  192.                     if drive:
  193.                         cell.set_property('text', drive.get_display_name())
  194.                     else:
  195.                         cell.set_property('text', dev['mountpoint'])
  196.                 else:
  197.                     cell.set_property('text', dev['filename'])
  198.             elif pos == 1:
  199.                 cell.set_property('text', dev['label'])
  200.             elif pos == 2:
  201.                 cell.set_property('text', format_size(dev['size']))
  202.             
  203.  
  204.         
  205.         def pixbuf_data_func(column, cell, model, iterator):
  206.             dev = self.backend.cds[model[iterator][0]]
  207.             drive = self.get_gnome_drive(dev['udi'])
  208.             if drive:
  209.                 cell.set_property('icon-name', drive.get_icon())
  210.             else:
  211.                 cell.set_property('stock-id', None)
  212.  
  213.         list_store = gtk.ListStore(str)
  214.         self.source_treeview.set_model(list_store)
  215.         cell_name = gtk.CellRendererText()
  216.         cell_pixbuf = gtk.CellRendererPixbuf()
  217.         column_name = gtk.TreeViewColumn(_('CD-Drive/Image'))
  218.         column_name.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE)
  219.         column_name.pack_start(cell_pixbuf, expand = False)
  220.         column_name.pack_start(cell_name, expand = True)
  221.         self.source_treeview.append_column(column_name)
  222.         column_name.set_cell_data_func(cell_name, column_data_func, 0)
  223.         column_name.set_cell_data_func(cell_pixbuf, pixbuf_data_func)
  224.         cell_version = gtk.CellRendererText()
  225.         column_name = gtk.TreeViewColumn(_('OS Version'), cell_version)
  226.         column_name.set_cell_data_func(cell_version, column_data_func, 1)
  227.         column_name.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE)
  228.         self.source_treeview.append_column(column_name)
  229.         cell_size = gtk.CellRendererText()
  230.         column_name = gtk.TreeViewColumn(_('Size'), cell_size)
  231.         column_name.set_cell_data_func(cell_size, column_data_func, 2)
  232.         column_name.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE)
  233.         self.source_treeview.append_column(column_name)
  234.         selection = self.source_treeview.get_selection()
  235.         selection.connect('changed', self.update_all_rows)
  236.  
  237.     
  238.     def select_iso(self, *args):
  239.         filename = ''
  240.         chooser = gtk.FileChooserDialog(title = None, action = gtk.FILE_CHOOSER_ACTION_OPEN, buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK))
  241.         filter = gtk.FileFilter()
  242.         filter.add_pattern('*.iso')
  243.         filter.set_name(_('ISO Files'))
  244.         chooser.add_filter(filter)
  245.         if 'SUDO_USER' in os.environ:
  246.             folder = os.path.expanduser('~' + os.environ['SUDO_USER'])
  247.         else:
  248.             folder = os.path.expanduser('~')
  249.         chooser.set_current_folder(folder)
  250.         response = chooser.run()
  251.         failed = False
  252.         if response == gtk.RESPONSE_OK:
  253.             filename = chooser.get_filename()
  254.             self.backend.mount_iso(filename)
  255.         
  256.         chooser.destroy()
  257.  
  258.     
  259.     def add_dest(self, dest):
  260.         self.backend.log('adding: %s' % dest)
  261.         ni = self.dest_treeview.get_model().append([
  262.             dest,
  263.             self.YES])
  264.         sel = self.dest_treeview.get_selection()
  265.         (m, i) = sel.get_selected()
  266.         if not i:
  267.             sel.select_iter(ni)
  268.         
  269.  
  270.     
  271.     def update_row_state(self, model, iterator):
  272.         (m, i) = self.source_treeview.get_selection().get_selected()
  273.         if not i:
  274.             self.source_status.set_text(_("Please insert a CD or select 'Other...'."))
  275.         else:
  276.             self.source_status.set_text('')
  277.         if not iterator:
  278.             self.open_dest.hide()
  279.             self.format_dest.hide()
  280.             self.dest_status.set_text(_('Please insert a USB stick.'))
  281.             iterator = model.get_iter_first()
  282.             while iterator is not None:
  283.                 model[iterator][1] = self.YES
  284.                 iterator = model.iter_next(iterator)
  285.         else:
  286.             self.dest_status.set_text('')
  287.         if not i or not iterator:
  288.             return None
  289.         cd = self.backend.cds[m[i][0]]
  290.         disk = model[iterator][0]
  291.         disk = self.backend.devices[disk]
  292.         if not disk['fstype']:
  293.             if cd['size'] > disk['capacity']:
  294.                 model[iterator][1] = self.NO
  295.             else:
  296.                 model[iterator][1] = self.MAYBE
  297.         elif cd['size'] < disk['free']:
  298.             model[iterator][1] = self.YES
  299.         elif cd['size'] > disk['capacity']:
  300.             model[iterator][1] = self.NO
  301.         else:
  302.             model[iterator][1] = self.MAYBE
  303.         if self.dest_treeview.get_selection().iter_is_selected(iterator):
  304.             self.backend.log('updating dest_status as part of update_row_state')
  305.             self.open_dest.hide()
  306.             self.format_dest.hide()
  307.             self.button_install.set_sensitive(False)
  308.             if not disk['fstype']:
  309.                 if cd['size'] > disk['capacity']:
  310.                     self.dest_status.set_text(_('%s is too small for %s.') % (disk['device'], cd['label']))
  311.                 else:
  312.                     self.dest_status.set_text(_('%s needs to be formatted.') % disk['device'])
  313.                     self.format_dest.show()
  314.             elif cd['size'] < disk['free']:
  315.                 self.dest_status.set_text(_('%s has enough free space for %s.') % (disk['device'], cd['label']))
  316.                 self.button_install.set_sensitive(True)
  317.                 self.persist_vbox.set_sensitive(True)
  318.                 persist_max = disk['free'] - cd['size']
  319.                 if persist_max > MIN_PERSIST:
  320.                     self.persist_vbox.set_sensitive(True)
  321.                     self.persist_enabled_vbox.set_sensitive(True)
  322.                     self.persist_value.set_range(MIN_PERSIST, persist_max)
  323.                 else:
  324.                     self.persist_enabled_vbox.set_sensitive(False)
  325.                     self.persist_disabled.set_active(True)
  326.             elif cd['size'] > disk['capacity']:
  327.                 self.dest_status.set_text(_('%s is too small for %s.') % (disk['device'], cd['label']))
  328.             else:
  329.                 needed = cd['size'] - disk['free']
  330.                 needed = format_size(needed)
  331.                 self.dest_status.set_text(_('%s is too full to fit %s (%s more needed).') % (disk['device'], cd['label'], needed))
  332.                 self.open_dest.show()
  333.         
  334.  
  335.     
  336.     def update_dest_row(self, device):
  337.         m = self.dest_treeview.get_model()
  338.         iterator = m.get_iter_first()
  339.         while iterator is not None:
  340.             if m.get_value(iterator, 0) == device:
  341.                 self.update_row_state(m, iterator)
  342.                 m.row_changed(m.get_path(iterator), iterator)
  343.                 break
  344.             
  345.             iterator = m.iter_next(iterator)
  346.  
  347.     
  348.     def dest_selection_changed(self, selection):
  349.         (model, iterator) = selection.get_selected()
  350.         self.update_row_state(model, iterator)
  351.  
  352.     
  353.     def setup_dest(self):
  354.         
  355.         def column_data_func(column, cell, model, iterator, pos):
  356.             val = model[iterator][0]
  357.             dev = self.backend.devices[val]
  358.             drive = self.get_gnome_drive(dev['udi'])
  359.             if pos == 0:
  360.                 if drive:
  361.                     cell.set_property('text', drive.get_display_name())
  362.                 else:
  363.                     cell.set_property('text', dev['device'])
  364.             elif pos == 1:
  365.                 cell.set_property('text', dev['label'])
  366.             elif pos == 2:
  367.                 cell.set_property('text', format_size(dev['capacity']))
  368.             elif pos == 3:
  369.                 cell.set_property('text', format_size(dev['free']))
  370.             
  371.  
  372.         
  373.         def pixbuf_data_func(column, cell, model, iterator):
  374.             if model[iterator][1] == self.MAYBE:
  375.                 cell.set_property('stock-id', gtk.STOCK_DIALOG_WARNING)
  376.             elif model[iterator][1] == self.NO:
  377.                 cell.set_property('stock-id', gtk.STOCK_DIALOG_ERROR)
  378.             else:
  379.                 dev = self.backend.devices[model[iterator][0]]
  380.                 drive = self.get_gnome_drive(dev['udi'])
  381.                 if drive:
  382.                     cell.set_property('icon-name', drive.get_icon())
  383.                 else:
  384.                     cell.set_property('stock-id', None)
  385.  
  386.         list_store = gtk.ListStore(str, int)
  387.         self.dest_treeview.set_model(list_store)
  388.         column_name = gtk.TreeViewColumn()
  389.         column_name.set_title(_('Device'))
  390.         cell_name = gtk.CellRendererText()
  391.         cell_pixbuf = gtk.CellRendererPixbuf()
  392.         column_name.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE)
  393.         column_name.pack_start(cell_pixbuf, expand = False)
  394.         column_name.pack_start(cell_name, expand = True)
  395.         self.dest_treeview.append_column(column_name)
  396.         column_name.set_cell_data_func(cell_name, column_data_func, 0)
  397.         column_name.set_cell_data_func(cell_pixbuf, pixbuf_data_func)
  398.         cell_name = gtk.CellRendererText()
  399.         column_name = gtk.TreeViewColumn(_('Label'), cell_name)
  400.         column_name.set_cell_data_func(cell_name, column_data_func, 1)
  401.         column_name.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE)
  402.         self.dest_treeview.append_column(column_name)
  403.         cell_capacity = gtk.CellRendererText()
  404.         column_name = gtk.TreeViewColumn(_('Capacity'), cell_capacity)
  405.         column_name.set_cell_data_func(cell_capacity, column_data_func, 2)
  406.         column_name.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE)
  407.         self.dest_treeview.append_column(column_name)
  408.         cell_free = gtk.CellRendererText()
  409.         column_name = gtk.TreeViewColumn(_('Free Space'), cell_free)
  410.         column_name.set_cell_data_func(cell_free, column_data_func, 3)
  411.         column_name.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE)
  412.         self.dest_treeview.append_column(column_name)
  413.         selection = self.dest_treeview.get_selection()
  414.         selection.connect('changed', self.dest_selection_changed)
  415.  
  416.     
  417.     def install(self, widget):
  418.         self.backend.log('Installing...')
  419.         self.window.hide()
  420.         starting_up = _('Starting up')
  421.         self.progress_title.set_markup('<big><b>' + starting_up + '</b></big>')
  422.         self.progress_info.set_text('')
  423.         self.install_window.show()
  424.         (m, i) = self.source_treeview.get_selection().get_selected()
  425.         if not i:
  426.             self.failed(_('Install button pressed but there was no source selected.'))
  427.         
  428.         val = m[i][0]
  429.         self.backend.log('Source CD: %s' % val)
  430.         self.backend.set_install_source(val)
  431.         (m, i) = self.dest_treeview.get_selection().get_selected()
  432.         if not i:
  433.             self.failed(_('Install button pressed but there was no destination selected.'))
  434.         
  435.         val = m[i][0]
  436.         self.backend.log('Destination disk: %s' % val)
  437.         self.backend.set_install_target(val)
  438.         if self.persist_enabled.get_active():
  439.             val = int(self.persist_value.get_value())
  440.         else:
  441.             val = 0
  442.         self.backend.log('Persistence size: %d B' % val)
  443.         self.backend.set_persistence_size(val)
  444.         self.backend.install_bootloader()
  445.         
  446.         try:
  447.             self.backend.copy_files()
  448.         except Exception:
  449.             e = None
  450.             self.failed(str(e))
  451.  
  452.  
  453.     
  454.     def progress(self, val, desc):
  455.         self.progress_info.set_text(_('%d%% complete') % val)
  456.         self.progress_bar.set_fraction(val / 100)
  457.         self.progress_title.set_markup('<big><b>' + desc + '</b></big>')
  458.  
  459.  
  460.  
  461. def format_size(size):
  462.     '''Format a partition size.'''
  463.     if size < 1024:
  464.         unit = 'B'
  465.         factor = 1
  466.     elif size < 1048576:
  467.         unit = 'kB'
  468.         factor = 1024
  469.     elif size < 1073741824:
  470.         unit = 'MB'
  471.         factor = 1048576
  472.     elif size < 0x10000000000L:
  473.         unit = 'GB'
  474.         factor = 1073741824
  475.     else:
  476.         unit = 'TB'
  477.         factor = 0x10000000000L
  478.     return '%.1f %s' % (float(size) / factor, unit)
  479.  
  480.