Introduce experimental netbook mode for small screen sizes

svn: r17965
This commit is contained in:
Nick Hall 2011-07-25 22:47:57 +00:00
parent 390410f2ca
commit 59c793608c
21 changed files with 167 additions and 73 deletions

View File

@ -257,6 +257,7 @@ src/gui/views/treemodels/repomodel.py
src/gui/views/treemodels/sourcemodel.py
# gui/widgets - the GUI widgets package
src/gui/widgets/basicentry.py
src/gui/widgets/menutoolbuttonaction.py
src/gui/widgets/styledtextbuffer.py
src/gui/widgets/undoablestyledbuffer.py

View File

@ -402,6 +402,16 @@ class DisplayState(gen.utils.Callback):
# but this connection is still made!
# self.dbstate.connect('database-changed', self.db_changed)
self.__netbook_mode = False
if self.window.get_screen().get_width() <= 1024:
self.__netbook_mode = True
def netbook_mode(self):
"""
Return True if running on a small screen, else return False.
"""
return self.__netbook_mode
def clear_history(self):
"""
Clear all history objects.

View File

@ -58,8 +58,8 @@ class EventSidebarFilter(SidebarFilter):
def __init__(self, dbstate, uistate, clicked):
self.clicked_func = clicked
self.filter_id = gtk.Entry()
self.filter_desc = gtk.Entry()
self.filter_id = widgets.BasicEntry()
self.filter_desc = widgets.BasicEntry()
self.filter_event = gen.lib.Event()
self.filter_event.set_type((gen.lib.EventType.CUSTOM, u''))
self.etype = gtk.ComboBoxEntry()
@ -69,11 +69,11 @@ class EventSidebarFilter(SidebarFilter):
self.filter_event.set_type,
self.filter_event.get_type)
self.filter_mainparts = gtk.Entry()
self.filter_date = gtk.Entry()
self.filter_place = gtk.Entry()
self.filter_note = gtk.Entry()
self.filter_mainparts = widgets.BasicEntry()
self.filter_date = widgets.BasicEntry()
self.filter_place = widgets.BasicEntry()
self.filter_note = widgets.BasicEntry()
self.filter_regex = gtk.CheckButton(_('Use regular expressions'))
self.generic = gtk.ComboBox()
@ -88,15 +88,17 @@ class EventSidebarFilter(SidebarFilter):
self.generic.add_attribute(cell, 'text', 0)
self.on_filters_changed('Event')
self.etype.child.set_width_chars(5)
self.add_text_entry(_('ID'), self.filter_id)
self.add_text_entry(_('Description'), self.filter_desc)
self.add_entry(_('Type'), self.etype)
self.add_text_entry(_('Main Participants'), self.filter_mainparts)
self.add_text_entry(_('Participants'), self.filter_mainparts)
self.add_text_entry(_('Date'), self.filter_date)
self.add_text_entry(_('Place'), self.filter_place)
self.add_text_entry(_('Note'), self.filter_note)
self.add_filter_entry(_('Custom filter'), self.generic)
self.add_entry(None, self.filter_regex)
self.add_regex_entry(self.filter_regex)
def clear(self, obj):
self.filter_id.set_text(u'')

View File

@ -62,10 +62,10 @@ class FamilySidebarFilter(SidebarFilter):
def __init__(self, dbstate, uistate, clicked):
self.clicked_func = clicked
self.filter_id = gtk.Entry()
self.filter_father = gtk.Entry()
self.filter_mother = gtk.Entry()
self.filter_child = gtk.Entry()
self.filter_id = widgets.BasicEntry()
self.filter_father = widgets.BasicEntry()
self.filter_mother = widgets.BasicEntry()
self.filter_child = widgets.BasicEntry()
self.filter_event = gen.lib.Event()
self.filter_event.set_type((gen.lib.EventType.CUSTOM, u''))
@ -85,8 +85,8 @@ class FamilySidebarFilter(SidebarFilter):
self.family_stub.set_relationship,
self.family_stub.get_relationship)
self.filter_note = gtk.Entry()
self.filter_note = widgets.BasicEntry()
self.filter_regex = gtk.CheckButton(_('Use regular expressions'))
self.tag = gtk.ComboBox()
@ -108,6 +108,9 @@ class FamilySidebarFilter(SidebarFilter):
self.tag.pack_start(cell, True)
self.tag.add_attribute(cell, 'text', 0)
self.etype.child.set_width_chars(5)
self.rtype.child.set_width_chars(5)
self.add_text_entry(_('ID'), self.filter_id)
self.add_text_entry(_('Father'), self.filter_father)
self.add_text_entry(_('Mother'), self.filter_mother)
@ -117,7 +120,7 @@ class FamilySidebarFilter(SidebarFilter):
self.add_text_entry(_('Family Note'), self.filter_note)
self.add_entry(_('Tag'), self.tag)
self.add_filter_entry(_('Custom filter'), self.generic)
self.add_entry(None, self.filter_regex)
self.add_regex_entry(self.filter_regex)
def clear(self, obj):
self.filter_id.set_text(u'')

View File

@ -40,6 +40,7 @@ import gtk
# GRAMPS modules
#
#-------------------------------------------------------------------------
from gui import widgets
from Filters.SideBar import SidebarFilter
from Filters import GenericFilterFactory, build_filter_model, Rules
from Filters.Rules.MediaObject import (RegExpIdOf, HasIdOf, HasMedia, HasTag,
@ -56,13 +57,12 @@ class MediaSidebarFilter(SidebarFilter):
def __init__(self, dbstate, uistate, clicked):
self.clicked_func = clicked
self.filter_id = gtk.Entry()
self.filter_title = gtk.Entry()
self.filter_type = gtk.Entry()
self.filter_path = gtk.Entry()
self.filter_date = gtk.Entry()
self.filter_note = gtk.Entry()
self.filter_id = widgets.BasicEntry()
self.filter_title = widgets.BasicEntry()
self.filter_type = widgets.BasicEntry()
self.filter_path = widgets.BasicEntry()
self.filter_date = widgets.BasicEntry()
self.filter_note = widgets.BasicEntry()
self.filter_regex = gtk.CheckButton(_('Use regular expressions'))
@ -93,7 +93,7 @@ class MediaSidebarFilter(SidebarFilter):
self.add_text_entry(_('Note'), self.filter_note)
self.add_entry(_('Tag'), self.tag)
self.add_filter_entry(_('Custom filter'), self.generic)
self.add_entry(None, self.filter_regex)
self.add_regex_entry(self.filter_regex)
def clear(self, obj):
self.filter_id.set_text('')

View File

@ -58,8 +58,8 @@ class NoteSidebarFilter(SidebarFilter):
def __init__(self, dbstate, uistate, clicked):
self.clicked_func = clicked
self.filter_id = gtk.Entry()
self.filter_text = gtk.Entry()
self.filter_id = widgets.BasicEntry()
self.filter_text = widgets.BasicEntry()
self.note = Note()
self.note.set_type((NoteType.CUSTOM,''))
@ -90,12 +90,14 @@ class NoteSidebarFilter(SidebarFilter):
self.tag.pack_start(cell, True)
self.tag.add_attribute(cell, 'text', 0)
self.ntype.child.set_width_chars(5)
self.add_text_entry(_('ID'), self.filter_id)
self.add_text_entry(_('Text'), self.filter_text)
self.add_entry(_('Type'), self.ntype)
self.add_entry(_('Tag'), self.tag)
self.add_filter_entry(_('Custom filter'), self.generic)
self.add_entry(None, self.filter_regex)
self.add_regex_entry(self.filter_regex)
def clear(self, obj):
self.filter_id.set_text('')

View File

@ -72,10 +72,10 @@ class PersonSidebarFilter(SidebarFilter):
def __init__(self, dbstate, uistate, clicked):
self.clicked_func = clicked
self.filter_name = gtk.Entry()
self.filter_id = gtk.Entry()
self.filter_birth = gtk.Entry()
self.filter_death = gtk.Entry()
self.filter_name = widgets.BasicEntry()
self.filter_id = widgets.BasicEntry()
self.filter_birth = widgets.BasicEntry()
self.filter_death = widgets.BasicEntry()
self.filter_event = gen.lib.Event()
self.filter_event.set_type((gen.lib.EventType.CUSTOM, u''))
self.etype = gtk.ComboBoxEntry()
@ -84,7 +84,7 @@ class PersonSidebarFilter(SidebarFilter):
self.filter_event.set_type,
self.filter_event.get_type)
self.filter_note = gtk.Entry()
self.filter_note = widgets.BasicEntry()
self.filter_gender = gtk.combo_box_new_text()
map(self.filter_gender.append_text,
[ _('any'), _('male'), _('female'), _('unknown') ])
@ -111,6 +111,8 @@ class PersonSidebarFilter(SidebarFilter):
self.tag.pack_start(cell, True)
self.tag.add_attribute(cell, 'text', 0)
self.etype.child.set_width_chars(5)
exdate1 = gen.lib.Date()
exdate2 = gen.lib.Date()
exdate1.set(gen.lib.Date.QUAL_NONE, gen.lib.Date.MOD_RANGE,
@ -133,7 +135,7 @@ class PersonSidebarFilter(SidebarFilter):
self.add_text_entry(_('Note'), self.filter_note)
self.add_entry(_('Tag'), self.tag)
self.add_filter_entry(_('Custom filter'), self.generic)
self.add_entry(None, self.filter_regex)
self.add_regex_entry(self.filter_regex)
def clear(self, obj):
self.filter_name.set_text(u'')

View File

@ -41,7 +41,7 @@ import gtk
# GRAMPS modules
#
#-------------------------------------------------------------------------
from gui import widgets
from Filters.SideBar import SidebarFilter
from Filters import GenericFilterFactory, build_filter_model, Rules
from Filters.Rules.Place import (RegExpIdOf, HasIdOf, HasPlace, HasNoteRegexp,
@ -58,17 +58,18 @@ class PlaceSidebarFilter(SidebarFilter):
def __init__(self, dbstate, uistate, clicked):
self.clicked_func = clicked
self.filter_id = gtk.Entry()
self.filter_title = gtk.Entry()
self.filter_street = gtk.Entry()
self.filter_locality = gtk.Entry()
self.filter_city = gtk.Entry()
self.filter_county = gtk.Entry()
self.filter_state = gtk.Entry()
self.filter_country = gtk.Entry()
self.filter_zip = gtk.Entry()
self.filter_parish = gtk.Entry()
self.filter_note = gtk.Entry()
self.filter_id = widgets.BasicEntry()
self.filter_title = widgets.BasicEntry()
self.filter_street = widgets.BasicEntry()
self.filter_locality = widgets.BasicEntry()
self.filter_city = widgets.BasicEntry()
self.filter_county = widgets.BasicEntry()
self.filter_state = widgets.BasicEntry()
self.filter_country = widgets.BasicEntry()
self.filter_zip = widgets.BasicEntry()
self.filter_parish = widgets.BasicEntry()
self.filter_note = widgets.BasicEntry()
self.filter_regex = gtk.CheckButton(_('Use regular expressions'))
self.generic = gtk.ComboBox()
@ -94,7 +95,7 @@ class PlaceSidebarFilter(SidebarFilter):
self.add_text_entry(_('Church parish'), self.filter_parish)
self.add_text_entry(_('Note'), self.filter_note)
self.add_filter_entry(_('Custom filter'), self.generic)
self.add_entry(None, self.filter_regex)
self.add_regex_entry(self.filter_regex)
def clear(self, obj):
self.filter_id.set_text('')

View File

@ -58,10 +58,10 @@ class RepoSidebarFilter(SidebarFilter):
def __init__(self, dbstate, uistate, clicked):
self.clicked_func = clicked
self.filter_id = gtk.Entry()
self.filter_title = gtk.Entry()
self.filter_address = gtk.Entry()
self.filter_url = gtk.Entry()
self.filter_id = widgets.BasicEntry()
self.filter_title = widgets.BasicEntry()
self.filter_address = widgets.BasicEntry()
self.filter_url = widgets.BasicEntry()
self.repo = Repository()
self.repo.set_type((RepositoryType.CUSTOM,''))
@ -71,7 +71,7 @@ class RepoSidebarFilter(SidebarFilter):
self.repo.set_type,
self.repo.get_type)
self.filter_note = gtk.Entry()
self.filter_note = widgets.BasicEntry()
self.filter_regex = gtk.CheckButton(_('Use regular expressions'))
@ -87,6 +87,8 @@ class RepoSidebarFilter(SidebarFilter):
self.generic.add_attribute(cell, 'text', 0)
self.on_filters_changed('Repository')
self.rtype.child.set_width_chars(5)
self.add_text_entry(_('ID'), self.filter_id)
self.add_text_entry(_('Name'), self.filter_title)
self.add_entry(_('Type'), self.rtype)
@ -94,7 +96,7 @@ class RepoSidebarFilter(SidebarFilter):
self.add_text_entry(_('URL'), self.filter_url)
self.add_text_entry(_('Note'), self.filter_note)
self.add_filter_entry(_('Custom filter'), self.generic)
self.add_entry(None, self.filter_regex)
self.add_regex_entry(self.filter_regex)
def clear(self, obj):
self.filter_id.set_text('')

View File

@ -34,7 +34,7 @@ _RETURN = gtk.gdk.keyval_from_name("Return")
_KP_ENTER = gtk.gdk.keyval_from_name("KP_Enter")
class SidebarFilter(DbGUIElement):
_FILTER_WIDTH = 200
_FILTER_WIDTH = 20
_FILTER_ELLIPSIZE = pango.ELLIPSIZE_END
def __init__(self, dbstate, uistate, namespace):
@ -47,7 +47,9 @@ class SidebarFilter(DbGUIElement):
DbGUIElement.__init__(self, dbstate.db)
self.position = 1
self.vbox = gtk.VBox()
self.table = gtk.Table(4, 11)
self.vbox.pack_start(self.table, False, False)
self.table.set_border_width(6)
self.table.set_row_spacings(6)
self.table.set_col_spacing(0, 6)
@ -83,16 +85,18 @@ class SidebarFilter(DbGUIElement):
self.clear_btn.add(hbox)
self.clear_btn.connect('clicked', self.clear)
hbox = gtk.HBox()
hbox = gtk.HButtonBox()
hbox.set_layout(gtk.BUTTONBOX_START)
hbox.set_spacing(6)
hbox.set_border_width(12)
hbox.add(self.apply_btn)
hbox.add(self.clear_btn)
hbox.show()
self.table.attach(hbox, 2, 4, self.position, self.position+1,
xoptions=gtk.FILL, yoptions=0)
self.vbox.pack_start(hbox, False, False)
self.vbox.show()
def get_widget(self):
return self.table
return self.vbox
def create_widget(self):
pass
@ -111,6 +115,11 @@ class SidebarFilter(DbGUIElement):
def get_filter(self):
pass
def add_regex_entry(self, widget):
hbox = gtk.HBox()
hbox.pack_start(widget, False, False, 12)
self.vbox.pack_start(hbox, False, False)
def add_text_entry(self, name, widget, tooltip=None):
self.add_entry(name, widget)
widget.connect('key-press-event', self.key_press)
@ -129,7 +138,7 @@ class SidebarFilter(DbGUIElement):
1, 2, self.position, self.position+1,
xoptions=gtk.FILL, yoptions=0)
self.table.attach(widget, 2, 4, self.position, self.position+1,
xoptions=gtk.FILL, yoptions=0)
xoptions=gtk.FILL|gtk.EXPAND, yoptions=0)
self.position += 1
def on_filters_changed(self, namespace):
@ -208,8 +217,8 @@ class SidebarFilter(DbGUIElement):
Adds the text and widget to GUI, with an Edit button.
"""
hbox = gtk.HBox()
hbox.pack_start(widget)
hbox.pack_start(widgets.SimpleButton(gtk.STOCK_EDIT, self.edit_filter))
hbox.pack_start(widget, True, True)
hbox.pack_start(widgets.SimpleButton(gtk.STOCK_EDIT, self.edit_filter), False, False)
self.add_entry(text, hbox)
def edit_filter(self, obj):

