Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/jarabe/journal/expandedentry.py
diff options
context:
space:
mode:
authorWalter Bender <walter.bender@gmail.com>2013-02-13 04:32:42 (GMT)
committer Walter Bender <walter.bender@gmail.com>2013-02-13 04:32:42 (GMT)
commit8310ff5d7344b2a6e2df0577bdb5b9ca3e95c1c0 (patch)
tree14c528d8869172d05e758b8638fe0df337ab818f /src/jarabe/journal/expandedentry.py
parentd52a5b04c936e346c24b91660d1e0f9a3d913271 (diff)
refactoring of comments code
Diffstat (limited to 'src/jarabe/journal/expandedentry.py')
-rw-r--r--src/jarabe/journal/expandedentry.py236
1 files changed, 136 insertions, 100 deletions
diff --git a/src/jarabe/journal/expandedentry.py b/src/jarabe/journal/expandedentry.py
index a6cafc9..4c49b90 100644
--- a/src/jarabe/journal/expandedentry.py
+++ b/src/jarabe/journal/expandedentry.py
@@ -27,18 +27,19 @@ from gi.repository import GLib
from gi.repository import Gtk
from gi.repository import Gdk
from gi.repository import GdkPixbuf
-import simplejson
from sugar3.graphics import style
from sugar3.graphics.xocolor import XoColor
from sugar3.graphics.icon import CanvasIcon, get_icon_file_name
-from sugar3.graphics.icon import Icon, CellRendererIcon
+from sugar3.graphics.icon import Icon, CellRendererIcon, get_icon_file_name
+from sugar3.graphics.alert import Alert
from sugar3.util import format_size
from jarabe.journal.keepicon import KeepIcon
from jarabe.journal.palettes import ObjectPalette, BuddyPalette
from jarabe.journal import misc
from jarabe.journal import model
+from jarabe.journal import journalwindow
class Separator(Gtk.VBox):
@@ -63,14 +64,19 @@ class BuddyList(Gtk.Alignment):
self.add(hbox)
-class TextView(Gtk.TextView):
- def __init__(self):
+class DescTagsView(Gtk.TextView):
+ def __init__(self, parent):
Gtk.TextView.__init__(self)
text_buffer = Gtk.TextBuffer()
+ self._parent = parent
self.set_buffer(text_buffer)
self.set_left_margin(style.DEFAULT_PADDING)
self.set_wrap_mode(Gtk.WrapMode.WORD_CHAR)
- return
+ self.connect('focus-out-event',
+ self._description_tags_focus_out_event_cb)
+
+ def _description_tags_focus_out_event_cb(self, text_view, event):
+ self.parent._update_entry()
class CommentsView(Gtk.TreeView):
@@ -78,80 +84,120 @@ class CommentsView(Gtk.TreeView):
'comments-updated': (GObject.SignalFlags.RUN_FIRST, None, ([])),
'clicked': (GObject.SignalFlags.RUN_FIRST, None, [object]),
}
- def __init__(self):
+ FROM = 'from'
+ MESSAGE = 'message'
+ ICON = 'icon'
+ COMMENT_ICON = 0
+ COMMENT_ICON_COLOR = 1
+ COMMENT_FROM = 2
+ COMMENT_MESSAGE = 3
+ COMMENT_ERASE_ICON = 4
+ COMMENT_ERASE_ICON_COLOR = 5
+
+ def __init__(self, parent):
Gtk.TreeView.__init__(self)
- self.store = Gtk.ListStore(GdkPixbuf.Pixbuf, str, str, GdkPixbuf.Pixbuf)
- '''
- self._erase_button = CanvasIcon(icon_name='list-remove',
- xo_color=XoColor('#000000,#FFFFFF'),
- pixel_size=style.SMALL_ICON_SIZE)
- self._erase_button.connect('clicked', self._erase_comment_cb)
- '''
- self._erase_button = GdkPixbuf.Pixbuf.new_from_file_at_size(
- get_icon_file_name('zoom-out'), style.SMALL_ICON_SIZE,
- style.SMALL_ICON_SIZE)
-
+ self._store = Gtk.ListStore(str, object, str, str, str, object)
+ self._parent = parent
+ self._comments = []
self._init_model()
+ self.connect('comments-updated', self._comments_updated_event_cb)
def update_comments(self, comments):
- self.store.clear()
+ self._store.clear()
if comments != '':
- comments = json.loads(comments)
- for comment in comments:
+ self._comments = json.loads(comments)
+ for comment in self._comments:
self._add_row(
- self._get_comment_field(comment, 'from', ''),
- self._get_comment_field(comment, 'message', ''),
- self._get_comment_field(comment, 'icon', 'computer-xo'))
+ self._get_comment_field(comment, self.FROM, ''),
+ self._get_comment_field(comment, self.MESSAGE, ''),
+ self._get_comment_field(comment, self.ICON, 'computer-xo'))
self.show()
- def get_selected_row(self):
+ def _get_selected_row(self):
selection = self.get_selection()
return selection.get_selected()
+ def _comments_updated_event_cb(self, event):
+ logging.debug('expandedexntry: comments updated event')
+ self.update_comments()
+
def _get_comment_field(self, comment, field, default):
if field in comment:
return comment[field]
return default
- def _add_row(self, who, what, icon):
+ def _add_row(self, sender, message, icon):
if type(icon) is list:
icon_name = 'computer-xo'
- icon_color = "%s,%s" % (icon[0], icon[1])
+ icon_color = '%s,%s' % (str(icon[0]), str(icon[1]))
else:
icon_name = icon
- '''
- icon = CanvasIcon(icon_name=icon_name
- xo_color=XoColor(icon_color),
- pixel_size=style.SMALL_ICON_SIZE)
- '''
- # Until I figure out how to get the pixbuf from the icon
- # or how to add an icon to the ListStore
- pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(
- get_icon_file_name(icon_name), style.SMALL_ICON_SIZE,
- style.SMALL_ICON_SIZE)
- logging.debug('store append %s %s %s' % (who, what, icon_name))
- self.store.append((pixbuf, who, what, self._erase_button))
+ icon_color = '#FFFFFF,#000000'
+ self._store.append((get_icon_file_name(icon_name), XoColor(icon_color),
+ sender, message, get_icon_file_name('list-remove'),
+ XoColor('#FFFFFF,#000000')))
def _init_model(self):
- self.set_model(self.store)
- col = Gtk.TreeViewColumn()
- render_pixbuf = Gtk.CellRendererPixbuf()
- col.pack_start(render_pixbuf, False)
- col.add_attribute(render_pixbuf, 'pixbuf', 0)
- render_text = Gtk.CellRendererText()
- col.pack_start(render_text, True)
- col.add_attribute(render_text, 'text', 1)
- render_text = Gtk.CellRendererText()
- col.pack_start(render_text, True)
- col.add_attribute(render_text, 'text', 2)
- render_pixbuf = Gtk.CellRendererPixbuf()
- col.pack_start(render_pixbuf, False)
- col.add_attribute(render_pixbuf, 'pixbuf', 3)
+ self.set_model(self._store)
+ col = Gtk.TreeViewColumn(_('Coment'))
+ who_icon = CellRendererCommentIcon(self)
+ col.pack_start(who_icon, False)
+ col.add_attribute(who_icon, 'file-name', self.COMMENT_ICON)
+ col.add_attribute(who_icon, 'xo-color', self.COMMENT_ICON_COLOR)
+ who_text = Gtk.CellRendererText()
+ col.pack_start(who_text, True)
+ col.add_attribute(who_text, 'text', self.COMMENT_FROM)
+ comment_text = Gtk.CellRendererText()
+ col.pack_start(comment_text, True)
+ col.add_attribute(comment_text, 'text', self.COMMENT_MESSAGE)
+ erase_icon = CellRendererCommentIcon(self)
+ erase_icon.connect('clicked', self._erase_comment_cb)
+ col.pack_start(erase_icon, False)
+ col.add_attribute(erase_icon, 'file-name', self.COMMENT_ERASE_ICON)
+ col.add_attribute(erase_icon, 'xo-color', self.COMMENT_ERASE_ICON_COLOR)
self.append_column(col)
+ self.show()
- def _erase_comment_cb(self, event):
- # TODO: Find selected row; delete it; and remove comment from metadata
- logging.debug('ERASE COMMENT')
+ def _erase_comment_cb(self, widget, event):
+ selection = self.get_selection()
+ entry = selection.get_selected()[1]
+ alert = Alert()
+ erase_string = _('Erase')
+ alert.props.title = erase_string
+ alert.props.msg = _('Do you want to permanently erase \"%s\"?') \
+ % self._store[entry][self.COMMENT_MESSAGE]
+ icon = Icon(icon_name='dialog-cancel')
+ alert.add_button(Gtk.ResponseType.CANCEL, _('Cancel'), icon)
+ icon.show()
+ ok_icon = Icon(icon_name='dialog-ok')
+ alert.add_button(Gtk.ResponseType.OK, erase_string, ok_icon)
+ ok_icon.show()
+ alert.connect('response', self.__erase_alert_response_cb, entry)
+ journalwindow.get_journal_window().add_alert(alert)
+ alert.show()
+
+ def __erase_alert_response_cb(self, alert, response_id, entry):
+ journalwindow.get_journal_window().remove_alert(alert)
+ if response_id is Gtk.ResponseType.OK:
+ # Seems a bit kludgy
+ self._comments.remove(
+ self._comments[int(str(self._store[entry].path))])
+ self._parent.set_comments(json.dumps(self._comments))
+ self._store.remove(entry)
+ self.show()
+
+
+class CellRendererCommentIcon(CellRendererIcon):
+ def __init__(self, tree_view):
+ CellRendererIcon.__init__(self, tree_view)
+
+ self.props.width = style.SMALL_ICON_SIZE
+ self.props.height = style.SMALL_ICON_SIZE
+ self.props.size = style.SMALL_ICON_SIZE
+ self.props.stroke_color = style.COLOR_BUTTON_GREY.get_svg()
+ self.props.fill_color = style.COLOR_BLACK.get_svg()
+ self.props.mode = Gtk.CellRendererMode.ACTIVATABLE
+ self.props.icon_name = ''
class ExpandedEntry(Gtk.EventBox):
@@ -236,55 +282,55 @@ class ExpandedEntry(Gtk.EventBox):
if self._metadata == metadata:
logging.debug('expandedentry: metadata has *not* changed')
return
+ if self._metadata is not None:
+ old_uid = self._metadata['uid']
+ else:
+ old_uid = 'None'
+ if old_uid == metadata['uid']:
+ return
logging.debug('expandedentry: metadata has changed')
self._metadata = metadata
- logging.debug('expandedentry: 1. keep icon')
self._keep_icon.set_active(int(metadata.get('keep', 0)) == 1)
- logging.debug('expandedentry: 2. activity icon')
self._icon = self._create_icon()
for child in self._icon_box.get_children():
self._icon_box.remove(child)
#FIXME: self._icon_box.foreach(self._icon_box.remove)
self._icon_box.pack_start(self._icon, False, False, 0)
- logging.debug('expandedentry: 3. date')
self._date.set_text(misc.get_date(metadata))
- logging.debug('expandedentry: 4. title %s' % (metadata.get('title', _('Untitled'))))
self._title.set_text(metadata.get('title', _('Untitled')))
- logging.debug('expandedentry: 5. preview')
if self._preview_box.get_child():
self._preview_box.remove(self._preview_box.get_child())
self._preview_box.add(self._create_preview())
- logging.debug('expandedentry: 6. techbox')
for child in self._technical_box.get_children():
self._technical_box.remove(child)
#FIXME: self._technical_box.foreach(self._technical_box.remove)
self._technical_box.pack_start(self._create_technical(),
False, False, style.DEFAULT_SPACING)
- logging.debug('expandedentry: 7. buddies')
for child in self._buddy_list.get_children():
self._buddy_list.remove(child)
#FIXME: self._buddy_list.foreach(self._buddy_list.remove)
self._buddy_list.pack_start(self._create_buddy_list(), False, False,
style.DEFAULT_SPACING)
- logging.debug('expandedentry: 8. description')
description = metadata.get('description', '')
self._description.get_buffer().set_text(description)
- logging.debug('expandedentry: 9. tags')
tags = metadata.get('tags', '')
self._tags.get_buffer().set_text(tags)
- logging.debug('expandedentry: 10. comments')
self._comments.update_comments(metadata.get('comments', ''))
+ def set_comments(self, comments):
+ self._metadata['comments'] = comments
+ self._write_entry()
+
def _create_keep_icon(self):
keep_icon = KeepIcon()
keep_icon.connect('toggled', self._keep_icon_toggled_cb)
@@ -427,7 +473,7 @@ class ExpandedEntry(Gtk.EventBox):
vbox.pack_start(halign, False, False, 0)
if self._metadata.get('buddies'):
- buddies = simplejson.loads(self._metadata['buddies']).values()
+ buddies = json.loads(self._metadata['buddies']).values()
vbox.pack_start(BuddyList(buddies), False, False, 0)
return vbox
else:
@@ -437,41 +483,35 @@ class ExpandedEntry(Gtk.EventBox):
vbox = Gtk.VBox()
vbox.props.spacing = style.DEFAULT_SPACING
- text = Gtk.Label()
- text.set_markup('<span foreground="%s">%s</span>' % (
- style.COLOR_BUTTON_GREY.get_html(), label))
+ if label is not None:
+ text = Gtk.Label()
+ text.set_markup('<span foreground="%s">%s</span>' % (
+ style.COLOR_BUTTON_GREY.get_html(), label))
- halign = Gtk.Alignment.new(0, 0, 0, 0)
- halign.add(text)
- vbox.pack_start(halign, False, False, 0)
+ halign = Gtk.Alignment.new(0, 0, 0, 0)
+ halign.add(text)
+ vbox.pack_start(halign, False, False, 0)
scrolled_window = Gtk.ScrolledWindow()
scrolled_window.set_policy(Gtk.PolicyType.AUTOMATIC,
Gtk.PolicyType.AUTOMATIC)
scrolled_window.set_shadow_type(Gtk.ShadowType.ETCHED_IN)
- widget = widget_class()
+ widget = widget_class(self)
scrolled_window.add(widget)
vbox.pack_start(scrolled_window, True, True, 0)
- if isinstance(widget, Gtk.TextView):
- widget.connect('focus-out-event',
- self._description_tags_focus_out_event_cb)
- elif isinstance(widget, CommentsView):
- widget.connect('comments-updated',
- self._comments_updated_event_cb)
-
return vbox, widget
def _create_description(self):
- return self._create_scrollable(_('Description:'), TextView)
+ return self._create_scrollable(_('Description:'), DescTagsView)
def _create_tags(self):
- return self._create_scrollable(_('Tags:'), TextView)
+ return self._create_scrollable(_('Tags:'), DescTagsView)
def _create_comments(self):
- return self._create_scrollable(_('Comments:'), CommentsView)
+ return self._create_scrollable(None, CommentsView)
def _title_notify_text_cb(self, entry, pspec):
if not self._update_title_sid:
@@ -481,17 +521,12 @@ class ExpandedEntry(Gtk.EventBox):
def _title_focus_out_event_cb(self, entry, event):
self._update_entry()
- def _description_tags_focus_out_event_cb(self, text_view, event):
- self._update_entry()
-
- def _comments_updated_event_cb(self, event):
- logging.debug('expandedexntry: comments updated event')
- self._comments.update_comments()
-
def _update_entry(self, needs_update=False):
if not model.is_editable(self._metadata):
return
+ if self._icon is None:
+ return
old_title = self._metadata.get('title', None)
new_title = self._title.get_text()
if old_title != new_title:
@@ -519,17 +554,20 @@ class ExpandedEntry(Gtk.EventBox):
needs_update = True
if needs_update:
- if self._metadata.get('mountpoint', '/') == '/':
- model.write(self._metadata, update_mtime=False)
- else:
- old_file_path = os.path.join(self._metadata['mountpoint'],
- model.get_file_name(old_title,
- self._metadata['mime_type']))
- model.write(self._metadata, file_path=old_file_path,
- update_mtime=False)
+ self._write_entry()
self._update_title_sid = None
+ def _write_entry(self):
+ if self._metadata.get('mountpoint', '/') == '/':
+ model.write(self._metadata, update_mtime=False)
+ else:
+ old_file_path = os.path.join(self._metadata['mountpoint'],
+ model.get_file_name(old_title,
+ self._metadata['mime_type']))
+ model.write(self._metadata, file_path=old_file_path,
+ update_mtime=False)
+
def _keep_icon_toggled_cb(self, keep_icon):
if keep_icon.get_active():
self._metadata['keep'] = 1
@@ -538,11 +576,9 @@ class ExpandedEntry(Gtk.EventBox):
self._update_entry(needs_update=True)
def _icon_button_release_event_cb(self, button, event):
- logging.debug('_icon_button_release_event_cb')
misc.resume(self._metadata)
return True
def _preview_box_button_release_event_cb(self, button, event):
- logging.debug('_preview_box_button_release_event_cb')
misc.resume(self._metadata)
return True