Projects/laydi
Projects
/
laydi
Archived
7
0
Fork 0

Code cleanup.

This commit is contained in:
Einar Ryeng 2007-12-11 00:13:26 +00:00
parent 055c0ea4ac
commit d0a7b1cbc2
2 changed files with 74 additions and 49 deletions

View File

@ -8,6 +8,12 @@ import dataset, logger, plots, project, workflow, main
import scipy import scipy
class NavigatorView (gtk.TreeView): class NavigatorView (gtk.TreeView):
"""The NavigatorView is a tree view of the project.
There is always one NavigatorView, that shows the functions, plots and
datasets in the current project.
"""
def __init__(self): def __init__(self):
if main.project: if main.project:
self.data_tree = main.project.data_tree self.data_tree = main.project.data_tree
@ -16,15 +22,14 @@ class NavigatorView (gtk.TreeView):
gtk.TreeView.__init__(self) gtk.TreeView.__init__(self)
# various properties # Various properties
self.set_enable_tree_lines(True) self.set_enable_tree_lines(True)
self.set_headers_visible(False) self.set_headers_visible(False)
self.get_hadjustment().set_value(0) self.get_hadjustment().set_value(0)
# Selection Mode # Selection Mode
self.get_selection().set_mode(gtk.SELECTION_MULTIPLE) self.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
self.get_selection().connect('changed',self.selection_changed_handler) self.get_selection().connect('changed',self.on_selection_changed)
self._previous_selection = [] self._previous_selection = []
# Setting up TextRenderers etc # Setting up TextRenderers etc
@ -41,7 +46,8 @@ class NavigatorView (gtk.TreeView):
self.object_col = gtk.TreeViewColumn('Object') self.object_col = gtk.TreeViewColumn('Object')
self.object_col.pack_start(pixbufrenderer,expand=False) self.object_col.pack_start(pixbufrenderer,expand=False)
self.object_col.pack_start(textrenderer,expand=False) self.object_col.pack_start(textrenderer,expand=False)
self.object_col.set_attributes(textrenderer, cell_background=3, foreground=4, text=0) self.object_col.set_attributes(textrenderer, cell_background=3,
foreground=4, text=0)
self.object_col.set_attributes(pixbufrenderer, pixbuf=5) self.object_col.set_attributes(pixbufrenderer, pixbuf=5)
self.append_column(self.object_col) self.append_column(self.object_col)
@ -54,20 +60,22 @@ class NavigatorView (gtk.TreeView):
logger.log('debug', 'Initializing navigator window.') logger.log('debug', 'Initializing navigator window.')
# sets data for drag event.
def slot_drag_data(self, treeview, context, selection, target_id, etime): def slot_drag_data(self, treeview, context, selection, target_id, etime):
"""Sets the data for a drag event."""
treeselection = treeview.get_selection() treeselection = treeview.get_selection()
model, paths = treeselection.get_selected_rows() model, paths = treeselection.get_selected_rows()
if paths: if paths:
self.data_tree.drag_data_get(paths[0], selection) self.data_tree.drag_data_get(paths[0], selection)
def add_project(self, project): def add_project(self, project):
"""Dependency injection."""
self.data_tree = project.data_tree self.data_tree = project.data_tree
self.set_model(project.data_tree) self.set_model(project.data_tree)
self.data_tree.connect('row-changed',self.on_row_changed) self.data_tree.connect('row-changed',self.on_row_changed)
# selection changed, setting current_data ojbects def on_selection_changed(self, selection):
def selection_changed_handler(self, selection): """Update the list of currently selected datasets."""
# update prev selection right away in case of multiple events # update prev selection right away in case of multiple events
model, paths = selection.get_selected_rows() model, paths = selection.get_selected_rows()
if not paths: # a plot is marked: do nothing if not paths: # a plot is marked: do nothing
@ -75,17 +83,17 @@ class NavigatorView (gtk.TreeView):
tmp = self._previous_selection tmp = self._previous_selection
self._previous_selection = paths self._previous_selection = paths
tree = self.data_tree
# set timestamp on newly selected objects # set timestamp on newly selected objects
[self.data_tree.set_value(self.data_tree.get_iter(path), 6, time.time()) [tree.set_value(tree.get_iter(path), 6, time.time())
for path in paths if path not in tmp] for path in paths if path not in tmp]
objs = [self.data_tree.get_iter(path) for path in paths] objs = [tree.get_iter(path) for path in paths]
objs = [(self.data_tree.get_value(iter,6), self.data_tree.get_value(iter,2)) objs = [(tree[iter][6], tree[iter][2]) for iter in objs]
for iter in objs]
objs.sort() objs.sort()
objs = [obj for timestamp, obj in objs] objs = [obj for timestamp, obj in objs]
# order dataset
if objs and isinstance(objs[0], dataset.Dataset): if objs and isinstance(objs[0], dataset.Dataset):
logger.log('debug', 'Selecting dataset') logger.log('debug', 'Selecting dataset')
@ -94,17 +102,16 @@ class NavigatorView (gtk.TreeView):
logger.log('debug', 'Deselecting dataset') logger.log('debug', 'Deselecting dataset')
main.project.set_current_data([]) main.project.set_current_data([])
# TreeView changed. Set correct focus and colours
def on_row_changed(self, treestore, pos, iter): def on_row_changed(self, treestore, pos, iter):
obj = treestore.get_value(iter,2) """Set correct focus and colours when rows have changed."""
type_= treestore.get_value(iter,1) obj = treestore[iter][2]
obj_type = treestore[iter][1]
if not (treestore.get_value(iter,2) or treestore.get_value(iter,1)): if not (obj or obj_type):
return return
self.expand_to_path(pos) self.expand_to_path(pos)
if isinstance(obj,dataset.Dataset): if isinstance(obj, dataset.Dataset):
self.set_cursor(pos) self.set_cursor(pos)
self.grab_focus() self.grab_focus()
@ -135,12 +142,12 @@ class NavigatorView (gtk.TreeView):
def on_mouse_event(self, widget, event): def on_mouse_event(self, widget, event):
path = widget.get_path_at_pos(int(event.x), int(event.y)) path = widget.get_path_at_pos(int(event.x), int(event.y))
iter = None
if path: if path:
iter = self.data_tree.get_iter(path[0]) iter = self.data_tree.get_iter(path[0])
obj = self.data_tree.get_value(iter, 2) obj = self.data_tree.get_value(iter, 2)
else: else:
iter = None
obj = None obj = None
if isinstance(obj, dataset.Dataset): if isinstance(obj, dataset.Dataset):
@ -152,9 +159,15 @@ class NavigatorView (gtk.TreeView):
self.menu.popup(None, None, None, event.button, event.time) self.menu.popup(None, None, None, event.button, event.time)
def on_cursor_changed(self, widget): def on_cursor_changed(self, widget):
"""Update statusbar to contain dataset information.
Lists the dimensions of a dataset in the statusbar of the program
if a dataset is focused in the navigator.
"""
path = widget.get_cursor()[0] path = widget.get_cursor()[0]
tree_iter = self.data_tree.get_iter(path) tree_iter = self.data_tree.get_iter(path)
obj = self.data_tree.get_value(tree_iter, 2) obj = self.data_tree.get_value(tree_iter, 2)
if isinstance(obj, dataset.Dataset): if isinstance(obj, dataset.Dataset):
dims = zip(obj.get_dim_name(), obj.shape) dims = zip(obj.get_dim_name(), obj.shape)
dim_text = ", ".join(["%s (%d)" % dim for dim in dims]) dim_text = ", ".join(["%s (%d)" % dim for dim in dims])
@ -250,20 +263,9 @@ class NavigatorMenu(gtk.Menu):
self.plot_item.set_property('sensitive', True) self.plot_item.set_property('sensitive', True)
self.trans_item.set_property('sensitive', True) self.trans_item.set_property('sensitive', True)
def on_load_dataset(self, item, navigator): def load_dataset(self, filename):
dialog = gtk.FileChooserDialog('Load dataset') """Load the dataset from the given file and add it to the project."""
dialog.set_action(gtk.FILE_CHOOSER_ACTION_OPEN) ds = dataset.read_ftsv(filename)
dialog.add_buttons(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK)
dialog.set_select_multiple(True)
dialog.set_current_folder(main.options.datadir)
retval = dialog.run()
if retval in [gtk.RESPONSE_CANCEL, gtk.RESPONSE_DELETE_EVENT]:
pass
elif retval == gtk.RESPONSE_OK:
for filename in dialog.get_filenames():
fd = open(filename)
ds = dataset.read_ftsv(fd)
fd.close()
if isinstance(ds, dataset.GraphDataset): if isinstance(ds, dataset.GraphDataset):
icon = fluents.icon_factory.get("graph_dataset") icon = fluents.icon_factory.get("graph_dataset")
@ -274,6 +276,22 @@ class NavigatorMenu(gtk.Menu):
main.project.add_dataset(ds) main.project.add_dataset(ds)
main.project.data_tree_insert(None, ds.get_name(), ds, None, "black", icon) main.project.data_tree_insert(None, ds.get_name(), ds, None, "black", icon)
def on_load_dataset(self, item, navigator):
# Set up file chooser.
dialog = gtk.FileChooserDialog('Load dataset')
dialog.set_action(gtk.FILE_CHOOSER_ACTION_OPEN)
dialog.add_buttons(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
gtk.STOCK_OPEN, gtk.RESPONSE_OK)
dialog.set_select_multiple(True)
dialog.set_current_folder(main.options.datadir)
retval = dialog.run()
if retval in [gtk.RESPONSE_CANCEL, gtk.RESPONSE_DELETE_EVENT]:
pass
elif retval == gtk.RESPONSE_OK:
for filename in dialog.get_filenames():
self.load_dataset(filename)
else: else:
print "unknown; ", retval print "unknown; ", retval
dialog.destroy() dialog.destroy()

