The relevant files here are:
def pyshell(self, *args):
import pyshell
pyshell.launch(pyshellfile=self.pyshellfile)
def push(self, line):
( update command shell history list if present )
( if current entry is a macro command, do some macro-specific stuff )
( if journaling is on, do record the command to the journal file )
if len(self.cmdlist) > 0:
# determine if the line starts with a command
cmd_name, remainder = parse_interpreter_line(line)
if self.cmdlist.has_key( cmd_name ):
# if code gets here, user has entered a registered
# command (eg. newview). This part parses the
# command, converts it to text that can be run
# as a python function, then pushes it through
# the interpreter.
( convert command line to python function text )
return code.InteractiveConsole.push(self,txt)
# If line does not start with a command, push it
# through the interpreter as-is.
return code.InteractiveConsole.push(self,line)
The base tool class is defined as follows in gviewapp.py:
class Tool_GViewApp:
# Abstract base class to derive tools from
def __init__(self,app=None):
self.app = app
self.menu_entries = Tool_GViewAppMenuEntries()
self.icon_entries = Tool_GViewAppIconEntries()
self.pymenu_entries = Tool_GViewAppMenuEntries()
self.pyicon_entries = Tool_GViewAppIconEntries()
class Tool_GViewAppMenuEntries:
# Class to store entries to be added to openev's menu
def __init__(self):
self.entries = {}
def set_entry(self,item,position=0,callback=None,accelerator=None):
# item = a string describing menu location
# position = default location in the menu (integer): Ignored if an
# xml menu entry is specified for the tool. Note:
# when used, the position refers to position in the
# lowest level menu. Eg. if a menu entry is
# 'File/menu1/entryN', position refer's to entryN's
# position within menu1, not menu1's position in
# File. For more flexibility, use the xml form of
# configuration.
# callback = callback
# accelerator = shortcut key
if (type(item) == type('')):
if (type(position) == type(0)):
self.entries[item] = (position,callback, accelerator)
else:
raise AttributeError,"position should be an integer"
else:
raise AttributeError,"Menu entry item must be a string"
(similar class for Icon entries)
This defines the way the tools add menu or icon entries to OpenEV's toolbar,
and stores a handle to the application so that the tool can interact
with it. Below is a simple tool that adds a new menu
entry Tools/Example, and when called prints out a list of the tools loaded
in the application.
#!/usr/bin/env python
import gviewapp
class Tool_example(gviewapp.Tool_GViewApp):
def __init__(self, app=None,startpath=None):
gviewapp.Tool_GViewApp.__init__(self,app)
self.init_menu()
def init_menu(self):
self.menu_entries.set_entry("Tools/Example...",1,self.example_tool_cb)
def example_tool_cb(self,*args):
print self.app.Tool_List
TOOL_LIST=['Tool_example']
Placing this tool in OpenEV's "tools" directory will register it
automatically. The relevant sections of gviewapp.py are:
Initialization:
The tools are loaded up and stored in self.Tool_List. Tools passed as a command line argument are loaded using self.load_tools_file; auto-registering tools (those in OpenEV's "tools" directory) are loaded using self.scan_tools_directories. These create an instance of the tool, tool_inst, and append a tuple consisting of (tool_name,tool_inst) to the Tool_List.
class GViewApp(Signaler):
def __init__(self,toolfile=None,menufile=None,iconfile=None,pyshellfile=None):
self.view_manager = ViewManager()
self.sel_manager = gvselbrowser.GvSelectionManager( self.view_manager )
self.pref_dialog = None
self.filename = None
# Toolbar
self.toolbar = Toolbar()
self.view_manager.set_toolbar( self.toolbar )
# Other dialogs, etc.
self.layerdlg = layerdlg.Launch()
self.view_manager.set_layerdlg(self.layerdlg)
self.publish('quit')
self.publish('rfl-change')
# Verify that float() works properly.
try:
x = float('0.9')
except:
gvutils.warning( 'It appears that float() doesn\'t work properly on your system.\nThis is likely due to use of a numeric locale with an alternate decimal\nrepresentation. Please try setting the LC_NUMERIC environment variable\nto C and restarting OpenEV.' )
# Default configuration files for view and python shell
self.menufile=menufile
self.iconfile=iconfile
self.pyshellfile=pyshellfile
# External tools to import and add to view menu
self.Tool_List = []
if toolfile is not None:
self.load_tools_file( toolfile )
self.scan_tools_directories()
# Tool index: a dictionary with the tool name as a
# key and the tool's position in the list as the value
self.tool_index = {}
for idx in range(len(self.Tool_List)):
self.tool_index[self.Tool_List[idx][0]]=idx
self.shell = None
New views: When a new view is created, the main application cycles through its tool list, and appends their menu and icon entries to the menu/icon bars.
def new_view(self, title=None, menufile=None,iconfile=None, *args):
# If menu/icon files aren't specified, use application-wide
# defaults
if ((menufile is None) and (self.menufile is not None)):
menufile=self.menufile
if ((iconfile is None) and (self.iconfile is not None)):
iconfile=self.iconfile
view_window = gvviewwindow.GvViewWindow(app=self, title=title, menufile=menufile,
iconfile=iconfile)
view_name=view_window.title
view_menu = view_window.menuf
if ((len(self.Tool_List) > 0) and (menufile is None)):
# If no menu configuration file is specified, put
# tools in the default positions specified by
# the tool menu entry's position parameter.
for cur_tool_list in self.Tool_List:
cur_tool = cur_tool_list[1]
if hasattr(cur_tool.menu_entries.entries,'keys'):
for item in cur_tool.menu_entries.entries.keys():
view_menu.insert_entry(
cur_tool.menu_entries.entries[item][0],
item,
cur_tool.menu_entries.entries[item][2],
cur_tool.menu_entries.entries[item][1],
(view_name))
# Icons- Note: currently it is assumed that the tool icons are
# xpms. Support for pixmaps and widgets will be added
# later if necessary (icon type would have to be detected
# from last entry of the relevant tool icon entry, and
# a function would have to be created to deal with them.
# They are slightly more complicated than the xpm case
# and wouldn't use insert_tool_icon. Would also need
# code in the complextoolentry case to avoid an icon
# of one type (eg. xpm) being replaced by another type
# (eg. widget, pixmap).
#
# ALSO: GtkToolbar does not allow callback information
# to be specified, so the viewname cannot be
# passed as an argument to tool icon callbacks
# the way it is for menu callbacks. However,
# if the view is needed, it can be obtained
# using:
# view=args[0].get_toplevel()
# The view title is under:
# view['title']. Note that this is not quite
# the same as the view's self.title, but is based
# on it (usually 'OpenEV: '+self.title)
if ((len(self.Tool_List) > 0) and (iconfile is None)):
for cur_tool_list in self.Tool_List:
cur_tool=cur_tool_list[1]
for item in cur_tool.icon_entries.entries:
view_window.insert_tool_icon(
item[0], # filename
item[1], # label
item[2], # hint text
item[4], # callback
item[5], # help topic
item[3], # position
)
view_window.show()
return view_window
Next