From 87beb0b65270cefbe6d19bbbdee6049ee417fadc Mon Sep 17 00:00:00 2001 From: Aleksey Lim Date: Fri, 22 Jan 2010 01:49:03 +0000 Subject: Make title editing in thumbs view more convenient --- 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 -- cgit v0.9.1