blob: fe670bfca3c73e8f628e42b26913bf8bbd2a090c [file] [log] [blame]
import pygtk
import gtk
from tuna import tuna, gui
import os, shutil
class profileview:
def on_loadProfileButton_clicked(self, button):
self.dialog = gtk.FileChooserDialog("Open...", None,
gtk.FILE_CHOOSER_ACTION_OPEN, (gtk.STOCK_CANCEL,
gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK))
self.dialog.set_default_response(gtk.RESPONSE_OK)
filter = gtk.FileFilter()
filter.set_name("All files")
filter.add_pattern("*")
self.dialog.add_filter(filter)
self.dialog.set_current_folder(self.config.config["root"])
self.response = self.dialog.run()
if self.response == gtk.RESPONSE_OK:
self.addFile(self.dialog.get_filename())
self.setProfileFileList()
self.dialog.destroy()
def setWtree(self, wtree):
self.configFileTree = wtree.get_widget("profileTree")
self.profileContent = wtree.get_widget("profileContent")
self.configFileCombo = wtree.get_widget("profileSelector")
self.profileDescription = wtree.get_widget("profileDescriptionText")
self.frame = wtree.get_widget("TunableFramesw")
def setProfileFileList(self):
self.clearConfig()
for val in self.config.populate():
self.addConfig(val)
return True
def addFile(self,value):
try:
if os.path.isfile(value):
tmp = value.rfind("/")
shutil.copy(value, self.config.config['root']+value[tmp:len(value)])
self.setProfileFileList()
self.config.load(value[tmp:len(value)])
except Exception as e:
self.show_mbox_warning(str(e))
def updateProfileContent(self):
try:
self.config.cache
except:
self.config.cache = ""
self.profileContentBuffer = self.profileContent.get_buffer()
self.profileContentBuffer.set_text(self.config.cache)
def clearConfig(self):
try:
self.config_store.clear()
self.combo_store.clear()
except:
pass
def addConfig(self,config):
if not self.configFileTree or not self.configFileCombo:
return False
try:
self.configs
self.configFileCombo
except AttributeError:
self.config_store = gtk.ListStore(str)
self.configs = self.configFileTree
self.configFileTree.append_column(gtk.TreeViewColumn('Profile Name', gtk.CellRendererText(), text=0))
self.configHandler = self.configs.connect('cursor_changed', self.changeProfile)
self.configs.set_model(self.config_store)
self.combo_store = gtk.ListStore(str)
self.configFileCombo.set_model(self.combo_store)
cell = gtk.CellRendererText()
self.configFileCombo.pack_start(cell, True)
self.configFileCombo.add_attribute(cell, "text", 0)
self.config_store.append([config])
self.configs.show()
self.combo_store.append([config])
self.configFileCombo.show()
def changeProfile(self,config):
try:
f = open(self.config.config['root']+self.config.cacheFileName, 'r')
temp = f.read()
f.close()
self.profileContentBuffer = self.profileContent.get_buffer()
buff = self.profileContentBuffer.get_text(self.profileContentBuffer.get_start_iter(),self.profileContentBuffer.get_end_iter())
if temp != buff:
dialog = gtk.MessageDialog(None,
gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
gtk.MESSAGE_WARNING,
gtk.BUTTONS_YES_NO,
"%s\n\n%s\n%s" % \
(_("Config file was changed!"),
_("All changes will be lost"),
_("Realy continue?"),))
ret = dialog.run()
dialog.destroy()
if ret == gtk.RESPONSE_NO:
old = self.config.cacheFileName.rfind("/")
old = self.config.cacheFileName[old+1:len(self.config.cacheFileName)]
self.set_current_tree_selection(old)
return False
except IOError as e:
pass
currentFile = self.get_current_tree_selection()
self.config.fileToCache(currentFile)
self.updateProfileContent()
self.profileDescription.set_text(self.config.description)
def on_SaveButton_clicked(self, widget):
try:
self.profileContentBuffer = self.profileContent.get_buffer()
self.config.cache = self.profileContentBuffer.get_text(self.profileContentBuffer.get_start_iter(),self.profileContentBuffer.get_end_iter())
self.config.cacheToFile(self.config.cacheFileName)
except IOError as e:
self.show_mbox_warning(_("Cannot write to config file: %s") % (self.config.cacheFileName))
def on_UpdateButton_clicked(self, widget):
self.profileContentBuffer = self.profileContent.get_buffer()
self.temp = self.profileContentBuffer.get_text(self.profileContentBuffer.get_start_iter(),self.profileContentBuffer.get_end_iter())
try:
if not self.config.loadDirect(self.temp):
self.commonview.updateCommonView()
self.config.updateDefault(self.config.cacheFileName)
self.frame.show()
else:
self.frame.hide()
except RuntimeError as e:
self.show_mbox_warning(str(e))
self.frame.hide()
def init_default_file(self):
self.setProfileFileList()
try:
if 'lastfile' in self.config.config and \
not self.config.load(self.config.config['lastfile']):
cur = self.configFileTree.get_model()
for val in cur:
if val[0] == self.config.config['lastfile']:
self.configFileTree.set_cursor(val.path[0])
self.commonview.updateCommonView()
self.frame.show()
else:
self.frame.hide()
except RuntimeError as e:
dialog = gtk.MessageDialog(None,
gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
gtk.MESSAGE_WARNING, gtk.BUTTONS_YES_NO,
_("%s\nRun autocorect?") % _(str(e)))
dlgret = dialog.run()
dialog.destroy()
if dlgret == gtk.RESPONSE_YES:
if 'lastfile' in self.config.config:
self.config.fixConfigFile(self.config.config['root'] + self.config.config['lastfile'])
err = self.config.checkConfigFile(self.config.config['root'] + self.config.config['lastfile'])
if err != '':
self.show_mbox_warning(_("Default %s" % str(err)))
self.frame.hide()
else:
self.init_default_file()
else:
self.frame.hide()
else:
self.frame.hide()
def on_profileTree_button_press_event(self, treeview, event):
if event.button == 3:
x = int(event.x)
y = int(event.y)
time = event.time
pthinfo = treeview.get_path_at_pos(x, y)
if pthinfo is not None:
path, col, cellx, celly = pthinfo
treeview.grab_focus()
treeview.set_cursor( path, col, 0)
context = gtk.Menu()
item = gtk.ImageMenuItem(_("New profile"))
item.connect("activate", self.on_menu_new)
img = gtk.image_new_from_stock(gtk.STOCK_NEW, gtk.ICON_SIZE_MENU)
img.show()
item.set_image(img)
context.append(item)
item = gtk.ImageMenuItem(_("Rename"))
item.connect("activate", self.on_menu_rename)
img = gtk.image_new_from_stock(gtk.STOCK_FILE, gtk.ICON_SIZE_MENU)
img.show()
item.set_image(img)
context.append(item)
item = gtk.ImageMenuItem(_("Copy"))
item.connect("activate", self.on_menu_copy)
img = gtk.image_new_from_stock(gtk.STOCK_COPY, gtk.ICON_SIZE_MENU)
img.show()
item.set_image(img)
context.append(item)
item = gtk.ImageMenuItem(_("Delete"))
item.connect("activate", self.on_menu_delete)
img = gtk.image_new_from_stock(gtk.STOCK_DELETE, gtk.ICON_SIZE_MENU)
img.show()
item.set_image(img)
context.append(item)
item = gtk.ImageMenuItem(_("Check"))
item.connect("activate", self.on_menu_check)
img = gtk.image_new_from_stock(gtk.STOCK_SPELL_CHECK, gtk.ICON_SIZE_MENU)
img.show()
item.set_image(img)
context.append(item)
context.show_all()
context.popup(None, None, None, event.button, time)
return True
def get_current_tree_selection(self):
selection = self.configFileTree.get_selection()
tree_model, tree_iter = selection.get_selected()
return tree_model.get_value(tree_iter, 0)
def set_current_tree_selection(self, string):
cur = self.configFileTree.get_model()
for val in cur:
if val[0] == string:
self.configFileTree.set_cursor(val.path[0])
return True
return False
def on_menu_new(self, widget):
filename = self.get_text_dialog(_("Please enter new filename"),"empty.conf")
if(filename == None or filename == "" or os.path.exists(self.config.config['root']+filename)):
self.show_mbox_warning(_("Bad or empty filename %s" % _(filename)))
return False
else:
try:
f = open(self.config.config['root'] + filename, 'w')
f.write("#List of enabled categories\n")
f.write("[categories]\n")
f.write("#format:\n")
f.write("# category_identifier=Category Name\n")
f.write("\n")
f.write("#[category_identifier]\n")
f.write("#value.name=default\n")
f.write("#value.name=slider_min,slider_max,default\n")
f.write("\n")
f.write("#[guiAlias]\n")
f.write("#value.name=Alias\n")
f.write("\n")
f.write("#[fileDescription]\n")
f.write("#text=Description of this profile\n")
f.write("\n")
f.close()
if self.setProfileFileList():
self.set_current_tree_selection(filename)
self.frame.hide()
except IOError as io:
self.show_mbox_warning(str(io))
return True
def on_menu_check(self, widget):
filename = self.get_current_tree_selection()
err = self.config.checkConfigFile(self.config.config['root']+filename)
if err != '':
self.show_mbox_warning("%s\n%s" % (_("Config file contain errors:"), _(err)))
return False
else:
dialog = gtk.MessageDialog(None, 0, gtk.MESSAGE_INFO,\
gtk.BUTTONS_OK, "%s\n" % (_("Config file looks OK")))
ret = dialog.run()
dialog.destroy()
self.set_current_tree_selection(filename)
return True
def on_menu_rename(self, widget):
old_filename = self.get_current_tree_selection()
new_filename = self.get_text_dialog(_("Please enter new name for %s" % (old_filename)), old_filename)
if(new_filename == None or new_filename == ""):
self.show_mbox_warning(_("Bad or empty filename %s" % _(new_filename)))
return False
else:
try:
os.rename(self.config.config['root'] + old_filename, self.config.config['root'] + new_filename)
if self.setProfileFileList():
self.set_current_tree_selection(new_filename)
if self.config.checkConfigFile(self.config.config['root'] + new_filename) == '':
self.commonview.updateCommonView()
else:
self.frame.hide()
except OSError as io:
self.show_mbox_warning(str(io))
return True
def on_menu_copy(self, widget):
old_filename = self.get_current_tree_selection()
new_filename = self.get_text_dialog(_("Please enter name for new file"), old_filename)
if(new_filename == None or new_filename == ""):
self.show_mbox_warning(_("Bad or empty filename %s" % _(new_filename)))
return False
else:
try:
shutil.copy2(self.config.config['root']+old_filename, self.config.config['root']+new_filename)
except (shutil.Error, IOError) as e:
self.show_mbox_warning(str(e))
if self.setProfileFileList():
self.set_current_tree_selection(new_filename)
if self.config.checkConfigFile(self.config.config['root'] + new_filename) == '':
self.commonview.updateCommonView()
else:
self.frame.hide()
return True
def on_menu_delete(self, widget):
filename = self.get_current_tree_selection()
dialog = gtk.MessageDialog(None,
gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
gtk.MESSAGE_WARNING, gtk.BUTTONS_YES_NO,
_("Profile %s will be deleted!\nReally?" % (filename)))
ret = dialog.run()
dialog.destroy()
if ret == gtk.RESPONSE_YES:
try:
os.unlink(self.config.config['root'] + filename)
except OSError as oe:
self.show_mbox_warning(str(oe))
return False
if self.setProfileFileList():
self.configFileTree.set_cursor(0)
currentFile = self.get_current_tree_selection()
if self.config.checkConfigFile(self.config.config['root'] + currentFile) == '':
self.commonview.updateCommonView()
return True
else:
self.frame.hide()
return False
def get_text_dialog(self, message, default=''):
d = gtk.MessageDialog(None,
gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
gtk.MESSAGE_QUESTION,
gtk.BUTTONS_OK_CANCEL,
message)
entry = gtk.Entry()
entry.set_text(default)
entry.show()
d.vbox.pack_end(entry)
entry.connect('activate', lambda _: d.response(gtk.RESPONSE_OK))
d.set_default_response(gtk.RESPONSE_OK)
r = d.run()
text = entry.get_text().decode('utf8')
d.destroy()
if r == gtk.RESPONSE_OK:
return text
else:
return None
def show_mbox_warning(self, message):
dialog = gtk.MessageDialog(None,
gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
gtk.MESSAGE_WARNING, gtk.BUTTONS_OK, _((str(message))))
ret = dialog.run()
dialog.destroy()