6333: Display optional close button in gramplet bar tabs

svn: r21140
This commit is contained in:
Nick Hall 2013-01-16 23:59:48 +00:00
parent a323f92482
commit 7bb5c75d6a
5 changed files with 138 additions and 53 deletions

View File

@ -209,6 +209,7 @@ register('interface.filter', False)
register('interface.filter-editor-width', 400) register('interface.filter-editor-width', 400)
register('interface.filter-editor-height', 350) register('interface.filter-editor-height', 350)
register('interface.fullscreen', False) register('interface.fullscreen', False)
register('interface.grampletbar-close', False)
register('interface.height', 500) register('interface.height', 500)
register('interface.lds-height', 450) register('interface.lds-height', 450)
register('interface.lds-width', 600) register('interface.lds-width', 600)

View File

@ -893,6 +893,12 @@ class GrampsPreferences(ConfigureDialog):
self.dbstate.db.name_formats = _nd.get_name_format(only_custom=True, self.dbstate.db.name_formats = _nd.get_name_format(only_custom=True,
only_active=False) only_active=False)
def cb_grampletbar_close(self, obj):
"""
Gramplet bar close button preference callback
"""
self.uistate.emit('grampletbar-close-changed')
def add_formats_panel(self, configdialog): def add_formats_panel(self, configdialog):
row = 0 row = 0
table = Gtk.Table(4, 4) table = Gtk.Table(4, 4)
@ -1058,6 +1064,13 @@ class GrampsPreferences(ConfigureDialog):
_("Show text in sidebar buttons (requires restart)"), _("Show text in sidebar buttons (requires restart)"),
row, 'interface.sidebar-text', stop=3) row, 'interface.sidebar-text', stop=3)
row += 1 row += 1
# Gramplet bar close buttons:
self.add_checkbox(table,
_("Show close button in gramplet bar tabs"),
row, 'interface.grampletbar-close', stop=3,
extra_callback=self.cb_grampletbar_close)
row += 1
return _('Display'), table return _('Display'), table
def add_text_panel(self, configdialog): def add_text_panel(self, configdialog):

View File

@ -369,6 +369,7 @@ class DisplayState(Callback):
'filters-changed' : (str, ), 'filters-changed' : (str, ),
'filter-name-changed' : (str, UNITYPE, UNITYPE), 'filter-name-changed' : (str, UNITYPE, UNITYPE),
'nameformat-changed' : None, 'nameformat-changed' : None,
'grampletbar-close-changed' : None,
} }
#nav_type to message #nav_type to message

View File

