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 <vidalia.h>
00029 #include <control/bandwidthevent.h>
00030 #include "bwgraph.h"
00031
00032 #define BWGRAPH_LINE_SEND (1u<<0)
00033 #define BWGRAPH_LINE_RECV (1u<<1)
00034 #define SETTING_FILTER "LineFilter"
00035 #define SETTING_OPACITY "Opacity"
00036 #define SETTING_ALWAYS_ON_TOP "AlwaysOnTop"
00037 #define SETTING_STYLE "GraphStyle"
00038 #define DEFAULT_FILTER (BWGRAPH_LINE_SEND|BWGRAPH_LINE_RECV)
00039 #define DEFAULT_ALWAYS_ON_TOP false
00040 #define DEFAULT_OPACITY 100
00041 #define DEFAULT_STYLE GraphFrame::AreaGraph
00042
00043 #define ADD_TO_FILTER(f,v,b) (f = ((b) ? ((f) | (v)) : ((f) & ~(v))))
00044
00045
00046 #define DATETIME_FMT "MMM dd hh:mm:ss"
00047
00048
00049 #define IMG_AREA_GRAPH ":/images/16x16/graph-area.png"
00050 #define IMG_LINE_GRAPH ":/images/16x16/graph-line.png"
00051
00052
00053
00054 BandwidthGraph::BandwidthGraph(QWidget *parent, Qt::WFlags flags)
00055 : VidaliaWindow("BandwidthGraph", parent, flags)
00056 {
00057
00058 ui.setupUi(this);
00059 #if defined(Q_WS_WIN)
00060 setShortcut("Esc", SLOT(close()));
00061 #else
00062 setShortcut("Ctrl+W", SLOT(close()));
00063 #endif
00064
00065
00066 createActions();
00067
00068
00069 _torControl = Vidalia::torControl();
00070 _torControl->setEvent(TorEvents::Bandwidth, this, true);
00071
00072
00073 reset();
00074
00075 showSettingsFrame(false);
00076
00077 loadSettings();
00078
00079
00080 #if defined(Q_WS_WIN)
00081 if(!(QSysInfo::WV_2000 <= QSysInfo::WindowsVersion <= QSysInfo::WV_2003)) {
00082 ui.frmOpacity->setVisible(false);
00083 }
00084 #endif
00085
00086 #if defined(Q_WS_X11)
00087 ui.frmOpacity->setVisible(false);
00088 #endif
00089 }
00090
00091
00092
00093 void
00094 BandwidthGraph::customEvent(QEvent *event)
00095 {
00096 if (event->type() == CustomEventType::BandwidthEvent) {
00097 BandwidthEvent *bw = (BandwidthEvent *)event;
00098 updateGraph(bw->bytesRead(), bw->bytesWritten());
00099 }
00100 }
00101
00102
00103 void
00104 BandwidthGraph::createActions()
00105 {
00106 connect(ui.btnToggleSettings, SIGNAL(toggled(bool)),
00107 this, SLOT(showSettingsFrame(bool)));
00108
00109 connect(ui.btnReset, SIGNAL(clicked()),
00110 this, SLOT(reset()));
00111
00112 connect(ui.btnSaveSettings, SIGNAL(clicked()),
00113 this, SLOT(saveChanges()));
00114
00115 connect(ui.btnCancelSettings, SIGNAL(clicked()),
00116 this, SLOT(cancelChanges()));
00117
00118 connect(ui.sldrOpacity, SIGNAL(valueChanged(int)),
00119 this, SLOT(setOpacity(int)));
00120 }
00121
00122
00123 void
00124 BandwidthGraph::updateGraph(quint64 bytesRead, quint64 bytesWritten)
00125 {
00126
00127 ui.frmGraph->addPoints(bytesRead/1024.0, bytesWritten/1024.0);
00128 }
00129
00130
00131 void
00132 BandwidthGraph::loadSettings()
00133 {
00134
00135 ui.sldrOpacity->setValue(getSetting(SETTING_OPACITY, DEFAULT_OPACITY).toInt());
00136 setOpacity(ui.sldrOpacity->value());
00137
00138
00139 ui.chkAlwaysOnTop->setChecked(getSetting(SETTING_ALWAYS_ON_TOP,
00140 DEFAULT_ALWAYS_ON_TOP).toBool());
00141 if (ui.chkAlwaysOnTop->isChecked()) {
00142 setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);
00143 } else {
00144 setWindowFlags(windowFlags() & ~Qt::WindowStaysOnTopHint);
00145 }
00146
00147
00148 uint filter = getSetting(SETTING_FILTER, DEFAULT_FILTER).toUInt();
00149 ui.chkReceiveRate->setChecked(filter & BWGRAPH_LINE_RECV);
00150 ui.chkSendRate->setChecked(filter & BWGRAPH_LINE_SEND);
00151
00152
00153 int graphStyle = getSetting(SETTING_STYLE, DEFAULT_STYLE).toInt();
00154 if (graphStyle < 0 || graphStyle >= ui.cmbGraphStyle->count()) {
00155 graphStyle = DEFAULT_STYLE;
00156 }
00157 ui.cmbGraphStyle->setCurrentIndex(graphStyle);
00158 ui.frmGraph->setGraphStyle((GraphFrame::GraphStyle)graphStyle);
00159
00160
00161 ui.frmGraph->setShowCounters(ui.chkReceiveRate->isChecked(),
00162 ui.chkSendRate->isChecked());
00163 }
00164
00165
00166 void
00167 BandwidthGraph::reset()
00168 {
00169
00170 ui.statusbar->showMessage(tr("Since:") + " " +
00171 QDateTime::currentDateTime()
00172 .toString(DATETIME_FMT));
00173
00174 ui.frmGraph->resetGraph();
00175 }
00176
00177
00178 void
00179 BandwidthGraph::saveChanges()
00180 {
00181
00182 showSettingsFrame(false);
00183
00184
00185 saveSetting(SETTING_OPACITY, ui.sldrOpacity->value());
00186 saveSetting(SETTING_STYLE, ui.cmbGraphStyle->currentIndex());
00187
00188
00189 saveSetting(SETTING_ALWAYS_ON_TOP, ui.chkAlwaysOnTop->isChecked());
00190 if (ui.chkAlwaysOnTop->isChecked()) {
00191 setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);
00192 } else {
00193 setWindowFlags(windowFlags() & ~Qt::WindowStaysOnTopHint);
00194 }
00195 setOpacity(ui.sldrOpacity->value());
00196
00197
00198 uint filter = 0;
00199 ADD_TO_FILTER(filter, BWGRAPH_LINE_RECV, ui.chkReceiveRate->isChecked());
00200 ADD_TO_FILTER(filter, BWGRAPH_LINE_SEND, ui.chkSendRate->isChecked());
00201 saveSetting(SETTING_FILTER, filter);
00202
00203
00204
00205 ui.frmGraph->setShowCounters(ui.chkReceiveRate->isChecked(),
00206 ui.chkSendRate->isChecked());
00207 ui.frmGraph->setGraphStyle((GraphFrame::GraphStyle)ui.cmbGraphStyle->currentIndex());
00208
00209
00210
00211 showNormal();
00212 }
00213
00214
00215 void
00216 BandwidthGraph::cancelChanges()
00217 {
00218
00219 showSettingsFrame(false);
00220
00221
00222 loadSettings();
00223 }
00224
00225
00226 void
00227 BandwidthGraph::showSettingsFrame(bool show)
00228 {
00229 static QSize minSize = minimumSize();
00230
00231 QSize newSize = size();
00232 if (show) {
00233
00234 ui.frmSettings->setVisible(true);
00235 ui.btnToggleSettings->setChecked(true);
00236 ui.btnToggleSettings->setText(tr("Hide Settings"));
00237
00238
00239 newSize.setHeight(newSize.height() + ui.frmSettings->height() + 6);
00240 } else {
00241
00242 ui.frmSettings->setVisible(false);
00243 ui.btnToggleSettings->setChecked(false);
00244 ui.btnToggleSettings->setText(tr("Show Settings"));
00245
00246
00247 newSize.setHeight(newSize.height() - ui.frmSettings->height() - 6);
00248 setMinimumSize(minSize);
00249 }
00250 resize(newSize);
00251 }
00252
00253
00254 void
00255 BandwidthGraph::setOpacity(int value)
00256 {
00257 qreal newValue = value / 100.0;
00258
00259
00260 #if defined(Q_WS_MAC)
00261 this->setWindowOpacity(newValue);
00262 ui.lblPercentOpacity->setText(QString::number(value));
00263 #elif defined(Q_WS_WIN)
00264 if(QSysInfo::WV_2000 <= QSysInfo::WindowsVersion <= QSysInfo::WV_2003) {
00265 this->setWindowOpacity(newValue);
00266 ui.lblPercentOpacity->setText(QString::number(value));
00267 }
00268 #else
00269 Q_UNUSED(newValue);
00270 #endif
00271 }
00272
00273
00274 void
00275 BandwidthGraph::showWindow()
00276 {
00277
00278 loadSettings();
00279
00280 VidaliaWindow::showWindow();
00281 }
00282