2009-01-18 16:30:53 +01:00
|
|
|
# Copyright (C) 2009 One Laptop Per Child
|
|
|
|
#
|
|
|
|
# This library is free software; you can redistribute it and/or
|
|
|
|
# modify it under the terms of the GNU Lesser General Public
|
|
|
|
# License as published by the Free Software Foundation; either
|
|
|
|
# version 2 of the License, or (at your option) any later version.
|
|
|
|
#
|
|
|
|
# This library 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
|
|
|
|
# Lesser General Public License for more details.
|
|
|
|
#
|
|
|
|
# You should have received a copy of the GNU Lesser General Public
|
|
|
|
# License along with this library; if not, write to the
|
|
|
|
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
|
|
# Boston, MA 02111-1307, USA.
|
|
|
|
|
|
|
|
import gettext
|
2009-02-16 16:06:38 +01:00
|
|
|
import os
|
2009-01-18 16:30:53 +01:00
|
|
|
|
2009-02-16 16:06:38 +01:00
|
|
|
import gio
|
2009-01-18 16:30:53 +01:00
|
|
|
import gtk
|
|
|
|
import gobject
|
|
|
|
import gconf
|
|
|
|
|
2011-10-29 10:44:18 +02:00
|
|
|
from sugar3.graphics import style
|
|
|
|
from sugar3.graphics.icon import Icon
|
|
|
|
from sugar3.graphics.xocolor import XoColor
|
|
|
|
from sugar3.graphics.icon import get_icon_file_name
|
|
|
|
from sugar3.graphics.toolbutton import ToolButton
|
2009-01-18 16:30:53 +01:00
|
|
|
|
2011-10-29 10:44:18 +02:00
|
|
|
from sugar3.bundle.activitybundle import ActivityBundle
|
2009-01-18 16:30:53 +01:00
|
|
|
|
2009-08-25 21:12:40 +02:00
|
|
|
|
2009-01-18 16:30:53 +01:00
|
|
|
_ = lambda msg: gettext.dgettext('sugar-toolkit', msg)
|
|
|
|
|
2009-08-25 21:12:40 +02:00
|
|
|
|
2009-02-16 16:06:38 +01:00
|
|
|
def _get_icon_name(metadata):
|
|
|
|
file_name = None
|
|
|
|
|
|
|
|
mime_type = metadata.get('mime_type', '')
|
|
|
|
if not file_name and mime_type:
|
|
|
|
icons = gio.content_type_get_icon(mime_type)
|
|
|
|
for icon_name in icons.props.names:
|
|
|
|
file_name = get_icon_file_name(icon_name)
|
|
|
|
if file_name is not None:
|
|
|
|
break
|
|
|
|
|
|
|
|
if file_name is None or not os.path.exists(file_name):
|
|
|
|
file_name = get_icon_file_name('application-octet-stream')
|
|
|
|
|
|
|
|
return file_name
|
|
|
|
|
2009-08-25 21:12:40 +02:00
|
|
|
|
2009-01-18 16:30:53 +01:00
|
|
|
class NamingToolbar(gtk.Toolbar):
|
|
|
|
""" Toolbar of the naming alert
|
|
|
|
"""
|
2009-08-25 21:12:40 +02:00
|
|
|
|
2009-01-18 16:30:53 +01:00
|
|
|
__gtype_name__ = 'SugarNamingToolbar'
|
|
|
|
|
|
|
|
__gsignals__ = {
|
2009-08-25 21:12:40 +02:00
|
|
|
'keep-clicked': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])),
|
2009-01-18 16:30:53 +01:00
|
|
|
}
|
2009-08-25 21:12:40 +02:00
|
|
|
|
2009-01-18 16:30:53 +01:00
|
|
|
def __init__(self):
|
|
|
|
gtk.Toolbar.__init__(self)
|
|
|
|
|
|
|
|
client = gconf.client_get_default()
|
|
|
|
color = XoColor(client.get_string('/desktop/sugar/user/color'))
|
|
|
|
icon = Icon()
|
2009-08-25 19:55:48 +02:00
|
|
|
icon.set_from_icon_name('activity-journal',
|
2009-01-18 16:30:53 +01:00
|
|
|
gtk.ICON_SIZE_LARGE_TOOLBAR)
|
|
|
|
icon.props.xo_color = color
|
|
|
|
self._add_widget(icon)
|
|
|
|
|
|
|
|
self._add_separator()
|
|
|
|
|
|
|
|
self._title = gtk.Label(_('Name this entry'))
|
|
|
|
self._add_widget(self._title)
|
2009-08-25 19:55:48 +02:00
|
|
|
|
2009-01-18 16:30:53 +01:00
|
|
|
self._add_separator(True)
|
|
|
|
|
2009-01-19 16:57:59 +01:00
|
|
|
self._keep_button = ToolButton('dialog-ok', tooltip=_('Keep'))
|
|
|
|
self._keep_button.props.accelerator = 'Return'
|
2009-01-18 16:30:53 +01:00
|
|
|
self._keep_button.connect('clicked', self.__keep_button_clicked_cb)
|
|
|
|
self.insert(self._keep_button, -1)
|
|
|
|
self._keep_button.show()
|
|
|
|
|
|
|
|
def _add_separator(self, expand=False):
|
|
|
|
separator = gtk.SeparatorToolItem()
|
|
|
|
separator.props.draw = False
|
|
|
|
if expand:
|
|
|
|
separator.set_expand(True)
|
|
|
|
else:
|
|
|
|
separator.set_size_request(style.DEFAULT_SPACING, -1)
|
|
|
|
self.insert(separator, -1)
|
|
|
|
separator.show()
|
|
|
|
|
|
|
|
def _add_widget(self, widget, expand=False):
|
|
|
|
tool_item = gtk.ToolItem()
|
|
|
|
tool_item.set_expand(expand)
|
|
|
|
|
|
|
|
tool_item.add(widget)
|
|
|
|
widget.show()
|
|
|
|
|
|
|
|
self.insert(tool_item, -1)
|
|
|
|
tool_item.show()
|
|
|
|
|
|
|
|
def __keep_button_clicked_cb(self, widget, data=None):
|
|
|
|
self.emit('keep-clicked')
|
|
|
|
|
2009-08-25 21:12:40 +02:00
|
|
|
|
2011-09-17 19:29:46 +02:00
|
|
|
class FavoriteIcon(gtk.ToggleButton):
|
2009-08-25 21:12:40 +02:00
|
|
|
|
2011-09-17 19:29:46 +02:00
|
|
|
def __init__(self):
|
|
|
|
gtk.ToggleButton.__init__(self)
|
|
|
|
self.set_relief(gtk.RELIEF_NONE)
|
|
|
|
self.set_focus_on_click(False)
|
|
|
|
|
|
|
|
self._icon = Icon(icon_name='emblem-favorite',
|
|
|
|
pixel_size=style.SMALL_ICON_SIZE)
|
|
|
|
self.set_image(self._icon)
|
2009-01-18 16:30:53 +01:00
|
|
|
|
2011-09-17 19:29:46 +02:00
|
|
|
self.connect('toggled', self.__toggled_cb)
|
|
|
|
self.connect('leave-notify-event', self.__leave_notify_event_cb)
|
|
|
|
self.connect('enter-notify-event', self.__enter_notify_event_cb)
|
2009-01-18 16:30:53 +01:00
|
|
|
|
2011-09-17 19:29:46 +02:00
|
|
|
def __toggled_cb(self, widget):
|
|
|
|
if self.get_active():
|
2009-01-18 16:30:53 +01:00
|
|
|
client = gconf.client_get_default()
|
|
|
|
color = XoColor(client.get_string('/desktop/sugar/user/color'))
|
2011-09-17 19:29:46 +02:00
|
|
|
self._icon.props.xo_color = color
|
2009-01-18 16:30:53 +01:00
|
|
|
else:
|
2011-09-17 19:29:46 +02:00
|
|
|
self._icon.props.stroke_color = style.COLOR_BUTTON_GREY.get_svg()
|
|
|
|
self._icon.props.fill_color = style.COLOR_WHITE.get_svg()
|
2009-01-18 16:30:53 +01:00
|
|
|
|
2011-09-17 19:29:46 +02:00
|
|
|
def __enter_notify_event_cb(self, icon, event):
|
|
|
|
if not self.get_active():
|
|
|
|
self._icon.props.fill_color = style.COLOR_BUTTON_GREY.get_svg()
|
2009-01-18 16:30:53 +01:00
|
|
|
|
2011-09-17 19:29:46 +02:00
|
|
|
def __leave_notify_event_cb(self, icon, event):
|
|
|
|
if not self.get_active():
|
|
|
|
self._icon.props.fill_color = style.COLOR_TRANSPARENT.get_svg()
|
2009-01-18 16:30:53 +01:00
|
|
|
|
2009-08-25 21:12:40 +02:00
|
|
|
|
2009-01-18 16:30:53 +01:00
|
|
|
class NamingAlert(gtk.Window):
|
2009-08-25 21:12:40 +02:00
|
|
|
|
2009-01-18 16:30:53 +01:00
|
|
|
__gtype_name__ = 'SugarNamingAlert'
|
|
|
|
|
|
|
|
def __init__(self, activity, bundle_path):
|
|
|
|
gtk.Window.__init__(self)
|
|
|
|
|
|
|
|
self._bundle_path = bundle_path
|
|
|
|
self._favorite_icon = None
|
|
|
|
self._title = None
|
|
|
|
self._description = None
|
|
|
|
self._tags = None
|
|
|
|
|
2009-01-19 16:57:59 +01:00
|
|
|
accel_group = gtk.AccelGroup()
|
|
|
|
self.set_data('sugar-accel-group', accel_group)
|
|
|
|
self.add_accel_group(accel_group)
|
|
|
|
|
2009-01-18 16:30:53 +01:00
|
|
|
self.set_border_width(style.LINE_WIDTH)
|
|
|
|
offset = style.GRID_CELL_SIZE
|
|
|
|
width = gtk.gdk.screen_width() - offset * 2
|
|
|
|
height = gtk.gdk.screen_height() - offset * 2
|
|
|
|
self.set_size_request(width, height)
|
2009-08-25 19:55:48 +02:00
|
|
|
self.set_position(gtk.WIN_POS_CENTER_ALWAYS)
|
2009-01-18 16:30:53 +01:00
|
|
|
self.set_decorated(False)
|
|
|
|
self.set_resizable(False)
|
|
|
|
self.set_modal(True)
|
|
|
|
self.connect('realize', self.__realize_cb)
|
|
|
|
|
|
|
|
self._activity = activity
|
|
|
|
|
|
|
|
vbox = gtk.VBox()
|
|
|
|
self.add(vbox)
|
|
|
|
vbox.show()
|
|
|
|
|
|
|
|
toolbar = NamingToolbar()
|
|
|
|
toolbar.connect('keep-clicked', self.__keep_cb)
|
2011-10-30 08:01:32 +01:00
|
|
|
vbox.pack_start(toolbar, False, False, 0)
|
2009-01-18 16:30:53 +01:00
|
|
|
toolbar.show()
|
|
|
|
|
|
|
|
body = self._create_body()
|
2011-10-30 08:01:32 +01:00
|
|
|
vbox.pack_start(body, True, True, 0)
|
2011-09-17 19:29:46 +02:00
|
|
|
body.show()
|
2009-01-18 16:30:53 +01:00
|
|
|
|
2011-09-17 19:29:46 +02:00
|
|
|
self._title.grab_focus()
|
2009-01-19 16:57:59 +01:00
|
|
|
|
2009-01-18 16:30:53 +01:00
|
|
|
def _create_body(self):
|
2011-09-17 19:29:46 +02:00
|
|
|
body = gtk.VBox(spacing=style.DEFAULT_SPACING)
|
|
|
|
body.set_border_width(style.DEFAULT_SPACING * 3)
|
|
|
|
header = self._create_header()
|
2011-10-30 08:01:32 +01:00
|
|
|
body.pack_start(header, False, False, style.DEFAULT_PADDING)
|
2009-01-18 16:30:53 +01:00
|
|
|
|
2011-10-30 08:01:32 +01:00
|
|
|
body.pack_start(self._create_separator(style.DEFAULT_SPACING), False, False, 0)
|
2009-01-18 16:30:53 +01:00
|
|
|
|
2011-10-30 08:01:32 +01:00
|
|
|
body.pack_start(self._create_label(_('Description:')), False, False, 0)
|
2009-01-18 16:30:53 +01:00
|
|
|
|
2011-09-17 19:29:46 +02:00
|
|
|
description = self._activity.metadata.get('description', '')
|
|
|
|
description_box, self._description = self._create_text_view(description)
|
2011-10-30 08:01:32 +01:00
|
|
|
body.pack_start(description_box, True, True, 0)
|
2009-01-18 16:30:53 +01:00
|
|
|
|
2011-10-30 08:01:32 +01:00
|
|
|
body.pack_start(self._create_separator(style.DEFAULT_PADDING), False, False, 0)
|
2009-01-18 16:30:53 +01:00
|
|
|
|
|
|
|
|
2011-10-30 08:01:32 +01:00
|
|
|
body.pack_start(self._create_label(_('Tags:')), False, False, 0)
|
2009-08-25 19:55:48 +02:00
|
|
|
|
2011-09-17 19:29:46 +02:00
|
|
|
tags = self._activity.metadata.get('tags', '')
|
|
|
|
tags_box, self._tags = self._create_text_view(tags)
|
2011-10-30 08:01:32 +01:00
|
|
|
body.pack_start(tags_box, True, True, 0)
|
2009-08-25 19:55:48 +02:00
|
|
|
|
2011-09-17 19:29:46 +02:00
|
|
|
body.show_all()
|
|
|
|
return body
|
2009-08-25 19:55:48 +02:00
|
|
|
|
2011-09-17 19:29:46 +02:00
|
|
|
def _create_label(self, text):
|
|
|
|
text = gtk.Label(text)
|
|
|
|
text.set_alignment(0, 0.5)
|
|
|
|
text.modify_fg(gtk.STATE_NORMAL,
|
|
|
|
style.COLOR_BUTTON_GREY.get_gdk_color())
|
|
|
|
return text
|
2009-01-18 16:30:53 +01:00
|
|
|
|
2011-09-17 19:29:46 +02:00
|
|
|
def _create_separator(self, height):
|
|
|
|
separator = gtk.HSeparator()
|
|
|
|
separator.modify_bg(gtk.STATE_NORMAL, style.COLOR_WHITE.get_gdk_color())
|
|
|
|
separator.set_size_request(-1, height)
|
|
|
|
return separator
|
2009-01-18 16:30:53 +01:00
|
|
|
|
2011-09-17 19:29:46 +02:00
|
|
|
def _create_header(self):
|
|
|
|
header = gtk.HBox(spacing=style.DEFAULT_SPACING)
|
2009-01-18 16:30:53 +01:00
|
|
|
|
2011-09-17 19:29:46 +02:00
|
|
|
self._favorite_icon = FavoriteIcon()
|
|
|
|
header.pack_start(self._favorite_icon, expand=False)
|
|
|
|
|
|
|
|
entry_icon = self._create_entry_icon()
|
|
|
|
header.pack_start(entry_icon, expand=False)
|
|
|
|
|
|
|
|
self._title = self._create_title()
|
|
|
|
header.pack_start(self._title, expand=True)
|
2009-01-18 16:30:53 +01:00
|
|
|
|
2011-09-17 19:29:46 +02:00
|
|
|
return header
|
2009-08-25 19:55:48 +02:00
|
|
|
|
2009-02-16 16:06:38 +01:00
|
|
|
def _create_entry_icon(self):
|
|
|
|
bundle_id = self._activity.metadata.get('activity', '')
|
|
|
|
if not bundle_id:
|
|
|
|
bundle_id = self._activity.metadata.get('bundle_id', '')
|
|
|
|
|
|
|
|
if bundle_id == '':
|
|
|
|
file_name = _get_icon_name(self._activity.metadata)
|
2009-08-25 19:55:48 +02:00
|
|
|
else:
|
2009-02-16 16:06:38 +01:00
|
|
|
activity_bundle = ActivityBundle(self._bundle_path)
|
|
|
|
file_name = activity_bundle.get_icon()
|
2011-09-17 19:29:46 +02:00
|
|
|
entry_icon = Icon(file=file_name, icon_size=gtk.ICON_SIZE_LARGE_TOOLBAR)
|
2010-10-15 20:18:15 +02:00
|
|
|
if self._activity.metadata.get('icon-color'):
|
2009-02-16 16:06:38 +01:00
|
|
|
entry_icon.props.xo_color = XoColor( \
|
2009-01-18 16:30:53 +01:00
|
|
|
self._activity.metadata['icon-color'])
|
2009-02-16 16:06:38 +01:00
|
|
|
return entry_icon
|
2009-08-25 19:55:48 +02:00
|
|
|
|
2009-01-18 16:30:53 +01:00
|
|
|
def _create_title(self):
|
2011-09-17 19:29:46 +02:00
|
|
|
title = gtk.Entry()
|
|
|
|
title.set_text(self._activity.metadata.get('title', _('Untitled')))
|
2009-01-18 16:30:53 +01:00
|
|
|
return title
|
2009-01-19 16:57:59 +01:00
|
|
|
|
2011-09-17 19:29:46 +02:00
|
|
|
def _create_text_view(self, text):
|
|
|
|
scrolled_window = gtk.ScrolledWindow()
|
|
|
|
scrolled_window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
|
|
|
|
scrolled_window.set_border_width(style.LINE_WIDTH)
|
|
|
|
scrolled_window.set_shadow_type(gtk.SHADOW_IN)
|
2009-01-18 16:30:53 +01:00
|
|
|
|
2011-09-17 19:29:46 +02:00
|
|
|
text_view = gtk.TextView()
|
|
|
|
text_view.set_left_margin(style.DEFAULT_PADDING)
|
|
|
|
text_view.set_wrap_mode(gtk.WRAP_WORD_CHAR)
|
|
|
|
text_view.set_accepts_tab(False)
|
|
|
|
text_view.get_buffer().set_text(text)
|
|
|
|
scrolled_window.add(text_view)
|
2009-01-18 16:30:53 +01:00
|
|
|
|
2011-09-17 19:29:46 +02:00
|
|
|
return scrolled_window, text_view
|
2009-01-18 16:30:53 +01:00
|
|
|
|
|
|
|
def __realize_cb(self, widget):
|
|
|
|
self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG)
|
|
|
|
self.window.set_accept_focus(True)
|
|
|
|
|
|
|
|
def __keep_cb(self, widget):
|
2011-09-17 19:29:46 +02:00
|
|
|
if self._favorite_icon.get_active():
|
2009-01-18 16:30:53 +01:00
|
|
|
self._activity.metadata['keep'] = 1
|
|
|
|
else:
|
|
|
|
self._activity.metadata['keep'] = 0
|
|
|
|
|
2011-09-17 19:29:46 +02:00
|
|
|
self._activity.metadata['title'] = self._title.get_text()
|
2009-01-18 16:30:53 +01:00
|
|
|
|
2011-09-17 19:29:46 +02:00
|
|
|
text_buffer = self._tags.get_buffer()
|
|
|
|
start, end = text_buffer.get_bounds()
|
2011-10-30 14:22:12 +01:00
|
|
|
new_tags = text_buffer.get_text(start, end, False)
|
2009-01-18 16:30:53 +01:00
|
|
|
self._activity.metadata['tags'] = new_tags
|
|
|
|
|
2011-09-17 19:29:46 +02:00
|
|
|
text_buffer = self._description.get_buffer()
|
|
|
|
start, end = text_buffer.get_bounds()
|
2011-10-30 14:22:12 +01:00
|
|
|
new_description = text_buffer.get_text(start, end, False)
|
2009-01-18 16:30:53 +01:00
|
|
|
self._activity.metadata['description'] = new_description
|
|
|
|
|
|
|
|
self._activity.metadata['title_set_by_user'] = '1'
|
|
|
|
self._activity.close()
|
2009-01-28 20:30:19 +01:00
|
|
|
self.destroy()
|