From 028f9582f58ca0c8e38986829e0bceab1b3135f5 Mon Sep 17 00:00:00 2001 From: vantu5z Date: Sun, 14 Jan 2018 16:00:02 +0900 Subject: [PATCH] Add color schemes to config --- gramps/gen/config.py | 35 ++++++----- gramps/gui/configure.py | 127 ++++++++++++++++++++++++++++------------ gramps/gui/utils.py | 42 +++++++++---- 3 files changed, 139 insertions(+), 65 deletions(-) diff --git a/gramps/gen/config.py b/gramps/gen/config.py index 7cbde8ea3..fa9196739 100644 --- a/gramps/gen/config.py +++ b/gramps/gen/config.py @@ -272,22 +272,25 @@ register('preferences.last-view', '') register('preferences.last-views', []) register('preferences.family-relation-type', 3) # UNKNOWN register('preferences.age-display-precision', 1) -register('preferences.color-gender-male-alive', '#b8cee6') -register('preferences.color-gender-male-death', '#b8cee6') -register('preferences.color-gender-female-alive', '#feccf0') -register('preferences.color-gender-female-death', '#feccf0') -register('preferences.color-gender-unknown-alive', '#f3dbb6') -register('preferences.color-gender-unknown-death', '#f3dbb6') -#register('preferences.color-gender-other-alive', '#fcaf3e') -#register('preferences.color-gender-other-death', '#fcaf3e') -register('preferences.bordercolor-gender-male-alive', '#1f4986') -register('preferences.bordercolor-gender-male-death', '#000000') -register('preferences.bordercolor-gender-female-alive', '#861f69') -register('preferences.bordercolor-gender-female-death', '#000000') -register('preferences.bordercolor-gender-unknown-alive', '#8e5801') -register('preferences.bordercolor-gender-unknown-death', '#000000') -#register('preferences.bordercolor-gender-other-alive', '#f57900') -#register('preferences.bordercolor-gender-other-death', '#000000') + +register('colors.scheme', 0) +register('colors.male-alive', ['#b8cee6', '#1f344a']) +register('colors.male-dead', ['#b8cee6', '#2d3039']) +register('colors.female-alive', ['#feccf0', '#62242D']) +register('colors.female-dead', ['#feccf0', '#3a292b']) +register('colors.unknown-alive', ['#f3dbb6', '#75507B']) +register('colors.unknown-dead', ['#f3dbb6', '#35103b']) +register('colors.family', ['#eeeeee', '#454545']) +register('colors.family-divorced', ['#ffdede', '#5c3636']) +register('colors.home-person', ['#bbe68a', '#304918']) +register('colors.border-male-alive', ['#1f4986', '#171d26']) +register('colors.border-male-dead', ['#000000', '#000000']) +register('colors.border-female-alive', ['#861f69', '#261111']) +register('colors.border-female-dead', ['#000000', '#000000']) +register('colors.border-unknown-alive', ['#8e5801', '#8e5801']) +register('colors.border-unknown-dead', ['#000000', '#000000']) +register('colors.border-family', ['#cccccc', '#252525']) +register('colors.border-family-divorced', ['#ff7373', '#720b0b']) register('researcher.researcher-addr', '') register('researcher.researcher-locality', '') diff --git a/gramps/gui/configure.py b/gramps/gui/configure.py index d8e7d3ab6..3e301ef28 100644 --- a/gramps/gui/configure.py +++ b/gramps/gui/configure.py @@ -249,13 +249,23 @@ class ConfigureDialog(ManagedWindow): """ self.__config.set(constant, obj.get_text()) - def update_color(self, obj, constant, color_hex_label): + def update_color(self, obj, pspec, constant, color_hex_label): + """ + Called on changing some color. + Either on programmatically color change. + """ rgba = obj.get_rgba() hexval = "#%02x%02x%02x" % (int(rgba.red * 255), int(rgba.green * 255), int(rgba.blue * 255)) color_hex_label.set_text(hexval) - self.__config.set(constant, hexval) + colors = self.__config.get(constant) + if isinstance(colors, list): + scheme = self.__config.get('colors.scheme') + colors[scheme] = hexval + self.__config.set(constant, colors) + else: + self.__config.set(constant, hexval) def update_checkbox(self, obj, constant, config=None): if not config: @@ -383,15 +393,24 @@ class ConfigureDialog(ManagedWindow): grid.attach(entry, col_attach+1, index, 1, 1) def add_color(self, grid, label, index, constant, config=None, col=0): + """ + Add color chooser widget with label to the grid. + """ if not config: config = self.__config lwidget = BasicLabel(_("%s: ") % label) # needed for French, else ignore - hexval = config.get(constant) + colors = config.get(constant) + if isinstance(colors, list): + scheme = config.get('colors.scheme') + hexval = colors[scheme] + else: + hexval = colors color = Gdk.color_parse(hexval) entry = Gtk.ColorButton(color=color) color_hex_label = BasicLabel(hexval) color_hex_label.set_hexpand(True) - entry.connect('color-set', self.update_color, constant, color_hex_label) + entry.connect('notify::color', self.update_color, constant, + color_hex_label) grid.attach(lwidget, col, index, 1, 1) grid.attach(entry, col+1, index, 1, 1) grid.attach(color_hex_label, col+2, index, 1, 1) @@ -554,7 +573,7 @@ class GrampsPreferences(ConfigureDialog): def add_color_panel(self, configdialog): """ - Add the tab to set defaults colors for graph boxes + Add the tab to set defaults colors for graph boxes. """ grid = Gtk.Grid() grid.set_border_width(12) @@ -562,40 +581,62 @@ class GrampsPreferences(ConfigureDialog): grid.set_row_spacing(6) self.add_text(grid, _('Set the colors used for boxes in the graphical views'), 0, line_wrap=False) - self.add_color(grid, _('Gender Male Alive'), 1, - 'preferences.color-gender-male-alive') - self.add_color(grid, _('Border Male Alive'), 2, - 'preferences.bordercolor-gender-male-alive') - self.add_color(grid, _('Gender Male Death'), 3, - 'preferences.color-gender-male-death') - self.add_color(grid, _('Border Male Death'), 4, - 'preferences.bordercolor-gender-male-death') - self.add_color(grid, _('Gender Female Alive'), 1, - 'preferences.color-gender-female-alive', col=4) - self.add_color(grid, _('Border Female Alive'), 2, - 'preferences.bordercolor-gender-female-alive', col=4) - self.add_color(grid, _('Gender Female Death'), 3, - 'preferences.color-gender-female-death', col=4) - self.add_color(grid, _('Border Female Death'), 4, - 'preferences.bordercolor-gender-female-death', col=4) -## self.add_color(grid, _('Gender Other Alive'), 5, -## 'preferences.color-gender-other-alive') -## self.add_color(grid, _('Border Other Alive'), 6, -## 'preferences.bordercolor-gender-other-alive') -## self.add_color(grid, _('Gender Other Death'), 7, -## 'preferences.color-gender-other-death') -## self.add_color(grid, _('Border Other Death'), 8, -## 'preferences.bordercolor-gender-other-death') - self.add_color(grid, _('Gender Unknown Alive'), 5, - 'preferences.color-gender-unknown-alive', col=4) - self.add_color(grid, _('Border Unknown Alive'), 6, - 'preferences.bordercolor-gender-unknown-alive', col=4) - self.add_color(grid, _('Gender Unknown Death'), 7, - 'preferences.color-gender-unknown-death', col=4) - self.add_color(grid, _('Border Unknown Death'), 8, - 'preferences.bordercolor-gender-unknown-death', col=4) + + hbox = Gtk.Box(spacing=12) + self.color_scheme_box = Gtk.ComboBoxText() + formats = [_("Light colors"), + _("Dark colors"),] + list(map(self.color_scheme_box.append_text, formats)) + scheme = config.get('colors.scheme') + self.color_scheme_box.set_active(scheme) + self.color_scheme_box.connect('changed', self.color_scheme_changed) + lwidget = BasicLabel(_("%s: ") % _('Color scheme')) + hbox.pack_start(lwidget, False, False, 0) + hbox.pack_start(self.color_scheme_box, False, False, 0) + + restore_btn = Gtk.Button(_('Restore to defaults')) + restore_btn.connect('clicked', self.restore_colors) + hbox.pack_start(restore_btn, False, False, 0) + grid.attach(hbox, 1, 1, 6, 1) + + color_list = [ + (_('Male Alive'), 'male-alive', 2, 0), + (_('Male Dead'), 'male-dead', 4, 0), + (_('Female Alive'), 'female-alive', 2, 4), + (_('Female Dead'), 'female-dead', 4, 4), + (_('Unknown Alive'), 'unknown-alive', 6, 4), + (_('Unknown Dead'), 'unknown-dead', 8, 4), + (_('Family Node'), 'family', 7, 0), + (_('Family Divorced'), 'family-divorced', 9, 0), + (_('Home Person'), 'home-person', 6, 0), + (_('Border Male Alive'), 'border-male-alive', 3, 0), + (_('Border Male Dead'), 'border-male-dead', 5, 0), + (_('Border Female Alive'), 'border-female-alive', 3, 4), + (_('Border Female Dead'), 'border-female-dead', 5, 4), + (_('Border Unknown Alive'), 'border-unknown-alive', 7, 4), + (_('Border Unknown Dead'), 'border-unknown-dead', 9, 4), + (_('Border Family'), 'border-family', 8, 0), + (_('Border Family Divorced'), 'border-family-divorced', 10, 0), + ] + + self.colors = {} + for color in color_list: + pref_name = 'colors.' + color[1] + self.colors[pref_name] = self.add_color(grid, color[0], color[2], + pref_name, col=color[3]) return _('Colors'), grid + def restore_colors(self, widget=None): + """ + Restore colors of selected scheme to default. + """ + scheme = config.get('colors.scheme') + for key, widget in self.colors.items(): + color = Gdk.RGBA() + hexval = config.get_default(key)[scheme] + Gdk.RGBA.parse(color, hexval) + widget.set_rgba(color) + def add_advanced_panel(self, configdialog): grid = Gtk.Grid() grid.set_border_width(12) @@ -1205,6 +1246,18 @@ class GrampsPreferences(ConfigureDialog): self.old_format = the_list.get_value(the_iter, COL_FMT) win = DisplayNameEditor(self.uistate, self.dbstate, self.track, self) + def color_scheme_changed(self, obj): + """ + Called on swiching color scheme. + """ + scheme = obj.get_active() + config.set('colors.scheme', scheme) + for key, widget in self.colors.items(): + color = Gdk.RGBA() + hexval = config.get(key)[scheme] + Gdk.RGBA.parse(color, hexval) + widget.set_rgba(color) + def check_for_type_changed(self, obj): active = obj.get_active() if active == 0: # update diff --git a/gramps/gui/utils.py b/gramps/gui/utils.py index baa3b8d8a..4a504a096 100644 --- a/gramps/gui/utils.py +++ b/gramps/gui/utils.py @@ -53,6 +53,7 @@ from gi.repository import Gdk #------------------------------------------------------------------------- from gramps.gen.const import GRAMPS_LOCALE as glocale _ = glocale.translation.gettext +from gramps.gen.lib import EventType, EventRoleType from gramps.gen.lib.person import Person from gramps.gen.constfunc import has_display, is_quartz, mac, win from gramps.gen.config import config @@ -474,33 +475,50 @@ def is_right_click(event): if Gdk.Event.triggers_context_menu(event): return True +def color_graph_family(family, dbstate): + """ + :return: based on the config the color for graph family node in hex + :rtype: tuple (hex color fill, hex color border) + """ + scheme = config.get('colors.scheme') + for event_ref in family.get_event_ref_list(): + event = dbstate.db.get_event_from_handle(event_ref.ref) + if (event.type == EventType.DIVORCE and + event_ref.get_role() in (EventRoleType.FAMILY, + EventRoleType.PRIMARY)): + return (config.get('colors.family-divorced')[scheme], + config.get('colors.border-family-divorced')[scheme]) + return (config.get('colors.family')[scheme], + config.get('colors.border-family')[scheme]) + def color_graph_box(alive=False, gender=Person.MALE): """ :return: based on the config the color for graph boxes in hex If gender is None, an empty box is assumed :rtype: tuple (hex color fill, hex color border) """ + scheme = config.get('colors.scheme') if gender == Person.MALE: if alive: - return (config.get('preferences.color-gender-male-alive'), - config.get('preferences.bordercolor-gender-male-alive')) + return (config.get('colors.male-alive')[scheme], + config.get('colors.border-male-alive')[scheme]) else: - return (config.get('preferences.color-gender-male-death'), - config.get('preferences.bordercolor-gender-male-death')) + return (config.get('colors.male-dead')[scheme], + config.get('colors.border-male-dead')[scheme]) elif gender == Person.FEMALE: if alive: - return (config.get('preferences.color-gender-female-alive'), - config.get('preferences.bordercolor-gender-female-alive')) + return (config.get('colors.female-alive')[scheme], + config.get('colors.border-female-alive')[scheme]) else: - return (config.get('preferences.color-gender-female-death'), - config.get('preferences.bordercolor-gender-female-death')) + return (config.get('colors.female-dead')[scheme], + config.get('colors.border-female-dead')[scheme]) elif gender == Person.UNKNOWN: if alive: - return (config.get('preferences.color-gender-unknown-alive'), - config.get('preferences.bordercolor-gender-unknown-alive')) + return (config.get('colors.unknown-alive')[scheme], + config.get('colors.border-unknown-alive')[scheme]) else: - return (config.get('preferences.color-gender-unknown-death'), - config.get('preferences.bordercolor-gender-unknown-death')) + return (config.get('colors.unknown-dead')[scheme], + config.get('colors.border-unknown-dead')[scheme]) #empty box, no gender return ('#d2d6ce', '#000000') ## print 'male alive', rgb_to_hex((185/256.0, 207/256.0, 231/256.0))