home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2007 September / PCWSEP07.iso / Software / Linux / Linux Mint 3.0 Light / LinuxMint-3.0-Light.iso / casper / filesystem.squashfs / usr / share / onboard / settings.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2007-04-29  |  12.2 KB  |  321 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. import gtk
  5. import gtk.glade as gtk
  6. import gconf
  7. import gobject
  8. from virtkey import virtkey
  9. from sok import Sok
  10. import shutil
  11. from utils import *
  12. from xml.parsers.expat import ExpatError
  13. import os
  14. import os.path as os
  15. import gettext
  16. app = 'onboard-settings'
  17. gettext.textdomain(app)
  18. gettext.bindtextdomain(app)
  19. gtk.glade.textdomain(app)
  20. gtk.glade.bindtextdomain(app)
  21.  
  22. class Settings:
  23.     
  24.     def __init__(self, mainwin):
  25.         self.SOK_INSTALL_DIR = os.path.dirname(os.path.abspath(__file__))
  26.         self.gladeXML = gtk.glade.XML(os.path.join(self.SOK_INSTALL_DIR, 'settings.glade'))
  27.         self.window = self.gladeXML.get_widget('settingsWindow')
  28.         self.gladeXML.signal_autoconnect({
  29.             'on_layoutView_released': self.do_change_layout,
  30.             'on_addButton_clicked': self.add_sok,
  31.             'on_removeButton_clicked': self.cb_removeButton_clicked,
  32.             'on_macroAddButton_clicked': self.add_macro,
  33.             'on_closeButton_clicked': self.cb_closeButton_clicked,
  34.             'on_intervalSpin_value_changed': self.cb_intervalSpin_value_changed,
  35.             'on_scanningCheck_toggled': self.cb_scanningCheck_toggled,
  36.             'on_closeButton_clicked': gtk.main_quit,
  37.             'on_personaliseButton_clicked': self.cb_on_personaliseButton_clicked,
  38.             'on_layoutFolderButton_clicked': self.cb_layoutFolderButton_clicked,
  39.             'on_icon_toggled': self.cb_icon_toggled })
  40.         self.layoutView = self.gladeXML.get_widget('layoutView')
  41.         self.macroNumberBox = self.gladeXML.get_widget('macroNumberBox')
  42.         self.macroTextBox = self.gladeXML.get_widget('macroTextBox')
  43.         self.macroDeleteBox = self.gladeXML.get_widget('macroDeleteBox')
  44.         self.gconfClient = gconf.client_get_default()
  45.         self.layoutView.append_column(gtk.TreeViewColumn(None, gtk.CellRendererText(), markup = 0))
  46.         self.user_layout_root = '%s/.sok/layouts/' % os.path.expanduser('~')
  47.         if not os.path.exists(self.user_layout_root):
  48.             os.makedirs(self.user_layout_root)
  49.         
  50.         self.update_layoutList()
  51.         self.on_macros_changed()
  52.         self.gladeXML.get_widget('icon_toggle').set_active(self.gconfClient.get_bool('/apps/sok/trayicon'))
  53.         scanEnabled = self.gconfClient.get_bool('/apps/sok/scanning')
  54.         if scanEnabled:
  55.             self.gladeXML.get_widget('scanningCheck').set_active(True)
  56.         
  57.         scanInterval = self.gconfClient.get_int('/apps/sok/scanning_interval')
  58.         if scanInterval:
  59.             self.gladeXML.get_widget('intervalSpin').set_value(float(scanInterval) / 1000)
  60.         
  61.         self.window.show()
  62.         self.window.set_keep_above(not mainwin)
  63.         self.window.connect('destroy', gtk.main_quit)
  64.         gtk.main()
  65.  
  66.     
  67.     def on_macros_changed(self, client = None, cxion_id = None, entry = None, user_data = None):
  68.         tempMacroList = self.gconfClient.get_list('/apps/sok/macros', gconf.VALUE_STRING)
  69.         self.macroNumbers = []
  70.         for child in self.macroNumberBox.get_children():
  71.             if child.__class__ is gtk.Entry:
  72.                 self.macroNumberBox.remove(child)
  73.                 continue
  74.         
  75.         for child in self.macroTextBox.get_children():
  76.             if child.__class__ is gtk.Entry:
  77.                 self.macroTextBox.remove(child)
  78.                 continue
  79.         
  80.         for child in self.macroDeleteBox.get_children():
  81.             if child.__class__ is gtk.Button:
  82.                 self.macroDeleteBox.remove(child)
  83.                 continue
  84.         
  85.         for n in range(len(tempMacroList)):
  86.             macroStr = tempMacroList[n]
  87.             if macroStr:
  88.                 self.macroNumbers.append(n)
  89.                 numberEntry = gtk.Entry()
  90.                 numberEntry.set_text(str(n))
  91.                 numberEntry.connect('activate', self.cb_macro_numberEntry_activate, n)
  92.                 numberEntry.set_size_request(5, 30)
  93.                 self.macroNumberBox.pack_start(numberEntry, False, False, 5)
  94.                 numberEntry.show()
  95.                 textEntry = gtk.Entry()
  96.                 textEntry.set_text(macroStr)
  97.                 textEntry.connect('activate', self.cb_macro_textEntry_activate, n)
  98.                 textEntry.set_size_request(-1, 30)
  99.                 self.macroTextBox.pack_start(textEntry, False, False, 5)
  100.                 textEntry.show()
  101.                 deleteButton = gtk.Button(stock = gtk.STOCK_DELETE)
  102.                 deleteButton.connect('clicked', self.cb_macro_deleteButton_clicked, n)
  103.                 self.macroDeleteBox.pack_start(deleteButton, False, False, 5)
  104.                 deleteButton.show()
  105.                 continue
  106.         
  107.  
  108.     
  109.     def cb_macro_numberEntry_activate(self, widget, currentNumber):
  110.         newNo = int(widget.get_text())
  111.         if newNo not in self.macroNumbers:
  112.             li = self.gconfClient.get_list('/apps/sok/macros', gconf.VALUE_STRING)
  113.             if newNo > len(li) - 1:
  114.                 for n in range(len(li) - newNo - 1):
  115.                     li.append('')
  116.                 
  117.             
  118.             text = li[currentNumber]
  119.             li[currentNumber] = ''
  120.             li[newNo] = text
  121.             self.gconfClient.set_list('/apps/sok/macros', gconf.VALUE_STRING, li)
  122.             self.on_macros_changed()
  123.         else:
  124.             dialog = gtk.MessageDialog(self.window, type = gtk.MESSAGE_WARNING, buttons = gtk.BUTTONS_OK, message_format = 'Snippit already assigned to this number')
  125.             dialog.run()
  126.             widget.set_text(str(currentNumber))
  127.             dialog.destroy()
  128.  
  129.     
  130.     def cb_macro_textEntry_activate(self, widget, currentNumber):
  131.         li = self.gconfClient.get_list('/apps/sok/macros', gconf.VALUE_STRING)
  132.         li[currentNumber] = widget.get_text()
  133.         self.gconfClient.set_list('/apps/sok/macros', gconf.VALUE_STRING, li)
  134.         self.on_macros_changed()
  135.  
  136.     
  137.     def cb_macro_deleteButton_clicked(self, widget, currentNumber):
  138.         li = self.gconfClient.get_list('/apps/sok/macros', gconf.VALUE_STRING)
  139.         li[currentNumber] = ''
  140.         self.gconfClient.set_list('/apps/sok/macros', gconf.VALUE_STRING, li)
  141.         self.on_macros_changed()
  142.  
  143.     
  144.     def cb_icon_toggled(self, widget):
  145.         self.gconfClient.set_bool('/apps/sok/trayicon', widget.get_active())
  146.  
  147.     
  148.     def open_user_layout_dir(self):
  149.         if os.path.exists('/usr/bin/nautilus'):
  150.             os.system('nautilus --no-desktop %s' % self.user_layout_root)
  151.         elif os.path.exists('/usr/bin/thunar'):
  152.             os.system('thunar %s' % self.user_layout_root)
  153.         else:
  154.             print 'No file manager to open layout folder'
  155.  
  156.     
  157.     def cb_layoutFolderButton_clicked(self, widget):
  158.         self.open_user_layout_dir()
  159.  
  160.     
  161.     def cb_on_personaliseButton_clicked(self, widget):
  162.         dialog = MacroDialog(self.window, 'Enter name for personalised layout')
  163.         dialog.show_all()
  164.         response = dialog.run()
  165.         if response == gtk.RESPONSE_OK:
  166.             text = dialog.macroEntry.get_text()
  167.             s = Sok()
  168.             create_default_layout_XML(text, virtkey(), s)
  169.             s.clean()
  170.             self.update_layoutList()
  171.             self.open_user_layout_dir()
  172.         
  173.         dialog.destroy()
  174.  
  175.     
  176.     def cb_scanningCheck_toggled(self, widget):
  177.         self.gconfClient.set_bool('/apps/sok/scanning', widget.get_active())
  178.  
  179.     
  180.     def cb_intervalSpin_value_changed(self, widget):
  181.         self.gconfClient.set_int('/apps/sok/scanning_interval', int(widget.get_value() * 1000))
  182.  
  183.     
  184.     def cb_closeButton_clicked(self, widget):
  185.         self.window.destroy()
  186.  
  187.     
  188.     def update_layoutList(self):
  189.         self.layoutList = gtk.ListStore(str, str)
  190.         self.layoutView.set_model(self.layoutList)
  191.         it = self.layoutList.append(('Default', ''))
  192.         self.layoutView.get_selection().select_iter(it)
  193.         self.get_soks(os.path.join(self.SOK_INSTALL_DIR, 'layouts'))
  194.         self.get_soks(self.user_layout_root)
  195.  
  196.     
  197.     def cb_selected_layout_changed(self):
  198.         self.get_soks(self.user_layout_root)
  199.  
  200.     
  201.     def cb_macroList_drag_drop(self, widget, event, thing1, thing2, thing3):
  202.         gobject.idle_add(self.macroList_changed)
  203.  
  204.     
  205.     def add_macro(self, event):
  206.         dialog = MacroDialog(self.window, 'Enter text for snippit')
  207.         dialog.show_all()
  208.         response = dialog.run()
  209.         if response == gtk.RESPONSE_OK:
  210.             text = dialog.macroEntry.get_text()
  211.             l = self.gconfClient.get_list('/apps/sok/macros', gconf.VALUE_STRING)
  212.             if self.macroNumbers:
  213.                 if len(l) <= self.macroNumbers[-1] + 1:
  214.                     l.append(text)
  215.                 else:
  216.                     l[self.macroNumbers[-1] + 1] = text
  217.             else:
  218.                 l.append(text)
  219.             self.gconfClient.set_list('/apps/sok/macros', gconf.VALUE_STRING, l)
  220.         
  221.         dialog.destroy()
  222.         self.on_macros_changed()
  223.  
  224.     
  225.     def add_sok(self, event):
  226.         chooser = gtk.FileChooserDialog(title = None, action = gtk.FILE_CHOOSER_ACTION_OPEN, buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK))
  227.         filterer = gtk.FileFilter()
  228.         filterer.add_pattern('*.sok')
  229.         chooser.add_filter(filterer)
  230.         response = chooser.run()
  231.         if response == gtk.RESPONSE_OK:
  232.             filename = chooser.get_filename()
  233.             f = open(filename)
  234.             sokdoc = minidom.parse(f).documentElement
  235.             for p in sokdoc.getElementsByTagName('pane'):
  236.                 fn = p.attributes['filename'].value
  237.                 shutil.copyfile('%s/%s' % (os.path.dirname(filename), fn), '%s%s' % (self.user_layout_root, fn))
  238.             
  239.             shutil.copyfile(filename, '%s%s' % (self.user_layout_root, os.path.basename(filename)))
  240.             self.update_layoutList()
  241.         
  242.         chooser.destroy()
  243.  
  244.     
  245.     def cb_removeButton_clicked(self, event):
  246.         filename = self.layoutList.get_value(self.layoutView.get_selection().get_selected()[1], 1)
  247.         f = open(filename)
  248.         sokdoc = minidom.parse(f).documentElement
  249.         f.close()
  250.         os.remove(filename)
  251.         for p in sokdoc.getElementsByTagName('pane'):
  252.             os.remove('%s/%s' % (os.path.dirname(filename), p.attributes['filename'].value))
  253.         
  254.         self.gconfClient.set_string('/apps/sok/layout_filename', '')
  255.         self.update_layoutList()
  256.  
  257.     
  258.     def get_soks(self, path):
  259.         files = os.listdir(path)
  260.         soks = []
  261.         for f in files:
  262.             if f[-4:] == '.sok':
  263.                 filename = '%s/%s' % (path, f)
  264.                 theActualFile = open(filename)
  265.                 
  266.                 try:
  267.                     sokdoc = minidom.parse(theActualFile).documentElement
  268.                     if os.access(filename, os.W_OK):
  269.                         it = self.layoutList.append(('<i>%s</i>' % sokdoc.attributes['id'].value, filename))
  270.                     else:
  271.                         it = self.layoutList.append((sokdoc.attributes['id'].value, filename))
  272.                     if filename == self.gconfClient.get_string('/apps/sok/layout_filename'):
  273.                         self.layoutView.get_selection().select_iter(it)
  274.                 except ExpatError:
  275.                     strerror = None
  276.                     print 'XML in %s %s' % (filename, strerror)
  277.                 except KeyError:
  278.                     strerror = None
  279.                     print 'key %s required in %s' % (strerror, filename)
  280.  
  281.                 theActualFile.close()
  282.                 continue
  283.         
  284.  
  285.     
  286.     def find_soks(self, path):
  287.         files = os.listdir(path)
  288.         soks = []
  289.         for f in files:
  290.             if f[-4:] == '.sok':
  291.                 soks.append(f)
  292.                 continue
  293.         
  294.         return soks
  295.  
  296.     
  297.     def do_change_layout(self, widget, event):
  298.         filename = self.layoutList.get_value(widget.get_selection().get_selected()[1], 1)
  299.         self.gconfClient.set_string('/apps/sok/layout_filename', filename)
  300.  
  301.  
  302.  
  303. class MacroDialog(gtk.MessageDialog):
  304.     
  305.     def __init__(self, parent, message):
  306.         gtk.MessageDialog.__init__(self, parent, gtk.MESSAGE_QUESTION)
  307.         self.add_buttons(gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
  308.         self.macroEntry = gtk.Entry()
  309.         self.macroEntry.connect('activate', self.cb_macroEntry_activated)
  310.         self.vbox.pack_end(self.macroEntry)
  311.         self.set_markup(message)
  312.  
  313.     
  314.     def cb_macroEntry_activated(self, event):
  315.         self.response(gtk.RESPONSE_OK)
  316.  
  317.  
  318. if __name__ == '__main__':
  319.     s = Settings(True)
  320.  
  321.