1*4882a593Smuzhiyun #include "wifiview.h"
2*4882a593Smuzhiyun #include <QPainter>
3*4882a593Smuzhiyun #include <QStyleOptionViewItem>
4*4882a593Smuzhiyun #include <QStyleOption>
5*4882a593Smuzhiyun #include <QRect>
6*4882a593Smuzhiyun #include <QTextOption>
7*4882a593Smuzhiyun #include <QDebug>
8*4882a593Smuzhiyun #include <QCoreApplication>
9*4882a593Smuzhiyun #include <QPalette>
10*4882a593Smuzhiyun #include <math.h>
11*4882a593Smuzhiyun
WifiItemDelegate(QObject * parent)12*4882a593Smuzhiyun WifiItemDelegate::WifiItemDelegate(QObject *parent):QAbstractItemDelegate(parent)
13*4882a593Smuzhiyun {
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun }
16*4882a593Smuzhiyun
paint(QPainter * painter,const QStyleOptionViewItem & option,const QModelIndex & index) const17*4882a593Smuzhiyun void WifiItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
18*4882a593Smuzhiyun {
19*4882a593Smuzhiyun QList<QVariant> list = index.data(Qt::DisplayRole).toList();
20*4882a593Smuzhiyun // QString bssid =list[0].toString();
21*4882a593Smuzhiyun QString wifiNmae = list[4].toString();
22*4882a593Smuzhiyun // QString flag = list[3].toString();
23*4882a593Smuzhiyun int connectState = list[5].toInt();
24*4882a593Smuzhiyun QString text = wifiNmae;
25*4882a593Smuzhiyun int sig = list[2].toInt();
26*4882a593Smuzhiyun painter->setRenderHint(QPainter::Antialiasing);
27*4882a593Smuzhiyun int width = option.rect.width();
28*4882a593Smuzhiyun int height = option.rect.height();
29*4882a593Smuzhiyun int x = option.rect.x();
30*4882a593Smuzhiyun int y= option.rect.y();
31*4882a593Smuzhiyun int nameWidth =width -40;
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun if(option.state &QStyle::State_Selected)
34*4882a593Smuzhiyun {
35*4882a593Smuzhiyun painter->save();
36*4882a593Smuzhiyun QPen pen(Qt::transparent);
37*4882a593Smuzhiyun painter->setPen(pen);
38*4882a593Smuzhiyun painter->setBrush(QColor(236, 238,237));
39*4882a593Smuzhiyun painter->setOpacity(0.7);
40*4882a593Smuzhiyun painter->drawRect(x, y, width, height);
41*4882a593Smuzhiyun painter->restore();
42*4882a593Smuzhiyun }
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun QRectF nameRect(x,y, nameWidth, height);
45*4882a593Smuzhiyun painter->save();
46*4882a593Smuzhiyun QTextOption o(Qt::AlignLeft);
47*4882a593Smuzhiyun QRectF fitNameRect =painter->boundingRect(nameRect, text, o);
48*4882a593Smuzhiyun if(connectState > 0)
49*4882a593Smuzhiyun {
50*4882a593Smuzhiyun QTextOption bottom(Qt::AlignCenter);
51*4882a593Smuzhiyun QString text ="connected";
52*4882a593Smuzhiyun painter->setPen(Qt::blue);
53*4882a593Smuzhiyun if(connectState !=2)
54*4882a593Smuzhiyun {
55*4882a593Smuzhiyun text="connect..."; painter->setPen(Qt::gray);
56*4882a593Smuzhiyun }
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun QRectF connectRect = painter->boundingRect(nameRect, text, bottom);
59*4882a593Smuzhiyun painter->drawText(connectRect, text);
60*4882a593Smuzhiyun }
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun painter->drawText(fitNameRect, text);
63*4882a593Smuzhiyun painter->setPen(QColor(215, 212,209));
64*4882a593Smuzhiyun painter->drawLine(x+5, y+height, x+width-5, y+height+1);
65*4882a593Smuzhiyun painter->restore();
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun QRectF sigRect(x+ nameWidth, y+ 10, height, height);
68*4882a593Smuzhiyun int startAngle = 40 * 16;
69*4882a593Smuzhiyun int spanAngle = 100 * 16;
70*4882a593Smuzhiyun QPen pen(Qt::gray);
71*4882a593Smuzhiyun pen.setWidthF(1.8);
72*4882a593Smuzhiyun int level =getLevel(sig);
73*4882a593Smuzhiyun for(int i=0; i<3; i++){
74*4882a593Smuzhiyun painter->save();
75*4882a593Smuzhiyun if(i< 4-level)
76*4882a593Smuzhiyun {
77*4882a593Smuzhiyun pen.setColor(Qt::gray);
78*4882a593Smuzhiyun }else{
79*4882a593Smuzhiyun pen.setColor(Qt::black);
80*4882a593Smuzhiyun }
81*4882a593Smuzhiyun painter->setPen(pen);
82*4882a593Smuzhiyun painter->drawArc(sigRect, startAngle, spanAngle);
83*4882a593Smuzhiyun painter->restore();
84*4882a593Smuzhiyun int adj =6;
85*4882a593Smuzhiyun sigRect.adjust(adj, adj,-adj,-adj);
86*4882a593Smuzhiyun }
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun QRectF centerRect(x+ nameWidth, y+ 10, height, height);
89*4882a593Smuzhiyun int r = (height/2)-2;
90*4882a593Smuzhiyun centerRect.adjust(r, r, -r, -r);
91*4882a593Smuzhiyun QColor color;
92*4882a593Smuzhiyun level ==0 ? color = Qt::gray: color = Qt::black;
93*4882a593Smuzhiyun painter->setPen(color);
94*4882a593Smuzhiyun painter->setBrush(color);
95*4882a593Smuzhiyun painter->drawEllipse(centerRect);
96*4882a593Smuzhiyun }
97*4882a593Smuzhiyun
sizeHint(const QStyleOptionViewItem & option,const QModelIndex & index) const98*4882a593Smuzhiyun QSize WifiItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
99*4882a593Smuzhiyun {
100*4882a593Smuzhiyun Q_UNUSED(option)
101*4882a593Smuzhiyun Q_UNUSED(index)
102*4882a593Smuzhiyun return QSize(200, 40);
103*4882a593Smuzhiyun }
104*4882a593Smuzhiyun
105*4882a593Smuzhiyun
getLevel(int singalLevel) const106*4882a593Smuzhiyun int WifiItemDelegate::getLevel(int singalLevel) const
107*4882a593Smuzhiyun {
108*4882a593Smuzhiyun int ret = 1;
109*4882a593Smuzhiyun if( singalLevel >= -66){
110*4882a593Smuzhiyun ret =4;
111*4882a593Smuzhiyun }else if(singalLevel >=-77 &&singalLevel<-66){
112*4882a593Smuzhiyun ret =3;
113*4882a593Smuzhiyun }else if(singalLevel >=-88 && singalLevel<-77){
114*4882a593Smuzhiyun ret =2;
115*4882a593Smuzhiyun }else if(singalLevel >=-100 && singalLevel<-88){
116*4882a593Smuzhiyun ret =1;
117*4882a593Smuzhiyun }else{
118*4882a593Smuzhiyun ret =0;
119*4882a593Smuzhiyun }
120*4882a593Smuzhiyun return ret;
121*4882a593Smuzhiyun }
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun
WifiModel(QObject * parent)124*4882a593Smuzhiyun WifiModel::WifiModel(QObject *parent):QAbstractListModel(parent)
125*4882a593Smuzhiyun {
126*4882a593Smuzhiyun }
127*4882a593Smuzhiyun
removeRepeat(const QList<ScanInfo> & list)128*4882a593Smuzhiyun QList<ScanInfo> removeRepeat(const QList<ScanInfo> &list)
129*4882a593Smuzhiyun {
130*4882a593Smuzhiyun QList<ScanInfo> results;
131*4882a593Smuzhiyun foreach (ScanInfo info, list) {
132*4882a593Smuzhiyun if(!results.contains(info)){
133*4882a593Smuzhiyun results <<info;
134*4882a593Smuzhiyun }
135*4882a593Smuzhiyun }
136*4882a593Smuzhiyun return results;
137*4882a593Smuzhiyun }
138*4882a593Smuzhiyun
setData(const QList<ScanInfo> & list)139*4882a593Smuzhiyun void WifiModel::setData(const QList<ScanInfo> &list)
140*4882a593Smuzhiyun {
141*4882a593Smuzhiyun if(list == m_list)
142*4882a593Smuzhiyun {
143*4882a593Smuzhiyun return;
144*4882a593Smuzhiyun }
145*4882a593Smuzhiyun beginResetModel();
146*4882a593Smuzhiyun m_list = list;
147*4882a593Smuzhiyun m_fixCount =0;
148*4882a593Smuzhiyun endResetModel();
149*4882a593Smuzhiyun }
150*4882a593Smuzhiyun
setDataHostap(const QList<ScanInfoAp> & infos)151*4882a593Smuzhiyun void WifiModel::setDataHostap(const QList<ScanInfoAp> &infos)
152*4882a593Smuzhiyun {
153*4882a593Smuzhiyun QList<ScanInfo> list;
154*4882a593Smuzhiyun foreach (ScanInfoAp info, infos) {
155*4882a593Smuzhiyun ScanInfo l;
156*4882a593Smuzhiyun l.ssid = info.ssid;
157*4882a593Smuzhiyun l.signalLevel = info.signal;
158*4882a593Smuzhiyun list << l;
159*4882a593Smuzhiyun }
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun setData(list);
162*4882a593Smuzhiyun }
163*4882a593Smuzhiyun
lostConnectHoseap(const QString & ssid)164*4882a593Smuzhiyun void WifiModel::lostConnectHoseap(const QString &ssid)
165*4882a593Smuzhiyun {
166*4882a593Smuzhiyun QList<ScanInfo> list = m_list;
167*4882a593Smuzhiyun ScanInfo info;
168*4882a593Smuzhiyun info.ssid = ssid;
169*4882a593Smuzhiyun list.removeOne(info);
170*4882a593Smuzhiyun setData(list);
171*4882a593Smuzhiyun }
172*4882a593Smuzhiyun
rowCount(const QModelIndex & parent) const173*4882a593Smuzhiyun int WifiModel::rowCount(const QModelIndex &parent) const
174*4882a593Smuzhiyun {
175*4882a593Smuzhiyun Q_UNUSED(parent)
176*4882a593Smuzhiyun return m_list.size();
177*4882a593Smuzhiyun }
178*4882a593Smuzhiyun
data(const QModelIndex & index,int role) const179*4882a593Smuzhiyun QVariant WifiModel::data(const QModelIndex &index, int role) const
180*4882a593Smuzhiyun {
181*4882a593Smuzhiyun if (!index.isValid())
182*4882a593Smuzhiyun {
183*4882a593Smuzhiyun return QVariant();
184*4882a593Smuzhiyun }
185*4882a593Smuzhiyun if (index.row() >= m_list.size() || index.row() < 0)
186*4882a593Smuzhiyun return QVariant();
187*4882a593Smuzhiyun if(role == Qt::DisplayRole)
188*4882a593Smuzhiyun {
189*4882a593Smuzhiyun ScanInfo d =m_list[index.row()];
190*4882a593Smuzhiyun QList<QVariant> list;
191*4882a593Smuzhiyun list << d.bssid
192*4882a593Smuzhiyun <<d.frequency
193*4882a593Smuzhiyun << d.signalLevel
194*4882a593Smuzhiyun <<d.flags
195*4882a593Smuzhiyun << d.ssid
196*4882a593Smuzhiyun <<d.state;
197*4882a593Smuzhiyun return QVariant(list);
198*4882a593Smuzhiyun }
199*4882a593Smuzhiyun return QVariant();
200*4882a593Smuzhiyun }
201*4882a593Smuzhiyun
canFetchMore(const QModelIndex & parent) const202*4882a593Smuzhiyun bool WifiModel::canFetchMore(const QModelIndex &parent) const
203*4882a593Smuzhiyun {
204*4882a593Smuzhiyun Q_UNUSED(parent)
205*4882a593Smuzhiyun return m_fixCount< m_list.size();
206*4882a593Smuzhiyun }
207*4882a593Smuzhiyun
fetchMore(const QModelIndex & parent)208*4882a593Smuzhiyun void WifiModel::fetchMore(const QModelIndex &parent)
209*4882a593Smuzhiyun {
210*4882a593Smuzhiyun Q_UNUSED(parent)
211*4882a593Smuzhiyun int remainder = m_list.size() - m_fixCount;
212*4882a593Smuzhiyun int itemsToFetch = qMin(10, remainder);
213*4882a593Smuzhiyun beginInsertRows(QModelIndex(), m_fixCount, m_fixCount+itemsToFetch-1);
214*4882a593Smuzhiyun m_fixCount += itemsToFetch;
215*4882a593Smuzhiyun endInsertRows();
216*4882a593Smuzhiyun }
217