Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSai Vineet <saivineet89@gmail.com>2013-12-24 15:52:58 (GMT)
committer Sai Vineet <saivineet89@gmail.com>2013-12-25 14:16:18 (GMT)
commitea0d56d3b2cac74ba3bd9f08a3d683a770d75e3e (patch)
tree4933743d93bc352d4026e1def3bfd2ef12236cd9
parent9026fa47f4dcc5f34dd86a53441fcba8f45d6b60 (diff)
Add Journal support to Pippy's new tab functionality
Also added disutils exporting feature and tab naming capability
-rw-r--r--Notebook.py74
-rw-r--r--pippy_app.py151
2 files changed, 202 insertions, 23 deletions
diff --git a/Notebook.py b/Notebook.py
index 3deb3a1..16eebe5 100644
--- a/Notebook.py
+++ b/Notebook.py
@@ -23,15 +23,28 @@ class TabLabel(Gtk.HBox):
([GObject.TYPE_PYOBJECT])),
}
- def __init__(self, child, label):
+ def __init__(self, child, label, tabs):
GObject.GObject.__init__(self)
self.child = child
- self._label = Gtk.Label(label=label)
+ self.label_text = label
+ self.tabs = tabs
+
+ self.label_box = Gtk.EventBox()
+ self._label = Gtk.Label(label=self.label_text)
self._label.set_alignment(0, 0.5)
- self.pack_start(self._label, True, True, 5)
self._label.show()
+ self.label_box.add(self._label)
+ self.label_box.connect("button-press-event", self._label_clicked)
+ self.label_box.show_all()
+ self.pack_start(self.label_box, True, True, 5)
+
+ self.label_entry = Gtk.Entry()
+ self.label_entry.connect("activate", self._label_entry_cb)
+ self.label_entry.connect("focus-out-event", self._label_entry_cb)
+ self.pack_start(self.label_entry, True, True, 0)
+
button = ToolButton("close-tab")
button.connect('clicked', self.__button_clicked_cb)
self.pack_start(button, False, True, 0)
@@ -41,6 +54,9 @@ class TabLabel(Gtk.HBox):
def set_text(self, title):
self._label.set_text(title)
+ def get_text(self):
+ return self._label.get_text()
+
def update_size(self, size):
self.set_size_request(size, -1)
@@ -53,6 +69,21 @@ class TabLabel(Gtk.HBox):
def __button_clicked_cb(self, button):
self.emit('tab-close', self.child)
+ def _label_clicked(self, eventbox, data):
+ if self.tabs.page_num(self.child) is not self.tabs.get_current_page():
+ self.child.grab_focus()
+ else:
+ self.label_entry.set_text(self.label_text)
+ eventbox.hide()
+ self.label_entry.grab_focus()
+ self.label_entry.show()
+
+ def _label_entry_cb(self, entry, focus=None):
+ self.label_text = self.label_entry.get_text()
+ self.label_box.show_all()
+ self.label_entry.hide()
+ self._label.set_text(self.label_text)
+
"""
AddNotebook
@@ -85,10 +116,9 @@ class SourceNotebook(AddNotebook):
def __init__(self, activity):
AddNotebook.__init__(self)
self.activity = activity
+ self.set_scrollable(True)
- self.add_tab()
-
- def add_tab(self, label=None):
+ def add_tab(self, label=None, buffer_text=None):
# Set text_buffer
text_buffer = GtkSource.Buffer()
@@ -109,6 +139,9 @@ class SourceNotebook(AddNotebook):
else:
text_buffer.set_highlight_syntax(True)
+ if buffer_text:
+ text_buffer.set_text(buffer_text)
+
# Set up SourceView
text_view = GtkSource.View()
text_view.set_buffer(text_buffer)
@@ -129,12 +162,13 @@ class SourceNotebook(AddNotebook):
Gtk.PolicyType.AUTOMATIC)
codesw.add(text_view)
- tabdex = self.get_n_pages()
+ tabdex = self.get_n_pages() + 1
if label:
- tablabel = TabLabel(codesw, label)
+ tablabel = TabLabel(codesw, label, self)
else:
tablabel = TabLabel(codesw,
- _("New Source File %d" % tabdex))
+ _("New Source File %d" % tabdex),
+ self)
tablabel.connect("tab-close", self._tab_closed_cb)
codesw.show_all()
index = self.append_page(codesw,
@@ -151,6 +185,24 @@ class SourceNotebook(AddNotebook):
text_view = tab[0]
return text_view
+ def get_all_data(self):
+ # Returns all the names of files and the buffer contents too.
+ names = []
+ contents = []
+ for i in range(0, self.get_n_pages()):
+ child = self.get_nth_page(i)
+ text_buffer = child.get_children()[0].get_buffer()
+ text = text_buffer.get_text(*text_buffer.get_bounds(),
+ include_hidden_chars=True)
+ contents.append(text)
+
+ label = self.get_tab_label(child).get_text()
+ if not label.endswith(".py"):
+ label = label + ".py"
+ names.append(label)
+
+ return (names, contents)
+
def child_exited_cb(self, *args):
"""Called whenever a child exits. If there's a handler, runadd it."""
h, self.activity._child_exited_handler = \
@@ -161,3 +213,7 @@ class SourceNotebook(AddNotebook):
def _tab_closed_cb(self, notebook, child):
index = self.page_num(child)
self.remove_page(index)
+ try:
+ del self.activity.session_data[index]
+ except IndexError:
+ pass
diff --git a/pippy_app.py b/pippy_app.py
index 0349d86..2eb1af9 100644
--- a/pippy_app.py
+++ b/pippy_app.py
@@ -25,6 +25,7 @@ import os
import subprocess
from random import uniform
import locale
+import json
import dbus
from dbus.mainloop.glib import DBusGMainLoop
@@ -43,6 +44,7 @@ from port.style import font_zoom
from signal import SIGTERM
from gettext import gettext as _
+from sugar3.datastore import datastore
from sugar3.activity.widgets import EditToolbar
from sugar3.activity.widgets import StopButton
from sugar3.activity.activity import get_bundle_path
@@ -80,13 +82,27 @@ groupthink_mimetype = 'pickle/groupthink-pippy'
from Notebook import SourceNotebook, AddNotebook
+DISUTILS_SETUP_SCRIPT = """#!/usr/bin/python
+# -*- coding: utf-8 -*-
+from distutils.core import setup
+setup(name='{modulename}',
+ version='1.0',
+ py_modules=[
+ {filenames}
+ ],
+ )
+""" # This is .format()'ed with the list of the file names.
+
class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity):
"""Pippy Activity as specified in activity.info"""
def early_setup(self):
- global text_buffer
from gi.repository import GtkSource
- text_buffer = GtkSource.Buffer()
+ self.initial_text_buffer = GtkSource.Buffer()
+ self.loaded_from_journal = False
+ self.py_file = False
+ self.loaded_session = []
+ self.session_data = []
def initialize_display(self):
self._logger = logging.getLogger('pippy-activity')
@@ -117,6 +133,12 @@ class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity):
create_bundle_button.show()
activity_toolbar.insert(create_bundle_button, -1)
+ export_disutils = ToolButton("pippy-create_bundle")
+ export_disutils.set_tooltip(_("Export as disutils package"))
+ export_disutils.connect("clicked", self.__export_disutils_cb)
+ export_disutils.show()
+ activity_toolbar.insert(export_disutils, -1)
+
self._edit_toolbar = EditToolbar()
edit_toolbar_button = ToolbarButton()
@@ -254,9 +276,17 @@ class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity):
root = os.path.join(os.environ['SUGAR_ACTIVITY_ROOT'], 'data')
self.paths.append([_('My examples'), root])
-
self.source_tabs = SourceNotebook(self)
self.source_tabs.connect("tab-added", self._add_source_cb)
+ if self.loaded_from_journal and self.py_file:
+ self.source_tabs.add_tab(
+ self.initial_title,
+ self.initial_text_buffer)
+ elif self.loaded_session:
+ for name, content in self.loaded_session:
+ self.source_tabs.add_tab(name, content)
+ else:
+ self.source_tabs.add_tab()
vpane.add1(self.source_tabs)
@@ -270,7 +300,7 @@ class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity):
Gdk.color_parse('#E7E7E7'),
[])
self._vte.connect('child_exited', self.child_exited_cb)
-
+
self._child_exited_handler = None
self._vte.connect('drag_data_received', self.vte_drop_cb)
outbox.pack_start(self._vte, True, True, 0)
@@ -483,6 +513,7 @@ class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity):
self.stopbutton_cb(None) # try stopping old code first.
self._reset_vte()
+ self.outbox.show_all()
self._vte.feed(_("Creating activity bundle..."))
self._vte.feed("\r\n")
TMPDIR = 'instance'
@@ -511,6 +542,60 @@ class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity):
self._vte.feed("\r\n")
raise
+ def __export_disutils_cb(self, button):
+ app_temp = os.path.join(self.get_activity_root(), "instance")
+ data = self.source_tabs.get_all_data()
+ for filename, content in zip(data[0], data[1]):
+ fileobj = open(os.path.join(app_temp, filename), "w")
+ fileobj.write(content)
+ fileobj.close()
+
+ filenames = ",".join([("'"+name[:-3]+"'") for name in data[0]])
+
+ title = self.metadata['title']
+ if title is _('Pippy Activity'):
+ from sugar3.graphics.alert import Alert
+ from sugar3.graphics.icon import Icon
+ alert = Alert()
+ alert.props.title = _('Save as disutils package error')
+ alert.props.msg = _('Please give your activity a meaningful \
+name before attempting to save it as an disutils package.')
+ ok_icon = Icon(icon_name='dialog-ok')
+ alert.add_button(Gtk.ResponseType.OK, _('Ok'), ok_icon)
+ alert.connect('response', self.dismiss_alert_cb)
+ self.add_alert(alert)
+ return
+
+ setup_script = DISUTILS_SETUP_SCRIPT.format(modulename=title,
+ filenames=filenames)
+ setupfile = open(os.path.join(app_temp, "setup.py"), "w")
+ setupfile.write(setup_script)
+ setupfile.close()
+
+ os.chdir(app_temp)
+
+ output = subprocess.check_output(
+ [
+ "/usr/bin/python",
+ os.path.join(app_temp, "setup.py"),
+ "sdist", "-v"
+ ])
+
+ # hand off to journal
+ os.chmod(app_temp, 0777)
+ jobject = datastore.create()
+ metadata = {
+ 'title': '%s disutils bundle' % title,
+ 'title_set_by_user': '1',
+ 'mime_type': 'application/x-gzip',
+ }
+ for k, v in metadata.items():
+ # the dict.update method is missing =(
+ jobject.metadata[k] = v
+ tarname = "dist/{modulename}-1.0.tar.gz".format(modulename=title)
+ jobject.file_path = os.path.join(app_temp, tarname)
+ datastore.write(jobject)
+
def _export_example_cb(self, __):
# get the name of this pippy program.
title = self.metadata['title']
@@ -557,7 +642,6 @@ Do you want to overwrite it?')
"""Called when we're done building a bundle for a source file."""
from sugar3 import profile
from shutil import rmtree
- from sugar3.datastore import datastore
try:
# find the .xo file: were we successful?
bundle_file = [f for f in os.listdir(app_temp)
@@ -617,11 +701,41 @@ Do you want to overwrite it?')
def save_to_journal(self, file_path, cloudstring):
_file = open(file_path, 'w')
if not self.shared_activity:
- self.metadata['mime_type'] = 'text/x-python'
- global text_buffer
- start, end = text_buffer.get_bounds()
- text = text_buffer.get_text(start, end, True)
- _file.write(text)
+ data = self.source_tabs.get_all_data()
+ zipped_data = zip(data[0], data[1])
+ sessionlist = []
+ app_temp = os.path.join(self.get_activity_root(), "instance")
+ tmpfile = os.path.join(app_temp,
+ "pippy-tempfile-storing.py")
+ for zipdata, dsid in map(None, zipped_data, self.session_data):
+ name, content = zipdata
+
+ if dsid is not None:
+ dsitem = datastore.get(dsid)
+ __file = open(tmpfile, "w")
+ __file.write(content)
+ __file.close()
+ dsitem.set_file_path(tmpfile)
+ dsitem.metadata['title'] = name
+ datastore.write(dsitem)
+ else:
+ dsobject = datastore.create()
+ dsobject.metadata['mime_type'] = 'text/x-python'
+ dsobject.metadata['title'] = name
+ __file = open(tmpfile, "w")
+ __file.write(content)
+ __file.close()
+ dsobject.set_file_path(tmpfile)
+ datastore.write(dsobject)
+ dsitem = None
+
+ if dsitem is not None:
+ sessionlist.append([name, dsitem.object_id])
+ else:
+ sessionlist.append([name, dsobject.object_id])
+
+ self.metadata['mime_type'] = 'application/json'
+ _file.write(json.dumps(sessionlist))
else:
self.metadata['mime_type'] = groupthink_mimetype
_file.write(cloudstring)
@@ -632,9 +746,19 @@ Do you want to overwrite it?')
# discard the '#!/usr/bin/python' and 'coding: utf-8' lines,
# if present
text = re.sub(r'^' + re.escape(PYTHON_PREFIX), '', text)
- global text_buffer
- text_buffer.set_text(text)
- text_buffer.set_modified(False)
+
+ self.initial_text_buffer = text
+ self.initial_title = self.metadata['title']
+ self.loaded_from_journal = self.py_file = True
+
+ elif self.metadata['mime_type'] == "application/json":
+ data = json.loads(open(file_path).read())
+ for name, dsid in data:
+ dsitem = datastore.get(dsid)
+ content = open(dsitem.get_file_path()).read()
+ self.loaded_session.append([name, content])
+ self.session_data.append(dsitem.object_id)
+
elif self.metadata['mime_type'] == groupthink_mimetype:
return open(file_path).read()
@@ -910,4 +1034,3 @@ if __name__ == '__main__':
main()
print(_("done!"))
sys.exit(0)
-