22 #include <QMessageBox>
24 #include <QHeaderView>
25 #include <QCoreApplication>
27 #define IMG_MOVE ":/images/22x22/move-map.png"
28 #define IMG_ZOOMIN ":/images/22x22/zoom-in.png"
29 #define IMG_ZOOMOUT ":/images/22x22/zoom-out.png"
35 #define MIN_RESOLVE_QUEUE_DELAY (10*1000)
38 #define MAX_RESOLVE_QUEUE_DELAY (30*1000)
51 ui.actionHelp->setShortcut(QString(
"Ctrl+?"));
82 ui.treeRouterList->header()->
84 ui.treeRouterList->header()->
86 ui.treeCircuitList->header()->
90 #if defined(USE_MARBLE)
94 connect(
ui.actionZoomFullScreen, SIGNAL(triggered()),
99 ui.actionZoomFullScreen->setVisible(
false);
101 ui.gridLayout->addWidget(
_map);
106 connect(
ui.actionZoomToFit, SIGNAL(triggered()),
_map, SLOT(zoomToFit()));
115 connect(
ui.actionHelp, SIGNAL(triggered()),
this, SLOT(
help()));
119 connect(
ui.treeRouterList, SIGNAL(zoomToRouter(QString)),
120 _map, SLOT(zoomToRouter(QString)));
131 connect(
ui.lineRouterSearch, SIGNAL(returnPressed()),
133 connect(
ui.lineRouterSearch, SIGNAL(textChanged(QString)),
138 QToolBar *tb =
new QToolBar();
139 tb->addAction(
ui.actionRefresh);
140 tb->addAction(
ui.actionHelp);
141 tb->addAction(
ui.actionZoomIn);
142 tb->addAction(
ui.actionZoomOut);
143 tb->addAction(
ui.actionZoomToFit);
144 tb->addAction(
ui.actionZoomFullScreen);
146 tb->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
147 ui.horizontalLayout->addWidget(tb);
154 ui.retranslateUi(
this);
156 ui.treeRouterList->retranslateUi();
157 ui.treeCircuitList->retranslateUi();
159 if (
ui.treeRouterList->selectedItems().size()) {
160 QList<RouterDescriptor> routers;
161 foreach (QTreeWidgetItem *item,
ui.treeRouterList->selectedItems()) {
162 routers << dynamic_cast<RouterListItem *>(item)->descriptor();
164 ui.textRouterInfo->display(routers);
165 }
else if (
ui.treeCircuitList->selectedItems().size()) {
166 QList<RouterDescriptor> routers;
167 QTreeWidgetItem *item =
ui.treeCircuitList->selectedItems()[0];
169 foreach (QString
id, circuit.
routerIDs()) {
174 ui.textRouterInfo->display(routers);
183 #if defined(USE_GEOIP)
186 if (! databaseFile.isEmpty()) {
189 vInfo(
"Using local database file for relay mapping: %1")
195 vInfo(
"Using Tor's GeoIP database for country-level relay mapping.");
205 ui.actionRefresh->setEnabled(
true);
214 ui.actionRefresh->setEnabled(
false);
222 ui.actionRefresh->setEnabled(
false);
235 ui.actionRefresh->setEnabled(
true);
248 ui.treeRouterList->clearRouters();
249 ui.treeCircuitList->clearCircuits();
250 ui.textRouterInfo->clear();
258 ui.treeRouterList->searchNextRouter(
ui.lineRouterSearch->text());
276 foreach (
Circuit circuit, circuits) {
281 foreach (
Stream stream, streams) {
294 ui.treeCircuitList->addCircuit(circuit);
310 ui.treeCircuitList->addStream(
315 ui.treeCircuitList->addStream(stream);
321 const QDateTime &expires)
347 QCoreApplication::processEvents();
379 foreach (QString
id, ids) {
392 ui.treeRouterList->deselectAll();
393 ui.textRouterInfo->clear();
399 QList<RouterDescriptor> routers;
401 foreach (QString
id, circuit.
routerIDs()) {
408 ui.textRouterInfo->display(routers);
416 ui.textRouterInfo->clear();
417 ui.textRouterInfo->display(routers);
423 if (routers.size() == 1)
434 : static_cast<QWidget*>(
this));
440 tr(
"No details on the selected relay are available."),
448 dlg.setRouterInfo(rd, rs);
455 dlg.setLocation(tr(
"Unknown"));
471 #if defined(USE_MARBLE)
472 _map->zoomViewBy(40);
482 #if defined(USE_MARBLE)
483 _map->zoomViewBy(-40);
494 if (
_map->isFullScreen()) {
496 ui.gridLayout->addWidget(
_map);
497 _map->setWindowState(
_map->windowState() & ~Qt::WindowFullScreen);
502 _map->setWindowState(
_map->windowState() | Qt::WindowFullScreen);