122
122
123
123
#-------------------------------------------------------------------------
124
124
#
125
- # Search widget module
125
+ # GraphView modules
126
126
#
127
127
#-------------------------------------------------------------------------
128
128
import sys
129
129
sys .path .append (os .path .abspath (os .path .dirname (__file__ )))
130
- from search_widget import SearchWidget , Popover , ListBoxRow
130
+ from search_widget import SearchWidget , Popover , ListBoxRow , get_person_tooltip
131
+ from avatars import Avatars
131
132
132
133
133
134
#-------------------------------------------------------------------------
@@ -144,6 +145,9 @@ class GraphView(NavigationView):
144
145
CONFIGSETTINGS = (
145
146
('interface.graphview-show-images' , True ),
146
147
('interface.graphview-show-avatars' , True ),
148
+ ('interface.graphview-avatars-style' , 1 ),
149
+ ('interface.graphview-avatars-male' , '' ), # custom avatar
150
+ ('interface.graphview-avatars-female' , '' ), # custom avatar
147
151
('interface.graphview-show-full-dates' , False ),
148
152
('interface.graphview-show-places' , False ),
149
153
('interface.graphview-place-format' , 0 ),
@@ -193,6 +197,8 @@ def __init__(self, pdata, dbstate, uistate, nav_group=0):
193
197
194
198
# for disable animation options in config dialog
195
199
self .ani_widgets = []
200
+ # for disable custom avatar options in config dialog
201
+ self .avatar_widgets = []
196
202
197
203
self .additional_uis .append (self .additional_ui )
198
204
self .define_print_actions ()
@@ -407,6 +413,38 @@ def cb_update_show_avatars(self, _client, _cnxn_id, entry, _data):
407
413
self .show_avatars = entry == 'True'
408
414
self .graph_widget .populate (self .get_active ())
409
415
416
+ def cb_update_avatars_style (self , _client , _cnxn_id , entry , _data ):
417
+ """
418
+ Called when the configuration menu changes the avatars setting.
419
+ """
420
+ for widget in self .avatar_widgets :
421
+ widget .set_visible (entry == '0' )
422
+ self .graph_widget .populate (self .get_active ())
423
+
424
+ def cb_on_combo_show (self , combobox ):
425
+ """
426
+ Called when the configuration menu show combobox widget for avatars.
427
+ Used to hide custom avatars settings.
428
+ """
429
+ for widget in self .avatar_widgets :
430
+ widget .set_visible (combobox .get_active () == 0 )
431
+
432
+ def cb_male_avatar_set (self , file_chooser_button ):
433
+ """
434
+ Called when the configuration menu changes the male avatar.
435
+ """
436
+ self ._config .set ('interface.graphview-avatars-male' ,
437
+ file_chooser_button .get_filename ())
438
+ self .graph_widget .populate (self .get_active ())
439
+
440
+ def cb_female_avatar_set (self , file_chooser_button ):
441
+ """
442
+ Called when the configuration menu changes the female avatar.
443
+ """
444
+ self ._config .set ('interface.graphview-avatars-female' ,
445
+ file_chooser_button .get_filename ())
446
+ self .graph_widget .populate (self .get_active ())
447
+
410
448
def cb_update_show_full_dates (self , _client , _cnxn_id , entry , _data ):
411
449
"""
412
450
Called when the configuration menu changes the date setting.
@@ -566,6 +604,8 @@ def config_connect(self):
566
604
self .cb_update_show_images )
567
605
self ._config .connect ('interface.graphview-show-avatars' ,
568
606
self .cb_update_show_avatars )
607
+ self ._config .connect ('interface.graphview-avatars-style' ,
608
+ self .cb_update_avatars_style )
569
609
self ._config .connect ('interface.graphview-show-full-dates' ,
570
610
self .cb_update_show_full_dates )
571
611
self ._config .connect ('interface.graphview-show-places' ,
@@ -696,6 +736,47 @@ def theme_config_panel(self, configdialog):
696
736
font_btn .connect ('font-set' , self .config_change_font )
697
737
font_btn .set_filter_func (self .font_filter_func )
698
738
739
+ # Avatars options
740
+ # ===================================================================
741
+ row += 1
742
+ avatars = Avatars (self ._config )
743
+ combo = configdialog .add_combo (grid , _ ('Avatars style' ), row ,
744
+ 'interface.graphview-avatars-style' ,
745
+ avatars .get_styles_list ())
746
+ combo .connect ('show' , self .cb_on_combo_show )
747
+
748
+ file_filter = Gtk .FileFilter ()
749
+ file_filter .set_name (_ ('PNG files' ))
750
+ file_filter .add_pattern ("*.png" )
751
+
752
+ self .avatar_widgets .clear ()
753
+ row += 1
754
+ lbl = Gtk .Label (label = _ ('Male avatar:' ), halign = Gtk .Align .END )
755
+ FCB_male = Gtk .FileChooserButton .new (_ ('Choose male avatar' ),
756
+ Gtk .FileChooserAction .OPEN )
757
+ FCB_male .add_filter (file_filter )
758
+ FCB_male .set_filename (
759
+ self ._config .get ('interface.graphview-avatars-male' ))
760
+ FCB_male .connect ('file-set' , self .cb_male_avatar_set )
761
+ grid .attach (lbl , 1 , row , 1 , 1 )
762
+ grid .attach (FCB_male , 2 , row , 1 , 1 )
763
+ self .avatar_widgets .append (lbl )
764
+ self .avatar_widgets .append (FCB_male )
765
+
766
+ row += 1
767
+ lbl = Gtk .Label (label = _ ('Female avatar:' ), halign = Gtk .Align .END )
768
+ FCB_female = Gtk .FileChooserButton .new (_ ('Choose female avatar' ),
769
+ Gtk .FileChooserAction .OPEN )
770
+ FCB_female .connect ('file-set' , self .cb_female_avatar_set )
771
+ FCB_female .add_filter (file_filter )
772
+ FCB_female .set_filename (
773
+ self ._config .get ('interface.graphview-avatars-female' ))
774
+ grid .attach (lbl , 1 , row , 1 , 1 )
775
+ grid .attach (FCB_female , 2 , row , 1 , 1 )
776
+ self .avatar_widgets .append (lbl )
777
+ self .avatar_widgets .append (FCB_female )
778
+ # ===================================================================
779
+
699
780
return _ ('Themes' ), grid
700
781
701
782
def animation_config_panel (self , configdialog ):
@@ -2130,6 +2211,8 @@ def __init__(self, dbstate, view, bold_size=0, norm_size=0):
2130
2211
# font if we use genealogical symbols
2131
2212
self .sym_font = None
2132
2213
2214
+ self .avatars = Avatars (self .view ._config )
2215
+
2133
2216
def __del__ (self ):
2134
2217
"""
2135
2218
Free stream file on destroy.
@@ -2175,6 +2258,7 @@ def init_dot(self):
2175
2258
ranksep = ranksep * 0.1
2176
2259
nodesep = self .view ._config .get ('interface.graphview-nodesep' )
2177
2260
nodesep = nodesep * 0.1
2261
+ self .avatars .update_current_style ()
2178
2262
# get background color from gtk theme and convert it to hex
2179
2263
# else use white background
2180
2264
bg_color = self .context .lookup_color ('theme_bg_color' )
@@ -2838,16 +2922,6 @@ def get_person_themes(self, index=-1):
2838
2922
else :
2839
2923
return person_themes [0 ]
2840
2924
2841
- def get_avatar (self , gender ):
2842
- """
2843
- Return person gender avatar.
2844
- """
2845
- path , _filename = os .path .split (__file__ )
2846
- if gender == Person .MALE :
2847
- return os .path .join (path , 'person_male.png' )
2848
- if gender == Person .FEMALE :
2849
- return os .path .join (path , 'person_female.png' )
2850
-
2851
2925
def get_person_label (self , person ):
2852
2926
"""
2853
2927
Return person label string (with tags).
@@ -2871,7 +2945,7 @@ def get_person_label(self, person):
2871
2945
image = self .view .graph_widget .get_person_image (person ,
2872
2946
kind = 'path' )
2873
2947
if not image and self .show_avatars :
2874
- image = self .get_avatar (gender = person .gender )
2948
+ image = self .avatars . get_avatar (gender = person .gender )
2875
2949
2876
2950
if image is not None :
2877
2951
image = '<IMG SRC="%s"/>' % image
0 commit comments