22 #include <QMessageBox>
23 #include <QHeaderView>
24 #include <QCoreApplication>
26 #define IMG_MOVE ":/images/22x22/move-map.png"
27 #define IMG_ZOOMIN ":/images/22x22/zoom-in.png"
28 #define IMG_ZOOMOUT ":/images/22x22/zoom-out.png"
34 #define MIN_RESOLVE_QUEUE_DELAY (10*1000)
37 #define MAX_RESOLVE_QUEUE_DELAY (30*1000)
50 ui.actionHelp->setShortcut(QString(
"Ctrl+?"));
54 ui.actionClose->setShortcut(QString(
"Esc"));
81 ui.treeRouterList->header()->
83 ui.treeRouterList->header()->
85 ui.treeCircuitList->header()->
89 #if defined(USE_MARBLE)
93 connect(
ui.actionZoomFullScreen, SIGNAL(triggered()),
98 ui.actionZoomFullScreen->setVisible(
false);
100 ui.gridLayout->addWidget(
_map);
104 connect(
ui.actionZoomIn, SIGNAL(triggered()),
this, SLOT(
zoomIn()));
105 connect(
ui.actionZoomOut, SIGNAL(triggered()),
this, SLOT(
zoomOut()));
106 connect(
ui.actionZoomToFit, SIGNAL(triggered()),
_map, SLOT(zoomToFit()));
115 connect(
ui.actionHelp, SIGNAL(triggered()),
this, SLOT(
help()));
116 connect(
ui.actionRefresh, SIGNAL(triggered()),
this, SLOT(
refresh()));
119 connect(
ui.treeRouterList, SIGNAL(zoomToRouter(QString)),
120 _map, SLOT(zoomToRouter(QString)));
123 connect(
ui.treeCircuitList, SIGNAL(circuitRemoved(
CircuitId)),
125 connect(
ui.treeCircuitList, SIGNAL(zoomToCircuit(
CircuitId)),
127 connect(
ui.treeCircuitList, SIGNAL(closeCircuit(
CircuitId)),
129 connect(
ui.treeCircuitList, SIGNAL(closeStream(
StreamId)),
139 ui.retranslateUi(
this);
140 ui.treeRouterList->retranslateUi();
141 ui.treeCircuitList->retranslateUi();
143 if (
ui.treeRouterList->selectedItems().size()) {
144 QList<RouterDescriptor> routers;
145 foreach (QTreeWidgetItem *item,
ui.treeRouterList->selectedItems()) {
146 routers << dynamic_cast<RouterListItem *>(item)->descriptor();
148 ui.textRouterInfo->display(routers);
149 }
else if (
ui.treeCircuitList->selectedItems().size()) {
150 QList<RouterDescriptor> routers;
151 QTreeWidgetItem *item =
ui.treeCircuitList->selectedItems()[0];
153 foreach (QString
id, circuit.
routerIDs()) {
158 ui.textRouterInfo->display(routers);
167 #if defined(USE_GEOIP)
170 if (! databaseFile.isEmpty()) {
173 vInfo(
"Using local database file for relay mapping: %1")
179 vInfo(
"Using Tor's GeoIP database for country-level relay mapping.");
189 ui.actionRefresh->setEnabled(
true);
198 ui.actionRefresh->setEnabled(
false);
206 ui.actionRefresh->setEnabled(
false);
219 ui.actionRefresh->setEnabled(
true);
232 ui.treeRouterList->clearRouters();
233 ui.treeCircuitList->clearCircuits();
234 ui.textRouterInfo->clear();
252 foreach (
Circuit circuit, circuits) {
257 foreach (
Stream stream, streams) {
270 ui.treeCircuitList->addCircuit(circuit);
286 ui.treeCircuitList->addStream(
291 ui.treeCircuitList->addStream(stream);
297 const QDateTime &expires)
315 if (networkStatus.isEmpty()) {
330 if(usingMicrodescriptors) {
336 QCoreApplication::processEvents();
368 foreach (QString
id, ids) {
381 ui.treeRouterList->deselectAll();
382 ui.textRouterInfo->clear();
388 QList<RouterDescriptor> routers;
390 foreach (QString
id, circuit.
routerIDs()) {
397 ui.textRouterInfo->display(routers);
405 ui.textRouterInfo->clear();
406 ui.textRouterInfo->display(routers);
412 if (routers.size() == 1)
423 : static_cast<QWidget*>(
this));
429 tr(
"No details on the selected relay are available."),
437 dlg.setRouterInfo(rd, rs);
444 dlg.setLocation(tr(
"Unknown"));
460 #if defined(USE_MARBLE)
461 _map->zoomViewBy(40);
471 #if defined(USE_MARBLE)
472 _map->zoomViewBy(-40);
483 if (
_map->isFullScreen()) {
485 ui.gridLayout->addWidget(
_map);
486 _map->setWindowState(
_map->windowState() & ~Qt::WindowFullScreen);
491 _map->setWindowState(
_map->windowState() | Qt::WindowFullScreen);