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
00034 RouterListWidget::RouterListWidget(QWidget *parent)
00035 : QTreeWidget(parent)
00036 {
00037
00038 setHeaderLabels(QStringList() << tr("Status") << tr("Server"));
00039
00040
00041
00042
00043 sortByColumn(StatusColumn);
00044 sortByColumn(StatusColumn);
00045
00046
00047 connect(this, SIGNAL(itemSelectionChanged()),
00048 this, SLOT(onSelectionChanged()));
00049 }
00050
00051
00052 void
00053 RouterListWidget::deselectAll()
00054 {
00055 QList<QTreeWidgetItem *> selected = selectedItems();
00056 foreach (QTreeWidgetItem *item, selected) {
00057 setItemSelected(item, false);
00058 }
00059 }
00060
00061
00062 void
00063 RouterListWidget::clearRouters()
00064 {
00065 _idmap.clear();
00066 QTreeWidget::clear();
00067 }
00068
00069
00070
00071 void
00072 RouterListWidget::insertSorted(RouterListItem *item)
00073 {
00074 Qt::SortOrder order = header()->sortIndicatorOrder();
00075 int left = 0;
00076 int right = topLevelItemCount();
00077 int mid;
00078
00079 while (left < right) {
00080 mid = (left + right)/2;
00081 if (order == Qt::AscendingOrder) {
00082 if (*((RouterListItem *)topLevelItem(mid)) < *item) {
00083 left = mid + 1;
00084 } else {
00085 right = mid;
00086 }
00087 } else {
00088 if (*item < *((RouterListItem *)topLevelItem(mid))) {
00089 left = mid+1;
00090 } else {
00091 right = mid;
00092 }
00093 }
00094 }
00095
00096 if (left == topLevelItemCount()) {
00097 addTopLevelItem(item);
00098 } else {
00099 insertTopLevelItem(left, item);
00100 }
00101 }
00102
00103
00104
00105 void
00106 RouterListWidget::keyPressEvent(QKeyEvent *event)
00107 {
00108 int index;
00109
00110 QString key = event->text();
00111 if (!key.isEmpty() && key.at(0).isLetterOrNumber()) {
00112
00113 QList<QTreeWidgetItem *> list = findItems(QString("^[%1%2].*$")
00114 .arg(key.toUpper())
00115 .arg(key.toLower()),
00116 Qt::MatchRegExp|Qt::MatchWrap,
00117 NameColumn);
00118 if (list.size() > 0) {
00119 QList<QTreeWidgetItem *> s = selectedItems();
00120
00121
00122
00123
00124
00125 deselectAll();
00126 index = (!s.size() ? 0 : (list.indexOf(s.at(0)) + 1) % list.size());
00127
00128
00129 setItemSelected(list.at(index), true);
00130 scrollToItem(list.at(index));
00131 }
00132 event->accept();
00133 } else {
00134
00135 QTreeWidget::keyPressEvent(event);
00136 }
00137 }
00138
00139
00140
00141 RouterListItem*
00142 RouterListWidget::findRouterById(QString id)
00143 {
00144 if (_idmap.contains(id)) {
00145 return _idmap.value(id);
00146 }
00147 return 0;
00148 }
00149
00150
00151
00152
00153 RouterListItem*
00154 RouterListWidget::findRouterByName(QString name)
00155 {
00156 QList<QTreeWidgetItem *> list = findItems(name,
00157 Qt::MatchExactly,
00158 NameColumn);
00159
00160
00161
00162 if (list.size() > 0) {
00163 return (RouterListItem *)list.at(0);
00164 }
00165 return 0;
00166 }
00167
00168
00169 void
00170 RouterListWidget::addRouter(RouterDescriptor rd)
00171 {
00172 QString id = rd.id();
00173 if (!id.isEmpty()) {
00174 RouterListItem *item = findRouterById(id);
00175 if (item) {
00176
00177
00178 delete takeTopLevelItem(indexOfTopLevelItem(item));
00179 _idmap.remove(id);
00180 }
00181
00182
00183 item = new RouterListItem(this, rd);
00184 insertSorted(item);
00185 _idmap.insert(id, item);
00186
00187
00188 setStatusTip(tr("%1 servers total").arg(topLevelItemCount()));
00189 }
00190 }
00191
00192
00193
00194
00195 void
00196 RouterListWidget::onSelectionChanged()
00197 {
00198 RouterDescriptor rd;
00199 QList<QTreeWidgetItem *> items = selectedItems();
00200
00201 if (items.count() > 0) {
00202 rd = ((RouterListItem *)items[0])->descriptor();
00203 }
00204 emit routerSelected(rd);
00205 }
00206