Реализовать ListBox

голоса
0

Мне нужно реализовать ListBox для мобильного телефона. Единственные соответствующие элементы управления вверх и вниз клавиши со стрелками. ListBox должен отображать столько строк элементов из списка, которые поместятся на экране (screen_rows), одна строка должна быть highighted (sel_row) и дисплей должен завернуть, если пользователь нажимает клавишу со стрелкой вверх, когда первый элемент выделен или стрелка вниз если выделен последний элемент (то есть, последний элемент должен быть отображен и выделен, если пользователь нажмет когда будет выделен первый пункт). Стрелка вверх указывает на предыдущий элемент и стрелка вниз указывает на следующий элемент.

Я положил что-то вместе, но я обеспокоен тем, что я пропустил что-то в тестировании. Там должен быть стандартный способ сделать это, учитывая распространенность ListBoxes там.

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: после каждой функции я вызвать функцию перерисовки экрана, который перерисовывает экран с top_item в верхних и Сел-строки выделены.

Я добавил псевдо-код тег, в случае, если кто-то имеет версию, в то, что не питон.

Задан 20/10/2009 в 14:24
источник пользователем
На других языках...                            


1 ответов

голоса
1

Лишь немногие программы Python реализовать ListBoxes с нуля - они обычно просто взяты из существующих наборов инструментов. Это может объяснить, почему нет никакого реального кросс-инструментарий «стандарт»! -)

Приезжая в свой код, я полагаю , set_posпредназначается , чтобы назвать сразу после либо up_keyили down_keyзакончены (вы не сделаете это совершенно ясно).

Моя главная забота будет о repetitiousness и асимметрии между вашими двумя _keyрутин. Конечно , учитывая , что ваши данные очень похожи на клавиши вверх и вниз, вы хотите делегировать одну функцию , которая принимает «приращение» аргумент, +1 или -1. Эта общая функция может сначала сделать self.sel_row += increment, а затем сразу же вернуться в общем случае , когда sel_rowвсе еще в порядке, то есть if self.top_item <= self.sel_row < self.top_item + self.screen_rows; в противном случае иметь дело со случаями , когда sel_rowпокинул отображаемый в данный момент регион, путь регулирования self.top_item, выход , если это не приводит к необходимости Wraparound, или , наконец , дела со случаями сервопривода.

Я заинтересован, чтобы применить «плоский лучше, чем вложенный», многократно используя конструкции вида «сделать некоторые требуемое состояние шанс, если что-то сейчас хорошо, возвращение», а не логически более сложным «, если делать простую вещь будет хорошо , затем сделать простую вещь, иначе, если что-то немного более сложным, но не страшно нужно, то делать что-то сложное, иначе, если мы в самом деле сложный случай, дело с очень сложной проблемой»- последняя далеко более склонны к ошибкам и труднее следовать в любом случае.

Ответил 20/10/2009 в 16:30
источник пользователем

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