You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
325 lines
7.9 KiB
325 lines
7.9 KiB
/*
|
|
$ Author: Mirko Boehm $
|
|
$ License: This code is licensed under the LGPL $
|
|
$ Copyright: (C) 1996-2003, Mirko Boehm $
|
|
$ Contact: Mirko Boehm <mirko@kde.org>
|
|
http://www.kde.org
|
|
http://www.hackerbuero.org $
|
|
*/
|
|
|
|
#include <qtimer.h>
|
|
#include <qpainter.h>
|
|
#include <qpen.h>
|
|
#include <qcolor.h>
|
|
#include <qpointarray.h>
|
|
#include <kglobalsettings.h>
|
|
#include <kdebug.h>
|
|
#include <kpassivepopup.h>
|
|
#include <klocale.h>
|
|
|
|
#include "kwirelesswidget.h"
|
|
#include "propertytable.h"
|
|
#include "linuxwirelesswidget.h"
|
|
|
|
extern "C" {
|
|
#include <math.h>
|
|
}
|
|
|
|
QPtrList<DeviceInfo> KWireLessWidget::deviceInfo;
|
|
QMutex KWireLessWidget::mutex;
|
|
QTimer *KWireLessWidget::timer;
|
|
int KWireLessWidget::m_instances;
|
|
|
|
DeviceInfo::DeviceInfo(QString _device, QString _essid, QString _encr,
|
|
float _quality, float _signal, float _noise,
|
|
int _bitrate)
|
|
: m_device(_device),
|
|
m_essid(_essid),
|
|
m_quality(_quality),
|
|
m_noise(_noise),
|
|
m_signal(_signal),
|
|
m_bitrate(_bitrate),
|
|
m_encr(_encr)
|
|
{
|
|
}
|
|
|
|
float DeviceInfo::quality()
|
|
{
|
|
return m_quality;
|
|
}
|
|
|
|
QString DeviceInfo::qualityString()
|
|
{
|
|
return i18n("%1%").arg(QString::number(m_quality*100, 'f', 0));
|
|
}
|
|
|
|
float DeviceInfo::signal()
|
|
{
|
|
return m_signal;
|
|
}
|
|
|
|
QString DeviceInfo::signalString()
|
|
{
|
|
return i18n("%1%").arg(QString::number(m_signal*100, 'f', 0));
|
|
}
|
|
|
|
float DeviceInfo::noise()
|
|
{
|
|
return m_noise ;
|
|
}
|
|
|
|
QString DeviceInfo::noiseString()
|
|
{
|
|
return i18n("%1%").arg(QString::number(m_noise*100, 'f', 0));
|
|
}
|
|
|
|
const QString& DeviceInfo::device()
|
|
{
|
|
return m_device;
|
|
}
|
|
|
|
const QString& DeviceInfo::essid()
|
|
{
|
|
return m_essid;
|
|
}
|
|
|
|
|
|
QString DeviceInfo::bitrateString()
|
|
{
|
|
QString bitrate;
|
|
QTextOStream b(&bitrate);
|
|
b.precision(2);
|
|
|
|
switch((int)log10(m_bitrate))
|
|
{
|
|
case 0:
|
|
case 1:
|
|
case 2:
|
|
b << m_bitrate << " bit/s";
|
|
break;
|
|
case 3:
|
|
case 4:
|
|
case 5:
|
|
b << m_bitrate/1000 << " kbit/s";
|
|
break;
|
|
case 6:
|
|
case 7:
|
|
case 8:
|
|
b << m_bitrate/1000000 << " Mbit/s";
|
|
break;
|
|
case 9:
|
|
case 10:
|
|
case 11:
|
|
b << m_bitrate/1000000000 << " Gbit/s";
|
|
break;
|
|
default:
|
|
b << m_bitrate << " bit/s (!)";
|
|
};
|
|
return bitrate;
|
|
}
|
|
|
|
bool DeviceInfo::usesEncryption()
|
|
{
|
|
return !m_encr.isEmpty();
|
|
}
|
|
|
|
QString DeviceInfo::encrString()
|
|
{
|
|
if(m_encr.isEmpty())
|
|
{
|
|
return i18n("unknown");
|
|
} else {
|
|
// we rely on the information provided (that is, it has to
|
|
// translated already!):
|
|
return m_encr;
|
|
}
|
|
}
|
|
|
|
KWireLessWidget::KWireLessWidget(QWidget *parent, const char* name)
|
|
: QWidget(parent, name),
|
|
mode(Horizontal),
|
|
frameWidth(1),
|
|
qualityBarWidth(6),
|
|
signalBarWidth(3),
|
|
noiseBarWidth(3)
|
|
{
|
|
++m_instances;
|
|
deviceInfo.setAutoDelete(true);
|
|
// set up the poll timer:
|
|
if(timer == 0)
|
|
{ // this way, only the poll() method of the first instance will
|
|
// ever be called (intended behaviour):
|
|
timer = new QTimer(this);
|
|
connect(timer, SIGNAL(timeout()), SLOT(poll()));
|
|
// single shot, will be restartet at the end of poll ()
|
|
timer->start(100, true);
|
|
}
|
|
}
|
|
|
|
KWireLessWidget::~KWireLessWidget()
|
|
{
|
|
--m_instances;
|
|
}
|
|
|
|
int KWireLessWidget::preferredHeight()
|
|
{
|
|
return preferredWidth();
|
|
}
|
|
|
|
int KWireLessWidget::preferredWidth()
|
|
{
|
|
return 4*frameWidth + qualityBarWidth + signalBarWidth + noiseBarWidth;
|
|
}
|
|
|
|
int KWireLessWidget::instances()
|
|
{
|
|
return m_instances;
|
|
}
|
|
|
|
void KWireLessWidget::setMode(KWireLessWidget::Mode _mode)
|
|
{
|
|
mode = _mode;
|
|
}
|
|
|
|
void KWireLessWidget::mousePressEvent(QMouseEvent *e)
|
|
{
|
|
if( e->button() == QMouseEvent::LeftButton)
|
|
{
|
|
PropertiesDialog dialog(this);
|
|
connect(this, SIGNAL(updateDeviceInfo(QPtrList<DeviceInfo> *)),
|
|
&dialog, SLOT(update(QPtrList<DeviceInfo> *)));
|
|
dialog.exec();
|
|
}
|
|
}
|
|
|
|
void KWireLessWidget::paintEvent(QPaintEvent*)
|
|
{
|
|
// WORK_TO_DO: paint other devices, too:
|
|
// for quick repaints, we need a buffered painter!
|
|
int w, h, space;
|
|
const int bevel = qualityBarWidth/2;
|
|
QPainter painter(this);
|
|
QPointArray points;
|
|
QColor color, brush;
|
|
|
|
// do stuff that does not rely on device being valid (e.g.,
|
|
// non-nil):
|
|
space = 3 * frameWidth + qualityBarWidth + signalBarWidth + noiseBarWidth+1;
|
|
|
|
if(mode == Horizontal)
|
|
{
|
|
h = space;
|
|
w = width();
|
|
} else {
|
|
// Vertical
|
|
h = height();
|
|
w = space;
|
|
}
|
|
|
|
painter.setPen(QPen(Qt::black, frameWidth));
|
|
painter.setBrush(KGlobalSettings::baseColor());
|
|
painter.drawRect(0, 0, w, h);
|
|
|
|
int x = qualityBarWidth + frameWidth;
|
|
mode == Vertical
|
|
? painter.drawLine(x, frameWidth, x, h-frameWidth)
|
|
: painter.drawLine(frameWidth, x, w-frameWidth, x);
|
|
x += signalBarWidth + frameWidth;
|
|
mode == Vertical
|
|
? painter.drawLine(x, frameWidth, x, h-frameWidth)
|
|
: painter.drawLine(frameWidth, x, w-frameWidth, x);
|
|
|
|
DeviceInfo *device = deviceInfo.getFirst();
|
|
if(device != 0)
|
|
{
|
|
// draw the quality bar:
|
|
switch((int)(device->quality()*3))
|
|
{
|
|
case 0:
|
|
color = Qt::darkRed;
|
|
brush = Qt::red;
|
|
break;
|
|
case 1:
|
|
color = Qt::darkYellow;
|
|
brush = Qt::yellow;
|
|
break;
|
|
default:
|
|
color = Qt::darkGreen;
|
|
brush = Qt::green;
|
|
};
|
|
if(mode == Vertical)
|
|
{
|
|
int position = (int)(((float)(h-2*frameWidth))*(1-device->quality())+0.5);
|
|
|
|
points.putPoints
|
|
(0, 4,
|
|
frameWidth, h - 2*frameWidth,
|
|
frameWidth, position + bevel/2,
|
|
qualityBarWidth, QMAX(position - bevel/2, frameWidth),
|
|
qualityBarWidth, h - 2*frameWidth);
|
|
} else {
|
|
int position = (int)(((float)(w-2*frameWidth))*device->quality()+0.5);
|
|
|
|
points.putPoints
|
|
(0, 4,
|
|
frameWidth, frameWidth,
|
|
QMIN(position - bevel/2, w-frameWidth), frameWidth,
|
|
QMIN(position + bevel/2, w-frameWidth), frameWidth+qualityBarWidth-1,
|
|
frameWidth, frameWidth+qualityBarWidth-1);
|
|
}
|
|
painter.setPen(QPen(color));
|
|
painter.setBrush(brush);
|
|
painter.drawPolygon(points);
|
|
|
|
// draw the signal bar:
|
|
painter.setPen(QPen(Qt::darkRed));
|
|
painter.setBrush(Qt::red);
|
|
|
|
if(mode == Vertical)
|
|
{
|
|
int x = 2 * frameWidth + qualityBarWidth;
|
|
int h1 = (int)(((float)(h-2*frameWidth))*(1-device->signal())+0.5);
|
|
|
|
painter.drawRect(x, h1, signalBarWidth, h - frameWidth - h1);
|
|
} else {
|
|
int x = frameWidth;
|
|
int y = 2 * frameWidth + qualityBarWidth;
|
|
int w1 = (int)(((float)(w-2*frameWidth))*device->signal()+0.5);
|
|
|
|
painter.drawRect(x, y, w1, signalBarWidth);
|
|
}
|
|
// draw the noise bar:
|
|
painter.setPen(QPen(Qt::gray));
|
|
painter.setBrush(Qt::lightGray);
|
|
|
|
if(mode == Vertical)
|
|
{
|
|
int x = 3 * frameWidth + qualityBarWidth + signalBarWidth;
|
|
int h1 = (int)(((float)(h-2*frameWidth))*(1-device->noise())+0.5);
|
|
|
|
painter.drawRect(x, h1, signalBarWidth, h - frameWidth - h1);
|
|
} else {
|
|
int x = frameWidth;
|
|
int y = 3 * frameWidth + qualityBarWidth + signalBarWidth;
|
|
int w1 = (int)(((float)(w-2*frameWidth))*device->noise()+0.5);
|
|
|
|
painter.drawRect(x, y, w1, signalBarWidth);
|
|
}
|
|
}
|
|
}
|
|
|
|
KWireLessWidget* KWireLessWidget::makeWireLessWidget(QWidget *parent,
|
|
const char *name)
|
|
{
|
|
#if 1
|
|
// defined linuxwirelesswidget
|
|
return new LinuxWireLessWidget(parent, name);
|
|
#else
|
|
#error KWireLess is not available for your OS
|
|
#endif
|
|
// just to shut the compiler up:
|
|
parent = parent; name = name; return 0;
|
|
}
|
|
|
|
#include "kwirelesswidget.moc"
|