[tor-commits] [vidalia/alpha] Improve search in the routers list by adding a search field

chiiph at torproject.org chiiph at torproject.org
Sat Jul 2 22:06:27 UTC 2011


commit d2ba7d6b2d3a429f66571039dd2d56154aba6ffb
Author: Thibault Vataire <vatairethibault at no-log.org>
Date:   Thu Jun 16 20:30:41 2011 +0200

    Improve search in the routers list by adding a search field
---
 src/vidalia/network/NetViewer.cpp        |   12 ++++
 src/vidalia/network/NetViewer.h          |    3 +
 src/vidalia/network/NetViewer.ui         |   91 +++++++++++++++++++++---------
 src/vidalia/network/RouterListWidget.cpp |   34 +++++++++++
 src/vidalia/network/RouterListWidget.h   |    5 ++
 5 files changed, 118 insertions(+), 27 deletions(-)

diff --git a/src/vidalia/network/NetViewer.cpp b/src/vidalia/network/NetViewer.cpp
index 405fd35..0e0a161 100644
--- a/src/vidalia/network/NetViewer.cpp
+++ b/src/vidalia/network/NetViewer.cpp
@@ -128,6 +128,10 @@ NetViewer::NetViewer(QWidget *parent)
           _torControl, SLOT(closeCircuit(CircuitId)));
   connect(ui.treeCircuitList, SIGNAL(closeStream(StreamId)),
           _torControl, SLOT(closeStream(StreamId)));
+  connect(ui.lineRouterSearch, SIGNAL(returnPressed()),
+          this, SLOT(onRouterSearch()));
+  connect(ui.lineRouterSearch, SIGNAL(textChanged(QString)),
+          ui.treeRouterList, SLOT(onRouterSearch(QString)));
 
   setupGeoIpResolver();
 
@@ -246,6 +250,14 @@ NetViewer::clear()
   ui.textRouterInfo->clear();
 }
 
+/** Called when the search of a router is triggered by the signal 
+ * returnPressed from the search field. */
+void
+NetViewer::onRouterSearch()
+{
+  ui.treeRouterList->searchNextRouter(ui.lineRouterSearch->text());
+}
+
 /** Loads a list of all current address mappings. */
 void
 NetViewer::loadAddressMap()
diff --git a/src/vidalia/network/NetViewer.h b/src/vidalia/network/NetViewer.h
index 3c0a675..b1c40be 100644
--- a/src/vidalia/network/NetViewer.h
+++ b/src/vidalia/network/NetViewer.h
@@ -101,6 +101,9 @@ private slots:
   /** Called when the user clicks "Full Screen" or presses Escape on the map.
    * Toggles the map between normal and a full screen viewing modes. */
   void toggleFullScreen();
+  /** Called when the search of a router is triggered by the signal 
+   * returnPressed from the search field. */
+  void onRouterSearch();
 
 private:
   /** */
diff --git a/src/vidalia/network/NetViewer.ui b/src/vidalia/network/NetViewer.ui
index 863907b..11fd0a2 100644
--- a/src/vidalia/network/NetViewer.ui
+++ b/src/vidalia/network/NetViewer.ui
@@ -28,9 +28,9 @@
      <property name="childrenCollapsible">
       <bool>false</bool>
      </property>
-     <widget class="RouterListWidget" name="treeRouterList">
+     <widget class="QSplitter" name="splitter4">
       <property name="sizePolicy">
-       <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
+       <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
         <horstretch>1</horstretch>
         <verstretch>0</verstretch>
        </sizepolicy>
@@ -42,38 +42,75 @@
        </size>
       </property>
       <property name="contextMenuPolicy">
-       <enum>Qt::DefaultContextMenu</enum>
-      </property>
-      <property name="statusTip">
-       <string/>
-      </property>
-      <property name="selectionMode">
-       <enum>QAbstractItemView::ExtendedSelection</enum>
-      </property>
-      <property name="indentation">
-       <number>0</number>
+       <enum>Qt::NoContextMenu</enum>
       </property>
-      <property name="sortingEnabled">
-       <bool>true</bool>
+      <property name="orientation">
+       <enum>Qt::Vertical</enum>
       </property>
-      <property name="columnCount">
-       <number>3</number>
+      <property name="childrenCollapsible">
+       <bool>false</bool>
       </property>
