Toolbars work again.

This commit is contained in:
2006-06-01 13:51:16 +00:00
parent 0670c42bd4
commit aca9a47f56
2 changed files with 95 additions and 187 deletions

View File

@@ -1,5 +1,6 @@
import pygtk
import gobject
import gtk
import matplotlib
import scipy
@@ -46,6 +47,12 @@ class ObjectTable:
class ViewFrame (gtk.Frame):
"""
A ViewFrame is a gtk bin that contains a view.
The ViewFrame is either active or inactive, and belongs to a group of
VeiwFrames of which only one can be active at any time.
"""
def __init__(self, view_frames):
gtk.Frame.__init__(self)
self.focused = False
@@ -65,7 +72,6 @@ class ViewFrame (gtk.Frame):
gtk.gdk.ACTION_LINK)
self.connect("drag-data-received", self.on_drag_data_received)
# Set view
self._view = self.empty_view
self._view.connect("button-press-event", self.on_button_press_event)
@@ -83,6 +89,7 @@ class ViewFrame (gtk.Frame):
self.set_shadow_type(gtk.SHADOW_IN)
self.focused = True
self.emit('focus-changed', self, True)
return self
def unfocus(self):
@@ -92,6 +99,7 @@ class ViewFrame (gtk.Frame):
self.set_shadow_type(gtk.SHADOW_OUT)
self.focused = False
self.emit('focus-changed', self, False)
def set_view(self, view):
"""Set view to view or to empty view if parameter is None"""
@@ -154,6 +162,9 @@ class MainView (gtk.Notebook):
self._small_views.set_row_spacings(4)
self._large_view = ViewFrame(list())
self.update_small_views()
for vf in self._view_frames:
vf.connect('focus-changed', self.on_view_focus_changed)
self.append_page(self._small_views)
self.append_page(self._large_view)
@@ -205,6 +216,9 @@ class MainView (gtk.Notebook):
self._small_views.show()
gtk.Notebook.show(self)
def on_view_focus_changed(self, widget, vf, focused):
if focused:
self.emit('view-changed', vf)
class Plot (gtk.Frame):
@@ -234,125 +248,6 @@ class Plot (gtk.Frame):
return None
class SmallView (gtk.Table):
def __init__(self):
gtk.Table.__init__(self, 2, 2, True)
self.child_views = [[EmptyView(), EmptyView()],
[EmptyView(), EmptyView()]]
self.cols = 2
self.rows = 2
self.active_x = 0
self.active_y = 0
self.set_row_spacings(3)
self.set_col_spacings(3)
self._listener = None
for x in range(self.cols):
for y in range(self.rows):
child = self.child_views[x][y]
child.parent_signalling = child.connect('button_press_event', self.__view_button_event__)
self.attach(child, x, x+1, y, y+1)
# drag'n'drop
for views in self.child_views:
for view in views:
view.drag_dest_set(gtk.DEST_DEFAULT_ALL,
[("GTK_TREE_MODEL_ROW",gtk.TARGET_SAME_APP,7)],
gtk.gdk.ACTION_LINK)
view.connect("drag-data-received",self.drag_received_by_view,view)
def drag_received_by_view(self, widget, drag_context, x, y, selection, info, timestamp, view):
treestore, path = selection.tree_get_row_drag_data()
iter = treestore.get_iter(path)
obj = treestore.get_value(iter,2)
loc = self.find_child(view)
if loc and isinstance(obj, Plot) and (not self.find_child(obj)):
self.set_child(obj,loc[0],loc[1])
def set_view_listener(self, listener):
self._listener = listener
def set_child(self, child, col, row):
# urg, this probably belongs somewhere else
child.drag_dest_set(gtk.DEST_DEFAULT_ALL,
[("GTK_TREE_MODEL_ROW",gtk.TARGET_SAME_APP,7)],
gtk.gdk.ACTION_LINK)
child.connect("drag-data-received",self.drag_received_by_view,child)
cur_widget = self.child_views[col][row]
cur_widget.disconnect(cur_widget.parent_signalling)
self.remove(cur_widget)
self.attach(child, col, col+1, row, row+1)
child.parent_signalling = child.connect('button_press_event', self.__view_button_event__)
self.child_views[col][row] = child
if cur_widget.active:
child.mark_active(True)
cur_widget.mark_active(False)
child.show()
def borrow_current(self):
self.borrowed = self.child_views[self.active_x][self.active_y]
self.remove_child(self.active_x, self.active_y)
return self.borrowed
def return_current(self, view):
self.set_child(view, self.active_x, self.active_y)
def remove_child(self, col, row):
self.remove(self.child_views[col][row])
self.attach(EmptyView(), col, col+1, row, row+1)
def insert_view(self, child):
if not self.find_child(child):
self.set_child(child, self.active_x, self.active_y)
def show(self):
for x in self.child_views:
for y in x:
y.show()
gtk.Table.show(self)
def hide(self):
for x in self.child_views:
for y in x:
y.hide()
gtk.Table.hide(self)
def set_active(self, x, y):
old_focus = self.child_views[self.active_x][self.active_y]
new_focus = self.child_views[x][y]
old_focus.mark_active(False)
new_focus.mark_active(True)
self.active_x = x
self.active_y = y
if self._listener:
logger.log("debug", "emitting")
self._listener(new_focus)
def find_child(self, child):
for i, row in enumerate(self.child_views):
for j, v in enumerate(row):
if v == child:
return (i, j)
return None
def __view_button_event__(self, view, *rest):
loc = self.find_child(view)
if loc:
self.set_active(loc[0], loc[1])
def get_view(self, x, y):
return self.child_views[x][y]
class EmptyView (Plot):
def __init__(self):
Plot.__init__(self, 'Empty view')
@@ -600,3 +495,14 @@ class ScatterPlot(Plot):
self.ax.plot(xdata_new,ydata_new,'or')
self.canvas.draw()
# Create a view-changed signal that should be emitted every time
# the active view changes.
gobject.signal_new('view-changed', MainView, gobject.SIGNAL_RUN_LAST,
gobject.TYPE_NONE,
(gobject.TYPE_PYOBJECT,))
# Create focus-changed signal
gobject.signal_new('focus-changed', ViewFrame, gobject.SIGNAL_RUN_LAST,
gobject.TYPE_NONE,
(gobject.TYPE_PYOBJECT, gobject.TYPE_BOOLEAN,))