2006-04-16 20:25:54 +02:00
|
|
|
#!/usr/bin/python
|
|
|
|
|
2006-04-27 12:54:18 +02:00
|
|
|
import os
|
2006-04-16 20:25:54 +02:00
|
|
|
import sys
|
|
|
|
|
|
|
|
import pygtk
|
|
|
|
pygtk.require('2.0')
|
|
|
|
import gtk
|
|
|
|
import gtk.gdk
|
|
|
|
import gtk.glade
|
|
|
|
import gnome
|
|
|
|
import gnome.ui
|
2006-04-20 12:27:58 +02:00
|
|
|
import scipy
|
2006-04-25 11:53:35 +02:00
|
|
|
import pango
|
2006-08-07 16:14:42 +02:00
|
|
|
from system import project, workflow, dataset, logger, plots, navigator, dialogs, selections
|
2006-04-25 11:53:35 +02:00
|
|
|
|
2006-04-16 20:25:54 +02:00
|
|
|
|
2006-04-27 12:54:18 +02:00
|
|
|
PROGRAM_NAME = 'fluents'
|
2006-04-16 20:25:54 +02:00
|
|
|
VERSION = '0.1.0'
|
2006-04-27 13:20:12 +02:00
|
|
|
DATADIR = os.path.dirname(sys.modules['system'].__file__)
|
2006-08-30 12:27:45 +02:00
|
|
|
ICONDIR = os.path.join(DATADIR,"..","icons")
|
2006-05-29 13:24:33 +02:00
|
|
|
GLADEFILENAME = os.path.join(DATADIR, 'fluents.glade')
|
2006-04-16 20:25:54 +02:00
|
|
|
|
|
|
|
class FluentApp:
|
|
|
|
|
2006-06-01 15:51:16 +02:00
|
|
|
def __init__(self, wf): # Application variables
|
2006-04-22 23:46:44 +02:00
|
|
|
self.project = None
|
2006-04-20 12:27:58 +02:00
|
|
|
self.current_data = None
|
2006-04-26 14:11:23 +02:00
|
|
|
self._last_view = None
|
|
|
|
self._plot_toolbar = None
|
2006-04-24 11:53:07 +02:00
|
|
|
|
2006-04-16 20:25:54 +02:00
|
|
|
gtk.glade.set_custom_handler(self.custom_object_factory)
|
2006-04-19 21:59:55 +02:00
|
|
|
self.widget_tree = gtk.glade.XML(GLADEFILENAME, 'appwindow')
|
2006-04-25 14:19:25 +02:00
|
|
|
self.workflow = wf(self)
|
2006-08-07 16:14:42 +02:00
|
|
|
self['selection_tree'].set_identifier_list(self['identifier_list'])
|
2006-04-22 23:46:44 +02:00
|
|
|
|
2006-04-16 20:25:54 +02:00
|
|
|
def init_gui(self):
|
2006-04-19 21:59:55 +02:00
|
|
|
self['appwindow'].set_size_request(800, 600)
|
2006-04-16 20:25:54 +02:00
|
|
|
|
|
|
|
# Set up workflow
|
2006-04-22 23:46:44 +02:00
|
|
|
self.wf_menu = workflow.WorkflowView(self.workflow)
|
|
|
|
self.wf_menu.show()
|
|
|
|
self['workflow_vbox'].pack_end(self.wf_menu)
|
2006-04-19 20:25:44 +02:00
|
|
|
|
2006-04-16 20:25:54 +02:00
|
|
|
# Set up plot toolbar
|
2006-04-19 21:59:55 +02:00
|
|
|
# self['plot_toolbar_dock'].add(plot.get_toolbar(self.app))
|
2006-04-16 20:25:54 +02:00
|
|
|
|
|
|
|
# Connect signals
|
|
|
|
signals = {'on_quit1_activate' : (gtk.main_quit),
|
|
|
|
'on_appwindow_delete_event' : (gtk.main_quit),
|
2006-04-17 22:27:39 +02:00
|
|
|
'on_zoom_in_button_clicked' : (self.on_single_view),
|
2006-04-22 23:46:44 +02:00
|
|
|
'on_zoom_out_button_clicked' : (self.on_multiple_view),
|
2006-04-22 23:56:30 +02:00
|
|
|
'on_new1_activate' : (self.on_create_project),
|
|
|
|
'on_button_new_clicked' : (self.on_create_project),
|
2006-04-25 20:06:21 +02:00
|
|
|
'on_workflow_refresh_clicked' : (self.on_workflow_refresh_clicked),
|
2006-04-27 11:55:19 +02:00
|
|
|
'on_index1_activate' : (self.on_help_index),
|
|
|
|
'on_about1_activate' : (self.on_help_about),
|
2006-05-29 13:24:33 +02:00
|
|
|
'on_report_bug1_activate' : (self.on_help_report_bug),
|
|
|
|
'on_small_view1_activate' : (self.on_multiple_view),
|
|
|
|
'on_large_view1_activate' : (self.on_single_view),
|
|
|
|
}
|
2006-04-16 20:25:54 +02:00
|
|
|
self.widget_tree.signal_autoconnect(signals)
|
|
|
|
|
2006-06-01 15:51:16 +02:00
|
|
|
self['main_view'].connect('view-changed', self.on_view_changed)
|
|
|
|
|
2006-04-16 20:25:54 +02:00
|
|
|
# Log that we've set up the app now
|
|
|
|
logger.log('debug', 'Program started')
|
|
|
|
|
2006-06-01 15:51:16 +02:00
|
|
|
def set_project(self, project):
|
|
|
|
logger.log('notice', 'Creating a new project')
|
|
|
|
self.project = project
|
|
|
|
self.workflow.add_project(self.project)
|
|
|
|
self.navigator_view.add_project(self.project)
|
2006-08-07 16:14:42 +02:00
|
|
|
self['selection_tree'].set_project(self.project)
|
2006-06-01 15:51:16 +02:00
|
|
|
|
|
|
|
def set_workflow(self, workflow):
|
|
|
|
self.workflow = workflow
|
|
|
|
self.wf_menu.set_workflow(self.workflow)
|
|
|
|
|
|
|
|
def show(self):
|
|
|
|
self.init_gui()
|
|
|
|
|
2006-04-16 20:25:54 +02:00
|
|
|
def change_plot(self, plot):
|
2006-08-31 15:27:58 +02:00
|
|
|
"""Sets the plot in the currently active ViewFrame. If the plot is
|
|
|
|
already shown in another ViewFrame it will be moved from there."""
|
2006-08-31 12:57:44 +02:00
|
|
|
# Set current selection in the plot before showing it.
|
2006-08-28 14:06:05 +02:00
|
|
|
plot.selection_changed(self.project.get_selection())
|
2006-08-31 15:27:58 +02:00
|
|
|
|
|
|
|
self['main_view'].insert_view(plot)
|
|
|
|
self._update_toolbar(plot)
|
2006-08-31 12:57:44 +02:00
|
|
|
|
|
|
|
def change_plots(self, plots):
|
|
|
|
"""Changes all plots."""
|
|
|
|
self['main_view'].set_all_plots(plots)
|
|
|
|
|
2006-06-01 15:51:16 +02:00
|
|
|
def get_active_view_frame(self):
|
|
|
|
return self['main_view'].get_active_view_frame()
|
|
|
|
|
|
|
|
def _update_toolbar(self, view):
|
2006-08-31 15:27:58 +02:00
|
|
|
"""Set the plot specific toolbar to the toolbar of the currently
|
|
|
|
active plot."""
|
2006-06-01 15:51:16 +02:00
|
|
|
|
|
|
|
# don't do anything on no change
|
|
|
|
if self._last_view == view:
|
|
|
|
return
|
|
|
|
self._last_view = view
|
|
|
|
|
|
|
|
logger.log("debug", "view changed to %s" % view)
|
|
|
|
|
2006-08-31 15:27:58 +02:00
|
|
|
window = self['plot_toolbar_dock']
|
2006-06-01 15:51:16 +02:00
|
|
|
if self._plot_toolbar:
|
|
|
|
window.remove(self._plot_toolbar)
|
2006-07-21 16:30:09 +02:00
|
|
|
|
|
|
|
if view:
|
|
|
|
self._plot_toolbar = view.get_toolbar()
|
|
|
|
else:
|
|
|
|
self._plot_toolbar = None
|
|
|
|
|
2006-06-01 15:51:16 +02:00
|
|
|
if self._plot_toolbar:
|
|
|
|
window.add(self._plot_toolbar)
|
|
|
|
|
|
|
|
# Methods to create GUI widgets from CustomWidgets in the glade file.
|
|
|
|
# The custom_object_factory calls other functions to generate specific
|
|
|
|
# widgets.
|
|
|
|
|
|
|
|
def custom_object_factory(self, glade, fun_name, widget_name, s1, s2, i1, i2):
|
|
|
|
"Called by the glade file reader to create custom GUI widgets."
|
|
|
|
handler = getattr(self, fun_name)
|
|
|
|
return handler(s1, s2, i1, i2)
|
|
|
|
|
|
|
|
def create_logview(self, str1, str2, int1, int2):
|
|
|
|
self.log_view = logger.LogView(logger.logger)
|
|
|
|
self.log_view.show()
|
|
|
|
return self.log_view
|
|
|
|
|
|
|
|
def create_main_view(self, str1, str2, int1, int2):
|
|
|
|
self.main_view = plots.MainView()
|
|
|
|
self.main_view.show()
|
|
|
|
return self.main_view
|
|
|
|
|
|
|
|
def create_navigator_view(self, str1, str2, int1, int2):
|
|
|
|
self.navigator_view = navigator.NavigatorView(None, self)
|
|
|
|
self.navigator_view.show()
|
|
|
|
return self.navigator_view
|
|
|
|
|
2006-08-07 16:14:42 +02:00
|
|
|
def create_selection_tree(self, str1, str2, int1, int2):
|
|
|
|
self.selection_tree = selections.SelectionTree()
|
|
|
|
self.selection_tree.show()
|
|
|
|
return self.selection_tree
|
|
|
|
|
|
|
|
def create_identifier_list(self, str1, str2, int1, int2):
|
|
|
|
self.identifier_list = selections.IdentifierList()
|
|
|
|
self.identifier_list.show()
|
|
|
|
return self.identifier_list
|
|
|
|
|
2006-08-30 01:57:21 +02:00
|
|
|
def __getitem__(self, key):
|
|
|
|
return self.widget_tree.get_widget(key)
|
|
|
|
|
2006-06-01 15:51:16 +02:00
|
|
|
# Event handlers.
|
2006-07-21 16:30:09 +02:00
|
|
|
# These methods are called by the gtk framework in response to events and
|
|
|
|
# should not be called directly.
|
2006-06-01 15:51:16 +02:00
|
|
|
|
2006-05-29 13:24:33 +02:00
|
|
|
def on_single_view(self, *ignored):
|
2006-06-01 15:51:16 +02:00
|
|
|
self['main_view'].goto_large()
|
2006-04-17 22:27:39 +02:00
|
|
|
|
2006-05-29 13:24:33 +02:00
|
|
|
def on_multiple_view(self, *ignored):
|
2006-06-01 15:51:16 +02:00
|
|
|
self['main_view'].goto_small()
|
2006-04-16 20:25:54 +02:00
|
|
|
|
2006-04-22 23:46:44 +02:00
|
|
|
def on_create_project(self, *rest):
|
|
|
|
d = dialogs.CreateProjectDruid(self)
|
|
|
|
d.run()
|
|
|
|
|
2006-04-22 23:56:30 +02:00
|
|
|
def on_help_about(self, *rest):
|
|
|
|
widget_tree = gtk.glade.XML(GLADEFILENAME, 'aboutdialog')
|
|
|
|
about = widget_tree.get_widget('aboutdialog')
|
|
|
|
about.run()
|
|
|
|
|
2006-04-27 11:55:19 +02:00
|
|
|
def on_help_index(self, *ignored):
|
|
|
|
gnome.help_display_uri('https://dev.pvv.org/projects/fluent/wiki/help')
|
|
|
|
|
|
|
|
def on_help_report_bug(self, *ignored):
|
|
|
|
gnome.help_display_uri('https://dev.pvv.org/projects/fluent/newticket')
|
|
|
|
|
2006-04-25 20:06:21 +02:00
|
|
|
def on_workflow_refresh_clicked(self, *ignored):
|
|
|
|
try:
|
|
|
|
reload(sys.modules[self.workflow.__class__.__module__])
|
|
|
|
except Exception, e:
|
|
|
|
logger.log('warning', 'Cannot reload workflow')
|
|
|
|
logger.log('warning', e)
|
|
|
|
else:
|
|
|
|
logger.log('notice', 'Successfully reloaded workflow')
|
2006-06-01 15:51:16 +02:00
|
|
|
|
|
|
|
def on_view_changed(self, widget, vf):
|
|
|
|
self._update_toolbar(vf.get_view())
|
|
|
|
|