Layout item handling is now done via a separate controller object.

This commit is contained in:
Chris Jones 2010-03-05 22:20:48 +00:00
parent 8732754794
commit b8703fdecb
2 changed files with 167 additions and 35 deletions

View File

@ -2615,6 +2615,7 @@
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="invisible_char">&#x2022;</property> <property name="invisible_char">&#x2022;</property>
<signal name="activate" handler="on_layout_profile_command_activate"/>
</object> </object>
<packing> <packing>
<property name="left_attach">1</property> <property name="left_attach">1</property>
@ -2630,6 +2631,7 @@
<property name="visible">True</property> <property name="visible">True</property>
<property name="model">layoutprofilelist</property> <property name="model">layoutprofilelist</property>
<property name="active">0</property> <property name="active">0</property>
<signal name="changed" handler="on_layout_profile_chooser_changed"/>
<child> <child>
<object class="GtkCellRendererText" id="cellrenderertext13"/> <object class="GtkCellRendererText" id="cellrenderertext13"/>
<attributes> <attributes>

View File

@ -10,7 +10,7 @@ write it to a config file
import os import os
import gtk import gtk
from util import dbg from util import dbg, err
import config import config
from keybindings import Keybindings, KeymapError from keybindings import Keybindings, KeymapError
from translation import _ from translation import _
@ -23,6 +23,7 @@ class PrefsEditor:
keybindings = None keybindings = None
window = None window = None
builder = None builder = None
layouteditor = None
previous_layout_selection = None previous_layout_selection = None
previous_profile_selection = None previous_profile_selection = None
colorschemevalues = {'black_on_yellow': 0, colorschemevalues = {'black_on_yellow': 0,
@ -104,9 +105,11 @@ class PrefsEditor:
self.builder.add_from_string(gladedata) self.builder.add_from_string(gladedata)
self.window = self.builder.get_object('prefswin') self.window = self.builder.get_object('prefswin')
self.set_values() self.layouteditor = LayoutEditor(self.builder)
self.builder.connect_signals(self) self.builder.connect_signals(self)
self.layouteditor.prepare()
self.window.show_all() self.window.show_all()
self.set_values()
def on_cancelbutton_clicked(self, _button): def on_cancelbutton_clicked(self, _button):
"""Close the window""" """Close the window"""
@ -203,6 +206,10 @@ class PrefsEditor:
selection = widget.get_selection() selection = widget.get_selection()
selection.connect('changed', self.on_layout_selection_changed) selection.connect('changed', self.on_layout_selection_changed)
selection.select_iter(self.layoutiters['default']) selection.select_iter(self.layoutiters['default'])
# Now set up the selection changed handler for the layout itself
widget = guiget('LayoutTreeView')
selection = widget.get_selection()
selection.connect('changed', self.on_layout_item_selection_changed)
## Keybindings tab ## Keybindings tab
widget = guiget('keybindingtreeview') widget = guiget('keybindingtreeview')
@ -655,9 +662,9 @@ class PrefsEditor:
value = 'escape-sequence' value = 'escape-sequence'
self.config['delete_binding'] = value self.config['delete_binding'] = value
def set_layout(self, layout): def set_layout(self, layout_name):
"""Set a layout""" """Set a layout"""
pass self.layouteditor.set_layout(layout_name)
def store_layout(self, layout): def store_layout(self, layout):
"""Store a layout""" """Store a layout"""
@ -685,6 +692,8 @@ class PrefsEditor:
treeview.set_cursor(path, focus_column=treeview.get_column(0), treeview.set_cursor(path, focus_column=treeview.get_column(0),
start_editing=True) start_editing=True)
self.layouteditor.update_profiles()
def on_profileremovebutton_clicked(self, _button): def on_profileremovebutton_clicked(self, _button):
"""Remove a profile from the list""" """Remove a profile from the list"""
guiget = self.builder.get_object guiget = self.builder.get_object
@ -702,6 +711,7 @@ class PrefsEditor:
self.config.del_profile(profile) self.config.del_profile(profile)
model.remove(rowiter) model.remove(rowiter)
selection.select_iter(model.get_iter_first()) selection.select_iter(model.get_iter_first())
self.layouteditor.update_profiles()
def on_layoutaddbutton_clicked(self, _button): def on_layoutaddbutton_clicked(self, _button):
"""Add a new layout to the list""" """Add a new layout to the list"""
@ -740,7 +750,7 @@ class PrefsEditor:
# We shouldn't let people delete this layout # We shouldn't let people delete this layout
return return
self.previous_sekection = None self.previous_selection = None
self.config.del_layout(layout) self.config.del_layout(layout)
model.remove(rowiter) model.remove(rowiter)
selection.select_iter(model.get_iter_first()) selection.select_iter(model.get_iter_first())
@ -849,39 +859,19 @@ class PrefsEditor:
def on_layout_selection_changed(self, selection): def on_layout_selection_changed(self, selection):
"""A different layout was selected""" """A different layout was selected"""
if self.previous_layout_selection is not None: self.layouteditor.on_layout_selection_changed(selection)
dbg('Storing: %s' % self.previous_layout_selection)
self.store_layout(self.previous_layout_selection)
(listmodel, rowiter) = selection.get_selected() def on_layout_item_selection_changed(self, selection):
if not rowiter: """A different item in the layout was selected"""
# Something is wrong, just jump to the first item in the list self.layouteditor.on_layout_item_selection_changed(selection)
treeview = selection.get_tree_view()
liststore = treeview.get_model()
selection.select_iter(liststore.get_iter_first())
return
layout = listmodel.get_value(rowiter, 0)
self.set_layout(layout)
self.previous_layout_selection = layout
widget = self.builder.get_object('layoutremovebutton') def on_layout_profile_chooser_changed(self, widget):
if layout == 'default': """A different profile has been selected for this item"""
widget.set_sensitive(False) self.layouteditor.on_layout_profile_chooser_changed(widget)
else:
widget.set_sensitive(True)
# Render this layout to the canvas def on_layout_profile_command_activate(self, widget):
# FIXME: This should probably be in a scrollable viewport for when """A different command has been entered for this item"""
# there are multiple windows self.layouteditor.on_layout_profile_command_activate(widget)
#canvas = self.layout_to_goo(layout)
#canvas.show_all()
#container = self.builder.get_object('canvasalignment')
#child = container.get_child()
#if child is not None:
# container.remove(child)
# del(child)
#container.add(canvas)
def on_layout_name_edited(self, cell, path, newtext): def on_layout_name_edited(self, cell, path, newtext):
"""Update a layout name""" """Update a layout name"""
@ -972,6 +962,146 @@ class PrefsEditor:
celliter = liststore.get_iter_from_string(path) celliter = liststore.get_iter_from_string(path)
liststore.set(celliter, 2, 0, 3, 0) liststore.set(celliter, 2, 0, 3, 0)
class LayoutEditor:
profile_ids_to_profile = None
profile_profile_to_ids = None
layout_name = None
layout_item = None
builder = None
treeview = None
treestore = None
config = None
def __init__(self, builder):
"""Initialise ourself"""
self.config = config.Config()
self.builder = builder
def prepare(self, layout=None):
"""Do the things we can't do in __init__"""
self.treeview = self.builder.get_object('LayoutTreeView')
self.treestore = self.builder.get_object('LayoutTreeStore')
self.update_profiles()
if layout:
self.set_layout(layout)
def set_layout(self, layout_name):
"""Load a particular layout"""
self.layout_name = layout_name
store = self.treestore
layout = self.config.layout_get_config(layout_name)
listitems = {}
store.clear()
children = layout.keys()
i = 0
while children != []:
child = children.pop()
child_type = layout[child]['type']
parent = layout[child]['parent']
if child_type != 'Window' and parent not in layout:
# We have an orphan!
err('%s is an orphan in this layout. Discarding' % child)
continue
try:
parentiter = listitems[parent]
except KeyError:
if child_type == 'Window':
parentiter = None
else:
# We're not ready for this widget yet
children.insert(0, child)
continue
if child_type == 'VPaned':
child_type = 'Vertical split'
elif child_type == 'HPaned':
child_type = 'Horizontal split'
listitems[child] = store.append(parentiter, [child, child_type])
treeview = self.builder.get_object('LayoutTreeView')
treeview.expand_all()
def update_profiles(self):
"""Update the list of profiles"""
self.profile_ids_to_profile = {}
self.profile_profile_to_ids= {}
chooser = self.builder.get_object('layout_profile_chooser')
model = chooser.get_model()
model.clear()
profiles = self.config.list_profiles()
profiles.sort()
i = 0
for profile in profiles:
self.profile_ids_to_profile[i] = profile
self.profile_profile_to_ids[profile] = i
model.append([profile])
i = i + 1
def on_layout_selection_changed(self, selection):
"""A different layout was selected"""
(listmodel, rowiter) = selection.get_selected()
if not rowiter:
# Something is wrong, just jump to the first item in the list
selection.select_iter(self.treestore.get_iter_first())
return
layout = listmodel.get_value(rowiter, 0)
self.set_layout(layout)
self.previous_layout_selection = layout
widget = self.builder.get_object('layoutremovebutton')
if layout == 'default':
widget.set_sensitive(False)
else:
widget.set_sensitive(True)
def on_layout_item_selection_changed(self, selection):
"""A different item in the layout was selected"""
(treemodel, rowiter) = selection.get_selected()
if not rowiter:
return
item = treemodel.get_value(rowiter, 0)
self.layout_item = item
self.set_layout_item(item)
def set_layout_item(self, item_name):
"""Set a layout item"""
layout = self.config.layout_get_config(self.layout_name)
layout_item = layout[self.layout_item]
command = self.builder.get_object('layout_profile_command')
chooser = self.builder.get_object('layout_profile_chooser')
if layout_item['type'] != 'Terminal':
command.set_sensitive(False)
chooser.set_sensitive(False)
return
command.set_sensitive(True)
chooser.set_sensitive(True)
if layout_item.has_key('command') and layout_item['command'] != '':
command.set_text(layout_item['command'])
if layout_item.has_key('profile') and layout_item['profile'] != '':
chooser.set_active(self.profile_profile_to_ids[layout_item['profile']])
def on_layout_profile_chooser_changed(self, widget):
"""A new profile has been selected for this item"""
if not self.layout_item:
return
profile = widget.get_active_text()
layout = self.config.layout_get_config(self.layout_name)
layout[self.layout_item]['profile'] = profile
def on_layout_profile_command_activate(self, widget):
"""A new command has been entered for this item"""
command = widget.get_text()
layout = self.config.layout_get_config(self.layout_name)
layout[self.layout_item]['command'] = command
if __name__ == '__main__': if __name__ == '__main__':
import util import util
util.DEBUG = True util.DEBUG = True