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

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import gettext
  5. from gettext import gettext as _
  6. import gobject
  7. import gtk
  8. import pango
  9. import gst
  10. import gst.pbutils as gst
  11. import apt
  12. import PackageWorker
  13. (LIST_PKG_TO_INSTALL, LIST_PKG_NAME, LIST_PKG_REQUEST) = range(3)
  14. CODEC_WARNING_LIST = [
  15.     'gstreamer0.10-plugins-bad',
  16.     'gstreamer0.10-plugins-bad-multiverse',
  17.     'gstreamer0.10-ffmpeg',
  18.     'gstreamer0.10-plugins-ugly']
  19.  
  20. class CodecDetailsView(gtk.TextView):
  21.     ''' special view to display for the codec information '''
  22.     
  23.     def __init__(self):
  24.         gtk.TextView.__init__(self)
  25.         self.set_property('editable', False)
  26.         self.set_cursor_visible(False)
  27.         self.set_wrap_mode(gtk.WRAP_WORD)
  28.         self.buffer = gtk.TextBuffer()
  29.         self.set_buffer(self.buffer)
  30.         self.buffer.create_tag('summary', scale = pango.SCALE_LARGE, weight = pango.WEIGHT_BOLD)
  31.         self.buffer.create_tag('homepage', weight = pango.WEIGHT_BOLD)
  32.         self.buffer.create_tag('provides', weight = pango.WEIGHT_BOLD)
  33.         self.buffer.create_tag('description', weight = pango.WEIGHT_BOLD)
  34.         self.buffer.insert_with_tags_by_name(self.buffer.get_start_iter(), _('No package selected'), 'summary')
  35.  
  36.     
  37.     def show_codec(self, pkg = None, requests = None):
  38.         self.buffer.set_text('')
  39.         iter = self.buffer.get_start_iter()
  40.         self.buffer.place_cursor(iter)
  41.         if pkg is None:
  42.             self.buffer.insert_with_tags_by_name(iter, _('No package selected'), 'summary')
  43.             return None
  44.         self.buffer.insert_with_tags_by_name(iter, pkg.summary, 'summary')
  45.         self.buffer.insert(iter, '\n\n')
  46.         if pkg.homepage:
  47.             self.buffer.insert_with_tags_by_name(iter, _('Homepage:') + '\n', 'homepage')
  48.             self.buffer.insert(iter, pkg.homepage + '\n\n')
  49.         
  50.         self.buffer.insert_with_tags_by_name(iter, _('Provides:') + '\n', 'provides')
  51.         for request in requests:
  52.             self.buffer.insert(iter, request.description + '\n')
  53.         
  54.         self.buffer.insert(iter, '\n')
  55.         self.buffer.insert_with_tags_by_name(iter, _('Long Description:') + '\n', 'description')
  56.         self.buffer.insert(iter, pkg.description + '\n')
  57.  
  58.  
  59.  
  60. class MainWindow(object):
  61.     
  62.     def __init__(self, requests):
  63.         self._requests = requests
  64.         self._window = gtk.Window(gtk.WINDOW_TOPLEVEL)
  65.         self._window.set_title(_('Install Multimedia Plugins'))
  66.         self._window.set_property('default_width', 600)
  67.         self._window.set_property('default_height', 500)
  68.         self._window.set_border_width(10)
  69.         self._window.set_position(gtk.WIN_POS_CENTER_ON_PARENT)
  70.         self._return_code = gst.pbutils.INSTALL_PLUGINS_NOT_FOUND
  71.         self._window.connect('delete_event', self._delete_event)
  72.         self._window.connect('destroy', self._destroy)
  73.         vbox_window = gtk.VBox()
  74.         vbox_packages = gtk.VBox(homogeneous = False)
  75.         label = gtk.Label()
  76.         label.set_line_wrap(True)
  77.         label.set_justify(gtk.JUSTIFY_LEFT)
  78.         label.set_alignment(0, 0)
  79.         plugins = ''
  80.         for request in self._requests:
  81.             plugins += '\n- ' + request.description
  82.         
  83.         label.set_markup(_('<b><big>Please select the packages for installation to provide the following plugins:</big></b>\n') + plugins)
  84.         vbox_packages.pack_start(label, False, False, 10)
  85.         self._package_list_model = gtk.ListStore(gobject.TYPE_BOOLEAN, gobject.TYPE_STRING, gobject.TYPE_PYOBJECT)
  86.         self._package_list = gtk.TreeView(self._package_list_model)
  87.         self._package_list.set_headers_visible(True)
  88.         self._package_list.connect('cursor-changed', self._package_cursor_changed)
  89.         toggle_renderer = gtk.CellRendererToggle()
  90.         toggle_renderer.connect('toggled', self._toggle_install)
  91.         self._package_list.append_column(gtk.TreeViewColumn(None, toggle_renderer, active = 0))
  92.         text_renderer = gtk.CellRendererText()
  93.         text_renderer.set_data('column', 1)
  94.         self._package_list.append_column(gtk.TreeViewColumn(_('Package'), text_renderer, text = 1))
  95.         scrolled_window = gtk.ScrolledWindow()
  96.         scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
  97.         scrolled_window.add(self._package_list)
  98.         vbox_packages.pack_start(scrolled_window, True, True, 10)
  99.         expander = gtk.Expander(_('Details') + ':')
  100.         expander.connect('notify::expanded', self._package_details_expanded)
  101.         self._package_details = CodecDetailsView()
  102.         scrolled_window = gtk.ScrolledWindow()
  103.         scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
  104.         scrolled_window.add_with_viewport(self._package_details)
  105.         expander.add(scrolled_window)
  106.         vbox_packages.pack_start(expander, False, False, 10)
  107.         vbox_window.pack_start(vbox_packages, True, True, 0)
  108.         button_box = gtk.HButtonBox()
  109.         button_box.set_layout(gtk.BUTTONBOX_END)
  110.         button_box.set_spacing(5)
  111.         btn = gtk.Button(_('Cancel'), gtk.STOCK_CANCEL)
  112.         btn.connect('clicked', self._canceled)
  113.         button_box.add(btn)
  114.         btn = gtk.Button(_('Install'), None)
  115.         btn.connect('clicked', self._install_selection)
  116.         button_box.add(btn)
  117.         vbox_window.pack_start(button_box, False, False, 0)
  118.         self._window.add(vbox_window)
  119.         self._window.show_all()
  120.  
  121.     
  122.     def modal_dialog(self, type, primary, secondary = ''):
  123.         ''' helper that shows a modal dialog of the given type '''
  124.         dlg = gtk.MessageDialog(self._window, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, type, gtk.BUTTONS_OK, primary)
  125.         dlg.set_title(primary)
  126.         dlg.format_secondary_text(secondary)
  127.         res = dlg.run()
  128.         dlg.destroy()
  129.         return res
  130.  
  131.     
  132.     def _package_cursor_changed(self, treeview, data = None):
  133.         selection = treeview.get_selection()
  134.         if not selection:
  135.             self._package_details.show_codec(None)
  136.         else:
  137.             (model, iter) = selection.get_selected()
  138.             pkgname = model.get_value(iter, LIST_PKG_NAME)
  139.             requests = model.get_value(iter, LIST_PKG_REQUEST)
  140.             self._package_details.show_codec(self.cache[pkgname], requests)
  141.  
  142.     
  143.     def _package_details_expanded(self, expander, param_spec, data = None):
  144.         if expander.get_expanded():
  145.             expander.get_child().show_all()
  146.             expander.set_size_request(-1, 120)
  147.         else:
  148.             expander.set_size_request(-1, -1)
  149.             expander.get_child().hide_all()
  150.  
  151.     
  152.     def _confirm_codec_install(self, install_list):
  153.         ''' helper that shows a codec warning dialog '''
  154.         for pkgname in CODEC_WARNING_LIST:
  155.             if pkgname in install_list:
  156.                 break
  157.                 continue
  158.         else:
  159.             return None
  160.         dia = None.MessageDialog(parent = self._window, type = gtk.MESSAGE_WARNING, buttons = gtk.BUTTONS_CANCEL)
  161.         header = _('Confirm installation of restricted software')
  162.         body = _('The use of this software may be restricted in some countries. You must verify that one of the following is true:\n\n\xe2\x80\xa2 These restrictions do not apply in your country of legal residence\n\xe2\x80\xa2 You have permission to use this software (for example, a patent license)\n\xe2\x80\xa2 You are using this software for research purposes only')
  163.         dia.set_markup('<big><b>%s</b></big>\n\n%s' % (header, body))
  164.         dia.add_button(_('C_onfirm'), gtk.RESPONSE_OK)
  165.         res = dia.run()
  166.         dia.hide()
  167.         if res != gtk.RESPONSE_OK:
  168.             return False
  169.         return True
  170.  
  171.     
  172.     def _toggle_install(self, cell, path, data = None):
  173.         iter = self._package_list_model.get_iter((int(path),))
  174.         name = self._package_list_model.get_value(iter, LIST_PKG_NAME)
  175.         enabled = self._package_list_model.get_value(iter, LIST_PKG_TO_INSTALL)
  176.         enabled = not enabled
  177.         self._package_list_model.set(iter, LIST_PKG_TO_INSTALL, enabled)
  178.  
  179.     
  180.     def _populate_list(self):
  181.         dlg = gtk.Dialog(_('Searching Plugin Packages'), self._window, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, None)
  182.         dlg.set_has_separator(False)
  183.         dlg.set_deletable(False)
  184.         dlg.set_border_width(5)
  185.         label = gtk.Label()
  186.         label.set_markup('<b><big>' + _('Searching Plugin Packages') + '</big></b>\n' + _('This might take up to one or two minutes.'))
  187.         dlg.vbox.pack_start(label, True, True, 5)
  188.         progressbar = gtk.ProgressBar()
  189.         progressbar.set_fraction(0)
  190.         dlg.vbox.pack_start(progressbar, True, True, 5)
  191.         dlg.show_all()
  192.         self.update_ui()
  193.         progressbar.set_text(_('Loading package cache...'))
  194.         self.cache = apt.Cache(PackageWorker.GtkOpProgress())
  195.         self.update_ui()
  196.         npackages = 0
  197.         package_count = len(self.cache)
  198.         progressbar.set_text(_('Searching for requested plugins...'))
  199.         requests_map = [
  200.             ('decoder', 'Gstreamer-Decoders', True, False),
  201.             ('encoder', 'Gstreamer-Encoders', True, False),
  202.             ('urisource', 'Gstreamer-Uri-Sources', False, True),
  203.             ('urisink', 'Gstreamer-Uri-Sinks', False, True),
  204.             ('element', 'Gstreamer-Elements', False, True)]
  205.         for cur_package, pkg in enumerate(self.cache):
  206.             if cur_package % 500 == 0:
  207.                 progressbar.set_fraction(float(cur_package) / package_count)
  208.             
  209.             self.update_ui()
  210.             if pkg.isInstalled and not (pkg.isUpgradable):
  211.                 continue
  212.             
  213.             record = pkg.candidateRecord
  214.             if not record:
  215.                 continue
  216.             
  217.             if not record.has_key('Gstreamer-Version'):
  218.                 continue
  219.             
  220.             (major, minor) = pkg.candidateRecord['Gstreamer-Version'].split('.')
  221.             if int(major) != self._requests[0].major or int(minor) != self._requests[0].minor:
  222.                 continue
  223.             
  224.             add_pkg = False
  225.             pkg_requests = []
  226.             for request in self._requests:
  227.                 self.update_ui()
  228.                 for request_str, pkgrecord_str, check_caps, do_split in requests_map:
  229.                     if request.gstkind == request_str:
  230.                         if not record.has_key(pkgrecord_str):
  231.                             continue
  232.                         
  233.                         if check_caps:
  234.                             caps = gst.Caps(record[pkgrecord_str])
  235.                             if request.caps.intersect(caps):
  236.                                 add_pkg = True
  237.                                 pkg_requests.append(request)
  238.                                 break
  239.                             
  240.                         
  241.                         if do_split:
  242.                             elms = record[pkgrecord_str].split(',')
  243.                             if request.feature in elms:
  244.                                 add_pkg = True
  245.                                 pkg_requests.append(request)
  246.                                 break
  247.                             
  248.                         
  249.                     do_split
  250.                 
  251.             
  252.             if add_pkg:
  253.                 npackages += 1
  254.                 iter = self._package_list_model.append()
  255.                 self._package_list_model.set(iter, LIST_PKG_TO_INSTALL, True, LIST_PKG_NAME, pkg.name, LIST_PKG_REQUEST, pkg_requests)
  256.                 continue
  257.         
  258.         self._package_list_model.set_sort_column_id(LIST_PKG_NAME, gtk.SORT_ASCENDING)
  259.         self.update_ui()
  260.         dlg.destroy()
  261.         return npackages
  262.  
  263.     
  264.     def _delete_event(self, widget, event, data = None):
  265.         return False
  266.  
  267.     
  268.     def _destroy(self, widget, data = None):
  269.         gtk.main_quit()
  270.  
  271.     
  272.     def _canceled(self, widget, data = None):
  273.         self._return_code = gst.pbutils.INSTALL_PLUGINS_USER_ABORT
  274.         gtk.main_quit()
  275.  
  276.     
  277.     def update_ui(self):
  278.         ''' helper that processes all pending events '''
  279.         while gtk.events_pending():
  280.             gtk.main_iteration()
  281.  
  282.     
  283.     def _install_selection(self, widget, data = None):
  284.         iter = self._package_list_model.get_iter_first()
  285.         packages = []
  286.         while iter:
  287.             if self._package_list_model.get_value(iter, LIST_PKG_TO_INSTALL):
  288.                 packages.append((self._package_list_model.get_value(iter, LIST_PKG_NAME), self._package_list_model.get_value(iter, LIST_PKG_REQUEST)))
  289.             
  290.             iter = self._package_list_model.iter_next(iter)
  291.         if not packages or len(packages) == 0:
  292.             self.modal_dialog(gtk.MESSAGE_WARNING, _('No packages selected'))
  293.             self._return_code = gst.pbutils.INSTALL_PLUGINS_NOT_FOUND
  294.             return None
  295.         if not []([]([ package[LIST_PKG_TO_INSTALL] for package in packages ])):
  296.             return None
  297.         worker = PackageWorker.PackageWorker()
  298.         install_success = set([], []([ package[LIST_PKG_TO_INSTALL] for package in packages ]), set())
  299.         gtk.main_quit()
  300.  
  301.     
  302.     def main(self):
  303.         npackages = self._populate_list()
  304.         if npackages == 0:
  305.             plugins = ''
  306.             for request in self._requests:
  307.                 plugins += '\n' + request.description
  308.             
  309.             self.modal_dialog(gtk.MESSAGE_WARNING, _('No packages with the requested plugins found'), _('The requested plugins are:\n') + plugins)
  310.             return gst.pbutils.INSTALL_PLUGINS_NOT_FOUND
  311.         gtk.main()
  312.         return self._return_code
  313.  
  314.  
  315.