@ -54,6 +54,7 @@ from gi.repository import Gtk
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from gramps.gen.const import URL_MANUAL_PAGE, VERSION_DIR from gramps.gen.const import URL_MANUAL_PAGE, VERSION_DIR
from gramps.gen.config import config
from ..managedwindow import ManagedWindow from ..managedwindow import ManagedWindow
from ..display import display_help, display_url from ..display import display_help, display_url
from .grampletpane import (AVAILABLE_GRAMPLETS, from .grampletpane import (AVAILABLE_GRAMPLETS,
@ -94,15 +95,28 @@ class GrampletBar(Gtk.Notebook):
self.defaults = defaults self.defaults = defaults
self.detached_gramplets = [] self.detached_gramplets = []
self.empty = False self.empty = False
self.close_buttons = []
self.set_group_name("grampletbar") self.set_group_name("grampletbar")
self.set_show_border(False) self.set_show_border(False)
self.set_scrollable(True) self.set_scrollable(True)
book_button = Gtk.Button()
box = Gtk.VBox() # Arrow is too small unless in a Vbox
arrow = Gtk.Arrow(Gtk.ArrowType.DOWN, Gtk.ShadowType.NONE)
arrow.show()
box.add(arrow)
box.show()
book_button.add(box)
book_button.set_relief(Gtk.ReliefStyle.NONE)
book_button.connect('clicked', self.__button_clicked)
book_button.show()
self.set_action_widget(book_button, Gtk.PackType.END)
self.connect('switch-page', self.__switch_page) self.connect('switch-page', self.__switch_page)
self.connect('page-added', self.__page_added) self.connect('page-added', self.__page_added)
self.connect('page-removed', self.__page_removed) self.connect('page-removed', self.__page_removed)
self.connect('create-window', self.__create_window) self.connect('create-window', self.__create_window)
self.connect('button-press-event', self.__button_press)
config_settings, opts_list = self.__load(defaults) config_settings, opts_list = self.__load(defaults)
@ -123,6 +137,8 @@ class GrampletBar(Gtk.Notebook):
self.show() self.show()
self.set_current_page(config_settings[1]) self.set_current_page(config_settings[1])
uistate.connect('grampletbar-close-changed', self.cb_close_changed)
def __load(self, defaults): def __load(self, defaults):
""" """
Load the gramplets from the configuration file. Load the gramplets from the configuration file.
@ -333,21 +349,29 @@ class GrampletBar(Gtk.Notebook):
def __create_tab_label(self, gramplet): def __create_tab_label(self, gramplet):
""" """
Create a tab label. Create a tab label consisting of a label and a close button.
""" """
label = Gtk.Label() tablabel = TabLabel(gramplet, self.__delete_clicked)
if hasattr(gramplet.pui, "has_data"): if hasattr(gramplet.pui, "has_data"):
if gramplet.pui.has_data: tablabel.set_has_data(gramplet.pui.has_data)
label.set_text("<b>%s</b>" % gramplet.title)
else:
label.set_text(gramplet.title)
else: # just a function; always show yes it has data else: # just a function; always show yes it has data
label.set_text("<b>%s</b>" % gramplet.title) tablabel.set_has_data(True)
label.set_use_markup(True) if config.get('interface.grampletbar-close'):
label.set_tooltip_text(gramplet.tname) tablabel.use_close(True)
label.show_all() else:
return label tablabel.use_close(False)
return tablabel
def cb_close_changed(self):
"""
Close button preference changed.
"""
for gramplet in self.get_children():
tablabel = self.get_tab_label(gramplet)
tablabel.use_close(config.get('interface.grampletbar-close'))
def __delete_clicked(self, button, gramplet): def __delete_clicked(self, button, gramplet):
""" """
@ -421,47 +445,39 @@ class GrampletBar(Gtk.Notebook):
gramplet.detached_window.close() gramplet.detached_window.close()
gramplet.detached_window = None gramplet.detached_window = None
def __button_press(self, widget, event): def __button_clicked(self, button):
""" """
Called when a button is pressed in the tabs section of the GrampletBar. Called when the drop-down button is clicked.
""" """
if is_right_click(event): menu = Gtk.Menu()
menu = Gtk.Menu()
ag_menu = Gtk.MenuItem(label=_('Add a gramplet')) ag_menu = Gtk.MenuItem(label=_('Add a gramplet'))
nav_type = self.pageview.navigation_type() nav_type = self.pageview.navigation_type()
skip = self.all_gramplets() skip = self.all_gramplets()
gramplet_list = GET_GRAMPLET_LIST(nav_type, skip) gramplet_list = GET_GRAMPLET_LIST(nav_type, skip)
gramplet_list.sort()
self.__create_submenu(ag_menu, gramplet_list, self.__add_clicked)
ag_menu.show()
menu.append(ag_menu)
if not (self.empty or config.get('interface.grampletbar-close')):
rg_menu = Gtk.MenuItem(label=_('Remove a gramplet'))
gramplet_list = [(gramplet.title, gramplet.gname)
for gramplet in self.get_children() +
self.detached_gramplets]
gramplet_list.sort() gramplet_list.sort()
self.__create_submenu(ag_menu, gramplet_list, self.__add_clicked) self.__create_submenu(rg_menu, gramplet_list,
ag_menu.show() self.__remove_clicked)
menu.append(ag_menu) rg_menu.show()
menu.append(rg_menu)
if not self.empty: rd_menu = Gtk.MenuItem(label=_('Restore default gramplets'))
rg_menu = Gtk.MenuItem(label=_('Remove a gramplet')) rd_menu.connect("activate", self.__restore_clicked)
gramplet_list = [(gramplet.title, gramplet.gname) rd_menu.show()
for gramplet in self.get_children() + menu.append(rd_menu)
self.detached_gramplets]
gramplet_list.sort()
self.__create_submenu(rg_menu, gramplet_list,
self.__remove_clicked)
rg_menu.show()
menu.append(rg_menu)
rd_menu = Gtk.MenuItem(label=_('Restore default gramplets')) menu.show_all()
rd_menu.connect("activate", self.__restore_clicked) menu.popup(None, None, cb_menu_position, button, 0, 0)
rd_menu.show()
menu.append(rd_menu)
menu.show_all()
#GTK3 does not show the popup, workaround: pass position function
menu.popup(None, None,
lambda menu, data: (event.get_root_coords()[0],
event.get_root_coords()[1], True),
None, event.button, event.time)
return True
return False
def __create_submenu(self, main_menu, gramplet_list, callback_func): def __create_submenu(self, main_menu, gramplet_list, callback_func):
""" """
@ -651,3 +667,61 @@ class DetachedWindow(ManagedWindow):
self.gramplet.detached_window = None self.gramplet.detached_window = None
self.gramplet.reparent(self.grampletbar) self.gramplet.reparent(self.grampletbar)
ManagedWindow.close(self, *args) ManagedWindow.close(self, *args)
#-------------------------------------------------------------------------
#
# TabLabel class
#
#-------------------------------------------------------------------------
class TabLabel(Gtk.HBox):
"""
Create a tab label consisting of a label and a close button.
"""
def __init__(self, gramplet, callback):
Gtk.HBox.__init__(self)
self.text = gramplet.title
self.set_spacing(4)
self.label = Gtk.Label()
self.label.set_tooltip_text(gramplet.tname)
self.label.show()
self.closebtn = Gtk.Button()
image = Gtk.Image()
image.set_from_stock(Gtk.STOCK_CLOSE, Gtk.IconSize.MENU)
self.closebtn.connect("clicked", callback, gramplet)
self.closebtn.set_image(image)
self.closebtn.set_relief(Gtk.ReliefStyle.NONE)
self.pack_start(self.label, True, True, 0)
self.pack_end(self.closebtn, False, False, 0)
def set_has_data(self, has_data):
"""
Set the label to indicate if the gramplet has data.
"""
if has_data:
self.label.set_text("<b>%s</b>" % self.text)
self.label.set_use_markup(True)
else:
self.label.set_text(self.text)
def use_close(self, use_close):
"""
Display the cose button according to user preference.
"""
if use_close:
self.closebtn.show()
else:
self.closebtn.hide()
def cb_menu_position(menu, button):
"""
Determine the position of the popup menu.
"""
ret_val, x_pos, y_pos = button.get_window().get_origin()
x_pos += button.get_allocation().x
y_pos += button.get_allocation().y + button.get_allocation().height
return (x_pos, y_pos, False)

View File

@ -716,11 +716,7 @@ class GuiGramplet(object):
if isinstance(self.pane, Gtk.Notebook): if isinstance(self.pane, Gtk.Notebook):
if self.pane.get_tab_label(self): if self.pane.get_tab_label(self):
label = self.pane.get_tab_label(self) label = self.pane.get_tab_label(self)
if value: label.set_has_data(value)
label.set_text("<b>%s</b>" % self.title)
label.set_use_markup(True)
else:
label.set_text(self.title)
class GridGramplet(GuiGramplet): class GridGramplet(GuiGramplet):
""" """