diff --git a/src/jarabe/journal/expandedentry.py b/src/jarabe/journal/expandedentry.py
index a8dd21b16..71598a86f 100644
--- a/src/jarabe/journal/expandedentry.py
+++ b/src/jarabe/journal/expandedentry.py
@@ -438,10 +438,17 @@ def _format_date(self):
return _('No date')
def _create_buddy_list(self):
-
+ # No orphan heading: the label appears only when somebody
+ # actually worked on this together with the child.
vbox = Gtk.VBox()
vbox.props.spacing = style.DEFAULT_SPACING
+ buddies = []
+ if self._metadata.get('buddies'):
+ buddies = list(json.loads(self._metadata['buddies']).values())
+ if not buddies:
+ return vbox
+
text = Gtk.Label()
text.set_markup('%s' % (
style.COLOR_BUTTON_GREY.get_html(), _('Participants:')))
@@ -449,10 +456,7 @@ def _create_buddy_list(self):
halign.add(text)
vbox.pack_start(halign, False, False, 0)
- if self._metadata.get('buddies'):
- buddies = list(json.loads(self._metadata['buddies']).values())
- vbox.pack_start(BuddyList(buddies), False, False, 0)
- return vbox
+ vbox.pack_start(BuddyList(buddies), False, False, 0)
return vbox
def _create_scrollable(self, widget, label=None):
diff --git a/src/jarabe/journal/journalactivity.py b/src/jarabe/journal/journalactivity.py
index 28c0863d0..74c87a262 100644
--- a/src/jarabe/journal/journalactivity.py
+++ b/src/jarabe/journal/journalactivity.py
@@ -51,7 +51,6 @@
from jarabe.journal.journalwindow import JournalWindow
from jarabe.journal.bundlelauncher import launch_bundle, get_bundle
from jarabe.journal import journalwindow
-from jarabe.journal.listmodel import ListModel
from jarabe.model import session, shell
@@ -410,6 +409,12 @@ def __key_press_event_cb(self, widget, event):
self._main_toolbox.search_entry.grab_focus()
elif self._active_view == JournalViews.DETAIL:
+ # Arrow keys and Return are writing when a text field has
+ # the keyboard; they only steer the Journal when none does.
+ focus = self.get_focus()
+ if isinstance(focus, (Gtk.Entry, Gtk.TextView)):
+ return False
+
if keyname == 'Left':
path, col = self._list_view.tree_view.get_cursor()
self._list_view.tree_view.grab_focus()
diff --git a/src/jarabe/journal/journaltoolbox.py b/src/jarabe/journal/journaltoolbox.py
index a71f37b09..f577d281b 100644
--- a/src/jarabe/journal/journaltoolbox.py
+++ b/src/jarabe/journal/journaltoolbox.py
@@ -997,7 +997,7 @@ def do_draw(self, cr):
# draw a black background, has been done by the engine before
cr.set_source_rgb(0, 0, 0)
cr.rectangle(0, 0, allocation.width, allocation.height)
- cr.paint()
+ cr.fill()
Gtk.ToolButton.do_draw(self, cr)
diff --git a/src/jarabe/journal/listmodel.py b/src/jarabe/journal/listmodel.py
index ae1316434..0a9e90ffe 100644
--- a/src/jarabe/journal/listmodel.py
+++ b/src/jarabe/journal/listmodel.py
@@ -54,7 +54,6 @@ class ListModel(GObject.GObject, Gtk.TreeModel, Gtk.TreeDragSource):
COLUMN_BUDDY_1 = 9
COLUMN_BUDDY_2 = 10
COLUMN_BUDDY_3 = 11
- COLUMN_SELECT = 12
_COLUMN_TYPES = {
COLUMN_UID: str,
@@ -69,7 +68,6 @@ class ListModel(GObject.GObject, Gtk.TreeModel, Gtk.TreeDragSource):
COLUMN_BUDDY_1: object,
COLUMN_BUDDY_3: object,
COLUMN_BUDDY_2: object,
- COLUMN_SELECT: bool,
}
_PAGE_SIZE = 10
@@ -141,6 +139,9 @@ def set_value(self, iterator, column, value):
if column == ListModel.COLUMN_TITLE:
metadata['title'] = value
self._updated_entries[metadata['uid']] = metadata
+ # The edit must survive a re-read of this same row: the row
+ # cache was primed by the read that preceded this write.
+ self._last_requested_index = None
if self._updated_callback is not None:
model.updated.disconnect(self._updated_callback)
model.write(metadata, update_mtime=False,
@@ -165,22 +166,27 @@ def do_get_value(self, iterator, column):
metadata = self._result_set.read()
metadata.update(self._updated_entries.get(metadata['uid'], {}))
- self._last_requested_index = index
- self._cached_row = []
- self._cached_row.append(metadata['uid'])
- self._cached_row.append(metadata.get('keep', '0') == '1')
- self._cached_row.append(misc.get_icon_name(metadata))
+ row = []
+ row.append(metadata['uid'])
+ row.append(metadata.get('keep', '0') == '1')
+ row.append(misc.get_icon_name(metadata))
if misc.is_activity_bundle(metadata):
xo_color = XoColor('%s,%s' % (style.COLOR_BUTTON_GREY.get_svg(),
style.COLOR_TRANSPARENT.get_svg()))
else:
xo_color = misc.get_icon_color(metadata)
- self._cached_row.append(xo_color)
-
- title = GObject.markup_escape_text(metadata.get('title',
- _('Untitled')))
- self._cached_row.append('%s' % (title, ))
+ row.append(xo_color)
+
+ title_value = metadata.get('title', _('Untitled'))
+ if not isinstance(title_value, str):
+ # GObject.markup_escape_text raises TypeError on
+ # anything that isn't a string.
+ logging.warning('Content of title for %r is not a string: %r',
+ metadata['uid'], title_value)
+ title_value = _('Untitled')
+ title = GObject.markup_escape_text(title_value)
+ row.append('%s' % (title, ))
try:
timestamp = float(metadata.get('timestamp', 0))
@@ -188,27 +194,27 @@ def do_get_value(self, iterator, column):
timestamp_content = _('Unknown')
else:
timestamp_content = util.timestamp_to_elapsed_string(timestamp)
- self._cached_row.append(timestamp_content)
+ row.append(timestamp_content)
try:
creation_time = float(metadata.get('creation_time'))
except (TypeError, ValueError):
- self._cached_row.append(_('Unknown'))
+ row.append(_('Unknown'))
else:
- self._cached_row.append(
+ row.append(
util.timestamp_to_elapsed_string(float(creation_time)))
try:
size = int(metadata.get('filesize'))
except (TypeError, ValueError):
size = None
- self._cached_row.append(util.format_size(size))
+ row.append(util.format_size(size))
try:
progress = int(float(metadata.get('progress', 100)))
except (TypeError, ValueError):
progress = 100
- self._cached_row.append(progress)
+ row.append(progress)
buddies = []
if metadata.get('buddies'):
@@ -231,11 +237,13 @@ def do_get_value(self, iterator, column):
logging.warning('Malformed buddies for %r: %s',
metadata['uid'], exception)
else:
- self._cached_row.append([nick, XoColor(color)])
+ row.append([nick, XoColor(color)])
continue
- self._cached_row.append(None)
+ row.append(None)
+ self._cached_row = row
+ self._last_requested_index = index
return self._cached_row[column]
def do_iter_nth_child(self, parent_iter, n):
diff --git a/src/jarabe/journal/listview.py b/src/jarabe/journal/listview.py
index 017b94867..10f28dd8b 100644
--- a/src/jarabe/journal/listview.py
+++ b/src/jarabe/journal/listview.py
@@ -773,7 +773,7 @@ def _key_press_event_cb(self, tree_view, event):
if self.cell_title.props.editable:
self.emit('title-edit-started')
- column = self.tree_view.get_column(3)
+ column = self._title_column
tree_view.set_cursor_on_cell(path, column, self.cell_title,
start_editing=True)
diff --git a/src/jarabe/journal/objectchooser.py b/src/jarabe/journal/objectchooser.py
index 00ff5f0ec..084f280d5 100644
--- a/src/jarabe/journal/objectchooser.py
+++ b/src/jarabe/journal/objectchooser.py
@@ -150,7 +150,7 @@ def __volume_changed_cb(self, volume_toolbar, mount_point):
def __visibility_notify_event_cb(self, window, event):
logging.debug('visibility_notify_event_cb %r', self)
- visible = event.get_state() == Gdk.VisibilityState.FULLY_OBSCURED
+ visible = event.get_state() != Gdk.VisibilityState.FULLY_OBSCURED
if not self._show_preview:
self._list_view.set_is_visible(visible)
else: