[tor-commits] [vidalia/alpha] Port TorMapWidget and the rest to work with the latest Marble

chiiph at torproject.org chiiph at torproject.org
Mon Mar 5 13:01:51 UTC 2012


commit 56dbd017aa1e8c5af851aafa7357ff90aaa70b0a
Author: Tomás Touceda <chiiph at torproject.org>
Date:   Mon Feb 13 12:45:00 2012 -0300

    Port TorMapWidget and the rest to work with the latest Marble
---
 src/vidalia/CMakeLists.txt                       |    2 -
 src/vidalia/network/TorMapWidget.cpp             |  107 ++++++-----------
 src/vidalia/network/TorMapWidget.h               |    7 +-
 src/vidalia/network/TorMapWidgetInputHandler.cpp |  138 ----------------------
 src/vidalia/network/TorMapWidgetInputHandler.h   |   55 ---------
 src/vidalia/network/TorMapWidgetPopupMenu.cpp    |   37 ++----
 src/vidalia/network/TorMapWidgetPopupMenu.h      |   20 +---
 7 files changed, 58 insertions(+), 308 deletions(-)

diff --git a/src/vidalia/CMakeLists.txt b/src/vidalia/CMakeLists.txt
index 4a28504..315bf37 100644
--- a/src/vidalia/CMakeLists.txt
+++ b/src/vidalia/CMakeLists.txt
@@ -260,12 +260,10 @@ qt4_wrap_cpp(vidalia_SRCS
 if (USE_MARBLE)
   set(vidalia_SRCS ${vidalia_SRCS}
     network/TorMapWidget.cpp
-    network/TorMapWidgetInputHandler.cpp
     network/TorMapWidgetPopupMenu.cpp
   )
   qt4_wrap_cpp(vidalia_SRCS
     network/TorMapWidget.h
-    network/TorMapWidgetInputHandler.h
     network/TorMapWidgetPopupMenu.h
   )
 else(USE_MARBLE)
diff --git a/src/vidalia/network/TorMapWidget.cpp b/src/vidalia/network/TorMapWidget.cpp
index e222218..aa8abd7 100644
--- a/src/vidalia/network/TorMapWidget.cpp
+++ b/src/vidalia/network/TorMapWidget.cpp
@@ -14,11 +14,15 @@
 */
 
 #include "TorMapWidget.h"
-#include "TorMapWidgetInputHandler.h"
 #include "TorMapWidgetPopupMenu.h"
 #include "Vidalia.h"
 
 #include <MarbleModel.h>
+#include <MarbleWidgetInputHandler.h>
+#include <GeoDataPlacemark.h>
+#include <GeoDataTreeModel.h>
+#include <GeoDataDocument.h>
+#include <GeoDataFolder.h>
 #include <HttpDownloadManager.h>
 
 #include <QStringList>
@@ -26,8 +30,8 @@
 using namespace Marble;
 
 /** QPens to use for drawing different map elements */
-#define CIRCUIT_NORMAL_PEN      QPen(Qt::blue,  2.0)
-#define CIRCUIT_SELECTED_PEN    QPen(Qt::green, 3.0)
+#define CIRCUIT_NORMAL_PEN      QPen(QBrush(QColor(0,51,102)),  2.0)
+#define CIRCUIT_SELECTED_PEN    QPen(QBrush(QColor(65,146,75)), 3.0)
 
 
 /** Default constructor */
@@ -42,22 +46,24 @@ TorMapWidget::TorMapWidget(QWidget *parent)
 
   model()->downloadManager()->setDownloadEnabled(false);
 
-  TorMapWidgetInputHandler *handler = new TorMapWidgetInputHandler();
+  _document = new Marble::GeoDataDocument();
+  _folder = new Marble::GeoDataFolder();
+  model()->treeModel()->addDocument(_document);
+  model()->treeModel()->addFeature(_document, _folder);
+
   TorMapWidgetPopupMenu *popupMenu  = new TorMapWidgetPopupMenu(this);
 
-  connect(handler, SIGNAL(featureClicked(QPoint,Qt::MouseButton)),
-          popupMenu, SLOT(featureClicked(QPoint,Qt::MouseButton)));
-  connect(popupMenu, SIGNAL(displayRouterInfo(QString)),
-          this, SIGNAL(displayRouterInfo(QString)));
+  // Properly disable all right click menus
+  inputHandler()->setMouseButtonPopupEnabled(Qt::RightButton, false);
 
-  /* We can't call setInputHandler() until MarbleWidget has called its
-   * internal _q_initGui() method, which doesn't happen until a
-   * QTimer::singleShot(0, this, SLOT(_q_initGui())) timer set in its
-   * constructor times out. So force that event to process now. */ 
-  vApp->processEvents(QEventLoop::ExcludeUserInputEvents
-                        | QEventLoop::ExcludeSocketNotifiers);
+  // Hack to disable Marble's menus
+  disconnect(inputHandler(), SIGNAL(lmbRequest(int,int)), 
+             0,0);
 
-  setInputHandler(handler);
+  connect(inputHandler(), SIGNAL(lmbRequest(int,int)),
+          popupMenu, SLOT(featureLeftClicked(int,int)));
+  connect(popupMenu, SIGNAL(displayRouterInfo(QString)),
+          this, SIGNAL(displayRouterInfo(QString)));
 }
 
 /** Destructor */
@@ -70,38 +76,23 @@ TorMapWidget::~TorMapWidget()
 void
 TorMapWidget::addRouter(const RouterDescriptor &desc, const GeoIpRecord &geoip)
 {
-  QString kml;
   qreal lon = geoip.longitude();
   qreal lat = geoip.latitude();
   quint64 bw;
-  
+
   bw = qMin(desc.averageBandwidth(), desc.burstBandwidth());
   bw = qMin(bw, desc.observedBandwidth());
 
-  kml.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
-             "<kml xmlns=\"http://earth.google.com/kml/2.0\">"
-             "<Document>"
-             "  <Style id=\"normalPlacemark\">"
-             "    <IconStyle><Icon><href>:/images/icons/placemark-relay.png</href></Icon></IconStyle>"
-             "  </Style>"
-             );
-
-  kml.append("<Placemark>");
-  kml.append("<styleUrl>#normalPlacemark</styleUrl>");
-  kml.append(QString("<name>%1</name>").arg(desc.name()));
-  kml.append(QString("<description>%1</description>").arg(desc.id()));
-  kml.append(QString("<role>1</role>"));
-  kml.append(QString("<address>%1</address>").arg(geoip.toString()));
-  kml.append(QString("<CountryNameCode>%1</CountryNameCode>").arg(geoip.country()));
-  kml.append(QString("<pop>%1</pop>").arg(10 * bw));
-  kml.append(QString("<Point>"
-                     "  <coordinates>%1,%2</coordinates>"
-                     "</Point>").arg(lon).arg(lat));
-  kml.append("</Placemark>");
-  kml.append("</Document></kml>");
-
   QString id = desc.id();
-  addPlacemarkData(kml, id);
+
+  GeoDataPlacemark *pm = new GeoDataPlacemark(desc.name());
+  pm->setDescription(desc.id());
+  pm->setRole("1");
+  pm->setAddress(geoip.toString());
+  pm->setCountryCode(geoip.country());
+  pm->setPopularity(10 * bw);
+  pm->setCoordinate(lon, lat, 0.0, GeoDataCoordinates::Degree);
+  model()->treeModel()->addFeature(_folder, pm);
   _routers.insert(id, GeoDataCoordinates(lon, lat, 0.0,
                                          GeoDataCoordinates::Degree));
 }
@@ -154,19 +145,6 @@ TorMapWidget::removeCircuit(const CircuitId &circid)
   repaint();
 }
 
-/** Selects and highlights the router on the map. */
-void
-TorMapWidget::selectRouter(const QString &id)
-{
-#if 0
-  if (_routers.contains(id)) {
-    QPair<QPointF, bool> *routerPair = _routers.value(id);
-    routerPair->second = true;
-  }
-  repaint();
-#endif
-}
-
 /** Selects and highlights the circuit with the id <b>circid</b> 
  * on the map. */
 void
