121
121
122
122
#-------------------------------------------------------------------------
123
123
#
124
- # Search widget module
124
+ # GraphView modules
125
125
#
126
126
#-------------------------------------------------------------------------
127
127
import sys
128
128
sys .path .append (os .path .abspath (os .path .dirname (__file__ )))
129
129
from search_widget import SearchWidget , Popover , ListBoxRow , get_person_tooltip
130
+ from avatars import Avatars
130
131
131
132
132
133
#-------------------------------------------------------------------------
@@ -143,6 +144,9 @@ class GraphView(NavigationView):
143
144
CONFIGSETTINGS = (
144
145
('interface.graphview-show-images' , True ),
145
146
('interface.graphview-show-avatars' , True ),
147
+ ('interface.graphview-avatars-style' , 1 ),
148
+ ('interface.graphview-avatars-male' , '' ), # custom avatar
149
+ ('interface.graphview-avatars-female' , '' ), # custom avatar
146
150
('interface.graphview-show-full-dates' , False ),
147
151
('interface.graphview-show-places' , False ),
148
152
('interface.graphview-place-format' , 0 ),
@@ -191,6 +195,8 @@ def __init__(self, pdata, dbstate, uistate, nav_group=0):
191
195
192
196
# for disable animation options in config dialog
193
197
self .ani_widgets = []
198
+ # for disable custom avatar options in config dialog
199
+ self .avatar_widgets = []
194
200
195
201
self .additional_uis .append (self .additional_ui )
196
202
self .define_print_actions ()
@@ -397,6 +403,38 @@ def cb_update_show_avatars(self, _client, _cnxn_id, entry, _data):
397
403
self .show_avatars = entry == 'True'
398
404
self .graph_widget .populate (self .get_active ())
399
405
406
+ def cb_update_avatars_style (self , _client , _cnxn_id , entry , _data ):
407
+ """
408
+ Called when the configuration menu changes the avatars setting.
409
+ """
410
+ for widget in self .avatar_widgets :
411
+ widget .set_visible (entry == '0' )
412
+ self .graph_widget .populate (self .get_active ())
413
+
414
+ def cb_on_combo_show (self , combobox ):
415
+ """
416
+ Called when the configuration menu show combobox widget for avatars.
417
+ Used to hide custom avatars settings.
418
+ """
419
+ for widget in self .avatar_widgets :
420
+ widget .set_visible (combobox .get_active () == 0 )
421
+
422
+ def cb_male_avatar_set (self , file_chooser_button ):
423
+ """
424
+ Called when the configuration menu changes the male avatar.
425
+ """
426
+ self ._config .set ('interface.graphview-avatars-male' ,
427
+ file_chooser_button .get_filename ())
428
+ self .graph_widget .populate (self .get_active ())
429
+
430
+ def cb_female_avatar_set (self , file_chooser_button ):
431
+ """
432
+ Called when the configuration menu changes the female avatar.
433
+ """
434
+ self ._config .set ('interface.graphview-avatars-female' ,
435
+ file_chooser_button .get_filename ())
436
+ self .graph_widget .populate (self .get_active ())
437
+
400
438
def cb_update_show_full_dates (self , _client , _cnxn_id , entry , _data ):
401
439
"""
402
440
Called when the configuration menu changes the date setting.
@@ -550,6 +588,8 @@ def config_connect(self):
550
588
self .cb_update_show_images )
551
589
self ._config .connect ('interface.graphview-show-avatars' ,
552
590
self .cb_update_show_avatars )
591
+ self ._config .connect ('interface.graphview-avatars-style' ,
592
+ self .cb_update_avatars_style )
553
593
self ._config .connect ('interface.graphview-show-full-dates' ,
554
594
self .cb_update_show_full_dates )
555
595
self ._config .connect ('interface.graphview-show-places' ,
@@ -678,6 +718,47 @@ def theme_config_panel(self, configdialog):
678
718
font_btn .connect ('font-set' , self .config_change_font )
679
719
font_btn .set_filter_func (self .font_filter_func )
680
720
721
+ # Avatars options
722
+ # ===================================================================
723
+ row += 1
724
+ avatars = Avatars (self ._config )
725
+ combo = configdialog .add_combo (grid , _ ('Avatars style' ), row ,
726
+ 'interface.graphview-avatars-style' ,
727
+ avatars .get_styles_list ())
728
+ combo .connect ('show' , self .cb_on_combo_show )
729
+
730
+ file_filter = Gtk .FileFilter ()
731
+ file_filter .set_name (_ ('PNG files' ))
732
+ file_filter .add_pattern ("*.png" )
733
+
734
+ self .avatar_widgets .clear ()
735
+ row += 1
736
+ lbl = Gtk .Label (label = _ ('Male avatar:' ), halign = Gtk .Align .END )
737
+ FCB_male = Gtk .FileChooserButton .new (_ ('Choose male avatar' ),
738
+ Gtk .FileChooserAction .OPEN )
739
+ FCB_male .add_filter (file_filter )
740
+ FCB_male .set_filename (
741
+ self ._config .get ('interface.graphview-avatars-male' ))
742
+ FCB_male .connect ('file-set' , self .cb_male_avatar_set )
743
+ grid .attach (lbl , 1 , row , 1 , 1 )
744
+ grid .attach (FCB_male , 2 , row , 1 , 1 )
745
+ self .avatar_widgets .append (lbl )
746
+ self .avatar_widgets .append (FCB_male )
747
+
748
+ row += 1
749
+ lbl = Gtk .Label (label = _ ('Female avatar:' ), halign = Gtk .Align .END )
750
+ FCB_female = Gtk .FileChooserButton .new (_ ('Choose female avatar' ),
751
+ Gtk .FileChooserAction .OPEN )
752
+ FCB_female .connect ('file-set' , self .cb_female_avatar_set )
753
+ FCB_female .add_filter (file_filter )
754
+ FCB_female .set_filename (
755
+ self ._config .get ('interface.graphview-avatars-female' ))
756
+ grid .attach (lbl , 1 , row , 1 , 1 )
757
+ grid .attach (FCB_female , 2 , row , 1 , 1 )
758
+ self .avatar_widgets .append (lbl )
759
+ self .avatar_widgets .append (FCB_female )
760
+ # ===================================================================
761
+
681
762
return _ ('Themes' ), grid
682
763
683
764
def animation_config_panel (self , configdialog ):
@@ -2101,6 +2182,8 @@ def __init__(self, dbstate, view, bold_size=0, norm_size=0):
2101
2182
# font if we use genealogical symbols
2102
2183
self .sym_font = None
2103
2184
2185
+ self .avatars = Avatars (self .view ._config )
2186
+
2104
2187
def __del__ (self ):
2105
2188
"""
2106
2189
Free stream file on destroy.
@@ -2144,6 +2227,7 @@ def init_dot(self):
2144
2227
ranksep = ranksep * 0.1
2145
2228
nodesep = self .view ._config .get ('interface.graphview-nodesep' )
2146
2229
nodesep = nodesep * 0.1
2230
+ self .avatars .update_current_style ()
2147
2231
# get background color from gtk theme and convert it to hex
2148
2232
# else use white background
2149
2233
bg_color = self .context .lookup_color ('theme_bg_color' )
@@ -2757,16 +2841,6 @@ def get_person_themes(self, index=-1):
2757
2841
else :
2758
2842
return person_themes [0 ]
2759
2843
2760
- def get_avatar (self , gender ):
2761
- """
2762
- Return person gender avatar.
2763
- """
2764
- path , _filename = os .path .split (__file__ )
2765
- if gender == Person .MALE :
2766
- return os .path .join (path , 'person_male.png' )
2767
- if gender == Person .FEMALE :
2768
- return os .path .join (path , 'person_female.png' )
2769
-
2770
2844
def get_person_label (self , person ):
2771
2845
"""
2772
2846
Return person label string (with tags).
@@ -2790,7 +2864,7 @@ def get_person_label(self, person):
2790
2864
image = self .view .graph_widget .get_person_image (person ,
2791
2865
kind = 'path' )
2792
2866
if not image and self .show_avatars :
2793
- image = self .get_avatar (gender = person .gender )
2867
+ image = self .avatars . get_avatar (gender = person .gender )
2794
2868
2795
2869
if image is not None :
2796
2870
image = '<IMG SRC="%s"/>' % image
0 commit comments