Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAgustin Zubiaga <aguz@sugarlabs.org>2012-06-12 23:17:18 (GMT)
committer Gonzalo Odiard <godiard@gmail.com>2012-06-13 01:11:22 (GMT)
commit06ab523bbd538943b18f8a5d3bbe75ae7df32d53 (patch)
treeaefef1411b35e7467f84904af9c77c4c5327c7bf
parentba17a76645e24e1a18ba615a1adf3cb8546439e7 (diff)
Use browse tabs
-rw-r--r--develop-activity/icons/close-tab.svg27
-rw-r--r--develop-activity/logviewer.py8
-rw-r--r--develop-activity/sourceview_editor.py48
-rw-r--r--develop-activity/widgets.py74
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)