[tor-commits] r24265: {arm} Reimplementing layouts for the connection panel This is most (in arm/trunk/src: interface/connections util)

Damian Johnson atagar1 at gmail.com
Fri Feb 25 05:17:40 UTC 2011


Author: atagar
Date: 2011-02-25 05:17:40 +0000 (Fri, 25 Feb 2011)
New Revision: 24265

Modified:
   arm/trunk/src/interface/connections/connPanel.py
   arm/trunk/src/interface/connections/listings.py
   arm/trunk/src/util/torTools.py
Log:
Reimplementing layouts for the connection panel
This is mostly functionally equivilant, but a sane implementation (there was a lot of headaches and voodoo in figuring out where previous measurements came from), plus has better space allocation. Columns have priorities for determining which are shown in the limited space. However, we're now fitting in lower priority entries that fit even if there isn't room for a bigger but higher priority column.

added: smarter space utilization, filling in smaller columns if there isn't room for higher priority but larger entries
fix: trivial crashing bug when fecthing relay nicknames



Modified: arm/trunk/src/interface/connections/connPanel.py
===================================================================
--- arm/trunk/src/interface/connections/connPanel.py	2011-02-24 22:47:15 UTC (rev 24264)
+++ arm/trunk/src/interface/connections/connPanel.py	2011-02-25 05:17:40 UTC (rev 24265)
@@ -147,7 +147,8 @@
       xLoc = scrollOffset
       
       # prefix (entry data which is largely static, plus the time label)
-      entryLabel = entry.getLabel(Listing.IP, width - scrollOffset)
+      # the right content (time and type) takes seventeen columns
+      entryLabel = entry.getLabel(Listing.IP, width - scrollOffset - 17)
       timeLabel = uiTools.getTimeLabel(currentTime - entry.startTime, 1)
       prefixLabel = "%s%5s (" % (entryLabel, timeLabel)
       

Modified: arm/trunk/src/interface/connections/listings.py
===================================================================
--- arm/trunk/src/interface/connections/listings.py	2011-02-24 22:47:15 UTC (rev 24264)
+++ arm/trunk/src/interface/connections/listings.py	2011-02-25 05:17:40 UTC (rev 24265)
@@ -23,6 +23,11 @@
                   Category.CLIENT: "cyan",   Category.DIRECTORY: "magenta",
                   Category.CONTROL: "red"}
 
