273 lines
10 KiB
Python
Executable File
273 lines
10 KiB
Python
Executable File
#!/usr/bin/python
|
|
|
|
import gtk
|
|
import gobject
|
|
|
|
from util import dbg, err
|
|
import config
|
|
from keybindings import Keybindings
|
|
from version import APP_NAME, APP_VERSION
|
|
from translation import _
|
|
|
|
class PrefsEditor:
|
|
data = {'titlebars': ['Show titlebars', 'This places a bar above each terminal which displays its title.'],
|
|
'zoomedtitlebar': ['Show titlebar when zoomed', 'This places an informative bar above a zoomed terminal to indicate there are hidden terminals.'],
|
|
'allow_bold': ['Allow bold text', 'Controls whether or not the terminals will honour requests for bold text'],
|
|
'silent_bell': ['', 'When enabled, bell events will generate a flash. When disabled, they will generate a beep'],
|
|
'background_darkness': ['', 'Controls how much the background will be tinted'],
|
|
'scroll_background': ['', 'When enabled the background image will scroll with the text'],
|
|
'force_no_bell': ['', 'Disable both the visual and audible bells'],
|
|
'tab_position': ['', 'Controls the placement of the tab bar'],
|
|
'use_theme_colors': ['', 'Take the foreground and background colours from the current GTK theme'],
|
|
'enable_real_transparency': ['', 'If you are running a composited desktop (e.g. compiz), enabling this option will enable "true" transpraency'],
|
|
'handle_size': ['', 'This controls the size of the border between terminals. Values 0 to 5 are in pixels, while -1 means the value will be decided by your normal GTK theme.'],
|
|
'close_window': ['Quit Terminator', ''],
|
|
'toggle_zoom': ['Toggle maximise terminal', ''],
|
|
'scaled_zoom': ['Toggle zoomed terminal', ''],
|
|
'prev_tab': ['Previous tab', ''],
|
|
'split_vert': ['Split vertically', ''],
|
|
'split_horiz': ['Split horizontally', ''],
|
|
'go_prev': ['Focus previous terminal', ''],
|
|
'go_next': ['Focus next terminal', ''],
|
|
'close_term': ['Close terminal', ''],
|
|
'new_root_tab': ['New root tab', ''],
|
|
'zoom_normal': ['Zoom reset', ''],
|
|
'reset': ['Reset terminal state', ''],
|
|
'reset_clear': ['Reset and clear terminal', ''],
|
|
'hide_window': ['Toggle visibility of the window', ''],
|
|
'title_tx_txt_color': ['Tx Title Foreground Color', ''],
|
|
'title_tx_bg_color': ['Tx Title Background Color', ''],
|
|
'title_rx_txt_color': ['Rx Title Foreground Color', ''],
|
|
'title_rx_bg_color': ['Rx Title Background Color', ''],
|
|
'title_ia_txt_color': ['Inactive Title Foreground Color', ''],
|
|
'title_ia_bg_color': ['Inactive Title Background Color', ''],
|
|
}
|
|
|
|
config = None
|
|
|
|
def __init__ (self, term):
|
|
self.config = config.Config()
|
|
self.term = term
|
|
self.builder = gtk.Builder()
|
|
try:
|
|
gladefile = open('/home/cmsj/code/personal/terminator/branches/epicrefactor/data/preferences.glade', 'r')
|
|
gladedata = gladefile.read()
|
|
except Exception, ex:
|
|
print "Failed to find preferences.glade"
|
|
print ex
|
|
return
|
|
|
|
self.builder.add_from_string(gladedata)
|
|
self.window = self.builder.get_object('prefswin')
|
|
self.set_values()
|
|
self.builder.connect_signals(self)
|
|
self.window.show_all()
|
|
|
|
def set_values(self):
|
|
"""Update the preferences window with all the configuration from
|
|
Config()"""
|
|
guiget = self.builder.get_object
|
|
|
|
print "SETTING VALUES"
|
|
|
|
## Global tab
|
|
|
|
# Mouse focus
|
|
# default is 'system', which == 0
|
|
focus = self.config['focus']
|
|
active = 0
|
|
if focus == 'click':
|
|
active = 1
|
|
elif focus == 'sloppy':
|
|
active = 2
|
|
widget = guiget('focuscombo')
|
|
widget.set_active(active)
|
|
|
|
# Terminal separator size
|
|
# default is -1
|
|
termsepsize = self.config['handle_size']
|
|
widget = guiget('handlesize')
|
|
widget.set_value(termsepsize)
|
|
|
|
# Window geometry hints
|
|
# default is True
|
|
geomhint = self.config['geometry_hinting']
|
|
widget = guiget('wingeomcheck')
|
|
widget.set_active(geomhint)
|
|
|
|
# Window state
|
|
# default is not maximised, not fullscreen
|
|
option = self.config['window_state']
|
|
if option == 'hidden':
|
|
active = 1
|
|
elif option == 'maximise':
|
|
active = 2
|
|
elif option == 'fullscreen':
|
|
active = 3
|
|
else:
|
|
active = 0
|
|
widget = guiget('winstatecombo')
|
|
widget.set_active(active)
|
|
|
|
# Window borders
|
|
# default is True
|
|
widget = guiget('winbordercheck')
|
|
widget.set_active(not self.config['borderless'])
|
|
|
|
# Tab bar position
|
|
# default is top
|
|
option = self.config['tab_position']
|
|
widget = guiget('tabposcombo')
|
|
if option == 'bottom':
|
|
active = 1
|
|
elif option == 'left':
|
|
active = 2
|
|
elif option == 'right':
|
|
active = 3
|
|
else:
|
|
active = 0
|
|
widget.set_active(active)
|
|
|
|
## Profile tab
|
|
|
|
# Populate the profile list
|
|
widget = guiget('profilelist')
|
|
liststore = widget.get_model()
|
|
profiles = self.config.list_profiles()
|
|
self.profileiters = {}
|
|
for profile in profiles:
|
|
self.profileiters[profile] = liststore.append([profile])
|
|
|
|
selection = widget.get_selection()
|
|
selection.connect('changed', self.on_profile_selection_changed)
|
|
selection.select_iter(self.profileiters['default'])
|
|
print "VALUES ALL SET"
|
|
|
|
def on_profile_selection_changed(self, selection):
|
|
"""A different profile was selected"""
|
|
(listmodel, rowiter) = selection.get_selected()
|
|
profile = listmodel.get_value(rowiter, 0)
|
|
self.update_profile_values(profile)
|
|
|
|
def update_profile_values(self, profile):
|
|
"""Update the profile values for a given profile"""
|
|
self.config.set_profile(profile)
|
|
guiget = self.builder.get_object
|
|
|
|
print "setting profile %s" % profile
|
|
widget = guiget('allow-bold-checkbutton')
|
|
widget.set_active(self.config['allow_bold'])
|
|
|
|
def on_profile_name_edited(self, cell, path, newtext):
|
|
"""Update a profile name"""
|
|
oldname = cell.get_property('text')
|
|
if oldname == newtext:
|
|
return
|
|
dbg('PrefsEditor::on_profile_name_edited: Changing %s to %s' %
|
|
(oldname, newtext))
|
|
self.config.rename_profile(oldname, newtext)
|
|
|
|
widget = self.builder.get_object('profilelist')
|
|
model = widget.get_model()
|
|
iter = model.get_iter(path)
|
|
model.set_value(iter, 0, newtext)
|
|
|
|
def source_get_type (self, key):
|
|
if config.DEFAULTS['global_config'].has_key (key):
|
|
print "found %s in global_config" % key
|
|
return config.DEFAULTS['global_config'][key].__class__.__name__
|
|
elif config.DEFAULTS['profiles']['default'].has_key (key):
|
|
print "found %s in profiles" % key
|
|
return config.DEFAULTS['profiles']['default'][key].__class__.__name__
|
|
elif config.DEFAULTS['keybindings'].has_key (key):
|
|
print "found %s in keybindings" % key
|
|
return config.DEFAULTS['keybindings'][key].__class__.__name__
|
|
else:
|
|
print "could not find %s" % key
|
|
raise KeyError
|
|
|
|
def source_get_value (self, key):
|
|
return self.config[key]
|
|
|
|
def source_get_keyname (self, key):
|
|
if self.data.has_key (key) and self.data[key][0] != '':
|
|
label_text = self.data[key][0]
|
|
else:
|
|
label_text = key.replace ('_', ' ').capitalize ()
|
|
return label_text
|
|
|
|
def apply (self, data):
|
|
pass
|
|
|
|
def cancel (self, data):
|
|
self.window.destroy()
|
|
self.term.options = None
|
|
del(self)
|
|
|
|
def prepare_keybindings (self):
|
|
self.liststore = gtk.ListStore (gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_UINT, gobject.TYPE_UINT, gobject.TYPE_BOOLEAN)
|
|
self.liststore.set_sort_column_id (0, gtk.SORT_ASCENDING)
|
|
self.tkbobj = Keybindings()
|
|
keyval = None
|
|
mask = None
|
|
|
|
for binding in config.DEFAULTS['keybindings']:
|
|
value = self.config['keybindings'][binding]
|
|
keyval = 0
|
|
mask = 0
|
|
if isinstance (value, tuple):
|
|
value = value[0]
|
|
if value is not None and value != "None":
|
|
try:
|
|
(keyval, mask) = self.tkbobj._parsebinding (value)
|
|
except KeymapError:
|
|
pass
|
|
self.liststore.append ([binding, self.source_get_keyname (binding), keyval, mask, True])
|
|
dbg("Appended row: %s, %s, %s" % (binding, keyval, mask))
|
|
|
|
self.treeview = gtk.TreeView(self.liststore)
|
|
|
|
cell = gtk.CellRendererText()
|
|
col = gtk.TreeViewColumn(_("Name"))
|
|
col.pack_start(cell, True)
|
|
col.add_attribute(cell, "text", 0)
|
|
|
|
self.treeview.append_column(col)
|
|
|
|
cell = gtk.CellRendererText()
|
|
col = gtk.TreeViewColumn(_("Action"))
|
|
col.pack_start(cell, True)
|
|
col.add_attribute(cell, "text", 1)
|
|
|
|
self.treeview.append_column(col)
|
|
|
|
cell = gtk.CellRendererAccel()
|
|
col = gtk.TreeViewColumn(_("Keyboard shortcut"))
|
|
col.pack_start(cell, True)
|
|
col.set_attributes(cell, accel_key=2, accel_mods=3, editable=4)
|
|
|
|
cell.connect ('accel-edited', self.edited)
|
|
cell.connect ('accel-cleared', self.cleared)
|
|
|
|
self.treeview.append_column(col)
|
|
|
|
scrollwin = gtk.ScrolledWindow ()
|
|
scrollwin.set_policy (gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
|
|
scrollwin.add (self.treeview)
|
|
return (scrollwin)
|
|
|
|
def edited (self, obj, path, key, mods, code):
|
|
iter = self.liststore.get_iter_from_string(path)
|
|
self.liststore.set(iter, 2, key, 3, mods)
|
|
|
|
def cleared (self, obj, path):
|
|
iter = self.liststore.get_iter_from_string(path)
|
|
self.liststore.set(iter, 2, 0, 3, 0)
|
|
|
|
if __name__ == '__main__':
|
|
import terminal
|
|
term = terminal.Terminal()
|
|
foo = PrefsEditor(term)
|
|
|
|
gtk.main()
|