diff options
author | Agustin Zubiaga <aguz@sugarlabs.org> | 2012-06-12 23:17:18 (GMT) |
---|---|---|
committer | Gonzalo Odiard <godiard@gmail.com> | 2012-06-13 01:11:22 (GMT) |
commit | 06ab523bbd538943b18f8a5d3bbe75ae7df32d53 (patch) | |
tree | aefef1411b35e7467f84904af9c77c4c5327c7bf | |
parent | ba17a76645e24e1a18ba615a1adf3cb8546439e7 (diff) |
Use browse tabs
-rw-r--r-- | develop-activity/icons/close-tab.svg | 27 | ||||
-rw-r--r-- | develop-activity/logviewer.py | 8 | ||||
-rw-r--r-- | develop-activity/sourceview_editor.py | 48 | ||||
-rw-r--r-- | develop-activity/widgets.py | 74 |
4 files changed, 134 insertions, 23 deletions
diff --git a/develop-activity/icons/close-tab.svg b/develop-activity/icons/close-tab.svg new file mode 100644 index 0000000..782ad24 --- /dev/null +++ b/develop-activity/icons/close-tab.svg @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [ + <!ENTITY fill_color "#FFFFFF"> + <!ENTITY stroke_color "#010101"> +]> +<svg + xmlns="http://www.w3.org/2000/svg" + version="1.1" + width="22.16" + height="22.16" + viewBox="0 0 22.16 22.16" + id="browse-close-tab" + xml:space="preserve"> + <g + transform="matrix(1.3,0,0,1.3,-3.2682282,-3.3351543)" + id="browse-dialog-cancel" + style="stroke:&fill_color;;stroke-width:2.69230771;stroke-miterlimit:4;stroke-dasharray:none"> + <path + d="M 14.798121,7.2131543 6.9900671,15.021208" + id="path2986" + style="fill:none;stroke:&fill_color;;stroke-width:2.69230771;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <path + d="M 6.9900671,7.2131543 14.798121,15.021208" + id="path3756" + style="fill:none;stroke:&fill_color;;stroke-width:2.69230771;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + </g> +</svg> diff --git a/develop-activity/logviewer.py b/develop-activity/logviewer.py index 9fe0e9b..14549c7 100644 --- a/develop-activity/logviewer.py +++ b/develop-activity/logviewer.py @@ -26,6 +26,7 @@ import gtk #import gnomevfs import activity_model +from sourceview_editor import TabLabel #does not import develop_app, but references internals from the activity, # as passed to init. @@ -83,7 +84,7 @@ class LogMinder(gtk.VBox): self._logs = {} # Activities menu - self.activity.treenotebook.add_page(_("Log"), scrolled) + self.activity.treenotebook.append_page(gtk.Label(_("Log")), scrolled) # TODO: gnomevfs is deprecated #self._configure_watcher() @@ -136,7 +137,10 @@ class LogMinder(gtk.VBox): gtk.POLICY_AUTOMATIC) scrollwnd.add(newlogview) scrollwnd.page = newlogview - self.activity.editor.add_page(node["name"], scrollwnd) + tablabel = TabLabel(label=node["name"]) + tablabel.page = newlogview + + self.activity.editor.append_page(scrollwnd, tablabel) self.activity.editor.set_current_page(-1) self._active_log = newlogview diff --git a/develop-activity/sourceview_editor.py b/develop-activity/sourceview_editor.py index 45da0f1..cf20592 100644 --- a/develop-activity/sourceview_editor.py +++ b/develop-activity/sourceview_editor.py @@ -18,34 +18,32 @@ import logging import gtk import gobject import pango -from sugar.graphics import notebook import gtksourceview2 import os.path import re import mimetypes from exceptions import ValueError, TypeError, IOError, OSError +from widgets import TabLabel + class S_WHERE: selection, file, multifile = range(3) # an enum -class GtkSourceview2Editor(notebook.Notebook): +class GtkSourceview2Editor(gtk.Notebook): __gsignals__ = { 'changed': (gobject.SIGNAL_RUN_FIRST, None, []) } def __init__(self, activity): - notebook.Notebook.__init__(self, can_close_tabs=True) - self._can_close_tabs = True # redundant, but above call - # broken for some reason + gtk.Notebook.__init__(self) self.activity = activity - self.set_size_request(900, 350) self.connect('page-removed', self._page_removed_cb) self.connect('switch-page', self._switch_page_cb) def _page_removed_cb(self, __notebook, page, n): - page.remove() + page.page.remove() def _switch_page_cb(self, __notebook, page_gptr, page_num): self.activity.update_sidebar_to_page(self.get_nth_page(page_num)) @@ -70,9 +68,17 @@ class GtkSourceview2Editor(notebook.Notebook): scrollwnd.page = page label = filename page.text_buffer.connect('changed', self._changed_cb) - self.add_page(label, scrollwnd) + + tablabel = TabLabel(page, label) + tablabel.connect('tab-close', + lambda widget, child: self.remove_page(self.page_num(child))) + tablabel.page = page + + self.append_page(scrollwnd, tablabel) + self.set_current_page(-1) self._changed_cb(page.text_buffer) + self.show_all() def _changed_cb(self, buffer): if not buffer.can_undo(): @@ -193,9 +199,9 @@ class GtkSourceview2Editor(notebook.Notebook): class GtkSourceview2Page(gtksourceview2.View): def __init__(self, fullPath): - """ + ''' Do any initialization here. - """ + ''' gtksourceview2.View.__init__(self) self.fullPath = fullPath @@ -221,15 +227,15 @@ class GtkSourceview2Page(gtksourceview2.View): self.set_tab_width(4) self.set_auto_indent(True) - self.modify_font(pango.FontDescription("Monospace 10")) + self.modify_font(pango.FontDescription('Monospace 10')) self.load_text() self.show() def load_text(self, offset=None): - """ + ''' Load the text, and optionally scroll to the given offset in the file. - """ + ''' self.text_buffer.begin_not_undoable_action() _file = file(self.fullPath) self.text_buffer.set_text(_file.read()) @@ -270,26 +276,26 @@ class GtkSourceview2Page(gtksourceview2.View): _file.close() def can_undo_redo(self): - """ + ''' Returns a two-tuple (can_undo, can_redo) with Booleans of those abilities. - """ + ''' return (self.text_buffer.can_undo(), self.text_buffer.can_redo()) def undo(self): - """ + ''' Undo the last change in the file. If we can't do anything, ignore. - """ + ''' self.text_buffer.undo() def redo(self): - """ + ''' Redo the last change in the file. If we can't do anything, ignore. - """ + ''' self.text_buffer.redo() def replace(self, ftext, rtext, s_opts): - """returns true if replaced (succeeded)""" + '''returns true if replaced (succeeded)''' selection = s_opts.where == S_WHERE.selection if s_opts.replace_all or selection: result = False @@ -343,7 +349,7 @@ class GtkSourceview2Page(gtksourceview2.View): return rpat def reroot(self, olddir, newdir): - """Returns False if it works""" + '''Returns False if it works''' oldpath = self.fullPath if oldpath.startswith(olddir): self.fullPath = os.path.join(newdir, oldpath[len(olddir):]) diff --git a/develop-activity/widgets.py b/develop-activity/widgets.py new file mode 100644 index 0000000..4e7da2e --- /dev/null +++ b/develop-activity/widgets.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (C) 2006, Red Hat, Inc. +# Copyright (C) 2011, One Laptop Per Child +# Copyright (C) 2009, Tomeu Vizoso, Simon Schampijer +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +#, +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +import gtk +import gobject + +from sugar.graphics.icon import Icon + + +class TabLabel(gtk.HBox): + __gtype_name__ = 'BrowseTabLabel' + + __gsignals__ = { + 'tab-close': (gobject.SIGNAL_RUN_FIRST, + None, + ([object])), + } + + def __init__(self, child, label=""): + gtk.HBox.__init__(self) + + self._child = child + self._label = gtk.Label(label) + self._label.set_alignment(0, 0.5) + self.pack_start(self._label, True, True, 0) + self._label.show() + + self.modify_base(gtk.STATE_NORMAL, gtk.gdk.Color(0, 0, 0, 1)) + + close_tab_icon = Icon(icon_name='close-tab') + button = gtk.Button() + button.props.relief = gtk.RELIEF_NONE + button.props.focus_on_click = False + icon_box = gtk.HBox() + icon_box.pack_start(close_tab_icon, True, False, 0) + button.add(icon_box) + button.connect('clicked', self.__button_clicked_cb) + button.set_name('browse-tab-close') + self.pack_start(button, False, True, 0) + close_tab_icon.show() + icon_box.show() + button.show() + self._close_button = button + + def set_text(self, title): + self._label.set_text(title) + + def update_size(self, size): + self.set_size_request(size, -1) + + def hide_close_button(self): + self._close_button.hide() + + def show_close_button(self): + self._close_button.show() + + def __button_clicked_cb(self, button): + self.emit('tab-close', self._child) |