[tor-commits] [arm/master] Dropping alternative menu implementation

atagar at torproject.org atagar at torproject.org
Mon Jun 13 01:40:55 UTC 2011


commit ee2589f311dee651c0c8d47705ebb5cb07c95a23
Author: Damian Johnson <atagar at torproject.org>
Date:   Sun Jun 12 18:30:25 2011 -0700

    Dropping alternative menu implementation
    
    The other menus are complete now to dropping Kamran's implementation.
---
 src/cli/controller.py        |   11 -
 src/cli/menu/menu.py         |    3 +
 src/cli/menu_alt/__init__.py |    6 -
 src/cli/menu_alt/menu.py     |  439 ------------------------------------------
 src/cli/menu_alt/menuItem.py |   41 ----
 5 files changed, 3 insertions(+), 497 deletions(-)

diff --git a/src/cli/controller.py b/src/cli/controller.py
index 6158ade..b019f8e 100644
--- a/src/cli/controller.py
+++ b/src/cli/controller.py
@@ -8,7 +8,6 @@ import curses
 import threading
 
 import cli.menu.menu
-import cli.menu_alt.menu
 import cli.popups
 import cli.headerPanel
 import cli.logPanel
@@ -527,8 +526,6 @@ def drawTorMonitor(stdscr, startTime):
   overrideKey = None     # uses this rather than waiting on user input
   isUnresponsive = False # flag for heartbeat responsiveness check
 
-  menuKeys = []
-  
   while not control.isDone():
     displayPanels = control.getDisplayPanels()
     isUnresponsive = heartbeatCheck(isUnresponsive)
@@ -563,14 +560,6 @@ def drawTorMonitor(stdscr, startTime):
       control.prevPage()
     elif key == ord('p') or key == ord('P'):
       control.setPaused(not control.isPaused())
-    elif key == ord('n') or key == ord('N'):
-      menu = cli.menu_alt.menu.Menu()
-      menuKeys = menu.showMenu(keys=menuKeys)
-      if menuKeys != []:
-        for key in (ord('n'), ord('q'), ord('x')):
-          if key in menuKeys:
-            menuKeys.remove(key)
-            overrideKey = key
     elif key == ord('m') or key == ord('M'):
       cli.menu.menu.showMenu()
     elif key == ord('q') or key == ord('Q'):
diff --git a/src/cli/menu/menu.py b/src/cli/menu/menu.py
index b411a9c..1dbbbd0 100644
--- a/src/cli/menu/menu.py
+++ b/src/cli/menu/menu.py
@@ -1,3 +1,6 @@
+"""
+Display logic for presenting the menu.
+"""
 
 import curses
 