+# static data for listing format
+# <src>  -->  <dst>  <etc><padding>
+LABEL_FORMAT = "%s  -->  %s  %s%s"
+LABEL_MIN_PADDING = 2 # min space between listing label and following data
+
 class Endpoint:
   """
   Collection of attributes associated with a connection endpoint. This is a
@@ -281,9 +286,15 @@
     myType = self.getType()
     dstAddress = self.getDestinationLabel(26, DestAttr.LOCALE)
     
+    # The required widths are the sum of the following:
+    # - room for LABEL_FORMAT and LABEL_MIN_PADDING (11 characters)
+    # - base data for the listing
+    # - that extra field plus any previous
+    
+    usedSpace = len(LABEL_FORMAT % tuple([""] * 4)) + LABEL_MIN_PADDING
+    
     src, dst, etc = "", "", ""
     if listingType == connPanel.Listing.IP:
-      # base data requires 73 characters
       myExternalIpAddr = conn.getInfo("address", self.local.getIpAddr())
       addrDiffer = myExternalIpAddr != self.local.getIpAddr()
       
@@ -291,44 +302,50 @@
       src = "%-21s" % srcAddress # ip:port = max of 21 characters
       dst = "%-26s" % dstAddress # ip:port (xx) = max of 26 characters
       
-      if width > 115:
+      usedSpace += len(src) + len(dst) # base data requires 47 characters
+      
+      if width > usedSpace + 42:
         # show fingerprint (column width: 42 characters)
         etc += "%-40s  " % self.foreign.getFingerprint()
+        usedSpace += 42
       
-      if addrDiffer and width > 143:
+      if addrDiffer and width > usedSpace + 28:
         # include the internal address in the src (extra 28 characters)
         internalAddress = "%s:%s" % (self.local.getIpAddr(), self.local.getPort())
         src = "%-21s  -->  %s" % (internalAddress, src)
+        usedSpace += 28
       
-      if (not addrDiffer and width > 143) or width > 155:
+      if width > usedSpace + 10:
         # show nickname (column width: remainder)
-        nicknameSpace = width - 146
+        nicknameSpace = width - usedSpace
         nicknameLabel = uiTools.cropStr(self.foreign.getNickname(), nicknameSpace, 0)
         etc += ("%%-%is  " % nicknameSpace) % nicknameLabel
+        usedSpace += nicknameSpace + 2
     elif listingType == connPanel.Listing.HOSTNAME:
-      # base data requires 80 characters
+      # 15 characters for source, and a min of 40 reserved for the destination
       src = "localhost:%-5s" % self.local.getPort()
+      usedSpace += len(stc)
+      minHostnameSpace = 40
       
-      # space available for foreign hostname (stretched to claim any free space)
-      hostnameSpace = width - 42
-      
-      if width > 108:
+      if width > usedSpace + minHostnameSpace + 28:
         # show destination ip/port/locale (column width: 28 characters)
-        hostnameSpace -= 28
         etc += "%-26s  " % dstAddress
+        usedSpace += 28
       
-      if width > 134:
+      if width > usedSpace + minHostnameSpace + 42:
         # show fingerprint (column width: 42 characters)
-        hostnameSpace -= 42
         etc += "%-40s  " % self.foreign.getFingerprint()
+        usedSpace += 42
       
-      if width > 151:
+      if width > usedSpace + minHostnameSpace + 17:
         # show nickname (column width: min 17 characters, uses half of the remainder)
-        nicknameSpace = 15 + (width - 151) / 2
-        hostnameSpace -= (nicknameSpace + 2)
+        nicknameSpace = 15 + (width - (usedSpace + minHostnameSpace + 17)) / 2
         nicknameLabel = uiTools.cropStr(self.foreign.getNickname(), nicknameSpace, 0)
         etc += ("%%-%is  " % nicknameSpace) % nicknameLabel
+        usedSpace += (nicknameSpace + 2)
       
+      hostnameSpace = width - usedSpace
+      usedSpace = width
       if self.isPrivate():
         dst = ("%%-%is" % hostnameSpace) % "<scrubbed>"
       else:
@@ -342,45 +359,58 @@
         hostname = uiTools.cropStr(hostname, hostnameSpace, 0)
         dst = ("%%-%is:%%-5s" % hostnameSpace) % (hostname, port)
     elif listingType == connPanel.Listing.FINGERPRINT:
-      # base data requires 75 characters
       src = "localhost"
       if myType == Category.CONTROL: dst = "localhost"
       else: dst = self.foreign.getFingerprint()
       dst = "%-40s" % dst
       
-      if width > 92:
-        # show nickname (column width: min 17 characters, uses remainder if extra room's available)
-        nicknameSpace = width - 78 if width < 126 else width - 106
+      usedSpace += len(src) + len(dst) # base data requires 49 characters
+      
+      if width > usedSpace + 17:
+        # show nickname (column width: min 17 characters, consumes any remaining space)
+        nicknameSpace = width - usedSpace
+        
+        # if there's room then also show a column with the destination
+        # ip/port/locale (column width: 28 characters)
+        isIpLocaleIncluded = width > usedSpace + 45
+        if isIpLocaleIncluded: nicknameSpace -= 28
+        
+        nicknameSpace = width - usedSpace - 28 if isIpLocaleVisible else width - usedSpace
         nicknameLabel = uiTools.cropStr(self.foreign.getNickname(), nicknameSpace, 0)
         etc += ("%%-%is  " % nicknameSpace) % nicknameLabel
-      
-      if width > 125:
-        # show destination ip/port/locale (column width: 28 characters)
-        etc += "%-26s  " % dstAddress
+        usedSpace += nicknameSpace + 2
+        
+        if isIpLocaleIncluded:
+          etc += "%-26s  " % dstAddress
+          usedSpace += 28
     else:
-      # base data uses whatever extra room's available (using minimun of 50 characters)
+      # base data requires 50 min characters
       src = self.local.getNickname()
       if myType == Category.CONTROL: dst = self.local.getNickname()
       else: dst = self.foreign.getNickname()
+      minBaseSpace = 50
       
-      # space available for foreign nickname
-      nicknameSpace = width - len(src) - 27
-      
-      if width > 92:
+      if width > usedSpace + minBaseSpace + 42:
         # show fingerprint (column width: 42 characters)
-        nicknameSpace -= 42
         etc += "%-40s  " % self.foreign.getFingerprint()
+        usedSpace += 42
       
-      if width > 120:
+      if width > usedSpace + minBaseSpace + 28:
         # show destination ip/port/locale (column width: 28 characters)
-        nicknameSpace -= 28
         etc += "%-26s  " % dstAddress
+        usedSpace += 28
       
-      dst = ("%%-%is" % nicknameSpace) % dst
+      baseSpace = width - usedSpace
+      if len(src) + len(dst) > baseSpace:
+        src = uiTools.cropStr(src, baseSpace / 3)
+        dst = uiTools.cropStr(dst, baseSpace - len(src))
+      
+      # pads dst entry to its max space
+      dst = ("%%-%is" % (baseSpace - len(src))) % dst
     
     if myType == Category.INBOUND: src, dst = dst, src
-    padding = width - len(src) - len(dst) - len(etc) - 27
-    self._labelCache = "%s  -->  %s  %s%s" % (src, dst, etc, " " * padding)
+    padding = " " * (width - usedSpace + LABEL_MIN_PADDING)
+    self._labelCache = LABEL_FORMAT % (src, dst, etc, padding)
     self._labelCacheArgs = (listingType, width)
     
     return self._labelCache

Modified: arm/trunk/src/util/torTools.py
===================================================================
--- arm/trunk/src/util/torTools.py	2011-02-24 22:47:15 UTC (rev 24264)
+++ arm/trunk/src/util/torTools.py	2011-02-25 05:17:40 UTC (rev 24265)
@@ -911,7 +911,7 @@
     if self.isAlive():
       # query the nickname if it isn't yet cached
       if not relayFingerprint in self._nicknameLookupCache:
-        if relayFingerprint == getInfo("fingerprint"):
+        if relayFingerprint == self.getInfo("fingerprint"):
           # this is us, simply check the config
           myNickname = self.getOption("Nickname", "Unnamed")
           self._nicknameLookupCache[relayFingerprint] = myNickname



More information about the tor-commits mailing list