Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksey Lim <alsroot@member.fsf.org>2010-01-22 01:49:03 (GMT)
committer Aleksey Lim <alsroot@member.fsf.org>2010-01-22 01:49:03 (GMT)
commit87beb0b65270cefbe6d19bbbdee6049ee417fadc (patch)
treec79d5041f749a485a6e11a84c08452981aa9542d
parent07e3f7ab4b1495601f08bc372a53c524bba0eda3 (diff)
Make title editing in thumbs view more convenient
-rw-r--r--src/jarabe/journal/entry.py82
-rw-r--r--src/jarabe/journal/homogenetable.py8
-rw-r--r--src/jarabe/journal/listview.py41
-rw-r--r--src/jarabe/journal/preview.py1
-rw-r--r--src/jarabe/journal/thumbsview.py16
-rw-r--r--src/jarabe/journal/widgets.py17
6 files changed, 102 insertions, 63 deletions
diff --git a/src/jarabe/journal/entry.py b/src/jarabe/journal/entry.py
index 7347fe1..4b4a1fb 100644
--- a/src/jarabe/journal/entry.py
+++ b/src/jarabe/journal/entry.py
@@ -21,6 +21,9 @@ import gobject
import pango
+TEXT_HEIGHT = gtk.EventBox().create_pango_layout('W').get_pixel_size()[1]
+
+
class Entry(gtk.TextView):
"""One paragraph string entry with additional features
@@ -36,6 +39,7 @@ class Entry(gtk.TextView):
def __init__(self, **kwargs):
self._max_line_count = 1
self._text = None
+ self._button_pressed = False
gobject.GObject.__init__(self, **kwargs)
@@ -48,7 +52,9 @@ class Entry(gtk.TextView):
self.connect('key-press-event', self.__key_press_event_cb)
self.connect('focus-in-event', self.__focus_in_event_cb)
self.connect('focus-out-event', self.__focus_out_event_cb)
+ self.connect('button-press-event', self.__button_press_event_cb)
self.connect('button-release-event', self.__button_release_event_cb)
+ self.props.buffer.connect('changed', self.__buffer_changed_cb)
def set_accepts_tab(self, value):
# accepts_tab cannot be set by users
@@ -74,19 +80,7 @@ class Entry(gtk.TextView):
return self._max_line_count
def set_max_line_count(self, max_line_count):
- max_line_count = max(1, max_line_count)
- self._max_line_count = max_line_count
-
- if max_line_count == 1:
- gtk.TextView.set_wrap_mode(self, gtk.WRAP_NONE)
- else:
- gtk.TextView.set_wrap_mode(self, gtk.WRAP_WORD)
-
- context = self.get_pango_context()
- metrics = context.get_metrics(self.style.font_desc)
- line_height = pango.PIXELS(metrics.get_ascent() + \
- metrics.get_descent())
- self.set_size_request(-1, line_height * max_line_count)
+ self._max_line_count = max(1, max_line_count)
max_line_count = gobject.property(
getter=get_max_line_count, setter=set_max_line_count)
@@ -98,16 +92,31 @@ class Entry(gtk.TextView):
self._text = value
self.props.buffer.props.text = value
if not self.props.has_focus:
- self._accept()
+ self._set_accent_mode()
text = gobject.property(getter=get_text, setter=set_text)
def do_size_allocate(self, allocation):
gtk.TextView.do_size_allocate(self, allocation)
if not self.props.has_focus:
- self._accept()
+ self._set_accent_mode()
+
+ def _line_count(self):
+ iter = self.props.buffer.get_start_iter()
+ for lines in xrange(self.max_line_count):
+ if not self.forward_display_line(iter):
+ break
+ return lines + 1
+
+ def _set_edit_mode(self):
+ if self.max_line_count == 1:
+ gtk.TextView.set_wrap_mode(self, gtk.WRAP_NONE)
+ self.set_size_request(-1, TEXT_HEIGHT)
+ else:
+ gtk.TextView.set_wrap_mode(self, gtk.WRAP_WORD)
+ self.set_size_request(-1, TEXT_HEIGHT * self._line_count())
- def _accept(self):
+ def _set_accent_mode(self):
if self._text is None:
return
@@ -123,7 +132,7 @@ class Entry(gtk.TextView):
def last_offset():
iter = buf.get_start_iter()
- for __ in xrange(self._max_line_count):
+ for __ in xrange(self.max_line_count):
if not self.forward_display_line(iter):
return None
return iter.get_offset()
@@ -141,31 +150,53 @@ class Entry(gtk.TextView):
buf.props.text = buf.props.text[:offset - 3] + '...'
accent()
+ self.set_size_request(-1, TEXT_HEIGHT * self._line_count())
- def __button_release_event_cb(self, widget, event):
+ def _select(self):
buf = self.props.buffer
if not buf.get_has_selection():
+ self.scroll_to_iter(buf.get_end_iter(), 0, False)
buf.select_range(buf.get_end_iter(), buf.get_start_iter())
+
+ def __buffer_changed_cb(self, buffer):
+ if self.props.has_focus and self.max_line_count > 1:
+ __, height = self.get_size_request()
+ new_height = TEXT_HEIGHT * self._line_count()
+ if new_height != height:
+ self.set_size_request(-1, new_height)
+ self.parent.check_resize()
+
+ return False
+
+ def __button_press_event_cb(self, widget, event):
+ self._button_pressed = self.props.has_focus or -1
+ return False
+
+ def __button_release_event_cb(self, widget, event):
+ if self._button_pressed == -1:
+ self._select()
+ self._button_pressed = False
return False
def __focus_in_event_cb(self, widget, event):
self.props.buffer.props.text = self._text
+ self._set_edit_mode()
+ self.parent.check_resize()
- if self._max_line_count == 1:
- gtk.TextView.set_wrap_mode(self, gtk.WRAP_NONE)
- else:
- gtk.TextView.set_wrap_mode(self, gtk.WRAP_WORD)
+ if not self._button_pressed:
+ self._select()
return False
def __focus_out_event_cb(self, widget, event):
self._text = self.props.buffer.props.text
- self._accept()
+ self._set_accent_mode()
+ self.parent.check_resize()
return False
def __key_press_event_cb(self, widget, event):
ignore_mask = [gtk.keysyms.Return]
- if self._max_line_count == 1:
+ if self.max_line_count == 1:
ignore_mask.extend([gtk.keysyms.Up, gtk.keysyms.Down])
if event.keyval in ignore_mask:
@@ -181,4 +212,7 @@ class Entry(gtk.TextView):
gtk.main_do_event(key_event)
return True
+ elif event.keyval == gtk.keysyms.Escape:
+ self.props.buffer.props.text = self._text
+
return False
diff --git a/src/jarabe/journal/homogenetable.py b/src/jarabe/journal/homogenetable.py
index 43ff4fe..1a7ebbd 100644
--- a/src/jarabe/journal/homogenetable.py
+++ b/src/jarabe/journal/homogenetable.py
@@ -357,7 +357,9 @@ class VHomogeneTable(gtk.Container):
def do_set_focus_child(self, widget):
if widget is not None:
x, y, __, __ = widget.allocation
- self.cursor = self._get_cell_at_pos(x, y)
+ cursor = self._get_cell_at_pos(x, y)
+ if cursor not in self.frame_range:
+ self.cursor = cursor
def do_focus(self, type):
if self.editing:
@@ -631,7 +633,9 @@ class VHomogeneTable(gtk.Container):
page = self._column_count * self._frame_row_count
- if event.keyval == gtk.keysyms.Return and self.editable:
+ if event.keyval == gtk.keysyms.Escape and self.editing:
+ self.editing = False
+ elif event.keyval == gtk.keysyms.Return and self.editable:
self.editing = not self.editing
elif event.keyval == gtk.keysyms.Left:
self.cursor -= 1
diff --git a/src/jarabe/journal/listview.py b/src/jarabe/journal/listview.py
index a820ca4..d8ce421 100644
--- a/src/jarabe/journal/listview.py
+++ b/src/jarabe/journal/listview.py
@@ -31,34 +31,41 @@ class _Cell(Cell):
def __init__(self):
Cell.__init__(self)
- self._row = gtk.HBox()
- self._row.props.spacing = style.DEFAULT_SPACING
- self.add(self._row)
+ row = gtk.HBox()
+ row.props.spacing = style.DEFAULT_SPACING
+ self.add(row)
- keep = KeepIcon(box_width=style.GRID_CELL_SIZE)
- self._row.pack_start(keep, expand=False)
+ self._keep = KeepIcon(box_width=style.GRID_CELL_SIZE)
+ row.pack_start(self._keep, expand=False)
- icon = ObjectIcon(size=style.STANDARD_ICON_SIZE)
- self._row.pack_start(icon, expand=False)
+ self._icon = ObjectIcon(size=style.STANDARD_ICON_SIZE)
+ row.pack_start(self._icon, expand=False)
- title = Title(xalign=0, yalign=0.5, xscale=1, yscale=0)
- self._row.pack_start(title)
+ self._title = Title()
+ title_alignment = gtk.Alignment(
+ xalign=0, yalign=0.5, xscale=1, yscale=0)
+ title_alignment.add(self._title)
+ row.pack_start(title_alignment)
- details = DetailsIcon()
- self._row.pack_end(details, expand=False)
+ self._details = DetailsIcon()
+ row.pack_end(self._details, expand=False)
- date = Timestamp()
- self._row.pack_end(date, expand=False)
+ self._date = Timestamp()
+ row.pack_end(self._date, expand=False)
- buddies = Buddies(buddies_max=3,
+ self._buddies = Buddies(buddies_max=3,
xalign=0, yalign=0.5, xscale=1, yscale=0.15)
- self._row.pack_end(buddies, expand=False)
+ row.pack_end(self._buddies, expand=False)
self.show_all()
def do_fill_in_cell_content(self, table, offset, metadata):
- for i in self._row.get_children():
- i.fill_in(metadata)
+ self._keep.fill_in(metadata)
+ self._icon.fill_in(metadata)
+ self._title.fill_in(metadata)
+ self._details.fill_in(metadata)
+ self._date.fill_in(metadata)
+ self._buddies.fill_in(metadata)
class ListView(HomogeneView):
diff --git a/src/jarabe/journal/preview.py b/src/jarabe/journal/preview.py
index 1670884..0748e3a 100644
--- a/src/jarabe/journal/preview.py
+++ b/src/jarabe/journal/preview.py
@@ -204,6 +204,7 @@ class _AsyncLoader(object):
else:
return True
+
class _CacheEntry(object):
uid = None
offset = None
diff --git a/src/jarabe/journal/thumbsview.py b/src/jarabe/journal/thumbsview.py
index b96698a..5b085b1 100644
--- a/src/jarabe/journal/thumbsview.py
+++ b/src/jarabe/journal/thumbsview.py
@@ -22,9 +22,7 @@ from jarabe.journal.homogeneview import HomogeneView
from jarabe.journal.homogeneview import Cell
from jarabe.journal.widgets import *
from jarabe.journal import preview
-
-
-_TEXT_HEIGHT = gtk.EventBox().create_pango_layout('W').get_pixel_size()[1]
+from jarabe.journal import entry
class _Cell(Cell):
@@ -51,6 +49,7 @@ class _Cell(Cell):
# main
main = gtk.VBox()
+ main.props.spacing = style.DEFAULT_PADDING
cell.pack_end(main)
self._icon = ObjectIcon(
@@ -66,14 +65,11 @@ class _Cell(Cell):
self._thumb_box = gtk.HBox()
main.pack_start(self._thumb_box, expand=False)
- self._title = Title(
- max_line_count=2,
- xalign=0, yalign=0, xscale=1, yscale=0)
+ self._title = Title(max_line_count=2)
main.pack_start(self._title, expand=False)
- self._date = Timestamp(
- xalign=0.0,
- ellipsize=pango.ELLIPSIZE_END)
+ self._date = Timestamp(wrap=True, xalign=0.0)
+ self._date.set_size_request(preview.THUMB_WIDTH, -1)
main.pack_start(self._date, expand=False)
self.show_all()
@@ -115,7 +111,7 @@ class ThumbsView(HomogeneView):
cell_width = preview.THUMB_WIDTH + style.SMALL_ICON_SIZE + \
style.DEFAULT_PADDING + style.DEFAULT_SPACING * 2
- cell_height = preview.THUMB_HEIGHT + _TEXT_HEIGHT * 3 + \
+ cell_height = preview.THUMB_HEIGHT + entry.TEXT_HEIGHT * 4 + \
style.DEFAULT_PADDING * 3 + style.DEFAULT_SPACING
self.cell_size = (cell_width, cell_height)
diff --git a/src/jarabe/journal/widgets.py b/src/jarabe/journal/widgets.py
index 7ea8d5b..e2bd842 100644
--- a/src/jarabe/journal/widgets.py
+++ b/src/jarabe/journal/widgets.py
@@ -158,26 +158,23 @@ def ObjectIcon(**kwargs):
return _CanvasToWidget(ObjectIconCanvas, **kwargs)
-class Title(gtk.Alignment):
+class Title(Entry):
- def __init__(self, max_line_count=1, **kwargs):
- gtk.Alignment.__init__(self, **kwargs)
+ def __init__(self, **kwargs):
+ Entry.__init__(self, **kwargs)
self.metadata = None
- self._entry = Entry(max_line_count=max_line_count)
- self.add(self._entry)
-
- self._entry.connect_after('focus-out-event', self.__focus_out_event_cb)
+ self.connect_after('focus-out-event', self.__focus_out_event_cb)
def fill_in(self, metadata):
self.metadata = metadata
- self._entry.props.text = metadata.get('title', _('Untitled'))
- self._entry.props.editable = model.is_editable(metadata)
+ self.props.text = metadata.get('title', _('Untitled'))
+ self.props.editable = model.is_editable(metadata)
def __focus_out_event_cb(self, widget, event):
old_title = self.metadata.get('title', None)
- new_title = self._entry.props.text
+ new_title = self.props.text
if old_title != new_title:
self.metadata['title'] = new_title