Implementere en listeboksen

stemmer
0

Jeg trenger å implementere en listeboksen for en mobil. De eneste relevante kontrollene er opp og ned piltastene. Listeboksen skal vise så mange rader med elementer fra en liste som får plass på skjermen (screen_rows), bør en rad bli highighted (sel_row) og skjermen skal brytes hvis brukeren treffer pil opp når det første elementet er uthevet eller pil ned hvis det siste elementet er uthevet (det vil si, det siste elementet skal vises og fremhevet hvis brukeren treffer opp når det første elementet er uthevet). Pil opp streker forrige element og pil ned streker neste element.

Jeg har satt noe sammen, men er bekymret for jeg har gått glipp av noe i testing. Det må være en standard måte å gjøre dette på, gitt utbredelsen av listboxes ute.

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: etter hver funksjon å ringe en opptegning skjerm funksjon, som tegnes på skjermen med top_item ved toppen og sel-rad fremhevet.

Jeg har lagt en pseudo-kode tag, i tilfelle noen har en versjon i noe som ikke er Python.

Publisert på 20/10/2009 klokken 13:24
kilden bruker
På andre språk...                            


1 svar

stemmer
1

Få Python-programmer gjennomføre listboxes fra bunnen av - de er vanligvis bare tatt fra eksisterende verktøysett. Det kan forklare hvorfor det er ingen reell cross-verktøykasse "standard" -)

Kommer til koden din, jeg forestille set_poser ment å bli kalt rett etter enten up_keyeller down_keyer ferdig (du trenger ikke gjøre dette helt klart).

Min største bekymring ville være repetitiousness og asymmetri mellom de to _keyrutiner. Sikkert gitt at dine spesifikasjoner er så like for opp og ned tastene, du ønsker å delegere til en enkelt funksjon som tar en "økning" argument, enten en eller -1. Det felles funksjon kan først gjøre self.sel_row += increment, deretter umiddelbart tilbake i vanlig tilfelle der sel_rower fortsatt fine, det vil si if self.top_item <= self.sel_row < self.top_item + self.screen_rows; ellers forholde seg til de tilfellene der sel_rowhar gått som vises regionen, ved å justere self.top_item, spennende hvis det fører ingen grunn til wraparound eller endelig håndtere wraparound tilfeller.

Jeg vil være opptatt av å bruke "flat er bedre enn nestet" ved gjentatte ganger å bruke konstruksjoner av typen "gjøre noen nødvendige statlige sjanse, hvis ting er nå fine, retur" heller enn logisk mer kompleks "hvis du gjør en enkel ting vil være OK , så gjør den enkle ting, annet hvis noe litt mer komplisert, men ikke forferdelig er nødvendig, så gjør den kompliserte noe, annet hvis vi er i en veldig komplisert sak, håndtere veldig komplisert problem" - sistnevnte er langt mer utsatt for feil og vanskeligere å følge i alle fall.

Svarte 20/10/2009 kl. 15:30
kilden bruker

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