diff --git a/src/cli/menu_alt/__init__.py b/src/cli/menu_alt/__init__.py
deleted file mode 100644
index 6d7b6b7..0000000
--- a/src/cli/menu_alt/__init__.py
+++ /dev/null
@@ -1,6 +0,0 @@
-"""
-Resources for displaying the menu.
-"""
-
-__all__ = ["menuItem", "menu"]
-
diff --git a/src/cli/menu_alt/menu.py b/src/cli/menu_alt/menu.py
deleted file mode 100644
index 7e10366..0000000
--- a/src/cli/menu_alt/menu.py
+++ /dev/null
@@ -1,439 +0,0 @@
-"""
-A drop-down menu for sending actions to panels.
-"""
-
-import curses
-
-import cli.controller
-import cli.menu_alt.menuItem as menuItem
-import cli.popups
-
-from cli.graphing.graphPanel import Bounds as GraphBounds
-from util import log, panel, uiTools
-
-PARENTLEVEL, TOPLEVEL = (-1, 0)
-
-class Menu():
-  """Displays a popup menu and sends keys to appropriate panels"""
-
-  def __init__(self, item=None):
-    DEFAULT_ROOT = menuItem.MenuItem(label="Root", children=(
-      menuItem.MenuItem(label="File", children=(
-        menuItem.MenuItem(label="Exit",
-                          callback=lambda item: self._callbackReturnKey(ord('q'))),)),
-      menuItem.MenuItem(label="Logs", children=(
-        menuItem.MenuItem(label="Events",
-                          callback=lambda item: self._callbackPressKey('log', ord('e'))),
-        menuItem.MenuItem(label="Clear",
-                          callback=lambda item: self._callbackPressKey('log', ord('c'))),
-        menuItem.MenuItem(label="Save",
-                          callback=lambda item: self._callbackPressKey('log', ord('a'))),
-        menuItem.MenuItem(label="Filter",
-                          callback=lambda item: self._callbackPressKey('log', ord('f'))),
-        menuItem.MenuItem(label="Duplicates", children=(
-          menuItem.MenuItem(label="Hidden",
-                            callback=lambda item: self._callbackSet('log', 'showDuplicates', False, ord('u')),
-                            enabled=lambda: self._getItemEnabled('log', 'showDuplicates', False)),
-          menuItem.MenuItem(label="Visible",
-                            callback=lambda item: self._callbackSet('log', 'showDuplicates', True, ord('u')),
-                            enabled=lambda: self._getItemEnabled('log', 'showDuplicates', True)),
-          )))),
-      menuItem.MenuItem(label="View", children=(
-        menuItem.MenuItem(label="Graph",
-                          callback=lambda item: self._callbackView('graph')),
-        menuItem.MenuItem(label="Connections",
-                          callback=lambda item: self._callbackView('conn')),
-        menuItem.MenuItem(label="Configuration",
-                          callback=lambda item: self._callbackView('configState')),
-        menuItem.MenuItem(label="Configuration File",
-                          callback=lambda item: self._callbackView('configFile')),)),
-      menuItem.MenuItem(label="Graph", children=(
-        menuItem.MenuItem(label="Stats",
-                          callback=lambda item: self._callbackPressKey('graph', ord('s'))),
-        menuItem.MenuItem(label="Size", children=(
-          menuItem.MenuItem(label="Increase",
-                            callback=lambda item: self._callbackPressKey('graph', ord('m'))),
-          menuItem.MenuItem(label="Decrease",
-                            callback=lambda item: self._callbackPressKey('graph', ord('n'))),
-        )),
-        menuItem.MenuItem(label="Update Interval",
-                            callback=lambda item: self._callbackPressKey('graph', ord('i'))),
-        menuItem.MenuItem(label="Bounds", children=(
-          menuItem.MenuItem(label="Local Max",
-                            callback=lambda item: self._callbackSet('graph', 'bounds', GraphBounds.LOCAL_MAX, ord('b')),
-                            enabled=lambda: self._getItemEnabled('graph', 'bounds', GraphBounds.LOCAL_MAX)),
-          menuItem.MenuItem(label="Global Max",
-                            callback=lambda item: self._callbackSet('graph', 'bounds', GraphBounds.GLOBAL_MAX, ord('b')),
-                            enabled=lambda: self._getItemEnabled('graph', 'bounds', GraphBounds.GLOBAL_MAX)),
-          menuItem.MenuItem(label="Tight",
-                            callback=lambda item: self._callbackSet('graph', 'bounds', GraphBounds.TIGHT, ord('b')),
-                            enabled=lambda: self._getItemEnabled('graph', 'bounds', GraphBounds.TIGHT)),
-        )),)),
-      menuItem.MenuItem(label="Connections", children=(
-        menuItem.MenuItem(label="Identity",
-                            callback=lambda item: self._callbackPressKey('conn', ord('l'))),
-        menuItem.MenuItem(label="Resolver",
-                            callback=lambda item: self._callbackPressKey('conn', ord('u'))),
-        menuItem.MenuItem(label="Sort Order",
-                            callback=lambda item: self._callbackPressKey('conn', ord('s'))),
-        )),
-      menuItem.MenuItem(label="Configuration" , children=(
-        menuItem.MenuItem(label="Comments", children=(
-          menuItem.MenuItem(label="Hidden",
-                            callback=lambda item: self._callbackSet('configFile', 'stripComments', True, ord('s')),
-                            enabled=lambda: self._getItemEnabled('configFile', 'stripComments', True)),
-          menuItem.MenuItem(label="Visible",
-                            callback=lambda item: self._callbackSet('configFile', 'stripComments', False, ord('s')),
-                            enabled=lambda: self._getItemEnabled('configFile', 'stripComments', False)),
-        )),
-        menuItem.MenuItem(label="Reload",
-                          callback=lambda item: self._callbackPressKey('configFile', ord('r'))),
-        menuItem.MenuItem(label="Reset Tor",
-                          callback=lambda item: self._callbackReturnKey(ord('x'))),))
-      ))
-
-    self._first = [0]
-    self._selection = [0]
-
-    if item and item.isParent():
-      self._rootItem = item
-    else:
-      self._rootItem = DEFAULT_ROOT
-
-  def showMenu(self, keys=[]):
-    keys.reverse()
-    returnkeys = []
-
-    popup, width, height = cli.popups.init(height=3)
-    if popup:
-      try:
-        while True:
-          popup.win.erase()
-          popup.win.box()
-
-          self._drawTopLevel(popup, width, height)
-
-          popup.win.refresh()
-
-          control = cli.controller.getController()
-
-          if keys == []:
-            key = control.getScreen().getch()
-          else:
-            key = keys.pop()
-
-          if key == curses.KEY_RIGHT:
-            self._moveTopLevelRight(width)
-          elif key == curses.KEY_LEFT:
-            self._moveTopLevelLeft(width)
-          elif key == curses.KEY_DOWN:
-            cascaded, returnkeys = self._cascadeNLevel()
-            break
-          elif key == 27:
-            break
-          elif uiTools.isSelectionKey(key):
-            self._handleEvent()
-            break
-
-      finally:
-        cli.popups.finalize()
-
-    return returnkeys
-
-  def _appendLevel(self):
-    self._first.append(0)
-    self._selection.append(0)
-
-  def _removeLevel(self):
-    self._first.pop()
-    self._selection.pop()
-
-  def _getCurrentTopLevelItem(self):
-    index = self._first[TOPLEVEL] + self._selection[TOPLEVEL]
-    return self._rootItem.getChildren()[index]
-
-  def _getCurrentItem(self, level=0):
-    item = self._rootItem
-    if level == 0:
-      sums = [sum(values) for values in zip(self._first, self._selection)]
-    else:
-      sums = [sum(values) for values in zip(self._first[:level], self._selection[:level])]
-
-    for index in sums:
-      if item.isParent():
-        item = item.getChildren()[index]
-      else:
-        break
-
-    return item
-
-  def _calculateTopLevelWidths(self, width=0):
-    labels = [menuItem.getLabel() for menuItem in self._rootItem.getChildren()]
-
-    # width per label is set according to the longest label
-    labelwidth = max(map(len, labels)) + 2
-
-    # total number of labels that can be printed in supplied width
-    printable = min(width / labelwidth - 1, self._rootItem.getChildrenCount())
-
-    return (labelwidth, printable)
-
-  def _calculateNLevelWidths(self, level=0):
-    parent = self._getCurrentItem(level)
-
-    if parent.isLeaf():
-      return 0
-
-    labels = [menuItem.getLabel() for menuItem in parent.getChildren()]
-
-    labelwidth = max(map(len, labels))
-
-    return labelwidth
-
-  def _calculateNLevelHeights(self, height=0, level=0):
-    control = cli.controller.getController()
-    height, _ = control.getScreen().getmaxyx()
-    topSize = sum(stickyPanel.getHeight() for stickyPanel in control.getStickyPanels())
-    height = height - topSize
-
-    parent = self._getCurrentItem(level)
-
-    if parent.isLeaf():
-      return 0
-
-    printable = min(height - 4, parent.getChildrenCount())
-
-    return printable if printable else parent.getChildrenCount()
-
-  def _moveTopLevelRight(self, width):
-    _, printable = self._calculateTopLevelWidths(width)
-
-    if self._selection[TOPLEVEL] < printable - 1:
-      self._selection[TOPLEVEL] = self._selection[TOPLEVEL] + 1
-    else:
-      self._selection[TOPLEVEL] = 0
-      if printable < self._rootItem.getChildrenCount():
-        self._first[TOPLEVEL] = (self._first[TOPLEVEL] + printable) % self._rootItem.getChildrenCount()
-
-    if self._first[TOPLEVEL] + self._selection[TOPLEVEL] == self._rootItem.getChildrenCount():
-      self._first[TOPLEVEL] = 0
-      self._selection[TOPLEVEL] = 0
-
-  def _moveTopLevelLeft(self, width):
-    _, printable = self._calculateTopLevelWidths(width)
-
-    if self._selection[TOPLEVEL] > 0:
-      self._selection[TOPLEVEL] = self._selection[TOPLEVEL] - 1
-    else:
-      if self._first[TOPLEVEL] == 0:
-        self._first[TOPLEVEL] = ((self._rootItem.getChildrenCount() / printable) * printable) % self._rootItem.getChildrenCount()
-      else:
-        self._first[TOPLEVEL] = abs(self._first[TOPLEVEL] - printable) % self._rootItem.getChildrenCount()
-      self._selection[TOPLEVEL] = self._rootItem.getChildrenCount() - self._first[TOPLEVEL] - 1
-
-    if self._selection[TOPLEVEL] > printable:
-      self._selection[TOPLEVEL] = printable - 1
-
-  def _drawTopLevel(self, popup, width, height):
-    labelwidth, printable = self._calculateTopLevelWidths(width)
-    children = self._rootItem.getChildren()[self._first[TOPLEVEL]:self._first[TOPLEVEL] + printable]
-
-    top = 1
-    left = 1
-    for (index, item) in enumerate(children):
-      labelformat = curses.A_STANDOUT if index == self._selection[TOPLEVEL] else curses.A_NORMAL
-
-      popup.addch(top, left, curses.ACS_VLINE)
-      left = left + 1
-      popup.addstr(top, left, item.getLabel().center(labelwidth), labelformat)
-      left = left + labelwidth
-
-    popup.addch(top, left, curses.ACS_VLINE)
-    left = left + 1
-
-  def _cascadeNLevel(self):
-    parent = self._getCurrentItem()
-
-    if parent.isLeaf():
-      return (False, [])
-
-    self._appendLevel()
-
-    labelwidth = self._calculateNLevelWidths(level=PARENTLEVEL)
-    printable = self._calculateNLevelHeights(level=PARENTLEVEL)
-
-    toplabelwidth, _ = self._calculateTopLevelWidths()
-    left = (toplabelwidth + 2) * self._selection[TOPLEVEL]
-
-    popup, width, height = cli.popups.init(height=printable+2, width=labelwidth+2, top=2, left=left)
-
-    while self._getCurrentItem().isEnabled() == False:
-      self._moveNLevelDown(height)
-
-    if popup.win:
-      returnkeys = []
-      try:
-        while True:
-          popup.win.erase()
-          popup.win.box()
-
-          self._drawNLevel(popup, width, height)
-
-          popup.win.refresh()
-
-          control = cli.controller.getController()
-          key = control.getScreen().getch()
-
-          if key == curses.KEY_DOWN:
-            self._moveNLevelDown(height)
-          elif key == curses.KEY_UP:
-            self._moveNLevelUp(height)
-          elif key == curses.KEY_RIGHT:
-            cascaded, returnkeys = self._cascadeNLevel()
-            if cascaded == False:
-              index = self._first[TOPLEVEL] + self._selection[TOPLEVEL] + 1
-              returnkeys.append(ord('n'))
-              for i in range(index):
-                returnkeys.append(curses.KEY_RIGHT)
-              returnkeys.append(curses.KEY_DOWN)
-            break
-          elif key == curses.KEY_LEFT:
-            index = self._first[TOPLEVEL] + self._selection[TOPLEVEL] - 1
-            index = index % self._rootItem.getChildrenCount()
-            returnkeys.append(ord('n'))
-            for i in range(index):
-              returnkeys.append(curses.KEY_RIGHT)
-            returnkeys.append(curses.KEY_DOWN)
-            break
-          elif key == 27:
-            self._removeLevel()
-            break
-          elif uiTools.isSelectionKey(key):
-            returnkey = self._handleEvent()
-            if returnkey:
-                returnkeys.append(returnkey)
-            self._removeLevel()
-            break
-
-      finally:
-        cli.popups.finalize()
-
-      return (True, returnkeys)
-
-    return (False, [])
-
-  def _drawNLevel(self, popup, width, height):
-    printable = self._calculateNLevelHeights(level=PARENTLEVEL)
-    parent = self._getCurrentItem(level=PARENTLEVEL)
-    children = parent.getChildren()[self._first[PARENTLEVEL]:self._first[PARENTLEVEL] + printable]
-
-    top = 1
-    left = 1
-    for (index, item) in enumerate(children):
-      labelformat = curses.A_STANDOUT if index == self._selection[PARENTLEVEL] else curses.A_NORMAL
-
-      if not item.isEnabled():
-        labelformat = labelformat | uiTools.getColor('yellow')
-
-      popup.addstr(top, left, item.getLabel(), labelformat)
-      top = top + 1
-
-  def _moveNLevelDown(self, height):
-    printable = self._calculateNLevelHeights(level=PARENTLEVEL)
-    parent = self._getCurrentItem(level=PARENTLEVEL)
-
-    if self._selection[PARENTLEVEL] < printable - 1:
-      self._selection[PARENTLEVEL] = self._selection[PARENTLEVEL] + 1
-    else:
-      self._selection[PARENTLEVEL] = 0
-      if printable < parent.getChildrenCount():
-        self._first[PARENTLEVEL] = (self._first[PARENTLEVEL] + printable) % parent.getChildrenCount()
-
-    if self._first[PARENTLEVEL] + self._selection[PARENTLEVEL] == parent.getChildrenCount():
-      self._first[PARENTLEVEL] = 0
-      self._selection[PARENTLEVEL] = 0
-
-    while self._getCurrentItem().isEnabled() == False:
-      self._moveNLevelDown(height)
-
-  def _moveNLevelUp(self, height):
-    printable = self._calculateNLevelHeights(level=PARENTLEVEL)
-    parent = self._getCurrentItem(level=PARENTLEVEL)
-
-    if self._selection[PARENTLEVEL] > 0:
-      self._selection[PARENTLEVEL] = self._selection[PARENTLEVEL] - 1
-    else:
-      if self._first[PARENTLEVEL] == 0:
-        self._first[PARENTLEVEL] = ((parent.getChildrenCount() / printable) * printable) % parent.getChildrenCount()
-      else:
-        self._first[PARENTLEVEL] = abs(self._first[PARENTLEVEL] - printable) % parent.getChildrenCount()
-      self._selection[PARENTLEVEL] = parent.getChildrenCount() - self._first[PARENTLEVEL] - 1
-
-    if self._selection[PARENTLEVEL] > printable:
-      self._selection[PARENTLEVEL] = printable - 1
-
-    while self._getCurrentItem().isEnabled() == False:
-      self._moveNLevelUp(height)
-
-  def _handleEvent(self):
-    item = self._getCurrentItem()
-
-    if item.isLeaf():
-      return item.select()
-    else:
-      self._cascadeNLevel()
-
-  def _callbackDefault(self, item):
-    log.log(log.NOTICE, "%s selected" % item.getLabel())
-
-  def _callbackView(self, panelname):
-    control = cli.controller.getController()
-
-    start = control.getPage()
-    panels = control.getDisplayPanels(includeSticky=False)
-    panelnames = [panel.getName() for panel in panels]
-    while not panelname in panelnames:
-      control.nextPage()
-      panels = control.getDisplayPanels(includeSticky=False)
-      panelnames = [panel.getName() for panel in panels]
-
-      if control.getPage() == start:
-        log.log(log.ERR, "Panel %s not found" % panelname)
-        break
-
-  def _getItemEnabled(self, panel, attr, value):
-    control = cli.controller.getController()
-    if control:
-      panel = control.getPanel(panel)
-
-      if panel:
-        return getattr(panel, attr, None) != value
-
-      return False
-
-  def _callbackSet(self, panel, attr, value, key=None):
-    control = cli.controller.getController()
-    panel = control.getPanel(panel)
-
-    panelattr = getattr(panel, attr, None)
-
-    if panelattr != None:
-      if hasattr(panelattr, '__call__'):
-        panelattr(value)
-      elif panelattr != value and key != None:
-        start = panelattr
-        while panelattr != value:
-          panel.handleKey(key)
-          panelattr = getattr(panel, attr, None)
-          if panelattr == start:
-            log.log(log.ERR, "Could not set %s.%s" % (panel, attr))
-            break
-
-  def _callbackPressKey(self, panel, key):
-    control = cli.controller.getController()
-    panel = control.getPanel(panel)
-    panel.handleKey(key)
-
-  def _callbackReturnKey(self, key):
-    return key
-
diff --git a/src/cli/menu_alt/menuItem.py b/src/cli/menu_alt/menuItem.py
deleted file mode 100644
index 277c78a..0000000
--- a/src/cli/menu_alt/menuItem.py
+++ /dev/null
@@ -1,41 +0,0 @@
-"""
-Menu Item class, used by the drop-down menus.
-"""
-
-class MenuItem():
-  """
-  Contains title, callback handler and possible children.
-  """
-  
-  def __init__(self, label=None, callback=None, children=[], enabled=None):
-    self._label = label
-    self._callback = callback
-    self._children = children
-    self._enabled = enabled
-  
-  def getLabel(self):
-    return self._label
-  
-  def isLeaf(self):
-    return self._children == []
-  
-  def isParent(self):
-    return self._children != []
-  
-  def isEnabled(self):
-    if self._enabled == None:
-      return True
-    elif hasattr(self._enabled, '__call__'):
-      return self._enabled()
-    else:
-      return self._enabled
-  
-  def getChildren(self):
-    return self._children
-  
-  def getChildrenCount(self):
-    return len(self._children)
-  
-  def select(self):
-    return self._callback(self)
-



More information about the tor-commits mailing list