@@ -184,13 +162,6 @@ TorMapWidget::selectCircuit(const CircuitId &circid)
 void
 TorMapWidget::deselectAll()
 {
-#if 0
-  /* Deselect all router points */
-  foreach (QString router, _routers.keys()) {
-    QPair<QPointF,bool> *routerPair = _routers.value(router);
-    routerPair->second = false;
-  }
-#endif
   /* Deselect all circuit paths */
   foreach (CircuitGeoPath *path, _circuits.values()) {
     path->second = false;
@@ -204,7 +175,7 @@ void
 TorMapWidget::clear()
 {
   foreach (QString id, _routers.keys()) {
-    removePlacemarkKey(id);
+    model()->removeGeoData(id);
   }
 
   foreach (CircuitId circid, _circuits.keys()) {
@@ -234,18 +205,10 @@ TorMapWidget::zoomToFit()
 void
 TorMapWidget::zoomToCircuit(const CircuitId &circid)
 {
-#if 0
   if (_circuits.contains(circid)) {
-    QPair<QPainterPath*,bool> *pair = _circuits.value(circid);
-    QRectF rect = ((QPainterPath *)pair->first)->boundingRect();
-    if (!rect.isNull()) {
-      float zoomLevel = 1.0 - qMax(rect.height()/float(MAP_HEIGHT),
-                                   rect.width()/float(MAP_WIDTH));
-
-      zoom(rect.center().toPoint(), zoomLevel+0.2);
-    }
+    CircuitGeoPath *pair = _circuits.value(circid);
+    centerOn(pair->first.latLonAltBox(), true);
   }
-#endif
 }
 
 /** Zooms in on the router with the given <b>id</b>. */
@@ -257,7 +220,7 @@ TorMapWidget::zoomToRouter(const QString &id)
     GeoDataCoordinates coords = _routers.value(id);
     coords.geoCoordinates(lon, lat, GeoDataPoint::Degree);
 
-    zoomView(maximumZoom());
+    zoomView(zoomFromDistance(1000));
     centerOn(lon, lat, true);
   }
 }
diff --git a/src/vidalia/network/TorMapWidget.h b/src/vidalia/network/TorMapWidget.h
index f371198..bfc946b 100644
--- a/src/vidalia/network/TorMapWidget.h
+++ b/src/vidalia/network/TorMapWidget.h
@@ -33,6 +33,8 @@
 
 typedef QPair<Marble::GeoDataLineString, bool> CircuitGeoPath;
 
+class Marble::GeoDataDocument;
+class Marble::GeoDataFolder;
 
 class TorMapWidget : public Marble::MarbleWidget
 {
@@ -48,8 +50,6 @@ public:
   void addRouter(const RouterDescriptor &desc, const GeoIpRecord &geoip);
   /** Plots the given circuit on the map. */
   void addCircuit(const CircuitId &circid, const QStringList &path);
-  /** Selects and hightlights a router on the map. */
-  void selectRouter(const QString &id);
   /** Selects and highlights a circuit on the map. */
   void selectCircuit(const CircuitId &circid);
 
@@ -82,6 +82,9 @@ private:
   QHash<QString, Marble::GeoDataCoordinates> _routers;
   /** Stores circuit information */
   QHash<CircuitId, CircuitGeoPath*> _circuits;
+
+  Marble::GeoDataDocument *_document;
+  Marble::GeoDataFolder *_folder;
 };
 
 #endif
diff --git a/src/vidalia/network/TorMapWidgetInputHandler.cpp b/src/vidalia/network/TorMapWidgetInputHandler.cpp
deleted file mode 100644
index 467594b..0000000
--- a/src/vidalia/network/TorMapWidgetInputHandler.cpp
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
-**  This file is part of Vidalia, and is subject to the license terms in the
-**  LICENSE file, found in the top level directory of this distribution. If you
-**  did not receive the LICENSE file with this file, you may obtain it from the
-**  Vidalia source package distributed by the Vidalia Project at
-**  http://www.torproject.org/projects/vidalia.html. No part of Vidalia, 
-**  including this file, may be copied, modified, propagated, or distributed 
-**  except according to the terms described in the LICENSE file.
-*/
-
-#include "TorMapWidgetInputHandler.h"
-
-#include <MarbleWidget.h>
-#include <MarbleMap.h>
-#include <MarbleModel.h>
-#include <ViewParams.h>
-#include <ViewportParams.h>
-
-#include <QTimer>
-#include <QMouseEvent>
-#include <QWheelEvent>
-#include <QPersistentModelIndex>
-
-using namespace Marble;
-
-
-/** Amount to zoom in or out when responding to mouse double clicks. This
- * value was taken from MarbleMap.cpp.
- */
-#define MAP_ZOOM_STEP   40
-
-/** Number of units the mouse must be clicked and dragged before it will
- * force a map rotation and repaint.
-*/
-#define MIN_DRAG_THRESHOLD 3
-
-
-TorMapWidgetInputHandler::TorMapWidgetInputHandler()
-  : MarbleWidgetInputHandler()
-{
-}
-
-bool
-TorMapWidgetInputHandler::eventFilter(QObject *obj, QEvent *e)
-{
-  Q_UNUSED(obj);
-
-  QWheelEvent *wheelEvent = 0;
-  QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(e);
-
-  switch (e->type()) {
-    case QEvent::MouseButtonPress:
-      _mousePressedX = mouseEvent->x();
-      _mousePressedY = mouseEvent->y();
-      _mousePressedLon = m_widget->centerLongitude();
-      _mousePressedLat = m_widget->centerLatitude();
-
-      if (pointHasFeatures(mouseEvent->pos()))
-        emit featureClicked(mouseEvent->pos(), mouseEvent->button());
-      else
-        m_widget->setCursor(Qt::ClosedHandCursor);
-      break;
-
-    case QEvent::MouseButtonRelease:
-      if (! pointHasFeatures(mouseEvent->pos()))
-        m_widget->setCursor(Qt::OpenHandCursor);
-      else
-        m_widget->setCursor(Qt::PointingHandCursor);
-      break;
-
-    case QEvent::MouseMove:
-      if (mouseEvent->buttons() & Qt::LeftButton) {
-        // Pan the map if the left button is pressed while dragging
-        int dx = mouseEvent->x() - _mousePressedX;
-        int dy = mouseEvent->y() - _mousePressedY;
-
-        if (abs(dx) <= MIN_DRAG_THRESHOLD && abs(dy) <= MIN_DRAG_THRESHOLD)
-          return true;
-        m_widget->setCursor(Qt::ClosedHandCursor);
-
-        qreal dir = 1;
-        if (m_widget->projection() == Spherical) {
-          if (m_widget->map()->viewParams()->viewport()->polarity() > 0) {
-            if (mouseEvent->y() < (-m_widget->northPoleY() + m_widget->height()/2))
-              dir = -1;
-          } else {
-            if (mouseEvent->y() > (+m_widget->northPoleY() + m_widget->height()/2))
-              dir = -1;
-          }
-        }
-
-        qreal radius = (qreal)(m_widget->radius());
-        qreal lon = (qreal)(_mousePressedLon) - 90.0 * dir * dx / radius;
-        qreal lat = (qreal)(_mousePressedLat) + 90.0 * dy / radius;
-        m_widget->centerOn(lon, lat, false);
-
-        return true;
-      } else {
-        // Change the mouse cursor if we're hovering over a relay placemark
-        if (pointHasFeatures(mouseEvent->pos()) > 0)
-          m_widget->setCursor(Qt::PointingHandCursor);
-        else
-          m_widget->setCursor(Qt::OpenHandCursor);
-      }
-      break;
-
-    case QEvent::MouseButtonDblClick:
-      // Adjust the zoom level on the map
-      if (mouseEvent->button() == Qt::LeftButton) {
-        m_widget->zoomViewBy(MAP_ZOOM_STEP);
-        return true;
-      } else if (mouseEvent->button() == Qt::RightButton) {
-        m_widget->zoomViewBy(-MAP_ZOOM_STEP);
-        return true;
-      }
-      break;
-
-    case QEvent::Wheel:
-      // Adjust the zoom level on the map
-      m_widget->setViewContext(Marble::Animation);
-
-      wheelEvent = static_cast<QWheelEvent*>(e);
-      m_widget->zoomViewBy((int)(wheelEvent->delta() / 3));
-      m_mouseWheelTimer->start(400);
-      return true;
-
-    default:
-      break;
-  }
-  return MarbleWidgetInputHandler::eventFilter(obj, e);
-}
-
-bool
-TorMapWidgetInputHandler::pointHasFeatures(const QPoint &point) const
-{
-  return (m_widget->model()->whichFeatureAt(point).size() > 0);
-}
-
diff --git a/src/vidalia/network/TorMapWidgetInputHandler.h b/src/vidalia/network/TorMapWidgetInputHandler.h
deleted file mode 100644
index 066a4dc..0000000
--- a/src/vidalia/network/TorMapWidgetInputHandler.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
-**  This file is part of Vidalia, and is subject to the license terms in the
-**  LICENSE file, found in the top level directory of this distribution. If you
-**  did not receive the LICENSE file with this file, you may obtain it from the
-**  Vidalia source package distributed by the Vidalia Project at
-**  http://www.torproject.org/projects/vidalia.html. No part of Vidalia, 
-**  including this file, may be copied, modified, propagated, or distributed 
-**  except according to the terms described in the LICENSE file.
-*/
-
-#ifndef _TORMAPWIDGETINPUTHANDLER_H
-#define _TORMAPWIDGETINPUTHANDLER_H
-
-#include "MarbleWidgetInputHandler.h"
-
-#include <QEvent>
-#include <QObject>
-#include <QPoint>
-
-
-class TorMapWidgetInputHandler : public Marble::MarbleWidgetInputHandler
-{
-  Q_OBJECT
-
-public:
-  /** Default constructor.
-   */
-  TorMapWidgetInputHandler();
-
-signals:
-  /** Emitted when the user clicks on a map feature located at <b>point</b>.
-   * <b>button</b> indicates which mouse button was clicked.
-   */
-  void featureClicked(const QPoint &point, Qt::MouseButton button);
-
-protected:
-  /** Filter and handles event <b>e</b> that was sent to widget <b>obj</b>.
-   * <b>obj</b> is always a MarbleWidget object.
-   */
-  virtual bool eventFilter(QObject *obj, QEvent *e);
-
-private:
-  /** Returns true if the map has one or more features located at the screen
-   * position <b>point</b>.
-   */
-  bool pointHasFeatures(const QPoint &point) const;
-
-  int   _mousePressedX;
-  int   _mousePressedY;
-  qreal _mousePressedLon;
-  qreal _mousePressedLat;
-};
-
-#endif
-
diff --git a/src/vidalia/network/TorMapWidgetPopupMenu.cpp b/src/vidalia/network/TorMapWidgetPopupMenu.cpp
index a98c7e6..983b16e 100644
--- a/src/vidalia/network/TorMapWidgetPopupMenu.cpp
+++ b/src/vidalia/network/TorMapWidgetPopupMenu.cpp
@@ -18,6 +18,7 @@
 
 #include <MarbleModel.h>
 #include <MarblePlacemarkModel.h>
+#include <MarbleWidgetInputHandler.h>
 
 #include <QChar>
 #include <QVector>
@@ -31,41 +32,29 @@ TorMapWidgetPopupMenu::TorMapWidgetPopupMenu(TorMapWidget *widget)
     _widget(widget)
 {
   _leftClickMenu = new QMenu(widget);
+
+  _widget->inputHandler()->setMouseButtonPopupEnabled(Qt::LeftButton, true);
+
   connect(_leftClickMenu, SIGNAL(triggered(QAction*)),
           this, SLOT(relaySelected(QAction*)));
 }
 
 void
-TorMapWidgetPopupMenu::featureClicked(const QPoint &pos, Qt::MouseButton btn)
+TorMapWidgetPopupMenu::featureLeftClicked(int x, int y)
 {
-  switch (btn) {
-    case Qt::LeftButton:
-      featureLeftClicked(pos);
-      break;
-
-    case Qt::RightButton:
-      break;
-
-    default:
-      break;
-  }
-}
+  QVector<const GeoDataPlacemark*> features = _widget->whichFeatureAt(QPoint(x,y));
+  QVector<const GeoDataPlacemark*>::const_iterator it = features.constBegin();
+  QVector<const GeoDataPlacemark*>::const_iterator const itEnd = features.constEnd();
 
-void
-TorMapWidgetPopupMenu::featureLeftClicked(const QPoint &pos)
-{
-  QVector<QModelIndex>::const_iterator it;
-  QVector<QModelIndex> features = _widget->model()->whichFeatureAt(pos);
   QString name, id;
   int numRelays = 0;
 
   _leftClickMenu->clear();
-  for (it = features.constBegin(); it != features.constEnd(); ++it) {
-    QChar role = (*it).data(MarblePlacemarkModel::GeoTypeRole).toChar();
-    if (role == '1') {
+  for (; it != itEnd; ++it) {
+    if ((*it)->role() == "1") {
       /* Normal Tor Relay */
-      name = (*it).data().toString();
-      id   = (*it).data(MarblePlacemarkModel::DescriptionRole).toString();
+      name = (*it)->name();
+      id   = (*it)->description();
 
       QAction *action = _leftClickMenu->addAction(name);
       action->setData(id);
@@ -76,7 +65,7 @@ TorMapWidgetPopupMenu::featureLeftClicked(const QPoint &pos)
   if (numRelays == 1)
     emit displayRouterInfo(id);
   else if (numRelays > 1)
-    _leftClickMenu->popup(_widget->mapToGlobal(pos));
+    _leftClickMenu->popup(_widget->mapToGlobal(QPoint(x,y)));
 }
 
 void
diff --git a/src/vidalia/network/TorMapWidgetPopupMenu.h b/src/vidalia/network/TorMapWidgetPopupMenu.h
index c83ded3..4381b72 100644
--- a/src/vidalia/network/TorMapWidgetPopupMenu.h
+++ b/src/vidalia/network/TorMapWidgetPopupMenu.h
@@ -35,14 +35,14 @@ public:
   TorMapWidgetPopupMenu(TorMapWidget *widget);
 
 public slots:
-  /** Called when the user clicks on one or more map features located at mouse
-   * position <b>pos</b>. <b>button</b> specifies the mouse button clicked.
-   * A popup menu will be displayed depending on which mouse button was
-   * clicked.
+  /** Called when the user left-clicks on one or more placemarks at mouse
+   * position <b>pos</b>. If only one relay placemark exists at <b>pos</b>,
+   * then the displayRouterInfo() signal will be emitted. Otherwise, a
+   * popup menu will be displayed listing all placemarks at this location.
    *
    * \sa featureLeftClicked
    */
-  void featureClicked(const QPoint &pos, Qt::MouseButton button);
+  void featureLeftClicked(int x, int y);
 
 signals:
   /** Emitted when the user selects the router placemark whose fingerprint
@@ -50,16 +50,6 @@ signals:
    */
   void displayRouterInfo(const QString &id);
 
-protected:
-  /** Called when the user left-clicks on one or more placemarks at mouse
-   * position <b>pos</b>. If only one relay placemark exists at <b>pos</b>,
-   * then the displayRouterInfo() signal will be emitted. Otherwise, a
-   * popup menu will be displayed listing all placemarks at this location.
-   *
-   * \sa featureLeftClicked
-   */
-  virtual void featureLeftClicked(const QPoint &pos);
-
 private slots:
   /** Called when the user selects a relay from the popup menu used to
    * disambiguate a location with multiple relay placemarks.





More information about the tor-commits mailing list