home *** CD-ROM | disk | FTP | other *** search
/ Clickx 115 / Clickx 115.iso / software / tools / windows / tails-i386-0.16.iso / live / filesystem.squashfs / usr / share / arm / util / gtkTools.py < prev    next >
Encoding:
Python Source  |  2012-05-18  |  9.9 KB  |  427 lines

  1. """
  2. Helper module for getting Gtk+ theme colors.
  3. """
  4.  
  5. import gobject
  6. import gtk
  7.  
  8. COLOR_MAP = {
  9.   'normal' : ('fg', gtk.STATE_NORMAL),
  10.   'active' : ('fg', gtk.STATE_ACTIVE),
  11.   'insensitive' : ('fg', gtk.STATE_INSENSITIVE),
  12. }
  13.  
  14. class Theme:
  15.   def __init__(self):
  16.     self.colors = {}
  17.  
  18.     widget = gtk.Button()
  19.  
  20.     for (key, (prop, state)) in COLOR_MAP.items():
  21.       self.colors[key] = getattr(widget.style, prop)[state]
  22.  
  23. class ListWrapper(object):
  24.   def __init__(self, container, model=None):
  25.     self.container = []
  26.     self.model = model
  27.  
  28.     for value in container:
  29.       self.append(value)
  30.  
  31.   def append(self, value):
  32.     self.container.append(value)
  33.     gobject.idle_add(self._model_append, value)
  34.  
  35.   def empty(self):
  36.     self.container = []
  37.     gobject.idle_add(self._model_clear)
  38.  
  39.   def __str__(self):
  40.     return str(self.container)
  41.  
  42.   def __repr__(self):
  43.     return str(self.container)
  44.  
  45.   def __len__(self):
  46.     return len(self.container)
  47.  
  48.   def __iadd__(self, other):
  49.     for value in other:
  50.       self.append(value)
  51.  
  52.   def __delitem__(self, key):
  53.     del self.container[key]
  54.  
  55.     gobject.idle_add(self._model_del, key)
  56.  
  57.   def __getitem__(self, key):
  58.     return self.container[key]
  59.  
  60.   def __setitem__(self, key, value):
  61.     self.container[key] = value
  62.  
  63.     gobject.idle_add(self._model_set, key, value)
  64.  
  65.   def _model_append(self, value):
  66.     if not self.model:
  67.       return
  68.  
  69.     row = self._create_row_from_value(value)
  70.     self.model.append(row)
  71.  
  72.   def _model_clear(self):
  73.     if not self.model:
  74.       return
  75.  
  76.     self.model.clear()
  77.  
  78.   def _model_del(self, key):
  79.     if not self.model:
  80.       return
  81.  
  82.     treeIter = self.model.get_iter(key)
  83.     self.model.remove(treeIter)
  84.  
  85.   def _model_set(self, key, value):
  86.     if not self.model:
  87.       return
  88.  
  89.     row = self._create_row_from_value(value)
  90.     self.model[key] = row
  91.  
  92.   def _create_row_from_value(self, value):
  93.     raise NotImplementedError("Subclass must implement abstract method")
  94.  
  95. class TreeWrapper(ListWrapper):
  96.   def _model_append(self, value):
  97.     if not self.model:
  98.       return
  99.  
  100.     row = self._create_row_from_value(value)
  101.     self.model.append(None, row)
  102.  
  103. def response_to_dialog(entry, dialog, response):
  104.   dialog.response(response)
  105.  
  106. def input_size(prompt, default=None):
  107.   dialog = gtk.MessageDialog(None,
  108.       gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
  109.       gtk.MESSAGE_QUESTION,
  110.       gtk.BUTTONS_OK_CANCEL,
  111.       None)
  112.  
  113.   dialog.set_markup(prompt)
  114.  
  115.   hBox = gtk.HBox()
  116.  
  117.   dialog.vbox.pack_end(hBox, True, True, 0)
  118.  
  119.   spinButton = gtk.SpinButton(None)
  120.   spinButton.connect('activate', response_to_dialog, dialog, gtk.RESPONSE_OK)
  121.  
  122.   spinButton.set_increments(1, 10)
  123.   spinButton.set_range(0, 1024)
  124.  
  125.   hBox.pack_start(spinButton, True, True, 0)
  126.  
  127.   comboBox = gtk.combo_box_new_text()
  128.  
  129.   comboBox.append_text("B")
  130.   comboBox.append_text("KB")
  131.   comboBox.append_text("MB")
  132.   comboBox.append_text("GB")
  133.   comboBox.append_text("TB")
  134.   comboBox.append_text("PB")
  135.  
  136.   hBox.pack_end(comboBox, False, False, 0)
  137.  
  138.   if default:
  139.     value, units = default.split()
  140.  
  141.     spinButton.set_value(float(value))
  142.  
  143.     model = comboBox.get_model()
  144.     modelUnits = [row[0] for row in model]
  145.     index = modelUnits.index(units)
  146.     comboBox.set_active(index)
  147.  
  148.   dialog.show_all()
  149.   response = dialog.run()
  150.  
  151.   value = spinButton.get_value_as_int()
  152.  
  153.   model = comboBox.get_model()
  154.   active = comboBox.get_active()
  155.   (units,) = model[active]
  156.  
  157.   dialog.destroy()
  158.  
  159.   return "%d %s" % (value, units) if response == gtk.RESPONSE_OK else None
  160.  
  161. def input_time(prompt, default=None):
  162.   dialog = gtk.MessageDialog(None,
  163.       gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
  164.       gtk.MESSAGE_QUESTION,
  165.       gtk.BUTTONS_OK_CANCEL,
  166.       None)
  167.  
  168.   dialog.set_markup(prompt)
  169.  
  170.   hBox = gtk.HBox()
  171.  
  172.   dialog.vbox.pack_end(hBox, True, True, 0)
  173.  
  174.   spinButton = gtk.SpinButton(None)
  175.   spinButton.connect('activate', response_to_dialog, dialog, gtk.RESPONSE_OK)
  176.  
  177.   spinButton.set_increments(1, 10)
  178.   spinButton.set_range(0, 1024)
  179.  
  180.   hBox.pack_start(spinButton, True, True, 0)
  181.  
  182.   comboBox = gtk.combo_box_new_text()
  183.  
  184.   comboBox.append_text("seconds")
  185.   comboBox.append_text("minutes")
  186.   comboBox.append_text("hours")
  187.   comboBox.append_text("days")
  188.  
  189.   hBox.pack_end(comboBox, False, False, 0)
  190.  
  191.   if default:
  192.     if default[-1:] != 's':
  193.       default = default + 's'
  194.  
  195.     value, units = default.split()
  196.  
  197.     spinButton.set_value(float(value))
  198.  
  199.     model = comboBox.get_model()
  200.     modelUnits = [row[0] for row in model]
  201.     index = modelUnits.index(units)
  202.     comboBox.set_active(index)
  203.  
  204.   dialog.show_all()
  205.   response = dialog.run()
  206.  
  207.   value = spinButton.get_value_as_int()
  208.  
  209.   model = comboBox.get_model()
  210.   active = comboBox.get_active()
  211.   (units,) = model[active]
  212.  
  213.   dialog.destroy()
  214.  
  215.   return "%d %s" % (value, units) if response == gtk.RESPONSE_OK else None
  216.  
  217. def input_int(prompt, default=None, csvResponse=False):
  218.   dialog = gtk.MessageDialog(None,
  219.       gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
  220.       gtk.MESSAGE_QUESTION,
  221.       gtk.BUTTONS_OK_CANCEL,
  222.       None)
  223.  
  224.   dialog.set_markup(prompt)
  225.  
  226.   spinButton = gtk.SpinButton(None)
  227.   spinButton.connect('activate', response_to_dialog, dialog, gtk.RESPONSE_OK)
  228.  
  229.   spinButton.set_increments(1, 10)
  230.   spinButton.set_range(0, 65535)
  231.  
  232.   dialog.vbox.pack_end(spinButton, True, True, 0)
  233.  
  234.   if default:
  235.     spinButton.set_value(float(default))
  236.  
  237.   dialog.show_all()
  238.   response = dialog.run()
  239.  
  240.   value = spinButton.get_value_as_int()
  241.  
  242.   dialog.destroy()
  243.  
  244.   return "%d" % (value) if response == gtk.RESPONSE_OK else None
  245.  
  246. def input_string(prompt, default=None):
  247.   dialog = gtk.MessageDialog(None,
  248.       gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
  249.       gtk.MESSAGE_QUESTION,
  250.       gtk.BUTTONS_OK_CANCEL,
  251.       None)
  252.  
  253.   dialog.set_markup(prompt)
  254.  
  255.   entry = gtk.Entry()
  256.   entry.connect('activate', response_to_dialog, dialog, gtk.RESPONSE_OK)
  257.  
  258.   dialog.vbox.pack_end(entry, True, True, 0)
  259.  
  260.   if default:
  261.     entry.set_text(default)
  262.  
  263.   dialog.show_all()
  264.   response = dialog.run()
  265.  
  266.   text = entry.get_text()
  267.   dialog.destroy()
  268.  
  269.   return text if response == gtk.RESPONSE_OK else None
  270.  
  271. def input_list(prompt, default, csv=False):
  272.   def on_add_button_clicked(widget, listStore):
  273.     newValue = input_string("Enter new value:")
  274.  
  275.     if newValue:
  276.       row = (newValue,)
  277.       listStore.append(row)
  278.  
  279.   def on_delete_button_clicked(widget, treeView):
  280.     selection = treeView.get_selection()
  281.     model, selectionIter = selection.get_selected()
  282.  
  283.     if (selectionIter):
  284.       model.remove(selectionIter)
  285.  
  286.   dialog = gtk.MessageDialog(None,
  287.       gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
  288.       gtk.MESSAGE_QUESTION,
  289.       gtk.BUTTONS_OK_CANCEL,
  290.       None)
  291.  
  292.   dialog.set_markup(prompt)
  293.  
  294.   hBox = gtk.HBox()
  295.  
  296.   dialog.vbox.pack_start(hBox, False, False, 0)
  297.  
  298.   addButton = gtk.Button(stock=gtk.STOCK_ADD)
  299.  
  300.   hBox.pack_start(addButton, False, False, 0)
  301.  
  302.   deleteButton = gtk.Button(stock=gtk.STOCK_DELETE)
  303.  
  304.   hBox.pack_start(deleteButton, False, False, 0)
  305.  
  306.   scrolledWindow = gtk.ScrolledWindow()
  307.  
  308.   dialog.vbox.pack_end(scrolledWindow, True, True, 0)
  309.  
  310.   listStore = gtk.ListStore(str)
  311.   treeView = gtk.TreeView(listStore)
  312.   treeViewColumn = gtk.TreeViewColumn("Value")
  313.   cellRenderer = gtk.CellRendererText()
  314.  
  315.   treeViewColumn.pack_start(cellRenderer, True)
  316.   treeViewColumn.add_attribute(cellRenderer, 'text', 0)
  317.   treeView.append_column(treeViewColumn)
  318.  
  319.   scrolledWindow.add(treeView)
  320.  
  321.   addButton.connect('clicked', on_add_button_clicked, listStore)
  322.   deleteButton.connect('clicked', on_delete_button_clicked, treeView)
  323.  
  324.   separator = "," if csv else " "
  325.   if default:
  326.     for value in default.split(separator):
  327.       row = (value,)
  328.       listStore.append(row)
  329.  
  330.   dialog.show_all()
  331.   response = dialog.run()
  332.  
  333.   dialog.destroy()
  334.  
  335.   if not response == gtk.RESPONSE_OK:
  336.     return
  337.  
  338.   return None if len(listStore) == 0 else separator.join([row[0] for row in listStore])
  339.  
  340. def input_bool(prompt, default=None):
  341.   dialog = gtk.MessageDialog(None,
  342.       gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
  343.       gtk.MESSAGE_QUESTION,
  344.       gtk.BUTTONS_OK_CANCEL,
  345.       None)
  346.  
  347.   dialog.set_markup(prompt)
  348.  
  349.   hbox = gtk.HBox()
  350.   buttonTrue = gtk.RadioButton(None, "True")
  351.   buttonFalse = gtk.RadioButton(buttonTrue, "False")
  352.   hbox.pack_start(buttonTrue, True, True, 0)
  353.   hbox.pack_start(buttonFalse, True, True, 0)
  354.  
  355.   dialog.vbox.pack_end(hbox, True, True, 0)
  356.  
  357.   if not default == None:
  358.     if default == 'True':
  359.       buttonTrue.set_active(True)
  360.     elif default == 'False':
  361.       buttonFalse.set_active(True)
  362.  
  363.   dialog.show_all()
  364.   response = dialog.run()
  365.  
  366.   choice = None
  367.  
  368.   if buttonTrue.get_active():
  369.     choice = True
  370.   elif buttonFalse.get_active():
  371.     choice = False
  372.  
  373.   dialog.destroy()
  374.  
  375.   return choice if response == gtk.RESPONSE_OK else None
  376.  
  377. def input_dir(prompt, default):
  378.   dialog = gtk.FileChooserDialog(prompt,
  379.                                None,
  380.                                gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
  381.                                (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
  382.                                 gtk.STOCK_OPEN, gtk.RESPONSE_OK))
  383.   dialog.set_default_response(gtk.RESPONSE_OK)
  384.  
  385.   if default:
  386.     dialog.set_filename(default)
  387.  
  388.   dialog.show_all()
  389.   response = dialog.run()
  390.  
  391.   filename = dialog.get_filename()
  392.  
  393.   dialog.destroy()
  394.  
  395.   return filename if response == gtk.RESPONSE_OK else None
  396.  
  397. def input_filename(prompt, default):
  398.   dialog = gtk.FileChooserDialog(prompt,
  399.                                None,
  400.                                gtk.FILE_CHOOSER_ACTION_SAVE,
  401.                                (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
  402.                                 gtk.STOCK_OPEN, gtk.RESPONSE_OK))
  403.   dialog.set_default_response(gtk.RESPONSE_OK)
  404.  
  405.   if default:
  406.     dialog.set_filename(default)
  407.  
  408.   dialog.show_all()
  409.   response = dialog.run()
  410.  
  411.   filename = dialog.get_filename()
  412.  
  413.   dialog.destroy()
  414.  
  415.   return filename if response == gtk.RESPONSE_OK else None
  416.  
  417. def showError(msg):
  418.   dialog = gtk.MessageDialog(None,
  419.       gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
  420.       gtk.MESSAGE_ERROR,
  421.       gtk.BUTTONS_OK,
  422.       msg)
  423.  
  424.   dialog.run()
  425.   dialog.destroy()
  426.  
  427.