diff options
author | Gonzalo Odiard <godiard@gmail.com> | 2014-02-11 20:00:39 (GMT) |
---|---|---|
committer | Gonzalo Odiard <godiard@gmail.com> | 2014-02-11 20:16:13 (GMT) |
commit | 3add3f3733354dfb9897485cff8c8d672c28e6a6 (patch) | |
tree | 25dc5e87636a15c456f636c94e34157e4816ff1c | |
parent | 7030f1fc6cfc65bab8eca9c4b1798a5cb6c12994 (diff) |
Big logviewer refactoring. Fix update of opened files
-rw-r--r-- | develop-activity/develop_app.py | 33 | ||||
-rw-r--r-- | develop-activity/logviewer.py | 161 |
2 files changed, 87 insertions, 107 deletions
diff --git a/develop-activity/develop_app.py b/develop-activity/develop_app.py index 1430930..a9a877d 100644 --- a/develop-activity/develop_app.py +++ b/develop-activity/develop_app.py @@ -46,7 +46,7 @@ import logviewer import sourceview_editor S_WHERE = sourceview_editor.S_WHERE import new_activity - +from widgets import TabLabel from symbols_tree import SymbolsTree DEBUG_FILTER_LEVEL = 1 @@ -428,7 +428,11 @@ class DevelopActivity(activity.Activity): """ self.open_activity(activity_dir) namefilter = ActivityBundle(activity_dir).get_bundle_id() - self.logview = logviewer.LogMinder(self, namefilter) + self._log_files_viewer = logviewer.LogFilesViewer(namefilter) + self._log_files_viewer.connect('file-selected', + self.__log_file_selected_cb) + self.treenotebook.add_page(_("Log"), self._log_files_viewer) + self.set_dirty(False) def refresh_files(self): @@ -463,6 +467,31 @@ class DevelopActivity(activity.Activity): self.load_file(path) self.numb = False + def __log_file_selected_cb(self, log_file_viewer, path): + if not path: + return + + if os.path.isdir(path): + #do not try to open folders + return + + # Set buffer and scroll down + if self.editor.set_to_page_like(path): + return + newlogview = logviewer.LogView(path, log_file_viewer) + scrollwnd = Gtk.ScrolledWindow() + scrollwnd.set_policy(Gtk.PolicyType.AUTOMATIC, + Gtk.PolicyType.AUTOMATIC) + scrollwnd.add(newlogview) + scrollwnd.page = newlogview + tablabel = TabLabel(newlogview, os.path.basename(path)) + tablabel.connect( + 'tab-close', lambda widget, child: + self.editor.remove_page(self.editor.page_num(child))) + self.editor.append_page(scrollwnd, tablabel) + self.editor.show_all() + self.editor.set_current_page(-1) + def save_bundle(self, btn): #create bundle builder = XOPackager(Builder(Config(self.activity_dir, '/tmp'))) diff --git a/develop-activity/logviewer.py b/develop-activity/logviewer.py index 9b517bd..3bed44b 100644 --- a/develop-activity/logviewer.py +++ b/develop-activity/logviewer.py @@ -31,44 +31,61 @@ from sugar3.graphics import style from sourceview_editor import TabLabel -#does not import develop_app, but references internals from the activity, -# as passed to init. -#In other words, needs refactoring. - def _get_filename_from_path(path): return os.path.split(path)[-1] -class LogMinder(Gtk.VBox): +class LogFilesViewer(Gtk.ScrolledWindow): + __gtype_name__ = 'LogFileViewer' + + __gsignals__ = { + 'file-selected': (GObject.SignalFlags.RUN_FIRST, + None, + ([str])), + } + + def __init__(self, namefilter): - def __init__(self, activity, namefilter, path=None, extra_files=None): - self.activity = activity self._openlogs = [] - logging.info('creating MultiLogView namefilter %s', namefilter) - if not path: - # Main path to watch: ~/.sugar/someuser/logs... - path = os.path.join(os.path.expanduser("~"), ".sugar", "default", - "logs") + logging.info('creating LogFilesViewer namefilter %s', namefilter) + # Main path to watch: ~/.sugar/someuser/logs... + path = os.path.join(os.path.expanduser("~"), ".sugar", "default", + "logs") self._logs_path = path + '/' - self._active_log = None - self._extra_files = extra_files + self._extra_files = ['shell.log'] self._namefilter = namefilter - # Creating Main treeview with Actitivities list - self.file_viewer = LogFileViewer() - self.file_viewer.connect('file-selected', self._load_log) - self.file_viewer.set_title(_("Sugar logs")) + Gtk.ScrolledWindow.__init__(self) - # the internals of the treeview - self.file_viewer.init_logs(path, self._filter_by_name) + self.props.hscrollbar_policy = Gtk.PolicyType.AUTOMATIC + self.props.vscrollbar_policy = Gtk.PolicyType.AUTOMATIC + self.set_size_request(style.GRID_CELL_SIZE * 3, -1) - self._monitors = [] + self._path = None + + self._tree_view = Gtk.TreeView() + self._tree_view.connect('cursor-changed', self.__cursor_changed_cb) + self.add(self._tree_view) + self._tree_view.show() + + self._tree_view.props.headers_visible = False + selection = self._tree_view.get_selection() + selection.connect('changed', self.__selection_changed_cb) - # Activities menu - self.activity.treenotebook.add_page(_("Log"), self.file_viewer) + cell = Gtk.CellRendererText() + self._column = Gtk.TreeViewColumn() + self._column.pack_start(cell, True) + self._column.add_attribute(cell, 'text', 0) + self._tree_view.append_column(self._column) + self._tree_view.set_search_column(0) + + # Configuration + self.set_title(_("Sugar logs")) + self.init_logs(path, self._filter_by_name) + self._monitors = [] self._configure_watcher() @@ -92,91 +109,18 @@ class LogMinder(Gtk.VBox): """ def _log_file_changed_cb(self, monitor, path1, path2, event): - _directory, logfile = os.path.split(str(path1)) - if event == Gio.FileMonitorEvent.CHANGED: for log in self._openlogs: - if logfile in log.full_path: + if path1.get_path() == log.full_path: + logging.debug('updating logfile %s', path1.get_path()) log.update() elif (event == Gio.FileMonitorEvent.DELETED or event == Gio.FileMonitorEvent.CREATED): - self.file_viewer.load_model() - #If the log is open, just leave it that way - - # Load the log information in View (text_view) - def _load_log(self, file_viewer, path): - if not path: - return - - if os.path.isdir(path): - #do not try to open folders - return - - # Set buffer and scroll down - if self.activity.editor.set_to_page_like(path): - return - newlogview = LogView(path, self) - - scrollwnd = Gtk.ScrolledWindow() - scrollwnd.set_policy(Gtk.PolicyType.AUTOMATIC, - Gtk.PolicyType.AUTOMATIC) - scrollwnd.add(newlogview) - scrollwnd.page = newlogview - file_name = os.path.basename(path) - tablabel = TabLabel(newlogview, file_name) - tablabel.connect( - 'tab-close', - lambda widget, child: self.activity.editor.remove_page( - self.activity.editor.page_num(child))) - self.activity.editor.append_page(scrollwnd, tablabel) - self._active_log = newlogview - self.activity.editor.show_all() - self.activity.editor.set_current_page(-1) + self.load_model() def _filter_by_name(self, filename): return self._namefilter in filename - def _remove_logview(self, logview): - try: - self._openlogs.remove(logview) - except ValueError: - logging.debug("_remove_logview failed") - - -class LogFileViewer(Gtk.ScrolledWindow): - __gtype_name__ = 'LogFileViewer' - - __gsignals__ = { - 'file-selected': (GObject.SignalFlags.RUN_FIRST, - None, - ([str])), - } - - def __init__(self): - Gtk.ScrolledWindow.__init__(self) - - self.props.hscrollbar_policy = Gtk.PolicyType.AUTOMATIC - self.props.vscrollbar_policy = Gtk.PolicyType.AUTOMATIC - self.set_size_request(style.GRID_CELL_SIZE * 3, -1) - - self._path = None - - self._tree_view = Gtk.TreeView() - self._tree_view.connect('cursor-changed', self.__cursor_changed_cb) - self.add(self._tree_view) - self._tree_view.show() - - self._tree_view.props.headers_visible = False - selection = self._tree_view.get_selection() - selection.connect('changed', self.__selection_changed_cb) - - cell = Gtk.CellRendererText() - self._column = Gtk.TreeViewColumn() - self._column.pack_start(cell, True) - self._column.add_attribute(cell, 'text', 0) - self._tree_view.append_column(self._column) - self._tree_view.set_search_column(0) - def init_logs(self, path, filter_function): self._path = path self._filter_function = filter_function @@ -221,8 +165,15 @@ class LogFileViewer(Gtk.ScrolledWindow): def set_title(self, title): self._column.set_title(title) + def remove_logview(self, logview): + try: + self._openlogs.remove(logview) + except ValueError: + logging.debug("_remove_logview failed") + class LogBuffer(Gtk.TextBuffer): + def __init__(self, logfile): Gtk.TextBuffer.__init__(self) @@ -249,12 +200,12 @@ class LogBuffer(Gtk.TextBuffer): class LogView(Gtk.TextView): - def __init__(self, full_path, logminder): + def __init__(self, full_path, log_file_viewer): GObject.GObject.__init__(self) - self.logminder = logminder + self._log_file_viewer = log_file_viewer self.full_path = full_path - self.logminder._openlogs.append(self) + self._log_file_viewer._openlogs.append(self) self.set_wrap_mode(Gtk.WrapMode.WORD) @@ -272,7 +223,7 @@ class LogView(Gtk.TextView): self.show() def remove(self): - self.logminder._remove_logview(self) + self._log_file_viewer.remove_logview(self) def _create_log_buffer(self, path): self._written = False @@ -280,11 +231,11 @@ class LogView(Gtk.TextView): return False if not os.path.exists(path): - logging.error("ERROR: %s don't exists", path) + logging.error("_create_log_buffer: %s don't exists", path) return False if not os.access(path, os.R_OK): - logging.error("ERROR: I can't read '%s' file", path) + logging.error("_create_log_buffer: I can't read '%s' file", path) return False self.filename = _get_filename_from_path(path) |