#! /usr/bin/env python
# -*- coding: utf-8 -*-
import functions
try:
import pygtk
pygtk.require("2.0")
except:
print("pygtk Not Availible")
sys.exit(1)
try:
import gtk
except:
print("GTK Not Availible")
sys.exit(1)
class EditVariable(object):
def delete_event(self, widget, event):
self.window.destroy()
def __init__(self, parent, variable):
# use parent translator
self._ = parent._
self.parent = parent
self.variable = variable
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.set_title(self._("variable_edit_format").format(self.parent.variable_liststore[variable][0]))
self.window.connect("delete_event", self.delete_event)
self.window.set_border_width(10)
self.window.set_transient_for(parent.window)
self.window.set_modal(True)
self.window.set_size_request(300, 240)
vb = gtk.VBox(False, spacing=10)
# variable name
hb = gtk.HBox(False)
lbl = gtk.Label(self._('variable_name'))
hb.pack_start(lbl, False, False)
self.variable_name_entry = gtk.Entry()
self.variable_name_entry.set_text(self.parent.variable_liststore[variable][0])
hb.pack_start(self.variable_name_entry, True, True)
vb.pack_start(hb, False, False)
# variable weight
hb = gtk.HBox(False)
lbl = gtk.Label(self._('variable_weight'))
hb.pack_start(lbl, False, False)
adj = gtk.Adjustment(value=self.parent.variable_liststore[variable][1], lower=0.0, upper=50.0, step_incr=0.01, page_incr=0.1)
self.variable_weight_spin = gtk.SpinButton(adj, digits=2)
hb.pack_start(self.variable_weight_spin, True, True)
vb.pack_start(hb, False, False)
# levels. treeview is editable
hb = gtk.HBox(False)
lbl = gtk.Label(self._('variable_levels'))
hb.pack_start(lbl, False, False)
vb.pack_start(hb, False, False)
hb = gtk.HBox(False)
self.levels_liststore, self.levels_treeview = functions.make_treeview(
(str,), [self._('level_name')],
editable=True, edit_handler=self.levels_cell_edited)
levels = self.parent.variable_liststore[variable][2].split(',')
for level in levels:
self.levels_liststore.append((level,))
functions.make_scrolling(self.levels_treeview, hb)
# buttons for adding and deleting levels
vbuttonbox = gtk.VButtonBox()
vbuttonbox.set_layout(gtk.BUTTONBOX_START)
button = gtk.Button(None, gtk.STOCK_ADD)
button.connect("clicked", self.level_add_button)
vbuttonbox.pack_start(button, False, False)
button = gtk.Button(None, gtk.STOCK_DELETE)
button.connect("clicked", self.level_delete_button)
vbuttonbox.pack_start(button, False, False)
hb.pack_start(vbuttonbox, False, False)
vb.pack_start(hb, False, False)
hb = gtk.HBox(False)
# button for saving the variables and cancle the changes
button = gtk.Button(None, gtk.STOCK_SAVE)
button.connect('clicked', self.save_clicked)
hb.pack_start(button, False, False)
button = gtk.Button(self._('reset'))
button.connect('clicked', self.reset_clicked)
hb.pack_start(button, False, False)
button = gtk.Button(None, gtk.STOCK_CANCEL)
button.connect('clicked', self.cancel_clicked)
hb.pack_start(button, False, False)
vb.pack_start(hb, False, False)
self.window.add(vb)
self.window.show_all()
def reset_clicked(self, widget, data=None):
# reset to the initial value taken from parent
self.variable_name_entry.set_text(self.parent.variable_liststore[self.variable][0])
self.variable_weight_spin.set_value(self.parent.variable_liststore[self.variable][1])
self.levels_liststore.clear()
levels = self.parent.variable_liststore[self.variable][2].split(',')
for level in levels:
self.levels_liststore.append((level,))
def save_clicked(self, widget, data=None):
# Save the changes
# variable name can not be empty.
var_name = self.variable_name_entry.get_text()
if len(var_name) == 0:
functions.error_dialog(self.window, self._('statusbar_variable_names_can_not_be_empty').format(var_name), self._('empty_variable_name'))
self.window.set_focus(self.variable_name_entry)
return False
# must be unique
for r in range(len(self.parent.variable_liststore)):
if r != self.variable and var_name == self.parent.variable_liststore[r][0]:
functions.error_dialog(self.window, self._('statusbar_variable_name_already_in_use').format(var_name), self._('duplicate_variable_name'))
self.window.set_focus(self.variable_name_entry)
return False
new_levels = []
for row in range(len(self.levels_liststore)):
new_levels.append(self.levels_liststore[row][0].strip())
if len(new_levels) < 2:
functions.error_dialog(self.window, self._('statusbar_two_variable_levels_required'), self._('insufficient_levels'))
return False
if len(list(set(new_levels))) != len(new_levels):
functions.error_dialog(self.window, self._('duplicate_level_name_msg'), self._('duplicate_level_name'))
return False
self.parent.variable_liststore[self.variable][0] = var_name
self.parent.variable_liststore[self.variable][1] = self.variable_weight_spin.get_value()
self.parent.variable_liststore[self.variable][2] = ','.join(new_levels)
self.parent.update_interface()
self.window.destroy()
def cancel_clicked(self, widget, data=None):
self.window.destroy()
def level_add_button(self, widget, data=None):
# choose a default unique lvel name
n = 0
while True:
level_name = 'Level {0}'.format(n)
for row in range(len(self.levels_liststore)):
if self.levels_liststore[row][0] == level_name:
break
else:
break
n += 1
self.levels_liststore.append((level_name,))
row = len(self.levels_liststore) - 1
self.levels_treeview.scroll_to_cell((row,))
self.levels_treeview.set_cursor((row,),)
def level_delete_button(self, widget, data=None):
if self.levels_treeview.get_cursor()[0]:
row = self.levels_treeview.get_cursor()[0][0]
self.levels_liststore.remove(self.levels_liststore.get_iter(row))
def levels_cell_edited(self, cell, row, new_text, col):
if ',' in new_text:
functions.error_dialog(self.window, self._('level_names_not_comma'), self._('level_names_not_comma'))
return False
self.levels_liststore[row][col] = new_text
def close_window(self, widget, data=None):
self.window.destroy()