xref: /OK3568_Linux_fs/app/forlinx/flapp/src/plugins/wifi/wifiview.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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