-      <column>
-       <property name="text">
-        <string/>
+      <widget class="QLineEdit" name="lineRouterSearch">
+       <property name="minimumSize">
+        <size>
+         <width>0</width>
+         <height>30</height>
+        </size>
        </property>
-      </column>
-      <column>
-       <property name="text">
+       <property name="maximumSize">
+        <size>
+         <width>16777215</width>
+         <height>30</height>
+        </size>
+       </property>
+      </widget>
+      <widget class="RouterListWidget" name="treeRouterList">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
+         <horstretch>1</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="minimumSize">
+        <size>
+         <width>175</width>
+         <height>0</height>
+        </size>
+       </property>
+       <property name="contextMenuPolicy">
+        <enum>Qt::DefaultContextMenu</enum>
+       </property>
+       <property name="statusTip">
         <string/>
        </property>
-      </column>
-      <column>
-       <property name="text">
-        <string>Relay</string>
+       <property name="selectionMode">
+        <enum>QAbstractItemView::ExtendedSelection</enum>
+       </property>
+       <property name="indentation">
+        <number>0</number>
        </property>
-      </column>
+       <property name="sortingEnabled">
+        <bool>true</bool>
+       </property>
+       <property name="columnCount">
+        <number>3</number>
+       </property>
+       <column>
+        <property name="text">
+         <string/>
+        </property>
+       </column>
+       <column>
+        <property name="text">
+         <string/>
+        </property>
+       </column>
+       <column>
+        <property name="text">
+         <string>Relay</string>
+        </property>
+       </column>
+      </widget>
      </widget>
      <widget class="QSplitter" name="splitter3">
       <property name="sizePolicy">
diff --git a/src/vidalia/network/RouterListWidget.cpp b/src/vidalia/network/RouterListWidget.cpp
index e35bc22..851a5ea 100644
--- a/src/vidalia/network/RouterListWidget.cpp
+++ b/src/vidalia/network/RouterListWidget.cpp
@@ -152,6 +152,40 @@ RouterListWidget::clearRouters()
   setStatusTip(tr("%1 relays online").arg(0));
 }
 
+/** Called when the search of a router is triggered by the signal
+ * textChanged from the search field. */
+void
+RouterListWidget::onRouterSearch(const QString routerNickname)
+{
+  if (!currentIndex().data().toString().toLower().startsWith(routerNickname.toLower()))
+  {
+    searchNextRouter(routerNickname);
+  } else {
+    /* If item at currentIndex() isn't visible, make it visible. */
+    scrollToItem(itemFromIndex(currentIndex()));
+  }
+}
+
+/** Selects the following router whose name starts by routerNickname. */
+void
+RouterListWidget::searchNextRouter(const QString routerNickname)
+{
+  /* currentIndex().row() = -1 if no item is selected. */
+  int startIndex = currentIndex().row() + 1;
+  /* Search for a router whose name start with routerNickname. Case-insensitive search. */
+  QModelIndexList qmIndList = model()->match(model()->index(startIndex, NameColumn), 
+                                             Qt::DisplayRole, 
+                                             QVariant(routerNickname),
+                                             1,
+                                             (Qt::MatchStartsWith | Qt::MatchWrap));
+  if (qmIndList.count() > 0) {
+    setCurrentIndex(qmIndList.at(0));
+    /* If item at currentIndex() was already selected but not visible, 
+     * make it visible. */
+    scrollToItem(itemFromIndex(currentIndex()));
+  }
+}
+
 /** Called when the user selects a router from the list. This will search the
  * list for a router whose names starts with the key pressed. */
 void
diff --git a/src/vidalia/network/RouterListWidget.h b/src/vidalia/network/RouterListWidget.h
index 04d7263..95b471e 100644
--- a/src/vidalia/network/RouterListWidget.h
+++ b/src/vidalia/network/RouterListWidget.h
@@ -54,6 +54,8 @@ public:
   void deselectAll();
   /** Called when the user changes the UI translation. */
   void retranslateUi();
+  /** Selects the following router whose name starts by routerNickname. */
+  void searchNextRouter(const QString routerNickname);
 
 signals:
   /** Emitted when the user selects a router from the list. */
@@ -64,6 +66,9 @@ signals:
 public slots:
   /** Clears the list of router items. */
   void clearRouters();
+  /** Called when the search of a router is triggered by the signal 
+   * textChanged from the search field. */
+  void onRouterSearch(const QString routerNickname);
 
 private slots:
   /** Called when the user clicks on an item in the list. */



More information about the tor-commits mailing list