Ik moet een keuzelijst voor een mobiele implementeren. De enige relevante controles zijn op en neer pijltoetsen. De keuzelijst moet zo veel mogelijk rijen items weer te geven in een lijst als mogelijk op het scherm (screen_rows), moet één rij worden highighted (sel_row) en het display moet wikkelen indien de gebruiker raakt pijl op wanneer het eerste item is gemarkeerd of pijl omlaag als het laatste item is gemarkeerd (dat wil zeggen, het laatste item moet worden weergegeven en gemarkeerd als de gebruiker raakt wanneer het eerste item is gemarkeerd). Pijl omhoog wijst op het vorige item en pijl naar beneden wijst op het volgende item.
Ik heb iets in elkaar gezet, maar ik ben bezorgd dat ik iets in het testen gemist. Er moet een standaard manier om dit te doen, gezien de prevalentie van listboxes die er zijn.
def up_key(self):
if self.sel_row > 0:
self.sel_row -= 1
elif self.top_item > 0: # top_item is the index of the first list item
self.top_item -= 1
elif self.top_item == 0:
if self.n_lines >= self.screen_rows: # n_lines is the number of items in the list
self.top_item = self.n_lines - self.screen_rows
self.sel_row = min(self.screen_rows-1, self.n_lines-1)
else:
self.top_item = 0
self.sel_row = self.n_lines-1
def down_key(self):
if self.sel_row < self.screen_rows-1 and self.sel_row < self.n_lines-1:
self.sel_row += 1
elif self.sel_row == self.screen_rows-1:
bottom_item = self.top_item + self.screen_rows
if bottom_item == self.n_lines:
self.top_item = 0
self.sel_row = 0
if bottom_item < self.n_lines:
self.top_item += 1
elif self.sel_row == self.n_lines-1:
self.top_item = 0
self.sel_row = 0
def set_pos(self, pos): # display item with index pos
if pos < 0:
pos = 0
elif pos >= self.n_lines:
pos = self.n_lines - 1
if pos < self.screen_rows:
self.top_item = 0
self.sel_row = pos
else:
self.sel_row = min(self.screen_rows, self.n_lines)//2 - 1
self.top_item = pos - self.sel_row
if self.top_item >= self.n_lines - self.screen_rows:
self.top_item = self.n_lines - self.screen_rows - 1
self.sel_row = pos - self.top_item - 1
EDIT: Na elke functie ik een redraw screen functie, die het scherm top_item tekent bovenaan sel rij gemarkeerd.
Ik heb een pseudo-code tag, voor het geval iemand een versie in iets dat niet python toegevoegd.













