Skip to content

Commit 901dd50

Browse files
committed
selection logic improved
1 parent 35acbb8 commit 901dd50

File tree

1 file changed

+77
-32
lines changed

1 file changed

+77
-32
lines changed

src/dude.py

+77-32
Original file line numberDiff line numberDiff line change
@@ -817,7 +817,8 @@ def __init__(self,cwd,paths_to_add=None,exclude=None,exclude_regexp=None,norun=N
817817
style_map("TButton", relief=[('disabled',"flat"),('',"raised")] )
818818
style_map("TCheckbutton",relief=[('disabled',"flat"),('',"sunken")])
819819
style_map("Treeview.Heading", relief=[('','raised')] )
820-
style_configure("Treeview",rowheight=18)
820+
self.rowhight = 18
821+
style_configure("Treeview",rowheight=self.rowhight)
821822
style_configure("TButton", anchor = "center")
822823
style_configure("TCheckbutton",anchor='center',padding=(4, 0, 4, 0) )
823824

@@ -871,6 +872,9 @@ def __init__(self,cwd,paths_to_add=None,exclude=None,exclude_regexp=None,norun=N
871872
#######################################################################
872873

873874
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
874878

875879
self.my_next_dict={}
876880
self.my_prev_dict={}
@@ -1587,12 +1591,15 @@ def help_cascade_post():
15871591

15881592
#######################################################################
15891593

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)
15921596

15931597
self_groups_tree.bind("<Leave>", lambda event : self_widget_leave())
15941598
self_folder_tree.bind("<Leave>", lambda event : self_widget_leave())
15951599

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+
15961603
#######################################################################
15971604

15981605
if paths_to_add:
@@ -1855,7 +1862,6 @@ def get_settings_dialog(self):
18551862
self.lang_cb = Combobox(lang_frame,values=list(langs.lang_dict.keys()),textvariable=self.lang_var,state='readonly',width=16)
18561863
self.lang_cb.grid(row=0, column=1, sticky='news',padx=4,pady=4)
18571864

1858-
18591865
Label(lang_frame,text=STR('Theme:'),anchor='w').grid(row=0, column=3, sticky='wens',padx=8,pady=4)
18601866
self.theme_var = StringVar()
18611867

@@ -2316,6 +2322,13 @@ def unpost(self):
23162322
tooltip_show_after_folder=''
23172323
tooltip_show_after_widget=''
23182324

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+
23192332
def widget_leave(self):
23202333
self.menubar_unpost()
23212334
self.hide_tooltip()
@@ -2738,8 +2751,7 @@ def select_find_result(self,mod):
27382751
else:
27392752
self.semi_selection(self.find_tree,next_item)
27402753

2741-
self.find_tree.see(next_item)
2742-
self.find_tree.update()
2754+
self.tree_see_wrapper(self.find_tree,next_item)
27432755

27442756
if self.find_tree==self.groups_tree:
27452757
self.groups_tree_sel_change(next_item)
@@ -2831,7 +2843,7 @@ def goto_next_prev_duplicate_in_folder(self,direction):
28312843

28322844
if tree_set(current_item,'kind')==self_FILE:
28332845
self.semi_selection(tree,current_item)
2834-
tree.see(current_item)
2846+
self.tree_see_wrapper(tree,current_item)
28352847
self.folder_tree_sel_change(current_item)
28362848
self.status(status,do_log=False)
28372849
break
@@ -2855,22 +2867,21 @@ def goto_first_last_dir_entry(self,index):
28552867
self.folder_tree_see(next_item)
28562868
self.folder_tree.update()
28572869

2858-
28592870
@catched
28602871
def key_release(self,event):
28612872
try:
28622873
tree,key=event.widget,event.keysym
28632874

2864-
if key in ("Next"):
2875+
if key=="Next":
28652876
item=tree.focus()
28662877
#tree.yview_moveto(tree.bbox(item)[1] / tree.winfo_height())
28672878
children=tree.get_children(item)
28682879
children_len=len(children)
28692880

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])
28742885
except Exception as e :
28752886
#print(e)
28762887
pass
@@ -2895,11 +2906,12 @@ def key_press(self,event):
28952906

28962907
if key in ("Up","Down"):
28972908
if item:
2909+
direction = 1 if key=='Down' else -1
28982910
new_item = self.my_next_dict[tree][item] if key=='Down' else self.my_prev_dict[tree][item]
28992911

29002912
if new_item:
29012913
tree.focus(new_item)
2902-
tree.see(new_item)
2914+
self.tree_see_wrapper(tree,new_item,direction)
29032915

29042916
if tree==self.groups_tree:
29052917
self.groups_tree_sel_change(new_item)
@@ -3090,6 +3102,37 @@ def go_to_parent_dir(self):
30903102
self.enter_dir(normpath(str(Path(self.sel_path_full).parent.absolute())),tail)
30913103

30923104
#################################################
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+
30933136
def crc_select_and_focus(self,crc,try_to_show_all=False):
30943137
if try_to_show_all:
30953138
self.groups_tree_see(self.tree_children_sub[crc][-1])
@@ -3112,12 +3155,9 @@ def crc_select_and_focus_child(self,crc):
31123155
first_child = self.my_next_dict[tree][crc]
31133156

