Ticket #3761: 0001-Port-to-Gtk3-SL-3761.2.patch

File 0001-Port-to-Gtk3-SL-3761.2.patch, 14.3 KB (added by humitos, 12 years ago)

New version - v2

  • logviewer.py

    From 0b28e42f0e69f29937af9c78add18b7e0ebde16c Mon Sep 17 00:00:00 2001
    From: Manuel Kaufmann <humitos@gmail.com>
    Date: Wed, 25 Jul 2012 13:11:11 -0300
    Subject: [PATCH v2 Log] Port to Gtk3 SL #3761
    
    Convert all the gtk2 and sugar-toolkit code to launch this Activity
    using Gtk3.
    
     * Searching on the log file is not working due to this bug:
       https://bugzilla.gnome.org/show_bug.cgi?id=680597
    
    All these steps are documented here:
    
     * http://wiki.sugarlabs.org/go/Features/GTK3/Porting/Log
    
    Signed-off-by: Manuel Kaufmann <humitos@gmail.com>
    ---
     logviewer.py |  163 ++++++++++++++++++++++++++++++++--------------------------
     setup.py     |    2 +-
     2 files changed, 92 insertions(+), 73 deletions(-)
    
    diff --git a/logviewer.py b/logviewer.py
    index 71ab5c1..02cf25b 100644
    a b from gettext import gettext as _ 
    2222
    2323import re
    2424
    25 import gtk
    26 import pango
    27 import gobject
    28 import gio
    29 
    30 from sugar.activity import activity
    31 from sugar.activity.widgets import ActivityToolbarButton
    32 from sugar import env
    33 from sugar.graphics import iconentry
    34 from sugar.graphics.toolbutton import ToolButton
    35 from sugar.graphics.toggletoolbutton import ToggleToolButton
    36 from sugar.graphics.palette import Palette
    37 from sugar.graphics.alert import NotifyAlert
     25from gi.repository import Gtk
     26from gi.repository import Gdk
     27from gi.repository import Pango
     28from gi.repository import GObject
     29from gi.repository import Gio
     30
     31from sugar3.activity import activity
     32from sugar3.activity.widgets import ActivityToolbarButton
     33from sugar3 import env
     34from sugar3.graphics import iconentry
     35from sugar3.graphics.toolbutton import ToolButton
     36from sugar3.graphics.toggletoolbutton import ToggleToolButton
     37from sugar3.graphics.palette import Palette
     38from sugar3.graphics.alert import NotifyAlert
    3839from logcollect import LogCollect
    39 from sugar.graphics.toolbarbox import ToolbarBox
    40 from sugar.activity.widgets import CopyButton, StopButton
    41 from sugar.datastore import datastore
     40from sugar3.graphics.toolbarbox import ToolbarBox
     41from sugar3.activity.widgets import CopyButton, StopButton
     42from sugar3.datastore import datastore
    4243
    4344
    4445_AUTOSEARCH_TIMEOUT = 1000
    def _notify_response_cb(notify, response, activity): 
    4950    activity.remove_alert(notify)
    5051
    5152
    52 class MultiLogView(gtk.HPaned):
     53class MultiLogView(Gtk.HPaned):
    5354
    5455    def __init__(self, paths, extra_files):
    55         gtk.HPaned.__init__(self)
     56        GObject.GObject.__init__(self)
    5657
    5758        self.paths = paths
    5859        self.extra_files = extra_files
    class MultiLogView(gtk.HPaned): 
    7374        self._find_logs()
    7475
    7576    def _build_treeview(self):
    76         self._treeview = gtk.TreeView()
     77        self._treeview = Gtk.TreeView()
    7778
    7879        self._treeview.set_rules_hint(True)
    7980        self._treeview.connect('cursor-changed', self._cursor_changed_cb)
    8081
    81         self._treemodel = gtk.TreeStore(gobject.TYPE_STRING)
     82        self._treemodel = Gtk.TreeStore(GObject.TYPE_STRING)
    8283
    83         sorted = gtk.TreeModelSort(self._treemodel)
    84         sorted.set_sort_column_id(0, gtk.SORT_ASCENDING)
     84        # README: https://bugzilla.gnome.org/show_bug.cgi?id=680009
     85        sorted = self._treemodel.sort_new_with_model()
     86        sorted.set_sort_column_id(0, Gtk.SortType.ASCENDING)
    8587        sorted.set_sort_func(0, self._sort_logfile)
    8688        self._treeview.set_model(sorted)
    8789
    88         renderer = gtk.CellRendererText()
    89         col = gtk.TreeViewColumn(_('Log Files'), renderer, text=0)
     90        renderer = Gtk.CellRendererText()
     91        col = Gtk.TreeViewColumn(_('Log Files'), renderer, text=0)
    9092        self._treeview.append_column(col)
    9193
    9294        self.path_iter = {}
    class MultiLogView(gtk.HPaned): 
    9698        if len(self.extra_files):
    9799            self.extra_iter = self._treemodel.append(None, [_('Other')])
    98100
    99         scroll = gtk.ScrolledWindow()
    100         scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
     101        scroll = Gtk.ScrolledWindow()
     102        scroll.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
    101103        scroll.add(self._treeview)
    102         scroll.set_size_request(gtk.gdk.screen_width() * 30 / 100, -1)
     104        scroll.set_size_request(Gdk.Screen.width() * 30 / 100, -1)
    103105
    104106        self.add1(scroll)
    105107
    106108    def _build_textview(self):
    107         self._textview = gtk.TextView()
    108         self._textview.set_wrap_mode(gtk.WRAP_NONE)
     109        self._textview = Gtk.TextView()
     110        self._textview.set_wrap_mode(Gtk.WrapMode.NONE)
    109111
    110         pangoFont = pango.FontDescription('Mono')
     112        pangoFont = Pango.FontDescription('Mono')
    111113        self._textview.modify_font(pangoFont)
    112114
    113         bgcolor = gtk.gdk.color_parse('#FFFFFF')
    114         self._textview.modify_base(gtk.STATE_NORMAL, bgcolor)
     115        bgcolor = Gdk.color_parse('#FFFFFF')
     116        self._textview.modify_base(Gtk.StateType.NORMAL, bgcolor)
    115117
    116118        self._textview.set_editable(False)
    117119
    118         self._tagtable = gtk.TextTagTable()
    119         hilite_tag = gtk.TextTag('search-hilite')
     120        self._tagtable = Gtk.TextTagTable()
     121        hilite_tag = Gtk.TextTag.new('search-hilite')
    120122        hilite_tag.props.background = '#FFFFB0'
    121123        self._tagtable.add(hilite_tag)
    122         select_tag = gtk.TextTag('search-select')
     124        select_tag = Gtk.TextTag.new('search-select')
    123125        select_tag.props.background = '#B0B0FF'
    124126        self._tagtable.add(select_tag)
    125127
    126         scroll = gtk.ScrolledWindow()
    127         scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
     128        scroll = Gtk.ScrolledWindow()
     129        scroll.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
    128130        scroll.add(self._textview)
    129131
    130132        self.add2(scroll)
    131133
    132     def _sort_logfile(self, treemodel, itera, iterb):
     134    def _sort_logfile(self, treemodel, itera, iterb, user_data=None):
    133135        a = treemodel.get_value(itera, 0)
    134136        b = treemodel.get_value(iterb, 0)
    135137        if a == None or b == None:
    class MultiLogView(gtk.HPaned): 
    162164    def _configure_watcher(self):
    163165        # Setting where GIO will be watching
    164166        for p in self.paths:
    165             monitor = gio.File(p).monitor_directory()
     167            monitor = Gio.File.new_for_path(p)\
     168                .monitor_directory(Gio.FileMonitorFlags.NONE, None)
    166169            monitor.connect('changed', self._log_file_changed_cb)
    167170            self._gio_monitors.append(monitor)
    168171
    169172        for f in self.extra_files:
    170             monitor = gio.File(f).monitor_file()
     173            monitor = Gio.File.new_for_path(f)\
     174                .monitor_file(Gio.FileMonitorFlags.NONE, None)
    171175            monitor.connect('changed', self._log_file_changed_cb)
    172176            self._gio_monitors.append(monitor)
    173177
    174178    def _log_file_changed_cb(self, monitor, log_file, other_file, event):
    175179        logfile = log_file.get_basename()
    176180
    177         if event == gio.FILE_MONITOR_EVENT_CHANGED:
     181        if event == Gio.FileMonitorEvent.CHANGED:
    178182            if logfile in self.logs:
    179183                self.logs[logfile].update()
    180         elif event == gio.FILE_MONITOR_EVENT_DELETED:
     184        elif event == Gio.FileMonitorEvent.DELETED:
    181185            if logfile in self.logs:
    182186                self._remove_log_file(logfile)
    183         elif event == gio.FILE_MONITOR_EVENT_CREATED:
     187        elif event == Gio.FileMonitorEvent.CREATED:
    184188            self._add_log_file(log_file.get_path())
    185189
    186190    def _cursor_changed_cb(self, treeview):
    187191        treestore, text_iter = self._treeview.get_selection().get_selected()
    188         self._show_log(treestore.get_value(text_iter, 0))
     192        # FIXME: None is not a possible value
     193        if text_iter:
     194            self._show_log(treestore.get_value(text_iter, 0))
    189195
    190196    def _show_log(self, logfile):
    191197        if logfile in self.logs:
    192198            log = self.logs[logfile]
    193199            self._textview.set_buffer(log)
    194             self._textview.scroll_to_mark(log.get_insert(), 0)
     200            self._textview.scroll_to_mark(
     201                log.get_insert(), 0, use_align=False, xalign=0.5, yalign=0.5)
    195202            self.active_log = log
    196203
    197204    def _find_logs(self):
    class MultiLogView(gtk.HPaned): 
    241248        written = log._written
    242249
    243250        if self.active_log == None:
     251            # import epdb;epdb.set_trace()
    244252            self.active_log = log
    245253            self._show_log(logfile)
    246             log_iter = \
    247                 self._treeview.get_model().convert_child_iter_to_iter(None,
    248                 log.iter)
     254            # README: I don't understand how it works, sometimes it fails
     255            #   http://developer.gnome.org/gtk3/3.5/GtkTreeModelSort.html#gtk-tree-model-sort-convert-child-iter-to-iter
     256            success, log_iter = \
     257                self._treeview.get_model().convert_child_iter_to_iter(log.iter)
    249258            self._treeview.get_selection().select_iter(log_iter)
    250259
    251260        if written > 0 and self.active_log == log:
    252             self._textview.scroll_to_mark(log.get_insert(), 0)
     261            self._textview.scroll_to_mark(
     262                log.get_insert(), 0, use_align=False, xalign=0.5, yalign=0.5)
    253263
    254264    def _remove_log_file(self, logfile):
    255265        log = self.logs[logfile]
    class MultiLogView(gtk.HPaned): 
    268278        _buffer.remove_tag_by_name('search-select', start, end)
    269279
    270280        text_iter = _buffer.get_start_iter()
    271         while True:
    272             next_found = text_iter.forward_search(text, 0)
    273             if next_found is None:
    274                 break
    275             start, end = next_found
    276             _buffer.apply_tag_by_name('search-hilite', start, end)
    277             text_iter = end
     281
     282        # FIXME: this search is not working due to this bug
     283        # https://bugzilla.gnome.org/show_bug.cgi?id=680597
     284        # while True:
     285        #     next_found = text_iter.forward_search(text, 0)
     286        #     if next_found is None:
     287        #         break
     288        #     start, end = next_found
     289        #     _buffer.apply_tag_by_name('search-hilite', start, end)
     290        #     text_iter = end
    278291
    279292        if self.get_next_result('current'):
    280293            self.search_next('current')
    class MultiLogView(gtk.HPaned): 
    312325            self._textview.scroll_to_iter(end, 0.1)
    313326
    314327
    315 class LogBuffer(gtk.TextBuffer):
     328class LogBuffer(Gtk.TextBuffer):
    316329
    317330    def __init__(self, tagtable, logfile, iterator):
    318         gtk.TextBuffer.__init__(self, tagtable)
     331        # GObject.GObject.__init__(self, tagtable)
     332        GObject.GObject.__init__(self)
     333
     334        # FIXME: it's not possible to set this value
     335        # self.props.tag_table = tagtable
    319336
    320337        self.logfile = logfile
    321338        self._pos = 0
    class LogActivity(activity.Activity): 
    367384
    368385        self._build_toolbox()
    369386
     387        # Get Sugar's clipboard
     388        self.clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
    370389        self.show()
    371390
    372391    def _build_toolbox(self):
    class LogActivity(activity.Activity): 
    389408        toolbar_box.toolbar.insert(wrap_btn, -1)
    390409
    391410        self.search_entry = iconentry.IconEntry()
    392         self.search_entry.set_size_request(gtk.gdk.screen_width() / 3, -1)
     411        self.search_entry.set_size_request(Gdk.Screen.width() / 3, -1)
    393412        self.search_entry.set_icon_from_name(
    394413                iconentry.ICON_ENTRY_PRIMARY, 'system-search')
    395414        self.search_entry.add_clear_button()
    396415        self.search_entry.connect('activate', self._search_entry_activate_cb)
    397416        self.search_entry.connect('changed', self._search_entry_changed_cb)
    398         search_item = gtk.ToolItem()
     417        search_item = Gtk.ToolItem()
    399418        search_item.add(self.search_entry)
    400419        toolbar_box.toolbar.insert(search_item, -1)
    401420
    class LogActivity(activity.Activity): 
    423442        delete_btn.connect('clicked', self._delete_log_cb)
    424443        toolbar_box.toolbar.insert(delete_btn, -1)
    425444
    426         separator = gtk.SeparatorToolItem()
     445        separator = Gtk.SeparatorToolItem()
    427446        separator.set_expand(True)
    428447        separator.set_draw(False)
    429448        toolbar_box.toolbar.insert(separator, -1)
    class LogActivity(activity.Activity): 
    435454
    436455    def __copy_clicked_cb(self, button):
    437456        if self.viewer.active_log:
    438             self.viewer.active_log.copy_clipboard(gtk.clipboard_get())
     457            self.viewer.active_log.copy_clipboard(self.clipboard)
    439458
    440459    def _wrap_cb(self, button):
    441460        if button.get_active():
    442             self.viewer._textview.set_wrap_mode(gtk.WRAP_WORD_CHAR)
     461            self.viewer._textview.set_wrap_mode(Gtk.WrapMode.WORD_CHAR)
    443462        else:
    444             self.viewer._textview.set_wrap_mode(gtk.WRAP_NONE)
     463            self.viewer._textview.set_wrap_mode(Gtk.WrapMode.NONE)
    445464
    446465    def _search_entry_activate_cb(self, entry):
    447466        if self._autosearch_timer:
    448             gobject.source_remove(self._autosearch_timer)
     467            GObject.source_remove(self._autosearch_timer)
    449468        self.viewer.set_search_text(entry.props.text)
    450469        self._update_search_buttons()
    451470
    452471    def _search_entry_changed_cb(self, entry):
    453472        if self._autosearch_timer:
    454             gobject.source_remove(self._autosearch_timer)
    455         self._autosearch_timer = gobject.timeout_add(_AUTOSEARCH_TIMEOUT,
     473            GObject.source_remove(self._autosearch_timer)
     474        self._autosearch_timer = GObject.timeout_add(_AUTOSEARCH_TIMEOUT,
    456475            self.__autosearch_timer_cb)
    457476
    458477    def __autosearch_timer_cb(self):
    class CollectorPalette(Palette): 
    503522
    504523        self._collector = LogCollect()
    505524
    506         label = gtk.Label(
     525        label = Gtk.Label(label=
    507526            _('This captures information about the system\n'\
    508527              'and running processes to a journal entry.\n'\
    509528              'Use this to improve a problem report.'))
    510529
    511         send_button = gtk.Button(_('Capture information'))
     530        send_button = Gtk.Button(_('Capture information'))
    512531        send_button.connect('clicked', self._on_send_button_clicked_cb)
    513532
    514         vbox = gtk.VBox(False, 5)
    515         vbox.pack_start(label)
    516         vbox.pack_start(send_button)
     533        vbox = Gtk.VBox(False, 5)
     534        vbox.pack_start(label, True, True, 0)
     535        vbox.pack_start(send_button, True, True, 0)
    517536        vbox.show_all()
    518537
    519538        self.set_content(vbox)
  • setup.py

    diff --git a/setup.py b/setup.py
    index 876cd3f..95390a3 100755
    a b  
    1616# along with this program; if not, write to the Free Software
    1717# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
    1818
    19 from sugar.activity import bundlebuilder
     19from sugar3.activity import bundlebuilder
    2020
    2121bundlebuilder.start()
    2222