diff options
author | root <root@ghunt-desktop.(none)> | 2010-11-15 04:40:21 (GMT) |
---|---|---|
committer | root <root@ghunt-desktop.(none)> | 2010-11-15 04:40:21 (GMT) |
commit | 0b27ac481cdd8695e87908baf538350b28229376 (patch) | |
tree | f26a40ba016fe04862bf327ca869758aaf760d15 | |
parent | 8e4465bd5598173eaccf228b95450a1c156834b7 (diff) |
navigation buttons in help on earlier builds work, fixes for build 802,767
-rw-r--r-- | bin/continue_debug.py | 2 | ||||
-rw-r--r-- | bin/start_debug.py | 27 | ||||
-rw-r--r-- | editor_gui.py | 18 | ||||
-rw-r--r-- | filetree.py | 28 | ||||
-rw-r--r-- | help.py | 85 | ||||
-rw-r--r-- | page.py | 39 | ||||
-rw-r--r-- | progresslistener.py | 1 | ||||
-rw-r--r-- | project_gui.py | 38 | ||||
-rw-r--r-- | pydebug.py | 14 | ||||
-rw-r--r-- | terminal.py | 7 | ||||
-rw-r--r-- | terminal_gui.py | 3 |
11 files changed, 208 insertions, 54 deletions
diff --git a/bin/continue_debug.py b/bin/continue_debug.py index 8dbb2f2..0a887d8 100644 --- a/bin/continue_debug.py +++ b/bin/continue_debug.py @@ -133,7 +133,7 @@ _logger.debug('xmode set to %s'%xmode) #put module in top level namespace so it can be dreload()-ed exec 'import ' + debugee_module -exec 'reload(%s)'%debugee_module +#exec 'reload(%s)'%debugee_module """ if this were to work properly we should set go equal to object Macro go_cmd = 'run -d -b %s %s'%(os.path.join(db.pydebug_path,'bin','start_debug.py'),child_path) diff --git a/bin/start_debug.py b/bin/start_debug.py index c5c067c..36385f0 100644 --- a/bin/start_debug.py +++ b/bin/start_debug.py @@ -17,25 +17,27 @@ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import os +from gettext import gettext as _ # Initialize logging. import logging _logger = logging.getLogger('PyDebug') -_logger.setLevel(logging.DEBUG) +_logger.setLevel(logging.INFO) #establish a remote procedure call pipe connection with the PyDebug process from Rpyc import SocketConnection try: c = SocketConnection('localhost') db = c.modules.pydebug.pydebug_instance -except AttributeError: - _logger.error('cannot connect to localhost') +#except AttributeError: +# _logger.error('cannot connect to localhost') except Exception, e: + _logger.exception('cannot connect to localhost') print 'Rpyc connection failed' print(str(e)) assert False pydebug_path = db.pydebug_path -print('./bin/start_debug.py established connectioon. pydebug path: %s'%pydebug_path) +_logger.debug('./bin/start_debug.py established connectioon. pydebug path: %s'%pydebug_path) #these alternative definitions are required for ipython v0.11 and greater #define interface with the command line ipython instance @@ -49,12 +51,14 @@ from IPython.macro import Macro ip = ipapi.get() #define macros, one which sets pdb on, the other off -if not ip.user_ns.has_key('gb'): +trace_cmd = _('trace') +if not ip.user_ns.has_key(trace_cmd): cmd = 'run -b 242 -d %s\n'% os.path.join(pydebug_path,'bin','continue_debug.py') - ip.user_ns['gb'] = Macro(cmd) -if not ip.user_ns.has_key('go'): + ip.user_ns[trace_cmd] = Macro(cmd) +go_cmd = _('go') +if not ip.user_ns.has_key(go_cmd): cmd = 'run %s\n'% os.path.join(pydebug_path,'bin','continue_debug.py') - ip.user_ns['go'] = Macro(cmd) + ip.user_ns[go_cmd] = Macro(cmd) if not ip.user_ns.has_key('pi'): cmd = 'for k in _margv[0].__dict__.keys(): print "_margv[0]",k,"=",_margv[0].__dict__[k]\n' ip.user_ns['pi'] = Macro(cmd) @@ -63,4 +67,9 @@ if not ip.user_ns.has_key('ps'): ip.user_ns['ps'] = Macro(cmd) #change the directory to the child_path -os.chdir(db.child_path)
\ No newline at end of file +child_path = db.child_path +if child_path: + os.chdir(child_path) +else: + os.chdir(db.activity_playpen) +
\ No newline at end of file diff --git a/editor_gui.py b/editor_gui.py index 9bba2a0..86625c4 100644 --- a/editor_gui.py +++ b/editor_gui.py @@ -151,12 +151,12 @@ class EditorGui(GtkSourceview2Editor): #editpaste.props.accelerator = '<Ctrl>V' editpaste.show() self.editbar.insert(editpaste, -1) - + """ separator = gtk.SeparatorToolItem() separator.set_draw(True) separator.show() self.editbar.insert(separator, -1) - + """ editfind = ToolButton('viewmag1') editfind.set_tooltip(_('Find and Replace')) editfind.connect('clicked', self.show_find) @@ -164,12 +164,12 @@ class EditorGui(GtkSourceview2Editor): #editfind.props.accelerator = '<Ctrl>F' editfind.show() self.editbar.insert(editfind, -1) - + """ separator = gtk.SeparatorToolItem() separator.set_draw(True) separator.show() self.editbar.insert(separator, -1) - + """ self.zoomout = ToolButton('zoom-out') self.zoomout.set_tooltip(_('Zoom out')) self.zoomout.connect('clicked', self.__zoomout_clicked_cb) @@ -182,8 +182,18 @@ class EditorGui(GtkSourceview2Editor): self.editbar.insert(self.zoomin, -1) self.zoomin.show() + stop_button = ToolButton('activity-stop') + stop_button.set_tooltip(_('Stop')) + #stop_button.props.accelerator = '<Ctrl>Q' + stop_button.connect('clicked', self.__stop_clicked_cb) + self.editbar.insert(stop_button, -1) + stop_button.show() + self.editbar.show_all() + def __stop_clicked_cb(self, button): + self._activity.py_stop() + def get_editbar(self): """return reference for placing on the Sugar main menu notebook""" diff --git a/filetree.py b/filetree.py index c02f329..e0d31f3 100644 --- a/filetree.py +++ b/filetree.py @@ -25,7 +25,7 @@ import gtk.glade #import pydebug #from pydebug import pydebug_instance -class FileTree(): +class FileTree: column_names = [_('Name'), _('Size'), _('Last Changed')] def __init__(self,parent,widget=None,wTree=None): @@ -55,8 +55,32 @@ class FileTree(): self.treeview = gtk.TreeView() self.treeview.set_model(self.ft_model) self.treeview.show() - #self.treeview.set_tooltip_column(4) + #the following line was probably disabled for compatibility with earlier sugar + #search for TOOLTIP to find problem areas + if self.parent.sugar_minor >= 82: + self.treeview.set_tooltip_column(4) + else: + # assign the tooltip + tips = gtk.Tooltips() + tips.set_tip(self.treeview, "") + self.treeview.connect("motion-notify-event",self.show_tooltip, tips, 4) # <--- + self.treeview.set_events( gtk.gdk.POINTER_MOTION_MASK ) self.show_hidden = False + + def show_tooltip(self, widget, event, tooltips, cell, emptytext='no information'): + """ + If emptyText is None, the cursor has to enter widget from a side + that contains an item, otherwise no tooltip will be displayed. """ + + try: + (path,col,x,y) = widget.get_path_at_pos( int(event.x), int(event.y) ) + it = widget.get_model().get_iter(path) + value = widget.get_model().get_value(it,cell) + tooltips.set_tip(widget, value) + tooltips.enable() + except: + _logger.exception('show_tooltip exception') + tooltips.set_tip(widget, emptytext) def init_columns(self): col = gtk.TreeViewColumn() @@ -34,6 +34,13 @@ from sugar import wm, env from pdb import * from sugar.graphics.toolbutton import ToolButton import hulahop +hulahop.startup(os.path.join(os.environ['SUGAR_ACTIVITY_ROOT'], 'data/gecko')) +import xpcom +from xpcom.nsError import * +#from xpcom import components +#from xpcom.components import interfaces +from browser import Browser +from xpcom.components import interfaces gobject.threads_init() @@ -46,10 +53,12 @@ _logger = logging.getLogger('PyDebug') class Help(Window): def __init__(self, parent): self.pydebug = parent - hulahop.startup(os.path.join(parent.debugger_home, 'gecko')) - from browser import Browser - import xpcom - from xpcom.components import interfaces + + if version < 0.838: + from hulahop.webview import WebView as Browser + else: + from browser import Browser + self.help_id = None self.handle = ActivityHandle() self.handle.activity_id = util.unique_id() @@ -114,9 +123,9 @@ class Help(Window): def activate_help(self): _logger.debug('activate_help called') self.help_window.show() + self.toolbox._notebook.set_current_page(HELP_PANE) if version < 0.838: return window = self.get_wnck_window_from_activity_id(self.help_id) - self.toolbox._notebook.set_current_page(HELP_PANE) if window: window.activate(gtk.get_current_event_time()) else: @@ -175,7 +184,7 @@ class Toolbar(gtk.Toolbar): def __init__(self, parent, web_view): gobject.GObject.__init__(self) - self._activity = parent + self._help = parent self._web_view = web_view self._back = ToolButton('go-previous-paired') @@ -198,13 +207,42 @@ class Toolbar(gtk.Toolbar): self.insert(home, -1) home.show() - progress_listener = self._web_view.progress - progress_listener.connect('location-changed', - self._location_changed_cb) - progress_listener.connect('loading-stop', self._loading_stop_cb) + separator = gtk.SeparatorToolItem() + separator.set_draw(False) + separator.set_expand(True) + self.insert(separator, -1) + separator.show() + + stop_button = ToolButton('activity-stop') + stop_button.set_tooltip(_('Stop')) + #stop_button.props.accelerator = '<Ctrl>Q' + stop_button.connect('clicked', self.__stop_clicked_cb) + self.insert(stop_button, -1) + stop_button.show() + + if version < 0.838: + self._listener = xpcom.server.WrapObject(EarlyListener(self), + interfaces.nsIWebProgressListener) + weak_ref = xpcom.client.WeakReference(self._listener) + + mask = interfaces.nsIWebProgress.NOTIFY_STATE_NETWORK | \ + interfaces.nsIWebProgress.NOTIFY_LOCATION + self._web_view.web_progress.addProgressListener(self._listener, mask) + else: + + progress_listener = self._web_view.progress + progress_listener.connect('location-changed', + self._location_changed_cb) + progress_listener.connect('loading-stop', self._loading_stop_cb) + + + def __stop_clicked_cb(self, button): + self._help.pydebug.py_stop() + def _location_changed_cb(self, progress_listener, uri): self.update_navigation_buttons() + _logger.debug('location change cb') def _loading_stop_cb(self, progress_listener): self.update_navigation_buttons() @@ -223,8 +261,33 @@ class Toolbar(gtk.Toolbar): self._web_view.web_navigation.goForward() def _go_home_cb(self, button): - self._web_view.load_uri(self._activity.HOME) + self._web_view.load_uri(self._help.HOME) + +class EarlyListener(object): + #from xpcom.components import interfaces + + _com_interfaces_ = interfaces.nsIWebProgressListener + + def __init__(self, toolbar): + self._toolbar = toolbar + + def onLocationChange(self, webProgress, request, location): + self._toolbar.update_navigation_buttons() + + def onProgressChange(self, webProgress, request, curSelfProgress, + maxSelfProgress, curTotalProgress, maxTotalProgress): + pass + + def onSecurityChange(self, webProgress, request, state): + pass + + def onStateChange(self, webProgress, request, stateFlags, status): + if stateFlags & interfaces.nsIWebProgressListener.STATE_IS_NETWORK: + self._toolbar.update_navigation_buttons() + def onStatusChange(self, webProgress, request, status, message): + pass + def command_line(cmd): _logger.debug('command_line cmd:%s'%cmd) p1 = Popen(cmd,stdout=PIPE, shell=True) @@ -596,10 +596,11 @@ class GtkSourceview2Page(SearchablePage): return current_line def left_button_click_on_code_line(self, start_iter, line_end): - current_line_marks_list = self.get_marks_in_region_in_category(start_iter, line_end, BREAKPOINT_CAT) + start = start_iter.copy() + current_line_marks_list = self.get_marks_in_region_in_category(start, line_end, BREAKPOINT_CAT) self._activity.breakpoints_changed = True for m in current_line_marks_list: - if self._activity.sugar_minor < 84: + if self._activity.sugar_minor < 82: self.text_buffer.delete_marker(m) else: self.text_buffer.delete_mark(m) @@ -609,15 +610,18 @@ class GtkSourceview2Page(SearchablePage): self.text_buffer.apply_tag_by_name(BREAKPOINT_CAT, start_iter, line_end) mark = self.create_mark_universal(BREAKPOINT_CAT, start_iter) self.breakpoints[self.clicked_line_num] = '' - _logger.debug('set breakpoint') + if mark: + _logger.debug('set breakpoint') + else: + _logger.debug('failed to create mark and set breakpoint') def create_mark_universal(self, category, start_iter): - """early sourcview2 has both mark and marker (early)""" - _logger.debug('created mark at line: %s in category: %s'%(start_iter.get_line() + 1,category,)) - if self._activity.sugar_minor < 84: - mark = self.text_buffer.create_marker(self.create_category(category), category, start_iter) + """early sourcview2 has both mark and marker, very confusing!""" + name = self.create_category(category) + if self._activity.sugar_minor < 82: + mark = self.text_buffer.create_marker(name, category, start_iter) else: - mark = self.text_buffer.create_mark(None, category, start_iter) + mark = self.text_buffer.create_source_mark(name, category, start_iter) return mark @@ -630,13 +634,12 @@ class GtkSourceview2Page(SearchablePage): #_logger.debug('mark name:%s'%(mark_str,)) return mark_str - def get_marks_in_region_in_category(self, start_iter, end_iter, category = None): - """ return marks_list regardless of which version of sugar we have""" + def get_marks_in_region_in_category(self, start, end_iter, category = None): + """ return marks_list regardless of which version of sugar we have. """ mark_list = [] - if self._activity.sugar_minor < 84: + start_iter = start.copy() + if self._activity.sugar_minor < 82: mark_list = self.text_buffer.get_markers_in_region(start_iter, end_iter) - _logger.debug('len of marks list: %s start line:%s end:%s'%(len(mark_list),\ - start_iter.get_line(),end_iter.get_line())) if not category: return mark_list new_list = [] @@ -646,9 +649,13 @@ class GtkSourceview2Page(SearchablePage): new_list.append(m) mark_list = new_list else: + mark_list += self.text_buffer.get_source_marks_at_iter(start_iter, category) while self.text_buffer.forward_iter_to_source_mark(start_iter, category): - marks = self.text_buffer.get_marks_at_iter(start_iter, category) + if start_iter.get_offset() > end_iter.get_offset(): + break + marks = self.text_buffer.get_source_marks_at_iter(start_iter, category) mark_list += marks + _logger.debug('number of marks found in buffer in region:%s'%(len(mark_list),)) return mark_list @@ -665,7 +672,7 @@ class GtkSourceview2Page(SearchablePage): current_state = SHELL_CAT self.text_buffer.remove_tag_by_name(SHELL_CAT, line_start,line_end) #delete the marker - if self._activity.sugar_minor < 84 and current_state: + if self._activity.sugar_minor < 82 and current_state: self.text_buffer.delete_marker(m) else: self.text_buffer.delete_mark(m) @@ -703,7 +710,7 @@ class GtkSourceview2Page(SearchablePage): self.text_buffer.remove_tag_by_name(current_state, line_start, line_end) marker_list = self.get_marks_in_region_in_category(line_start, line_end) for m in marker_list: - if self._activity.sugar_minor < 84: + if self._activity.sugar_minor < 82: self.text_buffer.delete_marker(m) else: self.text_buffer.delete_mark(m) diff --git a/progresslistener.py b/progresslistener.py index cf3cb43..038ce3d 100644 --- a/progresslistener.py +++ b/progresslistener.py @@ -55,6 +55,7 @@ class ProgressListener(gobject.GObject): def onLocationChange(self, webProgress, request, location): self.emit('location-changed', location) + print('on location change call back executed') def onProgressChange(self, webProgress, request, curSelfProgress, maxSelfProgress, curTotalProgress, maxTotalProgress): diff --git a/project_gui.py b/project_gui.py index 18ae66d..68f65e5 100644 --- a/project_gui.py +++ b/project_gui.py @@ -72,14 +72,23 @@ class ProjectGui(ProjectFunctions): separator.set_expand(True) separator.show() + stop_button = ToolButton('activity-stop') + stop_button.set_tooltip(_('Stop')) + #stop_button.props.accelerator = '<Ctrl>Q' + stop_button.connect('clicked', self.__stop_clicked_cb) + stop_button.show() + projectbar = gtk.Toolbar() projectbar.show_all() projectbar.insert(project_run, -1) projectbar.insert(separator, -1) - #projectbar.insert(self.keep,-1) + projectbar.insert(stop_button, -1) self.projectbar = projectbar + def __stop_clicked_cb(self, button): + self._activity.py_stop() + ######################################################################################### def get_editor(self): @@ -778,11 +787,34 @@ class DataStoreTree(): self.treeview = gtk.TreeView() self.treeview.set_model(self.journal_model) self.treeview.show() - #self.treeview.has_tooltip = True - #self.treeview.set_tooltip_column(10) + #the following 3 lines were probably disabled because earlier sugar complained + #search for TOOLTIP to find problem areas #self.treeview.connect('query-tooltip',self.display_tooltip) + if self._activity.sugar_minor >= 82: + self.treeview.set_tooltip_column(10) + self.treeview.has_tooltip = True + else: + tips = gtk.Tooltips() + tips.set_tip(self.treeview, "") + self.treeview.connect("motion-notify-event",self.show_tooltip, tips, 10) # <--- + self.treeview.set_events( gtk.gdk.POINTER_MOTION_MASK ) self.show_hidden = False + def show_tooltip(self, widget, event, tooltips, cell, emptytext='no information'): + """ + If emptyText is None, the cursor has to enter widget from a side + that contains an item, otherwise no tooltip will be displayed. """ + + try: + (path,col,x,y) = widget.get_path_at_pos( int(event.x), int(event.y) ) + it = widget.get_model().get_iter(path) + value = widget.get_model().get_value(it,cell) + tooltips.set_tip(widget, value) + tooltips.enable() + except: + _logger.exception('show_tooltip exception') + tooltips.set_tip(widget, emptytext) + def init_columns(self): col = gtk.TreeViewColumn() col.set_title(self.column_names[0]) @@ -179,6 +179,10 @@ class PyDebugActivity(Activity, TerminalGui, EditorGui, ProjectGui): #get the persistent data across all debug sessions and start using it self.get_config () + #give the server a chance to get started so terminal can connect to it + self.non_blocking_server() + #glib.idle_add(self.non_blocking_server) + if self.request_new_jobject and self.debug_dict.get('jobject_id','') != '': self.request_new_jobject = False @@ -279,9 +283,6 @@ class PyDebugActivity(Activity, TerminalGui, EditorGui, ProjectGui): self.set_visible_canvas(self.panes['PROJECT']) self.set_toolbar(self.panes['PROJECT']) - self.non_blocking_server() - #glib.idle_add(self.non_blocking_server) - _logger.debug('about to setup_project_page. Elapsed time: %f'%(time.clock()-start_clock)) self.setup_project_page() _logger.debug('about Returned from setup_project_page. Elapsed time: %f'%(time.clock()-start_clock)) @@ -312,8 +313,11 @@ class PyDebugActivity(Activity, TerminalGui, EditorGui, ProjectGui): def realize_cb(self): _logger.debug('about total time to realize event: %f'%(time.clock()-start_clock)) + def py_stop(self): + self.__stop_clicked_cb(None) + def __stop_clicked_cb(self,button): - _logger('caught stop clicked call back') + _logger.debug('caught stop clicked call back') self.close(skip_save = True) @@ -567,6 +571,8 @@ class PyDebugActivity(Activity, TerminalGui, EditorGui, ProjectGui): def init_activity_dict(self): self.activity_dict['version'] = '1' + #try to disable the annoying save panel asking for new title + self.activity_dict['title_set_by_user'] = '1' self.activity_dict['name'] = 'untitled' self.activity_dict['bundle_id'] = '' self.activity_dict['command'] = '' diff --git a/terminal.py b/terminal.py index 697037d..773d430 100644 --- a/terminal.py +++ b/terminal.py @@ -41,7 +41,7 @@ MASKED_ENVIRONMENT = [ ] -class Terminal(): +class Terminal: def __init__(self,activity): self.terminal_notebook = gtk.Notebook() @@ -50,11 +50,12 @@ class Terminal(): #start the debugger user interface #alias_cmd = 'alias go="%s/bin/ipython.py -gthread"\n'%(self.sugar_bundle_path,) - alias_cmd = 'alias go="%s/bin/ipython.py "\n'%(self.sugar_bundle_path,) + go_cmd = _('go') + alias_cmd = 'alias %s="%s/bin/ipython.py "\n'%(go_cmd,self.sugar_bundle_path,) self.feed_virtual_terminal(0,alias_cmd) #self.feed_virtual_terminal(0,'%s/bin/ipython.py -gthread\n'%self.sugar_bundle_path) - self.feed_virtual_terminal(0,'%s/bin/ipython.py \n'%self.sugar_bundle_path) + self.feed_virtual_terminal(0,'clear\n%s/bin/ipython.py \n'%self.sugar_bundle_path) #the following become obsolete when start_debug starts automatically via ipython_config.py #cmd = 'run ' + os.path.join(self.sugar_bundle_path,'bin','start_debug.py') + '\n' diff --git a/terminal_gui.py b/terminal_gui.py index ffdb22d..2d80806 100644 --- a/terminal_gui.py +++ b/terminal_gui.py @@ -135,6 +135,7 @@ class TerminalGui(Terminal): ip.user_ns['go'] = arg_str _logger.debug('about to use "%s" to start ipython debugger\n'%(arg_str)) """ - self.feed_virtual_terminal(0,'go\n') + go_cmd = _('go') + self.feed_virtual_terminal(0,'%s\n'%(go_cmd,)) pass
\ No newline at end of file |