Major refactor, Items now names Entries

This commit is contained in:
PhilipTrauner 2016-01-31 20:38:49 +01:00
parent 240114e0cd
commit f95c83be52

View file

@ -12,73 +12,76 @@ class Input:
self.on_done, self.on_change, self.on_cancel) self.on_done, self.on_change, self.on_cancel)
class Item: class Entry:
def __init__(self, name, description="", action=None, items=None, input=None): def __init__(self, name, description="", action=None, kwargs={}, sub_menu=None, input=None):
self.name = name self.name = name
self.description = description self.description = description
self.action = action self.action = action
self.items = items self.kwargs = kwargs
self.sub_menu = sub_menu
self.input = input self.input = input
def __eq__(self, other): def __eq__(self, other):
return self.__dict__ == other.__dict__ return self.__dict__ == other.__dict__
class Items: class Menu:
def __init__(self, selected_index=-1, on_highlight=None): def __init__(self, selected_index=-1, on_highlight=None, subtitles=True):
self.selected_index = selected_index self.selected_index = selected_index
self.on_highlight = on_highlight self.on_highlight = on_highlight
self.items = {} self.subtitles = subtitles
self.item_names = [] self.entries = {}
self.window = None self.window = None
self.back = None self.back = None
def invoke(self, window, back=None): def invoke(self, window, back=None):
self.window = window self.window = window
if back:
items = [["Back", "Back to previous menu"]] + self.item_names[:]
self.back = back self.back = back
else: entries = self.menu_entries
items = self.item_names if back:
self.back = None entries.insert(0, ["Back", "Back to previous menu"])
window.show_quick_panel(items, self._action, if not self.subtitles:
for entry_index in range(len(entries)):
del entries[entry_index][1]
window.show_quick_panel(entries, self._action,
flags=0, selected_index=self.selected_index, flags=0, selected_index=self.selected_index,
on_highlight=self.on_highlight) on_highlight=self.on_highlight)
def _action(self, item_id): def _action(self, entry_id):
if item_id != -1: if entry_id != -1:
if self.back: if self.back:
if item_id != 0: if entry_id != 0:
item = self.items[item_id - 1] entry = self.entries[entry_id - 1]
else: else:
self.back.invoke(self.window) self.back.invoke(self.window)
return return
else: else:
item = self.items[item_id] entry = self.entries[entry_id]
if item.action != None: if entry.action != None:
item.action() entry.action(**entry.kwargs)
if item.input != None: if entry.input != None:
item.input.invoke(self.window) entry.input.invoke(self.window)
if item.items != None: if entry.sub_menu != None:
item.items.invoke(self.window, back=self) entry.sub_menu.invoke(self.window, back=self)
@property
def menu_entries(self):
entries = []
for entry_id in self.entries:
entries.append([self.entries[entry_id].name, self.entries[entry_id].description])
return entries
def add_item(self, item): def add(self, entry):
if len(self.items) > 0: if len(self.entries) > 0:
item_id = tuple(self.items.keys())[-1] + 1 entry_id = tuple(self.entries.keys())[-1] + 1
else: else:
item_id = 0 entry_id = 0
self.items[item_id] = item self.entries[entry_id] = entry
if item.description != None:
self.item_names.append([item.name, item.description])
else:
self.item_names.append([item.name, ""])
def rm_item(self, item):
if item in self.items.values(): def remove(self, entry):
for i in self.items: if entry in self.entries.values():
if self.items[i] == item: for entry_id in self.entries:
del self.items[i] if self.entries[entry_id] == entry:
del self.item_names[i] del self.entries[entry_id]
return True
return False