Sugar Code Snippets: Difference between revisions
m (adjust format headings) |
(Moved Toolbar snippet to a now "Old snippets which need to be overhauled" section.) |
||
Line 2: | Line 2: | ||
== Toolbar == |
== Toolbar == |
||
=== Big picture === |
|||
This snippet shows how an activity would have a toolbar with a button and a gtk.TextView widget embedded in a hippo Canvas: |
|||
import logging |
|||
import hippo |
|||
import gtk |
|||
from gettext import gettext as _ |
|||
from sugar.activity import activity |
|||
from sugar.graphics.toolbar import Toolbar |
|||
from sugar.graphics.iconbutton import IconButton |
|||
from sugar.graphics.entry import Entry |
|||
from sugar.graphics.optionmenu import OptionMenu |
|||
from sugar.graphics.menu import MenuItem |
|||
class FooActivity(activity.Activity): |
|||
_ACTION_ANYTHING = 1 |
|||
_ACTION_APPLES = 2 |
|||
_ACTION_ORANGES = 3 |
|||
def __init__(self, handle): |
|||
activity.Activity.__init__(self, handle) |
|||
vbox = hippo.CanvasBox() |
|||
self.set_root(vbox) |
|||
toolbar = Toolbar() |
|||
vbox.append(toolbar) |
|||
button = IconButton(icon_name='theme:stock-close') |
|||
button.connect("activated", self._button_activated_cb) |
|||
toolbar.append(button) |
|||
entry = Entry() |
|||
button.connect("activated", self._entry_activated_cb) |
|||
toolbar.append(entry) |
|||
option_menu = OptionMenu() |
|||
option_menu.add_item(MenuItem(self._ACTION_ANYTHING, _('Anything'))) |
|||
option_menu.add_item(MenuItem(self._ACTION_APPLES, _('Apples'), |
|||
'theme:stock-close')) |
|||
option_menu.add_item(MenuItem(self._ACTION_ORANGES, _('Oranges'))) |
|||
option_menu.add_separator() |
|||
toolbar.append(option_menu) |
|||
text_view_widget = hippo.CanvasWidget() |
|||
vbox.append(text_view_widget, hippo.PACK_EXPAND) |
|||
text_view = gtk.TextView() |
|||
text_view.get_buffer().set_text('Write here!', -1) |
|||
text_view_widget.props.widget = text_view |
|||
def _button_activated_cb(self, button): |
|||
logging.debug('FooActivity._button_activated_cb') |
|||
def _entry_activated_cb(self, entry): |
|||
logging.debug('FooActivity._entry_activated_cb') |
|||
In build 443 (June '07), <tt>from sugar.graphics.entry import Entry</tt> yields ''ImportError: No module named entry''. [[User:MitchellNCharity|MitchellNCharity]] 19:52, 15 June 2007 (EDT) |
|||
=== Toolbar icons === |
=== Toolbar icons === |
||
Line 131: | Line 68: | ||
* ctx.stroke() several lines at once. stroke() currently has significant overhead. So it is faster to stroke several, than to stroke them individually. They need not be contiguous. [[User:MitchellNCharity|MitchellNCharity]] 14:05, 10 May 2007 (EDT) |
* ctx.stroke() several lines at once. stroke() currently has significant overhead. So it is faster to stroke several, than to stroke them individually. They need not be contiguous. [[User:MitchellNCharity|MitchellNCharity]] 14:05, 10 May 2007 (EDT) |
||
== Old snippets which need to be overhauled == |
|||
=== Toolbar === |
|||
This snippet shows how an activity would have a toolbar with a button and a gtk.TextView widget embedded in a hippo Canvas: |
|||
import logging |
|||
import hippo |
|||
import gtk |
|||
from gettext import gettext as _ |
|||
from sugar.activity import activity |
|||
from sugar.graphics.toolbar import Toolbar |
|||
from sugar.graphics.iconbutton import IconButton |
|||
from sugar.graphics.entry import Entry |
|||
from sugar.graphics.optionmenu import OptionMenu |
|||
from sugar.graphics.menu import MenuItem |
|||
class FooActivity(activity.Activity): |
|||
_ACTION_ANYTHING = 1 |
|||
_ACTION_APPLES = 2 |
|||
_ACTION_ORANGES = 3 |
|||
def __init__(self, handle): |
|||
activity.Activity.__init__(self, handle) |
|||
vbox = hippo.CanvasBox() |
|||
self.set_root(vbox) |
|||
toolbar = Toolbar() |
|||
vbox.append(toolbar) |
|||
button = IconButton(icon_name='theme:stock-close') |
|||
button.connect("activated", self._button_activated_cb) |
|||
toolbar.append(button) |
|||
entry = Entry() |
|||
button.connect("activated", self._entry_activated_cb) |
|||
toolbar.append(entry) |
|||
option_menu = OptionMenu() |
|||
option_menu.add_item(MenuItem(self._ACTION_ANYTHING, _('Anything'))) |
|||
option_menu.add_item(MenuItem(self._ACTION_APPLES, _('Apples'), |
|||
'theme:stock-close')) |
|||
option_menu.add_item(MenuItem(self._ACTION_ORANGES, _('Oranges'))) |
|||
option_menu.add_separator() |
|||
toolbar.append(option_menu) |
|||
text_view_widget = hippo.CanvasWidget() |
|||
vbox.append(text_view_widget, hippo.PACK_EXPAND) |
|||
text_view = gtk.TextView() |
|||
text_view.get_buffer().set_text('Write here!', -1) |
|||
text_view_widget.props.widget = text_view |
|||
def _button_activated_cb(self, button): |
|||
logging.debug('FooActivity._button_activated_cb') |
|||
def _entry_activated_cb(self, entry): |
|||
logging.debug('FooActivity._entry_activated_cb') |
|||
:In build 443 (June '07), <tt>from sugar.graphics.entry import Entry</tt> yields ''ImportError: No module named entry''. [[User:MitchellNCharity|MitchellNCharity]] 19:52, 15 June 2007 (EDT) |
|||
:And obsolete, now deleted code like sugar.graphics.toolbar is being used. Snippet needs to be overhauled. [[User:MitchellNCharity|MitchellNCharity]] 18:04, 21 June 2007 (EDT) |
|||
[[Category:HowTo]] |
[[Category:HowTo]] |
Revision as of 22:04, 21 June 2007
Toolbar
Toolbar icons
button = sugar.graphics.toolbutton.ToolButton("some-icon-name") button.show() toolbar.insert(button,-1)
In addition to the standard icons in /usr/share/icons/sugar/scalable/ (eg, "go-next"), you can create additional icons by putting an svg in your activity's icons/ directory. Eg,
icons/my-icon.svg
Other notes
- Do not use sugar.graphics.toolbar and its Toolbar. It is old broken left-over code, now deleted. MitchellNCharity 17:06, 21 June 2007 (EDT)
Files
This snippet shows how to get a path to files in the running Activity:
from sugar.activity import activity bundle_path = activity.get_bundle_path()
Images
target = ctx.get_target() buf = target.create_similar(cairo.CONTENT_COLOR_ALPHA, w, h) ctx.set_source_surface(buf, x, y) ctx.paint()
dimensions = handle.get_dimension_data() width = dimensions[0] height = dimensions[1]
- Loading a JPEG file onto a surface:
pixbuf = gtk.gdk.pixbuf_new_from_file("foo.jpg") ctx = # a cairo context ctx.set_source_pixbuf(pixbuf,0,0) ctx.paint()
libjpeg is said to be an alternative to using pixbuf. Which is better? Perhaps Sugar/HippoCanvas provides an easier way to do this?
Cairo image expansion is good quality, but expensive. Shrinking is fine and notably faster. So for images rendered large (ie, screen-size), you might want to start with a big image, rather than expanding a small one. A speed/space tradeoff. And use SVG instead if appropriate, of course. MitchellNCharity 10:37, 10 May 2007 (EDT)
Not yet sorted
from sugar import profile key = profile.get_pubkey() # If you want a shorter key, you can hash that like: from sugar import util key_hash = util._sha_data(key) hashed_key = util.printable_hash(key_hash)
Performance Tips
This section belongs on a different, as yet non-existent page. But a good organization for software development tips is currently unclear to me, so I'll stash this here for now. MitchellNCharity 14:05, 10 May 2007 (EDT)
- ctx.stroke() several lines at once. stroke() currently has significant overhead. So it is faster to stroke several, than to stroke them individually. They need not be contiguous. MitchellNCharity 14:05, 10 May 2007 (EDT)
Old snippets which need to be overhauled
Toolbar
This snippet shows how an activity would have a toolbar with a button and a gtk.TextView widget embedded in a hippo Canvas:
import logging import hippo import gtk from gettext import gettext as _ from sugar.activity import activity from sugar.graphics.toolbar import Toolbar from sugar.graphics.iconbutton import IconButton from sugar.graphics.entry import Entry from sugar.graphics.optionmenu import OptionMenu from sugar.graphics.menu import MenuItem class FooActivity(activity.Activity): _ACTION_ANYTHING = 1 _ACTION_APPLES = 2 _ACTION_ORANGES = 3 def __init__(self, handle): activity.Activity.__init__(self, handle) vbox = hippo.CanvasBox() self.set_root(vbox) toolbar = Toolbar() vbox.append(toolbar) button = IconButton(icon_name='theme:stock-close') button.connect("activated", self._button_activated_cb) toolbar.append(button) entry = Entry() button.connect("activated", self._entry_activated_cb) toolbar.append(entry) option_menu = OptionMenu() option_menu.add_item(MenuItem(self._ACTION_ANYTHING, _('Anything'))) option_menu.add_item(MenuItem(self._ACTION_APPLES, _('Apples'), 'theme:stock-close')) option_menu.add_item(MenuItem(self._ACTION_ORANGES, _('Oranges'))) option_menu.add_separator() toolbar.append(option_menu) text_view_widget = hippo.CanvasWidget() vbox.append(text_view_widget, hippo.PACK_EXPAND) text_view = gtk.TextView() text_view.get_buffer().set_text('Write here!', -1) text_view_widget.props.widget = text_view def _button_activated_cb(self, button): logging.debug('FooActivity._button_activated_cb') def _entry_activated_cb(self, entry): logging.debug('FooActivity._entry_activated_cb')
- In build 443 (June '07), from sugar.graphics.entry import Entry yields ImportError: No module named entry. MitchellNCharity 19:52, 15 June 2007 (EDT)
- And obsolete, now deleted code like sugar.graphics.toolbar is being used. Snippet needs to be overhauled. MitchellNCharity 18:04, 21 June 2007 (EDT)