View File

@ -39,6 +39,7 @@ import gtk
# GRAMPS modules
#
#-------------------------------------------------------------------------
from gui import widgets
from Filters.SideBar import SidebarFilter
from Filters import GenericFilterFactory, build_filter_model, Rules
from Filters.Rules.Source import (RegExpIdOf, HasIdOf, HasSource,
@ -55,11 +56,11 @@ class SourceSidebarFilter(SidebarFilter):
def __init__(self, dbstate, uistate, clicked):
self.clicked_func = clicked
self.filter_id = gtk.Entry()
self.filter_title = gtk.Entry()
self.filter_author = gtk.Entry()
self.filter_pub = gtk.Entry()
self.filter_note = gtk.Entry()
self.filter_id = widgets.BasicEntry()
self.filter_title = widgets.BasicEntry()
self.filter_author = widgets.BasicEntry()
self.filter_pub = widgets.BasicEntry()
self.filter_note = widgets.BasicEntry()
self.filter_regex = gtk.CheckButton(_('Use regular expressions'))
@ -81,7 +82,7 @@ class SourceSidebarFilter(SidebarFilter):
self.add_text_entry(_('Publication'), self.filter_pub)
self.add_text_entry(_('Note'), self.filter_note)
self.add_filter_entry(_('Custom filter'), self.generic)
self.add_entry(None, self.filter_regex)
self.add_regex_entry(self.filter_regex)
def clear(self, obj):
self.filter_id.set_text('')

View File

@ -314,7 +314,11 @@ class GrampsBar(gtk.Notebook):
"""
Add a tab to the notebook for the given gramplet.
"""
gramplet.set_size_request(gramplet.width, gramplet.height)
if self.uistate.netbook_mode():
gramplet.set_size_request(225, 120)
else:
gramplet.set_size_request(285, 200)
page_num = self.append_page(gramplet)
return page_num

View File

@ -7,6 +7,7 @@ pkgdatadir = $(datadir)/@PACKAGE@/gui/widgets
pkgdata_PYTHON = \
__init__.py \
basicentry.py \
buttons.py \
expandcollapsearrow.py \
grampletpane.py \

View File

@ -23,6 +23,7 @@
"""Custom widgets."""
from basicentry import *
from buttons import *
from expandcollapsearrow import *
from labels import *

View File

@ -0,0 +1,50 @@
#
# 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$
__all__ = ["BasicEntry"]
#-------------------------------------------------------------------------
#
# Standard python modules
#
#-------------------------------------------------------------------------
import logging
_LOG = logging.getLogger(".widgets.basicentry")
#-------------------------------------------------------------------------
#
# GTK/Gnome modules
#
#-------------------------------------------------------------------------
import gtk
#-------------------------------------------------------------------------
#
# BasicEntry class
#
#-------------------------------------------------------------------------
class BasicEntry(gtk.Entry):
def __init__(self):
gtk.Entry.__init__(self)
self.set_width_chars(5)
self.show()

View File

@ -44,7 +44,7 @@ class Photo(gtk.EventBox):
"""
Displays an image and allows it to be viewed in an external image viewer.
"""
def __init__(self):
def __init__(self, netbook_mode=False):
gtk.EventBox.__init__(self)
self.full_path = None
self.photo = gtk.Image()
@ -53,6 +53,9 @@ class Photo(gtk.EventBox):
tip = _('Double-click on the picture to view it in the default image '
'viewer application.')
self.set_tooltip_text(tip)
self.__size = ThumbNails.SIZE_LARGE
if netbook_mode:
self.__size = ThumbNails.SIZE_NORMAL
def set_image(self, full_path, mime_type=None, rectangle=None):
"""
@ -63,7 +66,7 @@ class Photo(gtk.EventBox):
pixbuf = ThumbNails.get_thumbnail_image(full_path,
mime_type,
rectangle,
ThumbNails.SIZE_LARGE)
self.__size)
self.photo.set_from_pixbuf(pixbuf)
self.photo.show()
else:

View File

@ -39,6 +39,8 @@ class CalendarGramplet(Gramplet):
self.set_tooltip(_("Double-click a day for details"))
self.gui.calendar = gtk.Calendar()
self.gui.calendar.connect('day-selected-double-click', self.double_click)
if self.uistate.netbook_mode():
self.gui.calendar.set_display_options(gtk.CALENDAR_SHOW_HEADING)
self.gui.get_container_widget().remove(self.gui.textview)
self.gui.get_container_widget().add_with_viewport(self.gui.calendar)
self.gui.calendar.show()

View File

@ -61,7 +61,7 @@ class Gallery(Gramplet):
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"):
photo = Photo()
photo = Photo(self.uistate.netbook_mode())
photo.set_image(full_path, mime_type, media_ref.get_rectangle())
self.image_list.append(photo)
self.top.pack_start(photo, expand=False, fill=False)

View File

@ -38,7 +38,7 @@ class MediaPreview(Gramplet):
Build the GUI interface.
"""
self.top = gtk.HBox()
self.photo = Photo()
self.photo = Photo(self.uistate.netbook_mode())
self.top.pack_start(self.photo, fill=True, expand=False, padding=5)
self.top.show_all()
return self.top

View File

@ -45,7 +45,7 @@ class PersonDetails(Gramplet):
"""
self.top = gtk.HBox()
vbox = gtk.VBox()
self.photo = Photo()
self.photo = Photo(self.uistate.netbook_mode())
self.photo.show()
self.name = gtk.Label()
self.name.set_alignment(0, 0)

View File

@ -42,7 +42,7 @@ class PlaceDetails(Gramplet):
"""
self.top = gtk.HBox()
vbox = gtk.VBox()
self.photo = Photo()
self.photo = Photo(self.uistate.netbook_mode())
self.title = gtk.Label()
self.title.set_alignment(0, 0)
self.title.modify_font(pango.FontDescription('sans bold 12'))