00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <QHeaderView>
00029 #include <vidalia.h>
00030
00031 #include "routerlistwidget.h"
00032
00033 #define IMG_ZOOM ":/images/16x16/zoom.png"
00034
00035
00036 RouterListWidget::RouterListWidget(QWidget *parent)
00037 : QTreeWidget(parent)
00038 {
00039 _onlineRouterCount = 0;
00040
00041
00042 setHeaderLabels(QStringList() << QString("")
00043 << QString("")
00044 << tr("Server"));
00045
00046
00047 sortItems(StatusColumn, Qt::DescendingOrder);
00048
00049
00050 connect(this, SIGNAL(itemSelectionChanged()),
00051 this, SLOT(onSelectionChanged()));
00052
00053
00054 _routerContextMenu = new QMenu(this);
00055 _zoomToRouterAct = new QAction(QIcon(IMG_ZOOM), tr("Zoom to Server"), this);
00056 _routerContextMenu->addAction(_zoomToRouterAct);
00057 }
00058
00059
00060
00061
00062 void
00063 RouterListWidget::mouseReleaseEvent(QMouseEvent *e)
00064 {
00065 if (e->button() == Qt::RightButton) {
00066
00067 RouterListItem *item = (RouterListItem *)itemAt(e->pos());
00068 if (!item) {
00069 return;
00070 }
00071
00072
00073 QPoint pos = e->globalPos();
00074 QAction *action = _routerContextMenu->exec(pos);
00075 if (action == _zoomToRouterAct) {
00076
00077 emit zoomToRouter(item->id());
00078 }
00079 }
00080 }
00081
00082
00083 void
00084 RouterListWidget::deselectAll()
00085 {
00086 QList<QTreeWidgetItem *> selected = selectedItems();
00087 foreach (QTreeWidgetItem *item, selected) {
00088 setItemSelected(item, false);
00089 }
00090 }
00091
00092
00093 void
00094 RouterListWidget::clearRouters()
00095 {
00096 _idmap.clear();
00097 _onlineRouterCount = 0;
00098 QTreeWidget::clear();
00099 }
00100
00101
00102
00103 void
00104 RouterListWidget::insertSorted(RouterListItem *item)
00105 {
00106
00107
00108 #if QT_VERSION < 0x040200
00109 Qt::SortOrder order = header()->sortIndicatorOrder();
00110 int left = 0;
00111 int right = topLevelItemCount();
00112 int mid;
00113
00114 while (left < right) {
00115 mid = (left + right)/2;
00116 if (order == Qt::AscendingOrder) {
00117 if (*((RouterListItem *)topLevelItem(mid)) < *item) {
00118 left = mid + 1;
00119 } else {
00120 right = mid;
00121 }
00122 } else {
00123 if (*item < *((RouterListItem *)topLevelItem(mid))) {
00124 left = mid+1;
00125 } else {
00126 right = mid;
00127 }
00128 }
00129 }
00130
00131 if (left == topLevelItemCount()) {
00132 addTopLevelItem(item);
00133 } else {
00134 insertTopLevelItem(left, item);
00135 }
00136 #else
00137 addTopLevelItem(item);
00138 #endif
00139 }
00140
00141
00142
00143 void
00144 RouterListWidget::keyPressEvent(QKeyEvent *event)
00145 {
00146 int index;
00147
00148 QString key = event->text();
00149 if (!key.isEmpty() && key.at(0).isLetterOrNumber()) {
00150
00151 QList<QTreeWidgetItem *> list = findItems(QString("^[%1%2].*$")
00152 .arg(key.toUpper())
00153 .arg(key.toLower()),
00154 Qt::MatchRegExp|Qt::MatchWrap,
00155 NameColumn);
00156 if (list.size() > 0) {
00157 QList<QTreeWidgetItem *> s = selectedItems();
00158
00159
00160
00161
00162
00163 deselectAll();
00164 index = (!s.size() ? 0 : (list.indexOf(s.at(0)) + 1) % list.size());
00165
00166
00167 setItemSelected(list.at(index), true);
00168 scrollToItem(list.at(index));
00169 }
00170 event->accept();
00171 } else {
00172
00173 QTreeWidget::keyPressEvent(event);
00174 }
00175 }
00176
00177
00178
00179 RouterListItem*
00180 RouterListWidget::findRouterById(QString id)
00181 {
00182 if (_idmap.contains(id)) {
00183 return _idmap.value(id);
00184 }
00185 return 0;
00186 }
00187
00188
00189
00190
00191 RouterListItem*
00192 RouterListWidget::findRouterByName(QString name)
00193 {
00194 QList<QTreeWidgetItem *> list = findItems(name,
00195 Qt::MatchExactly,
00196 NameColumn);
00197
00198
00199
00200 if (list.size() > 0) {
00201 return (RouterListItem *)list.at(0);
00202 }
00203 return 0;
00204 }
00205
00206
00207 void
00208 RouterListWidget::addRouter(RouterDescriptor rd)
00209 {
00210 QString id = rd.id();
00211 if (!id.isEmpty()) {
00212 RouterListItem *item = findRouterById(id);
00213 if (item) {
00214
00215
00216 if (item->descriptor().online())
00217 _onlineRouterCount--;
00218 delete takeTopLevelItem(indexOfTopLevelItem(item));
00219 _idmap.remove(id);
00220 }
00221
00222
00223 item = new RouterListItem(this, rd);
00224 insertSorted(item);
00225 _idmap.insert(id, item);
00226
00227
00228 if (rd.online())
00229 _onlineRouterCount++;
00230 setStatusTip(tr("%1 servers online (%2 total)")
00231 .arg(_onlineRouterCount)
00232 .arg(topLevelItemCount()));
00233 }
00234 }
00235
00236
00237
00238
00239 void
00240 RouterListWidget::onSelectionChanged()
00241 {
00242 RouterDescriptor rd;
00243 QList<QTreeWidgetItem *> items = selectedItems();
00244
00245 if (items.count() > 0) {
00246 rd = ((RouterListItem *)items[0])->descriptor();
00247 }
00248 emit routerSelected(rd);
00249 }
00250