@@ -1726,7 +1726,6 @@ def __init__(self,
17261726 )
17271727 self ._get_window ()
17281728 self ._calculate_max_height_max_width ()
1729- self ._verify_selection_not_on_caption ()
17301729 self ._make_sure_selection_is_visible ()
17311730
17321731 @property
@@ -1818,17 +1817,23 @@ def _set_selection(self, a_sel):
18181817 self ._old_start_pos = self ._start_pos
18191818
18201819 self ._selection = a_sel
1821- self ._make_sure_selection_is_visible ()
1822- self ._verify_selection_not_on_caption ()
18231820
1824- # log_it('last line = {}'.format(self._start_pos + self._maxY))
1825- if a_sel < self ._start_pos or a_sel >= self ._start_pos + self ._body_maxY :
1826- self ._start_pos = self ._selection - int (self ._body_maxY / 2 ) + 1
1821+ if self ._make_sure_selection_is_visible ():
18271822 self ._refresh ()
18281823 else :
18291824 self ._toggle_selected_item ()
18301825
18311826
1827+ # self._make_sure_selection_is_visible()
1828+
1829+ # # log_it('last line = {}'.format(self._start_pos + self._maxY))
1830+ # if a_sel < self._start_pos or a_sel >= self._start_pos + self._body_maxY:
1831+ # self._start_pos = self._selection - int(self._body_maxY / 2) + 1
1832+ # self._refresh()
1833+ # else:
1834+ # self._toggle_selected_item()
1835+
1836+
18321837 def _get_window (self ):
18331838 Y , X = self ._parent .getmaxyx ()
18341839 # log_it('== WIN Y = {0}, X = {1}'.format(Y, X))
@@ -1959,7 +1964,6 @@ def show(self, parent=None):
19591964 return
19601965
19611966 if new_win :
1962- self ._verify_selection_not_on_caption ()
19631967 self ._make_sure_selection_is_visible ()
19641968 self .show ()
19651969 return
@@ -1987,6 +1991,7 @@ def _refresh(self):
19871991 self ._start_pos = 0
19881992 elif self ._start_pos > len (self ._items ) - 1 - self ._body_maxY :
19891993 self ._start_pos = len (self ._items ) - self ._body_maxY
1994+ # logger.error('refresh (st={0}, sel={1})'.format(self._start_pos, self._selection))
19901995 for i in range (0 , self ._body_maxY ):
19911996 item_id = i + self ._start_pos
19921997 disp_item = self ._format_line (i , active_item_length )
@@ -2063,19 +2068,28 @@ def _get_item_color(self, item_id):
20632068 # log_it('--- END ---')
20642069 return col
20652070
2066- def _make_sure_selection_is_visible (self ):
2071+ def _make_sure_selection_is_visible (self , mov = 1 ):
2072+ ''' adjust self._start_pos to make self._selection visible
2073+ Returns
2074+ True self._start_pos changed (use self._refresh)
2075+ False self._start_pos not changed (use self._toggle_selected_item)
2076+ '''
20672077 if len (self ._items ) <= self ._body_maxY :
20682078 self ._start_pos = 0
20692079 return
2080+ self ._verify_selection_not_on_caption (mov )
2081+ self ._old_start_pos = self ._start_pos
20702082 meso = int (self ._body_maxY / 2 )
2071- st = old_st = self ._start_pos
2072- en = st + self ._body_maxY - 1
2083+ self ._end_pos = self ._start_pos + self ._body_maxY - 1
2084+
2085+ if self ._start_pos <= self ._selection <= self ._end_pos :
2086+ return False
20732087
2074- st = self ._selection - meso
2088+ self . _start_pos = self ._selection - meso
20752089
2076- if st < 0 :
2077- st = 0
2078- self . _start_pos = st
2090+ if self . _start_pos < 0 :
2091+ self . _start_pos = 0
2092+ return True
20792093
20802094 def _verify_selection_not_on_caption (self , movement = 1 ):
20812095 # log_it('\n\n1 mov = {0}, sel = {1}, items = {2}'.format(movement, self._selection, len(self._items)))
@@ -2121,8 +2135,10 @@ def delete_item(self, target):
21212135 self .active = - 1
21222136
21232137 self ._verify_selection_not_on_caption (mov )
2124- if not self ._make_sure_selection_is_visible ():
2138+ if self ._make_sure_selection_is_visible ():
21252139 self ._refresh ()
2140+ else :
2141+ self ._toggle_selected_item ()
21262142
21272143 return len (self ._items )
21282144
@@ -2158,6 +2174,7 @@ def _toggle_selected_item(self):
21582174 # )
21592175 # log_it('_toggle_selection_item: X={0}, setting new selection: {1}, line: {2}'.format(self._X, selection_id, self._Y + selection_id))
21602176 update = True
2177+ # logger.error('toggle (st={0}, sel={1})'.format(self._start_pos, self._selection))
21612178 if update :
21622179 self ._win .refresh ()
21632180 return True
0 commit comments