[tor-commits] [arm/release] Expanding config screen to allow arbitrary options

atagar at torproject.org atagar at torproject.org
Sun Jul 17 06:08:28 UTC 2011


commit 83d1e367a003ec84b54527d470dde01901da6961
Author: Damian Johnson <atagar at torproject.org>
Date:   Sun Jun 26 14:04:35 2011 -0700

    Expanding config screen to allow arbitrary options
    
    Preping the configuration screen of the wizard to allow for other sets of
    options for different relay types.
---
 src/cli/wizard.py |   64 +++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 43 insertions(+), 21 deletions(-)

diff --git a/src/cli/wizard.py b/src/cli/wizard.py
index a3404b9..dadea16 100644
--- a/src/cli/wizard.py
+++ b/src/cli/wizard.py
@@ -14,12 +14,20 @@ from util import enum, uiTools
 RelayType = enum.Enum("RELAY", "EXIT", "BRIDGE", "CLIENT")
 
 # all options that can be configured
-Options = enum.Enum("NICKNAME", "CONTACT", "NOTIFY", "BANDWIDTH", "LIMIT", "STARTUP")
-RelayOptions = (Options.NICKNAME, Options.CONTACT, Options.NOTIFY, Options.BANDWIDTH, Options.LIMIT, Options.STARTUP)
+Options = enum.Enum("DIVIDER", "NICKNAME", "CONTACT", "NOTIFY", "BANDWIDTH", "LIMIT", "STARTUP")
+RelayOptions = {RelayType.RELAY: (Options.NICKNAME,
+                                  Options.CONTACT,
+                                  Options.NOTIFY,
+                                  Options.BANDWIDTH,
+                                  Options.DIVIDER,
+                                  Options.DIVIDER,
+                                  Options.LIMIT,
+                                  Options.STARTUP)}
 
 # other options provided in the prompts
 CANCEL, NEXT, BACK = "Cancel", "Next", "Back"
 
+DESC_SIZE = 5 # height of the description field
 MSG_COLOR = "green"
 OPTION_COLOR = "yellow"
 
@@ -97,6 +105,10 @@ def showWizard():
   relayType, config = None, {}
   
   for option in Options.values():
+    if option == Options.DIVIDER:
+      config[option] = option
+      continue
+    
     toggleValues = CONFIG["wizard.toggle"].get(option)
     default = CONFIG["wizard.default"].get(option, "")
     
@@ -116,13 +128,10 @@ def showWizard():
       if selection == CANCEL: break
       else: relayType = selection
     else:
-      if relayType == RelayType.RELAY:
-        selection = promptRelayOptions(config)
-        
-        if selection == BACK: relayType = None
-        elif selection == NEXT: break # TODO: implement next screen
-      else:
-        break # TODO: other catagories not yet implemented
+      selection = promptConfigOptions(relayType, config)
+      
+      if selection == BACK: relayType = None
+      elif selection == NEXT: break # TODO: implement next screen
     
     # redraws screen to clear away the dialog we just showed
     cli.controller.getController().requestRedraw(True)
@@ -134,7 +143,7 @@ def promptRelayType():
   dialog was canceled.
   """
   
-  popup, _, _ = cli.popups.init(24, 58)
+  popup, _, _ = cli.popups.init(25, 58)
   if not popup: return
   control = cli.controller.getController()
   key, selection = 0, 0
@@ -181,17 +190,25 @@ def promptRelayType():
   finally:
     cli.popups.finalize()
 
-def promptRelayOptions(config):
+def promptConfigOptions(relayType, config):
   """
   Prompts the user for the configuration of an internal relay.
   """
   
-  popup, _, _ = cli.popups.init(23, 58)
-  if not popup: return
-  control = cli.controller.getController()
-  options = [config[opt] for opt in RelayOptions]
+  # TODO: skipping section if it isn't ready yet
+  if not relayType in RelayOptions: return NEXT
+  
+  topContent = _splitStr(CONFIG.get("wizard.message.%s" % relayType.lower(), ""), 54)
+  
+  options = [config[opt] for opt in RelayOptions[relayType]]
+  options.append(Options.DIVIDER)
   options.append(ConfigOption(BACK, "general", "(to role selection)"))
   options.append(ConfigOption(NEXT, "general", "(to confirm options)"))
+  
+  popupHeight = len(topContent) + len(options) + DESC_SIZE + 5
+  popup, _, _ = cli.popups.init(popupHeight, 58)
+  if not popup: return
+  control = cli.controller.getController()
   key, selection = 0, 0
   
   try:
@@ -202,21 +219,21 @@ def promptRelayOptions(config):
       popup.win.box()
       
       # provides the description for internal relays
-      topContent = _splitStr(CONFIG["wizard.message.relay"], 54)
       for i in range(len(topContent)):
         popup.addstr(i + 1, 2, topContent[i], curses.A_BOLD | uiTools.getColor(MSG_COLOR))
       
       y, offset = len(topContent) + 1, 0
       for i in range(len(options)):
+        if options[i] == Options.DIVIDER:
+          offset += 1
+          continue
+        
         label = " %-30s%s" % (options[i].getLabel(), options[i].getDisplayValue())
         optionFormat = curses.A_BOLD | uiTools.getColor(OPTION_COLOR)
         if i == selection: optionFormat |= curses.A_STANDOUT
         
         offset += 1
         popup.addstr(y + offset, 2, uiTools.padStr(label, 54), optionFormat)
-        
-        # extra space to divide options/navigation
-        if i == len(options) - 3: offset += 1
       
       # divider between the options and description
       offset += 2
@@ -232,8 +249,13 @@ def promptRelayOptions(config):
       popup.win.refresh()
       key = control.getScreen().getch()
       
-      if key == curses.KEY_UP: selection = (selection - 1) % len(options)
-      elif key == curses.KEY_DOWN: selection = (selection + 1) % len(options)
+      if key in (curses.KEY_UP, curses.KEY_DOWN):
+        posOffset = -1 if key == curses.KEY_UP else 1
+        selection = (selection + posOffset) % len(options)
+        
+        # skips dividers
+        while options[selection] == Options.DIVIDER:
+          selection = (selection + posOffset) % len(options)
       elif uiTools.isSelectionKey(key):
         if selection == len(options) - 2: return BACK # selected back
         elif selection == len(options) - 1: return NEXT # selected next





More information about the tor-commits mailing list