From b74edfca2d40446e12477668b00ebf776432151d Mon Sep 17 00:00:00 2001 From: Nick Hall Date: Fri, 25 Feb 2011 22:03:41 +0000 Subject: [PATCH] Add Place Details, Repository Details and Media Preview gramplets svn: r16717 --- po/POTFILES.in | 2 + po/POTFILES.skip | 1 + src/plugins/gramplet/Gallery.py | 58 ++-------- src/plugins/gramplet/Makefile.am | 3 + src/plugins/gramplet/MediaPreview.py | 70 +++++++++++ src/plugins/gramplet/PersonDetails.py | 65 +++-------- src/plugins/gramplet/PlaceDetails.py | 135 ++++++++++++++++++++++ src/plugins/gramplet/RepositoryDetails.py | 118 +++++++++++++++++++ src/plugins/gramplet/bottombar.gpr.py | 39 +++++++ src/plugins/lib/libplaceview.py | 3 +- src/plugins/view/mediaview.py | 61 +--------- src/plugins/view/repoview.py | 3 +- 12 files changed, 395 insertions(+), 163 deletions(-) create mode 100644 src/plugins/gramplet/MediaPreview.py create mode 100644 src/plugins/gramplet/PlaceDetails.py create mode 100644 src/plugins/gramplet/RepositoryDetails.py diff --git a/po/POTFILES.in b/po/POTFILES.in index 2f3378b48..8c41a8e5e 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -269,8 +269,10 @@ src/plugins/gramplet/Notes.py src/plugins/gramplet/PedigreeGramplet.py src/plugins/gramplet/PersonDetails.py src/plugins/gramplet/PersonResidence.py +src/plugins/gramplet/PlaceDetails.py src/plugins/gramplet/QuickViewGramplet.py src/plugins/gramplet/RelativeGramplet.py +src/plugins/gramplet/RepositoryDetails.py src/plugins/gramplet/SessionLogGramplet.py src/plugins/gramplet/Sources.py src/plugins/gramplet/StatsGramplet.py diff --git a/po/POTFILES.skip b/po/POTFILES.skip index 4c6deb06e..2a78f4f11 100644 --- a/po/POTFILES.skip +++ b/po/POTFILES.skip @@ -294,6 +294,7 @@ src/plugins/tool/phpgedview.glade # plugins/gramplet directory src/plugins/gramplet/DeepConnections.py src/plugins/gramplet/HeadlineNewsGramplet.py +src/plugins/gramplet/MediaPreview.py src/plugins/gramplet/NoteGramplet.py src/plugins/gramplet/Gallery.py src/plugins/gramplet/PluginManagerGramplet.py diff --git a/src/plugins/gramplet/Gallery.py b/src/plugins/gramplet/Gallery.py index b46740d8b..75e24124e 100644 --- a/src/plugins/gramplet/Gallery.py +++ b/src/plugins/gramplet/Gallery.py @@ -19,8 +19,8 @@ # $Id$ # -from gui.utils import open_file_with_default_application from gen.plug import Gramplet +from gui.widgets import Photo import Utils import gtk @@ -37,9 +37,6 @@ class Gallery(Gramplet): """ Build the GUI interface. """ - tip = _('Double-click on a picture to view it in the default image ' - 'viewer application.') - self.set_tooltip(tip) self.image_list = [] self.top = gtk.HBox(False, 3) return self.top @@ -57,59 +54,18 @@ class Gallery(Gramplet): Load the primary image into the main form if it exists. """ media_list = obj.get_media_list() - for photo in media_list: - object_handle = photo.get_reference_handle() + for media_ref in media_list: + object_handle = media_ref.get_reference_handle() obj = self.dbstate.db.get_object_from_handle(object_handle) full_path = Utils.media_path_full(self.dbstate.db, obj.get_path()) mime_type = obj.get_mime_type() if mime_type and mime_type.startswith("image"): - pb = self.get_pixbuf(full_path, photo.get_rectangle()) - eb = gtk.EventBox() - eb.connect('button-press-event', self.display_image, full_path) - image = gtk.Image() - eb.add(image) - self.image_list.append(eb) - image.set_from_pixbuf(pb) - self.top.pack_start(eb, expand=False, fill=False) + photo = Photo(180.0) + photo.set_image(full_path, media_ref.get_rectangle()) + self.image_list.append(photo) + self.top.pack_start(photo, expand=False, fill=False) self.top.show_all() - def display_image(self, widget, event, path): - """ - Display the image with the default application. - """ - if event.type == gtk.gdk._2BUTTON_PRESS and event.button == 1: - open_file_with_default_application(path) - - def get_pixbuf(self, path, rectangle=None): - """ - Load, scale and display the person's main photo from the path. - """ - try: - i = gtk.gdk.pixbuf_new_from_file(path) - width = i.get_width() - height = i.get_height() - - if rectangle is not None: - upper_x = min(rectangle[0], rectangle[2])/100. - lower_x = max(rectangle[0], rectangle[2])/100. - upper_y = min(rectangle[1], rectangle[3])/100. - lower_y = max(rectangle[1], rectangle[3])/100. - sub_x = int(upper_x * width) - sub_y = int(upper_y * height) - sub_width = int((lower_x - upper_x) * width) - sub_height = int((lower_y - upper_y) * height) - if sub_width > 0 and sub_height > 0: - i = i.subpixbuf(sub_x, sub_y, sub_width, sub_height) - - ratio = float(max(i.get_height(), i.get_width())) - scale = float(180.0)/ratio - x = int(scale*(i.get_width())) - y = int(scale*(i.get_height())) - i = i.scale_simple(x, y, gtk.gdk.INTERP_BILINEAR) - return i - except: - return None - class PersonGallery(Gallery): """ Displays a gallery of media objects for a person. diff --git a/src/plugins/gramplet/Makefile.am b/src/plugins/gramplet/Makefile.am index 847f27944..6d26cf135 100644 --- a/src/plugins/gramplet/Makefile.am +++ b/src/plugins/gramplet/Makefile.am @@ -20,13 +20,16 @@ pkgdata_PYTHON = \ Gallery.py \ GivenNameGramplet.py \ gramplet.gpr.py \ + MediaPreview.py \ Notes.py \ PedigreeGramplet.py \ PersonDetails.py \ PersonResidence.py \ + PlaceDetails.py \ PluginManagerGramplet.py\ QuickViewGramplet.py \ RelativeGramplet.py \ + RepositoryDetails.py \ SessionLogGramplet.py \ Sources.py \ StatsGramplet.py \ diff --git a/src/plugins/gramplet/MediaPreview.py b/src/plugins/gramplet/MediaPreview.py new file mode 100644 index 000000000..0304ad897 --- /dev/null +++ b/src/plugins/gramplet/MediaPreview.py @@ -0,0 +1,70 @@ +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2011 Nick Hall +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# $Id$ +# + +from gen.plug import Gramplet +from gui.widgets import Photo +import Utils +import gtk + +class MediaPreview(Gramplet): + """ + Displays a preview of the media object. + """ + def init(self): + self.gui.WIDGET = self.build_gui() + self.gui.get_container_widget().remove(self.gui.textview) + self.gui.get_container_widget().add_with_viewport(self.gui.WIDGET) + + def build_gui(self): + """ + Build the GUI interface. + """ + self.top = gtk.HBox() + self.photo = Photo(190.0) + self.top.pack_start(self.photo, fill=True, expand=False, padding=5) + self.top.show_all() + return self.top + + def db_changed(self): + self.dbstate.db.connect('media-update', self.update) + self.connect_signal('Media', self.update) + self.update() + + def main(self): + active_handle = self.get_active('Media') + media = self.dbstate.db.get_object_from_handle(active_handle) + self.top.hide() + if media: + self.load_image(media) + else: + self.photo.set_image(None) + self.top.show() + + def load_image(self, media): + """ + Load the primary image if it exists. + """ + full_path = Utils.media_path_full(self.dbstate.db, media.get_path()) + mime_type = media.get_mime_type() + if mime_type and mime_type.startswith("image"): + self.photo.set_image(full_path) + else: + self.photo.set_image(None) diff --git a/src/plugins/gramplet/PersonDetails.py b/src/plugins/gramplet/PersonDetails.py index febf77028..d5d3818c4 100644 --- a/src/plugins/gramplet/PersonDetails.py +++ b/src/plugins/gramplet/PersonDetails.py @@ -21,6 +21,7 @@ from gen.lib import EventType, EventRoleType from gen.plug import Gramplet +from gui.widgets import Photo from gen.display.name import displayer as name_displayer from gen.ggettext import gettext as _ import DateHandler @@ -46,11 +47,12 @@ class PersonDetails(Gramplet): self.load_rect = None self.top = gtk.HBox() vbox = gtk.VBox() - self.obj_photo = gtk.Image() + self.photo = Photo(190.0) + self.photo.show() self.name = gtk.Label() self.name.set_alignment(0, 0) self.name.modify_font(pango.FontDescription('sans bold 12')) - vbox.pack_start(self.name, fill=True, expand=False, padding=10) + vbox.pack_start(self.name, fill=True, expand=False, padding=7) table = gtk.Table(2, 2) self.father = self.make_row(table, 0, _('Father')) self.mother = self.make_row(table, 1, _('Mother')) @@ -65,7 +67,7 @@ class PersonDetails(Gramplet): self.occupation = self.make_row(table, 0, _('Occupation')) vbox.pack_start(table, fill=True, expand=False, padding=5) vbox.show_all() - self.top.pack_start(self.obj_photo, fill=True, expand=False, padding=5) + self.top.pack_start(self.photo, fill=True, expand=False, padding=5) self.top.pack_start(vbox, fill=True, expand=True, padding=10) return self.top @@ -116,7 +118,7 @@ class PersonDetails(Gramplet): """ Display empty details when no person is selected. """ - self.load_photo(None) + self.photo.set_image(None) self.name.set_text(_('No active person')) self.father[1].set_text(_('Unknown')) self.mother[1].set_text(_('Unknown')) @@ -206,53 +208,14 @@ class PersonDetails(Gramplet): """ media_list = person.get_media_list() if media_list: - photo = media_list[0] - object_handle = photo.get_reference_handle() + media_ref = media_list[0] + object_handle = media_ref.get_reference_handle() obj = self.dbstate.db.get_object_from_handle(object_handle) full_path = Utils.media_path_full(self.dbstate.db, obj.get_path()) - #reload if different media, or different rectangle - if self.load_obj != full_path or \ - self.load_rect != photo.get_rectangle(): - mime_type = obj.get_mime_type() - if mime_type and mime_type.startswith("image"): - self.load_photo(full_path, photo.get_rectangle()) - else: - self.load_photo(None) + mime_type = obj.get_mime_type() + if mime_type and mime_type.startswith("image"): + self.photo.set_image(full_path, media_ref.get_rectangle()) + else: + self.photo.set_image(None) else: - self.load_photo(None) - - def load_photo(self, path, rectangle=None): - """ - Load, scale and display the person's main photo from the path. - """ - self.load_obj = path - self.load_rect = rectangle - if path is None: - self.obj_photo.hide() - else: - try: - i = gtk.gdk.pixbuf_new_from_file(path) - width = i.get_width() - height = i.get_height() - - if rectangle is not None: - upper_x = min(rectangle[0], rectangle[2])/100. - lower_x = max(rectangle[0], rectangle[2])/100. - upper_y = min(rectangle[1], rectangle[3])/100. - lower_y = max(rectangle[1], rectangle[3])/100. - sub_x = int(upper_x * width) - sub_y = int(upper_y * height) - sub_width = int((lower_x - upper_x) * width) - sub_height = int((lower_y - upper_y) * height) - if sub_width > 0 and sub_height > 0: - i = i.subpixbuf(sub_x, sub_y, sub_width, sub_height) - - ratio = float(max(i.get_height(), i.get_width())) - scale = float(190.0)/ratio - x = int(scale*(i.get_width())) - y = int(scale*(i.get_height())) - i = i.scale_simple(x, y, gtk.gdk.INTERP_BILINEAR) - self.obj_photo.set_from_pixbuf(i) - self.obj_photo.show() - except: - self.obj_photo.hide() + self.photo.set_image(None) diff --git a/src/plugins/gramplet/PlaceDetails.py b/src/plugins/gramplet/PlaceDetails.py new file mode 100644 index 000000000..6f0a0bdff --- /dev/null +++ b/src/plugins/gramplet/PlaceDetails.py @@ -0,0 +1,135 @@ +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2011 Nick Hall +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# $Id$ +# + +from gen.plug import Gramplet +from gui.widgets import LocationBox, Photo +from gen.ggettext import gettext as _ +from PlaceUtils import conv_lat_lon +import Utils +import gtk +import pango + +class PlaceDetails(Gramplet): + """ + Displays details for a place. + """ + def init(self): + self.gui.WIDGET = self.build_gui() + self.gui.get_container_widget().remove(self.gui.textview) + self.gui.get_container_widget().add_with_viewport(self.gui.WIDGET) + + def build_gui(self): + """ + Build the GUI interface. + """ + self.top = gtk.HBox() + vbox = gtk.VBox() + self.photo = Photo(190.0) + self.title = gtk.Label() + self.title.set_alignment(0, 0) + self.title.modify_font(pango.FontDescription('sans bold 12')) + vbox.pack_start(self.title, fill=True, expand=False, padding=7) + table = gtk.Table(4, 2) + self.location = LocationBox() + label = gtk.Label(_('Location') + ':') + label.set_alignment(1, 0) + table.attach(label, 0, 1, 0, 1, xoptions=gtk.FILL, xpadding=10) + table.attach(self.location, 1, 2, 0, 1, xoptions=gtk.FILL) + table.attach(gtk.Label(), 0, 1, 1, 2, xoptions=gtk.FILL) + self.latitude = self.make_row(table, 2, _('Latitude')) + self.longitude = self.make_row(table, 3, _('Longitude')) + vbox.pack_start(table, fill=True, expand=False) + self.top.pack_start(self.photo, fill=True, expand=False, padding=5) + self.top.pack_start(vbox, fill=True, expand=False, padding=10) + self.top.show_all() + return self.top + + def make_row(self, table, row, title): + """ + Make a row in a table. + """ + label = gtk.Label(title + ':') + label.set_alignment(1, 0) + widget = gtk.Label() + widget.set_alignment(0, 0) + table.attach(label, 0, 1, row, row + 1, xoptions=gtk.FILL, xpadding=10) + table.attach(widget, 1, 2, row, row + 1) + return (label, widget) + + def db_changed(self): + self.dbstate.db.connect('place-update', self.update) + self.connect_signal('Place', self.update) + self.update() + + def main(self): + active_handle = self.get_active('Place') + place = self.dbstate.db.get_place_from_handle(active_handle) + self.top.hide() + if place: + self.display_place(place) + else: + self.display_empty() + self.top.show() + + def display_place(self, place): + """ + Display details of the active place. + """ + self.load_place_image(place) + self.title.set_text(place.get_title()) + self.location.set_location(place.get_main_location()) + lat, lon = conv_lat_lon(place.get_latitude(), + place.get_longitude(), + format='DEG') + self.latitude[1].set_text('') + self.longitude[1].set_text('') + if lat: + self.latitude[1].set_text(lat) + if lon: + self.longitude[1].set_text(lon) + + def display_empty(self): + """ + Display empty details when no repository is selected. + """ + self.photo.set_image(None) + self.title.set_text('') + self.location.set_location(None) + self.latitude[1].set_text('') + self.longitude[1].set_text('') + + def load_place_image(self, place): + """ + Load the primary image if it exists. + """ + media_list = place.get_media_list() + if media_list: + media_ref = media_list[0] + object_handle = media_ref.get_reference_handle() + obj = self.dbstate.db.get_object_from_handle(object_handle) + full_path = Utils.media_path_full(self.dbstate.db, obj.get_path()) + mime_type = obj.get_mime_type() + if mime_type and mime_type.startswith("image"): + self.photo.set_image(full_path, media_ref.get_rectangle()) + else: + self.photo.set_image(None) + else: + self.photo.set_image(None) diff --git a/src/plugins/gramplet/RepositoryDetails.py b/src/plugins/gramplet/RepositoryDetails.py new file mode 100644 index 000000000..cd40516b6 --- /dev/null +++ b/src/plugins/gramplet/RepositoryDetails.py @@ -0,0 +1,118 @@ +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2011 Nick Hall +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# $Id$ +# + +from gen.lib import UrlType +from gen.plug import Gramplet +from gui.widgets import LocationBox +from gen.ggettext import gettext as _ +import gtk +import pango + +class RepositoryDetails(Gramplet): + """ + Displays details for a repository. + """ + def init(self): + self.gui.WIDGET = self.build_gui() + self.gui.get_container_widget().remove(self.gui.textview) + self.gui.get_container_widget().add_with_viewport(self.gui.WIDGET) + + def build_gui(self): + """ + Build the GUI interface. + """ + self.top = gtk.HBox() + vbox = gtk.VBox() + self.name = gtk.Label() + self.name.set_alignment(0, 0) + self.name.modify_font(pango.FontDescription('sans bold 12')) + vbox.pack_start(self.name, fill=True, expand=False, padding=7) + table = gtk.Table(4, 2) + self.address = LocationBox() + label = gtk.Label(_('Address') + ':') + label.set_alignment(1, 0) + table.attach(label, 0, 1, 0, 1, xoptions=gtk.FILL, xpadding=10) + table.attach(self.address, 1, 2, 0, 1, xoptions=gtk.FILL) + self.phone = self.make_row(table, 1, _('Phone')) + self.email = self.make_row(table, 2, _('Email')) + self.web = self.make_row(table, 3, _('Web')) + vbox.pack_start(table, fill=True, expand=False) + self.top.pack_start(vbox, fill=True, expand=False, padding=10) + self.top.show_all() + return self.top + + def make_row(self, table, row, title): + """ + Make a row in a table. + """ + label = gtk.Label(title + ':') + label.set_alignment(1, 0) + widget = gtk.Label() + widget.set_alignment(0, 0) + table.attach(label, 0, 1, row, row + 1, xoptions=gtk.FILL, xpadding=10) + table.attach(widget, 1, 2, row, row + 1) + return (label, widget) + + def db_changed(self): + self.dbstate.db.connect('repository-update', self.update) + self.connect_signal('Repository', self.update) + self.update() + + def main(self): + active_handle = self.get_active('Repository') + repo = self.dbstate.db.get_repository_from_handle(active_handle) + self.top.hide() + if repo: + self.display_repo(repo) + else: + self.display_empty() + self.top.show() + + def display_repo(self, repo): + """ + Display details of the active repository. + """ + self.name.set_text(repo.get_name()) + address_list = repo.get_address_list() + if len(address_list) > 0: + self.address.set_location(address_list[0]) + self.phone[1].set_text(address_list[0].get_phone()) + else: + self.address.set_location(None) + self.phone[1].set_text('') + + self.email[1].set_text('') + self.web[1].set_text('') + for url in repo.get_url_list(): + if int(url.get_type()) == UrlType.EMAIL: + self.email[1].set_text(url.get_path()) + if int(url.get_type()) == UrlType.WEB_HOME: + self.web[1].set_text(url.get_path()) + + def display_empty(self): + """ + Display empty details when no repository is selected. + """ + self.name.set_text('') + self.address.set_location(None) + self.phone[1].set_text('') + self.email[1].set_text('') + self.web[1].set_text('') diff --git a/src/plugins/gramplet/bottombar.gpr.py b/src/plugins/gramplet/bottombar.gpr.py index 9e551c1f6..6b259da8f 100644 --- a/src/plugins/gramplet/bottombar.gpr.py +++ b/src/plugins/gramplet/bottombar.gpr.py @@ -38,6 +38,45 @@ register(GRAMPLET, gramplet_title=_("Details"), ) +register(GRAMPLET, + id="Repository Details Gramplet", + name=_("Repository Details Gramplet"), + description = _("Gramplet showing details of a repository"), + version="1.0.0", + gramps_target_version="3.3", + status = STABLE, + fname="RepositoryDetails.py", + height=200, + gramplet = 'RepositoryDetails', + gramplet_title=_("Details"), + ) + +register(GRAMPLET, + id="Place Details Gramplet", + name=_("Place Details Gramplet"), + description = _("Gramplet showing details of a place"), + version="1.0.0", + gramps_target_version="3.3", + status = STABLE, + fname="PlaceDetails.py", + height=200, + gramplet = 'PlaceDetails', + gramplet_title=_("Details"), + ) + +register(GRAMPLET, + id="Media Preview Gramplet", + name=_("Media Preview Gramplet"), + description = _("Gramplet showing a preview of a media object"), + version="1.0.0", + gramps_target_version="3.3", + status = STABLE, + fname="MediaPreview.py", + height=200, + gramplet = 'MediaPreview', + gramplet_title=_("Preview"), + ) + register(GRAMPLET, id="Person Residence Gramplet", name=_("Person Residence Gramplet"), diff --git a/src/plugins/lib/libplaceview.py b/src/plugins/lib/libplaceview.py index 26c9bac74..e38a383f2 100644 --- a/src/plugins/lib/libplaceview.py +++ b/src/plugins/lib/libplaceview.py @@ -425,7 +425,8 @@ class PlaceBaseView(ListView): Define the default gramplets for the sidebar and bottombar. """ return (("Place Filter Gramplet",), - ("Place Gallery Gramplet", + ("Place Details Gramplet", + "Place Gallery Gramplet", "Place Sources Gramplet", "Place Notes Gramplet")) diff --git a/src/plugins/view/mediaview.py b/src/plugins/view/mediaview.py index 8cccecc5a..b3db9facb 100644 --- a/src/plugins/view/mediaview.py +++ b/src/plugins/view/mediaview.py @@ -278,64 +278,6 @@ class MediaView(ListView): """ return 'gramps-media' - def build_widget(self): - """ - Builds the View from GTK components - """ - base = ListView.build_widget(self) - vbox = gtk.VBox() - vbox.set_border_width(0) - vbox.set_spacing(4) - - self.image = gtk.Image() - self.image.set_size_request(int(const.THUMBSCALE), - int(const.THUMBSCALE)) - ebox = gtk.EventBox() - ebox.add(self.image) - ebox.connect('button-press-event', self.button_press_event) - ebox.set_tooltip_text( - _('Double click image to view in an external viewer')) - vbox.pack_start(ebox, False) - vbox.pack_start(base, True) - - self.selection.connect('changed', self.row_change) - self._set_dnd() - return vbox - - def button_press_event(self, obj, event): - """ - Event handler that catches a double click, and and launches a viewer for - the selected object. - """ - if event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS: - self.view_media(obj) - - def row_update(self, obj): - """ - Update the data in the row. we override this because the Media View adds - additional functionality to the normal List View. The Media View may - have to update the thumbnail image. So, we call the parent task to - handle the normal operation, then call row_change to make sure that - the thumbnail is updated properly if needed. - """ - ListView.row_update(self, obj) - if self.active: - self.row_change(obj) - - def row_change(self, obj): - """ - Update the thumbnail on a row change. If nothing is selected, clear - the thumbnail image. - """ - handle = self.first_selected() - if not handle: - self.image.clear() - else: - obj = self.dbstate.db.get_object_from_handle(handle) - pix = ThumbNails.get_thumbnail_image( - Utils.media_path_full(self.dbstate.db, obj.get_path())) - self.image.set_from_pixbuf(pix) - def additional_ui(self): """ Return the UIManager XML description of the menus @@ -493,6 +435,7 @@ class MediaView(ListView): Define the default gramplets for the sidebar and bottombar. """ return (("Media Filter Gramplet",), - ("Media Sources Gramplet", + ("Media Preview Gramplet", + "Media Sources Gramplet", "Media Notes Gramplet", "Media Attributes Gramplet")) diff --git a/src/plugins/view/repoview.py b/src/plugins/view/repoview.py index e55b2fb55..dfa11aa9c 100644 --- a/src/plugins/view/repoview.py +++ b/src/plugins/view/repoview.py @@ -274,4 +274,5 @@ class RepositoryView(ListView): Define the default gramplets for the sidebar and bottombar. """ return (("Repository Filter Gramplet",), - ("Repository Notes Gramplet",)) + ("Repository Details Gramplet", + "Repository Notes Gramplet"))