Ticket #3761: v3-Log-Port-to-Gtk3-SL-3761.patch

File v3-Log-Port-to-Gtk3-SL-3761.patch, 15.1 KB (added by humitos, 12 years ago)

v3 patch

  • logviewer.py

    From patchwork Mon Jul 30 11:56:41 2012
    Content-Type: text/plain; charset="utf-8"
    MIME-Version: 1.0
    Content-Transfer-Encoding: 7bit
    Subject: [v3,Log] Port to Gtk3 SL #3761
    Date: Mon, 30 Jul 2012 16:56:41 -0000
    From: Manuel Kaufmann <humitos@gmail.com>
    X-Patchwork-Id: 1604
    Message-Id: <1343649401-24353-1-git-send-email-humitos@gmail.com>
    To: gonzalo@laptop.org
    Cc: Manuel Kaufmann <humitos@gmail.com>, sugar-devel@lists.sugarlabs.org
    
    Convert all the gtk2 and sugar-toolkit code to launch this Activity
    using Gtk3. 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 | 168 ++++++++++++++++++++++++++++++++---------------------------
     setup.py     |   2 +-
     2 files changed, 91 insertions(+), 79 deletions(-)
    
    diff --git a/logviewer.py b/logviewer.py
    index 71ab5c1..e87ef77 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         hilite_tag.props.background = '#FFFFB0'
    121         self._tagtable.add(hilite_tag)
    122         select_tag = gtk.TextTag('search-select')
    123         select_tag.props.background = '#B0B0FF'
    124         self._tagtable.add(select_tag)
    125 
    126         scroll = gtk.ScrolledWindow()
    127         scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
     120        scroll = Gtk.ScrolledWindow()
     121        scroll.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
    128122        scroll.add(self._textview)
    129123
    130124        self.add2(scroll)
    131125
    132     def _sort_logfile(self, treemodel, itera, iterb):
     126    def _sort_logfile(self, treemodel, itera, iterb, user_data=None):
    133127        a = treemodel.get_value(itera, 0)
    134128        b = treemodel.get_value(iterb, 0)
    135129        if a == None or b == None:
    class MultiLogView(gtk.HPaned): 
    162156    def _configure_watcher(self):
    163157        # Setting where GIO will be watching
    164158        for p in self.paths:
    165             monitor = gio.File(p).monitor_directory()
     159            monitor = Gio.File.new_for_path(p)\
     160                .monitor_directory(Gio.FileMonitorFlags.NONE, None)
    166161            monitor.connect('changed', self._log_file_changed_cb)
    167162            self._gio_monitors.append(monitor)
    168163
    169164        for f in self.extra_files:
    170             monitor = gio.File(f).monitor_file()
     165            monitor = Gio.File.new_for_path(f)\
     166                .monitor_file(Gio.FileMonitorFlags.NONE, None)
    171167            monitor.connect('changed', self._log_file_changed_cb)
    172168            self._gio_monitors.append(monitor)
    173169
    174170    def _log_file_changed_cb(self, monitor, log_file, other_file, event):
    175171        logfile = log_file.get_basename()
    176172
    177         if event == gio.FILE_MONITOR_EVENT_CHANGED:
     173        if event == Gio.FileMonitorEvent.CHANGED:
    178174            if logfile in self.logs:
    179175                self.logs[logfile].update()
    180         elif event == gio.FILE_MONITOR_EVENT_DELETED:
     176        elif event == Gio.FileMonitorEvent.DELETED:
    181177            if logfile in self.logs:
    182178                self._remove_log_file(logfile)
    183         elif event == gio.FILE_MONITOR_EVENT_CREATED:
     179        elif event == Gio.FileMonitorEvent.CREATED:
    184180            self._add_log_file(log_file.get_path())
    185181
    186182    def _cursor_changed_cb(self, treeview):
    187         treestore, text_iter = self._treeview.get_selection().get_selected()
    188         self._show_log(treestore.get_value(text_iter, 0))
     183        selection = self._treeview.get_selection()
     184        if selection is not None:
     185            treestore, text_iter = selection.get_selected()
     186            self._show_log(treestore.get_value(text_iter, 0))
    189187
    190188    def _show_log(self, logfile):
    191189        if logfile in self.logs:
    192190            log = self.logs[logfile]
    193191            self._textview.set_buffer(log)
    194             self._textview.scroll_to_mark(log.get_insert(), 0)
     192            self._textview.scroll_to_mark(
     193                log.get_insert(), 0, use_align=False, xalign=0.5, yalign=0.5)
    195194            self.active_log = log
    196195
    197196    def _find_logs(self):
    class MultiLogView(gtk.HPaned): 
    233232                parent = self.path_iter[directory]
    234233            tree_iter = self._treemodel.append(parent, [logfile])
    235234
    236             model = LogBuffer(self._tagtable, path, tree_iter)
     235            model = LogBuffer(path, tree_iter)
    237236            self.logs[logfile] = model
    238237
    239238        log = self.logs[logfile]
    class MultiLogView(gtk.HPaned): 
    243242        if self.active_log == None:
    244243            self.active_log = log
    245244            self._show_log(logfile)
    246             log_iter = \
    247                 self._treeview.get_model().convert_child_iter_to_iter(None,
    248                 log.iter)
     245            success, log_iter = \
     246                self._treeview.get_model().convert_child_iter_to_iter(log.iter)
    249247            self._treeview.get_selection().select_iter(log_iter)
    250248
    251249        if written > 0 and self.active_log == log:
    252             self._textview.scroll_to_mark(log.get_insert(), 0)
     250            self._textview.scroll_to_mark(
     251                log.get_insert(), 0, use_align=False, xalign=0.5, yalign=0.5)
    253252
    254253    def _remove_log_file(self, logfile):
    255254        log = self.logs[logfile]
    class MultiLogView(gtk.HPaned): 
    268267        _buffer.remove_tag_by_name('search-select', start, end)
    269268
    270269        text_iter = _buffer.get_start_iter()
     270
    271271        while True:
    272             next_found = text_iter.forward_search(text, 0)
     272            next_found = text_iter.forward_search(text, 0, None)
    273273            if next_found is None:
    274274                break
    275275            start, end = next_found
    class MultiLogView(gtk.HPaned): 
    291291            text_iter = _buffer.get_iter_at_mark(_buffer.get_insert())
    292292
    293293        if direction == 'backward':
    294             return text_iter.backward_search(self.search_text, 0)
     294            return text_iter.backward_search(self.search_text, 0, None)
    295295        else:
    296             return text_iter.forward_search(self.search_text, 0)
     296            return text_iter.forward_search(self.search_text, 0, None)
    297297
    298298    def search_next(self, direction):
    299299        next_found = self.get_next_result(direction)
    class MultiLogView(gtk.HPaned): 
    308308
    309309            _buffer.place_cursor(start)
    310310
    311             self._textview.scroll_to_iter(start, 0.1)
    312             self._textview.scroll_to_iter(end, 0.1)
     311            self._textview.scroll_to_iter(start, 0.1, use_align=False,
     312                                          xalign=0.5, yalign=0.5)
     313            self._textview.scroll_to_iter(end, 0.1, use_align=False,
     314                                          xalign=0.5, yalign=0.5)
    313315
    314316
    315 class LogBuffer(gtk.TextBuffer):
     317class LogBuffer(Gtk.TextBuffer):
    316318
    317     def __init__(self, tagtable, logfile, iterator):
    318         gtk.TextBuffer.__init__(self, tagtable)
     319    def __init__(self, logfile, iterator):
     320        GObject.GObject.__init__(self)
     321
     322        _tagtable = self.get_tag_table()
     323        hilite_tag = Gtk.TextTag.new('search-hilite')
     324        hilite_tag.props.background = '#FFFFB0'
     325        _tagtable.add(hilite_tag)
     326        select_tag = Gtk.TextTag.new('search-select')
     327        select_tag.props.background = '#B0B0FF'
     328        _tagtable.add(select_tag)
    319329
    320330        self.logfile = logfile
    321331        self._pos = 0
    class LogActivity(activity.Activity): 
    367377
    368378        self._build_toolbox()
    369379
     380        # Get Sugar's clipboard
     381        self.clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
    370382        self.show()
    371383
    372384    def _build_toolbox(self):
    class LogActivity(activity.Activity): 
    389401        toolbar_box.toolbar.insert(wrap_btn, -1)
    390402
    391403        self.search_entry = iconentry.IconEntry()
    392         self.search_entry.set_size_request(gtk.gdk.screen_width() / 3, -1)
     404        self.search_entry.set_size_request(Gdk.Screen.width() / 3, -1)
    393405        self.search_entry.set_icon_from_name(
    394406                iconentry.ICON_ENTRY_PRIMARY, 'system-search')
    395407        self.search_entry.add_clear_button()
    396408        self.search_entry.connect('activate', self._search_entry_activate_cb)
    397409        self.search_entry.connect('changed', self._search_entry_changed_cb)
    398         search_item = gtk.ToolItem()
     410        search_item = Gtk.ToolItem()
    399411        search_item.add(self.search_entry)
    400412        toolbar_box.toolbar.insert(search_item, -1)
    401413
    class LogActivity(activity.Activity): 
    423435        delete_btn.connect('clicked', self._delete_log_cb)
    424436        toolbar_box.toolbar.insert(delete_btn, -1)
    425437
    426         separator = gtk.SeparatorToolItem()
     438        separator = Gtk.SeparatorToolItem()
    427439        separator.set_expand(True)
    428440        separator.set_draw(False)
    429441        toolbar_box.toolbar.insert(separator, -1)
    class LogActivity(activity.Activity): 
    435447
    436448    def __copy_clicked_cb(self, button):
    437449        if self.viewer.active_log:
    438             self.viewer.active_log.copy_clipboard(gtk.clipboard_get())
     450            self.viewer.active_log.copy_clipboard(self.clipboard)
    439451
    440452    def _wrap_cb(self, button):
    441453        if button.get_active():
    442             self.viewer._textview.set_wrap_mode(gtk.WRAP_WORD_CHAR)
     454            self.viewer._textview.set_wrap_mode(Gtk.WrapMode.WORD_CHAR)
    443455        else:
    444             self.viewer._textview.set_wrap_mode(gtk.WRAP_NONE)
     456            self.viewer._textview.set_wrap_mode(Gtk.WrapMode.NONE)
    445457
    446458    def _search_entry_activate_cb(self, entry):
    447459        if self._autosearch_timer:
    448             gobject.source_remove(self._autosearch_timer)
     460            GObject.source_remove(self._autosearch_timer)
    449461        self.viewer.set_search_text(entry.props.text)
    450462        self._update_search_buttons()
    451463
    452464    def _search_entry_changed_cb(self, entry):
    453465        if self._autosearch_timer:
    454             gobject.source_remove(self._autosearch_timer)
    455         self._autosearch_timer = gobject.timeout_add(_AUTOSEARCH_TIMEOUT,
     466            GObject.source_remove(self._autosearch_timer)
     467        self._autosearch_timer = GObject.timeout_add(_AUTOSEARCH_TIMEOUT,
    456468            self.__autosearch_timer_cb)
    457469
    458470    def __autosearch_timer_cb(self):
    class CollectorPalette(Palette): 
    503515
    504516        self._collector = LogCollect()
    505517
    506         label = gtk.Label(
     518        label = Gtk.Label(label=
    507519            _('This captures information about the system\n'\
    508520              'and running processes to a journal entry.\n'\
    509521              'Use this to improve a problem report.'))
    510522
    511         send_button = gtk.Button(_('Capture information'))
     523        send_button = Gtk.Button(_('Capture information'))
    512524        send_button.connect('clicked', self._on_send_button_clicked_cb)
    513525
    514         vbox = gtk.VBox(False, 5)
    515         vbox.pack_start(label)
    516         vbox.pack_start(send_button)
     526        vbox = Gtk.VBox(False, 5)
     527        vbox.pack_start(label, True, True, 0)
     528        vbox.pack_start(send_button, True, True, 0)
    517529        vbox.show_all()
    518530
    519531        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