@@ -817,7 +817,8 @@ def __init__(self,cwd,paths_to_add=None,exclude=None,exclude_regexp=None,norun=N
817
817
style_map ("TButton" , relief = [('disabled' ,"flat" ),('' ,"raised" )] )
818
818
style_map ("TCheckbutton" ,relief = [('disabled' ,"flat" ),('' ,"sunken" )])
819
819
style_map ("Treeview.Heading" , relief = [('' ,'raised' )] )
820
- style_configure ("Treeview" ,rowheight = 18 )
820
+ self .rowhight = 18
821
+ style_configure ("Treeview" ,rowheight = self .rowhight )
821
822
style_configure ("TButton" , anchor = "center" )
822
823
style_configure ("TCheckbutton" ,anchor = 'center' ,padding = (4 , 0 , 4 , 0 ) )
823
824
@@ -871,6 +872,9 @@ def __init__(self,cwd,paths_to_add=None,exclude=None,exclude_regexp=None,norun=N
871
872
#######################################################################
872
873
873
874
self_widget_leave = self .widget_leave
875
+ self_tree_configure = self .tree_configure
876
+ self_motion_on_folder_tree = self .motion_on_folder_tree
877
+ self_motion_on_groups_tree = self .motion_on_groups_tree
874
878
875
879
self .my_next_dict = {}
876
880
self .my_prev_dict = {}
@@ -1587,12 +1591,15 @@ def help_cascade_post():
1587
1591
1588
1592
#######################################################################
1589
1593
1590
- self_groups_tree .bind ("<Motion>" , self . motion_on_groups_tree )
1591
- self_folder_tree .bind ("<Motion>" , self . motion_on_folder_tree )
1594
+ self_groups_tree .bind ("<Motion>" , self_motion_on_groups_tree )
1595
+ self_folder_tree .bind ("<Motion>" , self_motion_on_folder_tree )
1592
1596
1593
1597
self_groups_tree .bind ("<Leave>" , lambda event : self_widget_leave ())
1594
1598
self_folder_tree .bind ("<Leave>" , lambda event : self_widget_leave ())
1595
1599
1600
+ self_groups_tree .bind ("<Configure>" , lambda event : self_tree_configure (event .widget ))
1601
+ self_folder_tree .bind ("<Configure>" , lambda event : self_tree_configure (event .widget ))
1602
+
1596
1603
#######################################################################
1597
1604
1598
1605
if paths_to_add :
@@ -1855,7 +1862,6 @@ def get_settings_dialog(self):
1855
1862
self .lang_cb = Combobox (lang_frame ,values = list (langs .lang_dict .keys ()),textvariable = self .lang_var ,state = 'readonly' ,width = 16 )
1856
1863
self .lang_cb .grid (row = 0 , column = 1 , sticky = 'news' ,padx = 4 ,pady = 4 )
1857
1864
1858
-
1859
1865
Label (lang_frame ,text = STR ('Theme:' ),anchor = 'w' ).grid (row = 0 , column = 3 , sticky = 'wens' ,padx = 8 ,pady = 4 )
1860
1866
self .theme_var = StringVar ()
1861
1867
@@ -2316,6 +2322,13 @@ def unpost(self):
2316
2322
tooltip_show_after_folder = ''
2317
2323
tooltip_show_after_widget = ''
2318
2324
2325
+ rows_offset = {}
2326
+ def tree_configure (self ,tree ):
2327
+ try :
2328
+ self .rows_offset [tree ] = (tree .winfo_height () / self .rowhight ) // 3
2329
+ except :
2330
+ self .rows_offset [tree ] = 0
2331
+
2319
2332
def widget_leave (self ):
2320
2333
self .menubar_unpost ()
2321
2334
self .hide_tooltip ()
@@ -2738,8 +2751,7 @@ def select_find_result(self,mod):
2738
2751
else :
2739
2752
self .semi_selection (self .find_tree ,next_item )
2740
2753
2741
- self .find_tree .see (next_item )
2742
- self .find_tree .update ()
2754
+ self .tree_see_wrapper (self .find_tree ,next_item )
2743
2755
2744
2756
if self .find_tree == self .groups_tree :
2745
2757
self .groups_tree_sel_change (next_item )
@@ -2831,7 +2843,7 @@ def goto_next_prev_duplicate_in_folder(self,direction):
2831
2843
2832
2844
if tree_set (current_item ,'kind' )== self_FILE :
2833
2845
self .semi_selection (tree ,current_item )
2834
- tree . see ( current_item )
2846
+ self . tree_see_wrapper ( tree , current_item )
2835
2847
self .folder_tree_sel_change (current_item )
2836
2848
self .status (status ,do_log = False )
2837
2849
break
@@ -2855,22 +2867,21 @@ def goto_first_last_dir_entry(self,index):
2855
2867
self .folder_tree_see (next_item )
2856
2868
self .folder_tree .update ()
2857
2869
2858
-
2859
2870
@catched
2860
2871
def key_release (self ,event ):
2861
2872
try :
2862
2873
tree ,key = event .widget ,event .keysym
2863
2874
2864
- if key in ( "Next" ) :
2875
+ if key == "Next" :
2865
2876
item = tree .focus ()
2866
2877
#tree.yview_moveto(tree.bbox(item)[1] / tree.winfo_height())
2867
2878
children = tree .get_children (item )
2868
2879
children_len = len (children )
2869
2880
2870
- if children_len >= 3 :
2871
- tree .see (children [2 ])
2872
- elif children_len :
2873
- tree .see (children [- 1 ])
2881
+ # if children_len>=3:
2882
+ # tree.see(children[2])
2883
+ # elif children_len:
2884
+ # tree.see(children[-1])
2874
2885
except Exception as e :
2875
2886
#print(e)
2876
2887
pass
@@ -2895,11 +2906,12 @@ def key_press(self,event):
2895
2906
2896
2907
if key in ("Up" ,"Down" ):
2897
2908
if item :
2909
+ direction = 1 if key == 'Down' else - 1
2898
2910
new_item = self .my_next_dict [tree ][item ] if key == 'Down' else self .my_prev_dict [tree ][item ]
2899
2911
2900
2912
if new_item :
2901
2913
tree .focus (new_item )
2902
- tree . see ( new_item )
2914
+ self . tree_see_wrapper ( tree , new_item , direction )
2903
2915
2904
2916
if tree == self .groups_tree :
2905
2917
self .groups_tree_sel_change (new_item )
@@ -3090,6 +3102,37 @@ def go_to_parent_dir(self):
3090
3102
self .enter_dir (normpath (str (Path (self .sel_path_full ).parent .absolute ())),tail )
3091
3103
3092
3104
#################################################
3105
+ def tree_see_wrapper (self ,tree ,node ,direction = 0 ):
3106
+ offset = self .rows_offset [tree ]
3107
+
3108
+ downnode = upnode = node
3109
+
3110
+ first = self .first_node [tree ]
3111
+
3112
+ prev_d = self .my_prev_dict [tree ]
3113
+ next_d = self .my_next_dict [tree ]
3114
+
3115
+ while offset :
3116
+ offset -= 1
3117
+
3118
+ if upnode != first :
3119
+ upnode = prev_d [upnode ]
3120
+ else :
3121
+ direction = 0
3122
+
3123
+ downcandidate = next_d [downnode ]
3124
+ if downcandidate != first :
3125
+ downnode = downcandidate
3126
+ else :
3127
+ direction = 0
3128
+
3129
+ if direction <= 0 :
3130
+ tree .see (upnode )
3131
+ tree .update ()
3132
+ if direction >= 0 :
3133
+ tree .see (downnode )
3134
+ tree .update ()
3135
+
3093
3136
def crc_select_and_focus (self ,crc ,try_to_show_all = False ):
3094
3137
if try_to_show_all :
3095
3138
self .groups_tree_see (self .tree_children_sub [crc ][- 1 ])
@@ -3112,12 +3155,9 @@ def crc_select_and_focus_child(self,crc):
3112
3155
first_child = self .my_next_dict [tree ][crc ]
3113
3156
3114
3157
self .selected [tree ] = self .sel_item = first_child
3115
-
3116
3158
tree .focus (first_child )
3117
- tree .see (first_child )
3118
3159
self .groups_tree_sel_change (first_child )
3119
-
3120
- self .groups_tree .update ()
3160
+ self .tree_see_wrapper (tree ,first_child )
3121
3161
3122
3162
def tree_on_mouse_button_press (self ,event ,toggle = False ):
3123
3163
self .menubar_unpost ()
@@ -4709,6 +4749,8 @@ def crc_remove_callback(self,crc):
4709
4749
self .selected [self .groups_tree ]= None
4710
4750
l_error (f'crc_remove_callback,{ crc } ,{ e } ' )
4711
4751
4752
+ first_node = {}
4753
+
4712
4754
@catched
4713
4755
def create_my_prev_next_dicts (self ,tree ):
4714
4756
my_next_dict = self .my_next_dict [tree ]= {}
@@ -4721,7 +4763,7 @@ def create_my_prev_next_dicts(self,tree):
4721
4763
self_tree_children_sub = self .tree_children_sub = {}
4722
4764
4723
4765
if top_nodes := children :
4724
- first = top_nodes [0 ]
4766
+ self . first_node [ tree ] = first = top_nodes [0 ]
4725
4767
tree_get_children = tree .get_children
4726
4768
for top_node in top_nodes :
4727
4769
prev2 ,prev1 = prev1 ,top_node
@@ -4863,6 +4905,7 @@ def groups_show(self):
4863
4905
4864
4906
self_CRC = self .CRC
4865
4907
self_FILE = self .FILE
4908
+ self_NOTAG = self .NOTAG
4866
4909
self_groups_tree_insert = self_groups_tree .insert
4867
4910
self_groups_tree_item_to_data = self .groups_tree_item_to_data = {}
4868
4911
self_iid_to_size = self .iid_to_size
@@ -4919,7 +4962,7 @@ def groups_show(self):
4919
4962
size_h ,\
4920
4963
str (ctime ),str (dev ),str (inode ),crc ,\
4921
4964
'' ,'' ,\
4922
- strftime ('%Y/%m/%d %H:%M:%S' ,localtime_catched_local (ctime // 1000000000 )),self_FILE ),tags = self . NOTAG ,text = dude_core_scanned_paths [pathnr ] if show_full_paths else '' ,image = self_icon_nr [pathnr ]) #DE_NANO= 1_000_000_000
4965
+ strftime ('%Y/%m/%d %H:%M:%S' ,localtime_catched_local (ctime // 1000000000 )),self_FILE ),tags = self_NOTAG ,text = dude_core_scanned_paths [pathnr ] if show_full_paths else '' ,image = self_icon_nr [pathnr ]) #DE_NANO= 1_000_000_000
4923
4966
4924
4967
#kind,crc,index_tuple
4925
4968
#kind,crc,(pathnr,path,file,ctime,dev,inode)
@@ -4973,7 +5016,7 @@ def groups_show(self):
4973
5016
'' ,\
4974
5017
str (ctime ),str (dev ),str (inode ),crc ,\
4975
5018
'' ,'' ,\
4976
- strftime ('%Y/%m/%d %H:%M:%S' ,localtime_catched_local (ctime // 1000000000 )),self_FILE ),tags = self . NOTAG ,text = dude_core_scanned_paths [pathnr ] if show_full_paths else '' ,image = self_icon_nr [pathnr ]) #DE_NANO= 1_000_000_000
5019
+ strftime ('%Y/%m/%d %H:%M:%S' ,localtime_catched_local (ctime // 1000000000 )),self_FILE ),tags = self_NOTAG ,text = dude_core_scanned_paths [pathnr ] if show_full_paths else '' ,image = self_icon_nr [pathnr ]) #DE_NANO= 1_000_000_000
4977
5020
4978
5021
#kind,crc,index_tuple
4979
5022
#kind,crc,(pathnr,path,file,ctime,dev,inode)
@@ -4998,6 +5041,8 @@ def groups_show(self):
4998
5041
#self.menu_enable()
4999
5042
self_status ('' )
5000
5043
5044
+ self .tree_configure (self_groups_tree )
5045
+
5001
5046
@block_and_log
5002
5047
def groups_tree_update_crc_and_path (self ,configure_icon = False ):
5003
5048
self .status (STR ('Updating items ...' ))
@@ -5035,8 +5080,7 @@ def groups_tree_update(self,item):
5035
5080
5036
5081
self .semi_selection (self_groups_tree ,item )
5037
5082
5038
- self_groups_tree .see (item )
5039
- self_groups_tree .update ()
5083
+ self .tree_see_wrapper (self_groups_tree ,item )
5040
5084
5041
5085
current_folder_items = ()
5042
5086
current_folder_items_tagged = set ()
@@ -5210,23 +5254,25 @@ def tree_folder_update(self,arbitrary_path=None):
5210
5254
self .status (str (e ))
5211
5255
l_error (e )
5212
5256
5257
+ self .create_my_prev_next_dicts (ftree )
5258
+
5213
5259
if not arbitrary_path :
5214
5260
try :
5215
5261
self .semi_selection (ftree ,self .sel_item )
5216
- ftree .see (self .sel_item )
5217
- except Exception :
5262
+ self .tree_see_wrapper (ftree ,self .sel_item )
5263
+ except Exception as e :
5264
+ print ('e:' ,e )
5218
5265
pass
5266
+ ftree .update ()
5219
5267
5220
5268
self .status_folder_quant_configure (text = fnumber (len (self_current_folder_items_tagged )))
5221
5269
self .status_folder_size_configure (text = bytes_to_str (current_folder_items_tagged_size ))
5222
5270
5223
- ftree .update ()
5224
-
5225
5271
folder_items_len = len (self .current_folder_items )
5226
5272
5227
5273
self .folder_tree_configure (takefocus = True )
5228
5274
5229
- self .create_my_prev_next_dicts (ftree )
5275
+ self .tree_configure (ftree )
5230
5276
5231
5277
return True
5232
5278
@@ -5273,10 +5319,9 @@ def mark_in_specified_group_by_ctime(self, action, crc, reverse,select=False):
5273
5319
if item :
5274
5320
action (item ,self_groups_tree )
5275
5321
if select :
5276
- self_groups_tree .see (item )
5277
5322
self_groups_tree .focus (item )
5278
5323
self .groups_tree_sel_change (item )
5279
- self_groups_tree . update ( )
5324
+ self . tree_see_wrapper ( self_groups_tree , item )
5280
5325
5281
5326
@block
5282
5327
def mark_all_by_ctime (self ,order_str , action ):
@@ -5472,7 +5517,7 @@ def mark_expression(self,action,prompt,all_groups=True):
5472
5517
first_item = items [0 ]
5473
5518
5474
5519
tree .focus (first_item )
5475
- tree . see ( first_item )
5520
+ self . tree_see_wrapper ( tree , first_item )
5476
5521
5477
5522
if tree == self .groups_tree :
5478
5523
for item in items :
@@ -5531,7 +5576,7 @@ def goto_next_mark(self,tree,direction,go_to_no_mark=False):
5531
5576
5532
5577
if (item_taggged and not go_to_no_mark ) or (go_to_no_mark and not item_taggged and current_item not in self_crc_to_size ):
5533
5578
self .semi_selection (tree ,current_item )
5534
- tree . see ( current_item )
5579
+ self . tree_see_wrapper ( tree , current_item )
5535
5580
5536
5581
if tree == self .groups_tree :
5537
5582
self .groups_tree_sel_change (current_item )
0 commit comments