Changed behaviour of search heavily - you can no longer move cursor around the input field, instead right arrow opens torrent detail view and left cancels searching. You can also go to first/last result with PGUP/PGDOWN

This commit is contained in:
Asmageddon 2012-05-27 21:24:34 +02:00
parent cc99279ad1
commit 920e765790

View File

@ -259,7 +259,6 @@ class AllTorrents(BaseMode, component.Component):
self.entering_search = False self.entering_search = False
self.search_string = None self.search_string = None
self.search_state = SEARCH_EMPTY self.search_state = SEARCH_EMPTY
self.cursor = 0
self.coreconfig = component.get("ConsoleUI").coreconfig self.coreconfig = component.get("ConsoleUI").coreconfig
@ -876,7 +875,7 @@ class AllTorrents(BaseMode, component.Component):
#self.stdscr.redrawwin() #self.stdscr.redrawwin()
if self.entering_search: if self.entering_search:
curses.curs_set(2) curses.curs_set(2)
self.stdscr.move(self.rows-1,self.cursor+17) self.stdscr.move(self.rows-1, len(self.search_string)+17)
else: else:
curses.curs_set(0) curses.curs_set(0)
@ -896,83 +895,115 @@ class AllTorrents(BaseMode, component.Component):
self.marked.append(idx) self.marked.append(idx)
self.last_mark = idx self.last_mark = idx
def __do_search(self): def __search_match_count(self):
# search forward for first torrent matching self.search_string match_count = 0
search_string = self.search_string.lower() search_string = self.search_string.lower()
for i,n in enumerate(self.torrent_names):
for n in self.torrent_names:
n = n.lower() n = n.lower()
if n.find(search_string) >= 0: if n.find(search_string) != -1:
match_count += 1
return match_count
def __do_search(self, direction="first", skip=0):
"""
Performs a search on visible torrent and sets cursor to the match
:param string: direction, the direction of search, can be first, last, next or previous
:returns: Nothing
"""
if direction == "first":
search_space = enumerate(self.torrent_names)
elif direction == "last":
search_space = enumerate(self.torrent_names)
search_space = list(search_space)
search_space = reversed(search_space)
elif direction == "next":
search_space = enumerate(self.torrent_names)
search_space = list(search_space)
search_space = search_space[self.cursel:]
elif direction == "previous":
search_space = enumerate(self.torrent_names)
search_space = list(search_space)[:self.cursel-1]
search_space = reversed(search_space)
search_string = self.search_string.lower()
for i,n in search_space:
n = n.lower()
if n.find(search_string) != -1:
if skip > 0:
skip -= 1
continue
self.cursel = (i+1) self.cursel = (i+1)
if ((self.curoff + self.rows - 5) < self.cursel): if ((self.curoff + self.rows - 5) < self.cursel):
self.curoff = self.cursel - self.rows + 5 self.curoff = self.cursel - self.rows + 5
elif ((self.curoff - 4) > self.cursel): elif ((self.curoff +1) > self.cursel):
self.curoff = max(1, self.cursel - 4)
self.search_state = SEARCH_SUCCESS
return
self.search_state = SEARCH_FAILING
def __do_search_backward(self):
# search backward for the next torrent matching self.search_string
search_list = list(enumerate(self.torrent_names[:self.cursel-1]))
search_list = list(reversed(search_list))
search_string = self.search_string.lower()
for i,n in search_list:
n = n.lower()
if n.find(search_string) >= 0:
self.cursel = (i+1)
if ((self.curoff + 1) > self.cursel):
self.curoff = max(1, self.cursel - 1) self.curoff = max(1, self.cursel - 1)
self.search_state = SEARCH_SUCCESS self.search_state = SEARCH_SUCCESS
return return
self.search_state = SEARCH_START_REACHED if direction in ["first", "last"]:
self.search_state = SEARCH_FAILING
def __do_search_forward(self): elif direction == "next":
# search forward for the next torrent matching self.search_string self.search_state = SEARCH_END_REACHED
search_string = self.search_string.lower() elif direction == "previous":
for i,n in enumerate(self.torrent_names[self.cursel:]): self.search_state = SEARCH_START_REACHED
n = n.lower()
if n.find(search_string) >= 0:
self.cursel += (i+1)
if ((self.curoff + self.rows - 5) < self.cursel):
self.curoff = self.cursel - self.rows + 5
self.search_state = SEARCH_SUCCESS
return
self.search_state = SEARCH_END_REACHED
def __update_search(self, c): def __update_search(self, c):
cname = self.torrent_names[self.cursel-1] cname = self.torrent_names[self.cursel-1]
if c == curses.KEY_BACKSPACE or c == 127: if c == curses.KEY_BACKSPACE or c == 127:
if self.search_string and self.cursor > 0: if self.search_string:
self.search_string = self.search_string[:self.cursor - 1] + self.search_string[self.cursor:] self.search_string = self.search_string[:-1]
self.cursor-=1
if cname.lower().find(self.search_string.lower()) != -1: if cname.lower().find(self.search_string.lower()) != -1:
self.search_state = SEARCH_SUCCESS self.search_state = SEARCH_SUCCESS
elif c == curses.KEY_DC: else:
if self.search_string and self.cursor < len(self.search_string): self.entering_search = False
self.search_string = self.search_string[:self.cursor] + self.search_string[self.cursor+1:] self.search_state = SEARCH_EMPTY
self.refresh([])
elif c == curses.KEY_DC:
self.search_string = ""
self.search_state = SEARCH_SUCCESS
self.refresh([])
if self.cursor < len(self.search_string):
self.__do_search()
if cname.lower().find(self.search_string.lower()) != -1:
self.search_state = SEARCH_SUCCESS
elif c == curses.KEY_UP: elif c == curses.KEY_UP:
self.__do_search_backward() self.__do_search("previous")
self.refresh([])
elif c == curses.KEY_DOWN: elif c == curses.KEY_DOWN:
self.__do_search_forward() self.__do_search("next")
self.refresh([])
elif c == curses.KEY_LEFT: elif c == curses.KEY_LEFT:
self.cursor = max(0,self.cursor-1)
elif c == curses.KEY_RIGHT:
self.cursor = min(len(self.search_string),self.cursor+1)
elif c == curses.KEY_HOME:
self.cursor = 0
elif c == curses.KEY_END:
self.cursor = len(self.search_string)
elif c in [10, curses.KEY_ENTER]:
self.entering_search = False self.entering_search = False
self.search_state = SEARCH_EMPTY self.search_state = SEARCH_EMPTY
self.refresh([])
elif c == curses.KEY_RIGHT:
tid = self.current_torrent_id()
self.show_torrent_details(tid)
elif c == curses.KEY_HOME:
self.__do_search("first")
self.refresh([])
elif c == curses.KEY_END:
self.__do_search("last")
self.refresh([])
elif c in [10, curses.KEY_ENTER]:
self.entering_search = False
self.refresh([])
elif c == 27: elif c == 27:
self.search_string = "" self.search_string = ""
self.search_state = SEARCH_EMPTY self.search_state = SEARCH_EMPTY
self.refresh([])
elif c > 31 and c < 256: elif c > 31 and c < 256:
old_search_string = self.search_string old_search_string = self.search_string
stroke = chr(c) stroke = chr(c)
@ -983,14 +1014,10 @@ class AllTorrents(BaseMode, component.Component):
except UnicodeDecodeError: except UnicodeDecodeError:
c = self.stdscr.getch() c = self.stdscr.getch()
stroke += chr(c) stroke += chr(c)
if uchar: if uchar:
if self.cursor == len(self.search_string): self.search_string += uchar
self.search_string += uchar
else:
# Insert into string
self.search_string = self.search_string[:self.cursor] + uchar + self.search_string[self.cursor:]
# Move the cursor forward
self.cursor+=1
still_matching = ( still_matching = (
cname.lower().find(self.search_string.lower()) cname.lower().find(self.search_string.lower())
== ==
@ -998,13 +1025,16 @@ class AllTorrents(BaseMode, component.Component):
and and
cname.lower().find(self.search_string.lower()) != -1 cname.lower().find(self.search_string.lower()) != -1
) )
if self.search_string and not still_matching: if self.search_string and not still_matching:
self.__do_search() self.__do_search()
elif self.search_string: elif self.search_string:
self.search_state = SEARCH_SUCCESS self.search_state = SEARCH_SUCCESS
self.refresh([])
if not self.search_string: if not self.search_string:
self.search_state = SEARCH_EMPTY self.search_state = SEARCH_EMPTY
self.refresh([])
def _doRead(self): def _doRead(self):
# Read the character # Read the character
@ -1034,7 +1064,6 @@ class AllTorrents(BaseMode, component.Component):
elif self.entering_search: elif self.entering_search:
self.__update_search(c) self.__update_search(c)
self.refresh([])
return return
#log.error("pressed key: %d\n",c) #log.error("pressed key: %d\n",c)
@ -1082,10 +1111,9 @@ class AllTorrents(BaseMode, component.Component):
if c > 31 and c < 256: if c > 31 and c < 256:
if chr(c) == '/': if chr(c) == '/':
self.search_string = "" self.search_string = ""
self.cursor = 0
self.entering_search = True self.entering_search = True
elif chr(c) == 'n' and self.search_string: elif chr(c) == 'n' and self.search_string:
self.__do_search_forward() self.__do_search("next")
elif chr(c) == 'j': elif chr(c) == 'j':
if not self._scroll_up(1): if not self._scroll_up(1):
effected_lines = [self.cursel-1,self.cursel] effected_lines = [self.cursel-1,self.cursel]