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

File 0001-Port-to-Gtk3-SL-3761.patch, 13.1 KB (added by humitos, 12 years ago)
  • logviewer.py

    From d9e796a09c07fdc2abc8a8f6d0a6352159623180 Mon Sep 17 00:00:00 2001
    From: Manuel Kaufmann <humitos@gmail.com>
    Date: Wed, 18 Jul 2012 11:21:59 -0300
    Subject: [PATCH Log] Port to Gtk3 SL #3761
    
    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 |  140 ++++++++++++++++++++++++++++++++--------------------------
     setup.py     |    2 +-
     2 files changed, 79 insertions(+), 63 deletions(-)
    
    diff --git a/logviewer.py b/logviewer.py
    index 71ab5c1..b65370e 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): 
    243250        if self.active_log == None:
    244251            self.active_log = log
    245252            self._show_log(logfile)
     253            # README: I don't understand how it works, sometimes it fails
     254            #   http://developer.gnome.org/gtk3/3.5/GtkTreeModelFilter.html#gtk-tree-model-filter-convert-child-iter-to-iter
    246255            log_iter = \
    247256                self._treeview.get_model().convert_child_iter_to_iter(None,
    248257                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): 
    312322            self._textview.scroll_to_iter(end, 0.1)
    313323
    314324
    315 class LogBuffer(gtk.TextBuffer):
     325class LogBuffer(Gtk.TextBuffer):
    316326
    317327    def __init__(self, tagtable, logfile, iterator):
    318         gtk.TextBuffer.__init__(self, tagtable)
     328        # GObject.GObject.__init__(self, tagtable)
     329        GObject.GObject.__init__(self)
     330
     331        # FIXME: it's not possible to set this value
     332        # self.props.tag_table = tagtable
    319333
    320334        self.logfile = logfile
    321335        self._pos = 0
    class LogActivity(activity.Activity): 
    367381
    368382        self._build_toolbox()
    369383
     384        # Get Sugar's clipboard
     385        self.clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
    370386        self.show()
    371387
    372388    def _build_toolbox(self):
    class LogActivity(activity.Activity): 
    389405        toolbar_box.toolbar.insert(wrap_btn, -1)
    390406
    391407        self.search_entry = iconentry.IconEntry()
    392         self.search_entry.set_size_request(gtk.gdk.screen_width() / 3, -1)
     408        self.search_entry.set_size_request(Gdk.Screen.width() / 3, -1)
    393409        self.search_entry.set_icon_from_name(
    394410                iconentry.ICON_ENTRY_PRIMARY, 'system-search')
    395411        self.search_entry.add_clear_button()
    396412        self.search_entry.connect('activate', self._search_entry_activate_cb)
    397413        self.search_entry.connect('changed', self._search_entry_changed_cb)
    398         search_item = gtk.ToolItem()
     414        search_item = Gtk.ToolItem()
    399415        search_item.add(self.search_entry)
    400416        toolbar_box.toolbar.insert(search_item, -1)
    401417
    class LogActivity(activity.Activity): 
    423439        delete_btn.connect('clicked', self._delete_log_cb)
    424440        toolbar_box.toolbar.insert(delete_btn, -1)
    425441
    426         separator = gtk.SeparatorToolItem()
     442        separator = Gtk.SeparatorToolItem()
    427443        separator.set_expand(True)
    428444        separator.set_draw(False)
    429445        toolbar_box.toolbar.insert(separator, -1)
    class LogActivity(activity.Activity): 
    435451
    436452    def __copy_clicked_cb(self, button):
    437453        if self.viewer.active_log:
    438             self.viewer.active_log.copy_clipboard(gtk.clipboard_get())
     454            self.viewer.active_log.copy_clipboard(self.clipboard)
    439455
    440456    def _wrap_cb(self, button):
    441457        if button.get_active():
    442             self.viewer._textview.set_wrap_mode(gtk.WRAP_WORD_CHAR)
     458            self.viewer._textview.set_wrap_mode(Gtk.WrapMode.WORD_CHAR)
    443459        else:
    444             self.viewer._textview.set_wrap_mode(gtk.WRAP_NONE)
     460            self.viewer._textview.set_wrap_mode(Gtk.WrapMode.NONE)
    445461
    446462    def _search_entry_activate_cb(self, entry):
    447463        if self._autosearch_timer:
    448             gobject.source_remove(self._autosearch_timer)
     464            GObject.source_remove(self._autosearch_timer)
    449465        self.viewer.set_search_text(entry.props.text)
    450466        self._update_search_buttons()
    451467
    452468    def _search_entry_changed_cb(self, entry):
    453469        if self._autosearch_timer:
    454             gobject.source_remove(self._autosearch_timer)
    455         self._autosearch_timer = gobject.timeout_add(_AUTOSEARCH_TIMEOUT,
     470            GObject.source_remove(self._autosearch_timer)
     471        self._autosearch_timer = GObject.timeout_add(_AUTOSEARCH_TIMEOUT,
    456472            self.__autosearch_timer_cb)
    457473
    458474    def __autosearch_timer_cb(self):
    class CollectorPalette(Palette): 
    503519
    504520        self._collector = LogCollect()
    505521
    506         label = gtk.Label(
     522        label = Gtk.Label(label=
    507523            _('This captures information about the system\n'\
    508524              'and running processes to a journal entry.\n'\
    509525              'Use this to improve a problem report.'))
    510526
    511         send_button = gtk.Button(_('Capture information'))
     527        send_button = Gtk.Button(_('Capture information'))
    512528        send_button.connect('clicked', self._on_send_button_clicked_cb)
    513529
    514         vbox = gtk.VBox(False, 5)
    515         vbox.pack_start(label)
    516         vbox.pack_start(send_button)
     530        vbox = Gtk.VBox(False, 5)
     531        vbox.pack_start(label, True, True, 0)
     532        vbox.pack_start(send_button, True, True, 0)
    517533        vbox.show_all()
    518534
    519535        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