31143157
self.selected[tree] = self.sel_item = first_child
3115-
31163158
tree.focus(first_child)
3117-
tree.see(first_child)
31183159
self.groups_tree_sel_change(first_child)
3119-
3120-
self.groups_tree.update()
3160+
self.tree_see_wrapper(tree,first_child)
31213161

31223162
def tree_on_mouse_button_press(self,event,toggle=False):
31233163
self.menubar_unpost()
@@ -4709,6 +4749,8 @@ def crc_remove_callback(self,crc):
47094749
self.selected[self.groups_tree]=None
47104750
l_error(f'crc_remove_callback,{crc},{e}')
47114751

4752+
first_node={}
4753+
47124754
@catched
47134755
def create_my_prev_next_dicts(self,tree):
47144756
my_next_dict = self.my_next_dict[tree]={}
@@ -4721,7 +4763,7 @@ def create_my_prev_next_dicts(self,tree):
47214763
self_tree_children_sub = self.tree_children_sub={}
47224764

47234765
if top_nodes := children:
4724-
first=top_nodes[0]
4766+
self.first_node[tree]=first=top_nodes[0]
47254767
tree_get_children = tree.get_children
47264768
for top_node in top_nodes:
47274769
prev2,prev1 = prev1,top_node
@@ -4863,6 +4905,7 @@ def groups_show(self):
48634905

48644906
self_CRC = self.CRC
48654907
self_FILE = self.FILE
4908+
self_NOTAG = self.NOTAG
48664909
self_groups_tree_insert=self_groups_tree.insert
48674910
self_groups_tree_item_to_data = self.groups_tree_item_to_data = {}
48684911
self_iid_to_size=self.iid_to_size
@@ -4919,7 +4962,7 @@ def groups_show(self):
49194962
size_h,\
49204963
str(ctime),str(dev),str(inode),crc,\
49214964
'','',\
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
49234966

49244967
#kind,crc,index_tuple
49254968
#kind,crc,(pathnr,path,file,ctime,dev,inode)
@@ -4973,7 +5016,7 @@ def groups_show(self):
49735016
'',\
49745017
str(ctime),str(dev),str(inode),crc,\
49755018
'','',\
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
49775020

49785021
#kind,crc,index_tuple
49795022
#kind,crc,(pathnr,path,file,ctime,dev,inode)
@@ -4998,6 +5041,8 @@ def groups_show(self):
49985041
#self.menu_enable()
49995042
self_status('')
50005043

5044+
self.tree_configure(self_groups_tree)
5045+
50015046
@block_and_log
50025047
def groups_tree_update_crc_and_path(self,configure_icon=False):
50035048
self.status(STR('Updating items ...'))
@@ -5035,8 +5080,7 @@ def groups_tree_update(self,item):
50355080

50365081
self.semi_selection(self_groups_tree,item)
50375082

5038-
self_groups_tree.see(item)
5039-
self_groups_tree.update()
5083+
self.tree_see_wrapper(self_groups_tree,item)
50405084

50415085
current_folder_items=()
50425086
current_folder_items_tagged=set()
@@ -5210,23 +5254,25 @@ def tree_folder_update(self,arbitrary_path=None):
52105254
self.status(str(e))
52115255
l_error(e)
52125256

5257+
self.create_my_prev_next_dicts(ftree)
5258+
52135259
if not arbitrary_path:
52145260
try:
52155261
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)
52185265
pass
5266+
ftree.update()
52195267

52205268
self.status_folder_quant_configure(text=fnumber(len(self_current_folder_items_tagged)))
52215269
self.status_folder_size_configure(text=bytes_to_str(current_folder_items_tagged_size))
52225270

5223-
ftree.update()
5224-
52255271
folder_items_len = len(self.current_folder_items)
52265272

52275273
self.folder_tree_configure(takefocus=True)
52285274

5229-
self.create_my_prev_next_dicts(ftree)
5275+
self.tree_configure(ftree)
52305276

52315277
return True
52325278

@@ -5273,10 +5319,9 @@ def mark_in_specified_group_by_ctime(self, action, crc, reverse,select=False):
52735319
if item:
52745320
action(item,self_groups_tree)
52755321
if select:
5276-
self_groups_tree.see(item)
52775322
self_groups_tree.focus(item)
52785323
self.groups_tree_sel_change(item)
5279-
self_groups_tree.update()
5324+
self.tree_see_wrapper(self_groups_tree,item)
52805325

52815326
@block
52825327
def mark_all_by_ctime(self,order_str, action):
@@ -5472,7 +5517,7 @@ def mark_expression(self,action,prompt,all_groups=True):
54725517
first_item=items[0]
54735518

54745519
tree.focus(first_item)
5475-
tree.see(first_item)
5520+
self.tree_see_wrapper(tree,first_item)
54765521

54775522
if tree==self.groups_tree:
54785523
for item in items:
@@ -5531,7 +5576,7 @@ def goto_next_mark(self,tree,direction,go_to_no_mark=False):
55315576

55325577
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):
55335578
self.semi_selection(tree,current_item)
5534-
tree.see(current_item)
5579+
self.tree_see_wrapper(tree,current_item)
55355580

55365581
if tree==self.groups_tree:
55375582
self.groups_tree_sel_change(current_item)

0 commit comments

Comments
 (0)