View File

@ -7,14 +7,21 @@ import logger
import dataset, plots, main import dataset, plots, main
class Project: class Project:
"""A Project contains datasets, selections etc.
The project, of which the application has only one at any given time,
is the container for all datasets, plots and selections in use. The data
in the project is organized in a gtk.TreeStrore that is displayed in the
navigator.
"""
def __init__(self,name="Testing"): def __init__(self,name="Testing"):
self.data_tree = gtk.TreeStore(gobject.TYPE_STRING, self.data_tree = gtk.TreeStore(str,
gobject.TYPE_STRING, str,
gobject.TYPE_PYOBJECT, object,
gobject.TYPE_STRING, str,
gobject.TYPE_STRING, str,
gobject.TYPE_OBJECT, gobject.TYPE_OBJECT,
gobject.TYPE_DOUBLE) float)
self.name = name self.name = name
self.dim_names = [] self.dim_names = []
@ -104,16 +111,17 @@ class Project:
elif isinstance(d, dataset.Selection): elif isinstance(d, dataset.Selection):
self.add_selection(d) self.add_selection(d)
def data_tree_insert(self, parent, text, data, bgcolour, fontcolour, icon, selected = 0): def data_tree_insert(self, parent, text, data, bg, fg, icon, selected = 0):
"""Inserts data into the tree view.
@param text: The title of the object.
@param data: A dataset, plot or function object.
@param bg: Background color.
@param fg: Foreground (font) color.
@param icon: Pixmap icon.
"""
tree = self.data_tree tree = self.data_tree
it = tree.append(parent) it = tree.append(parent)
tree.set_value(it, 0, text) tree[it] = [text, type(data), data, bg, fg, icon, selected]
tree.set_value(it, 1, type(data))
tree.set_value(it, 2, data)
tree.set_value(it, 3, bgcolour)
tree.set_value(it, 4, fontcolour)
tree.set_value(it, 5, icon)
tree.set_value(it, 6, selected)
self._dataset_iter_map[data] = it self._dataset_iter_map[data] = it
return it return it
@ -144,4 +152,3 @@ class Project:
def set_current_data(self, obj): def set_current_data(self, obj):
self.current_data = obj self.current_data = obj