Implementeren van een keuzelijst

stemmen
0

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.

De vraag is gesteld op 20/10/2009 om 14:24
bron van user
In andere talen...                            


1 antwoorden

stemmen
1

Weinig Python's uit te voeren listboxes vanuit het niets - ze zijn normaal gesproken gewoon overgenomen uit bestaande toolkits. Dat kan verklaren waarom er geen echte cross-toolkit "standaard" -!)

Coming to uw code, stel ik set_posis bedoeld om te worden opgeroepen direct na ofwel up_keyof down_keyvoltooid zijn (u hoeft dit niet geheel duidelijk te maken).

Mijn belangrijkste zorg zou de repetitiousness en asymmetrie tussen de twee zijn _keyroutines. Zeker gezien het feit dat je specs zijn zo op elkaar lijken voor het omhoog en omlaag, wilt u delegeren aan een enkele functie die een "increment" argument neemt, ofwel 1 of -1. Deze gemeenschappelijke functie kon eerst niet self.sel_row += increment, dan onmiddellijk terug te keren in de gemeenschappelijke geval sel_rowis nog in orde, dat wil zeggen if self.top_item <= self.sel_row < self.top_item + self.screen_rows; anders omgaan met de gevallen waarin sel_rowde weergegeven regio heeft verlaten, door het aanpassen self.top_item, het verlaten indien dat ervoor zorgt dat er geen noodzaak om wraparound, of uiteindelijk het omgaan met de wraparound gevallen.

Ik zou graag aan te brengen "flat is beter dan genest" door herhaaldelijk gebruik van constructies in de vorm zijn "doe wat nodig toestand kans, als de dingen zijn nu prima, return" in plaats van logisch meer complex "als het doen van een simpel ding zal op OK , doe dan het simpel ding; anders als er iets een beetje ingewikkeld, maar niet verschrikkelijk nodig is, doe dan de ingewikkelde iets, anders als we in een echt ingewikkeld geval gaan met de echt ingewikkeld probleem" - de laatste is ver meer foutgevoelig en moeilijker om in elk geval.

antwoordde op 20/10/2009 om 16:30
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more