Merge branch '1027-cc' into 'dbus-interface'

1027 cc

See merge request kylin-desktop/kylin-nm!366
This commit is contained in:
w x 2021-10-28 12:35:01 +00:00
commit dd40b9b94e
19 changed files with 280 additions and 75 deletions

1
debian/control vendored
View File

@ -18,6 +18,7 @@ Build-Depends: debhelper (>=9),
libkf5networkmanagerqt-dev (>= 5.36.0),
libnm-dev,
libcap-dev,
libukcc-dev,
Standards-Version: 4.5.0
Rules-Requires-Root: no
Homepage: https://github.com/ukui/kylin-nm

View File

@ -0,0 +1,105 @@
#include "infobutton.h"
#include <QEvent>
#include <QPainter>
#include <QApplication>
#include <QDebug>
#define BUTTON_SIZE 36,36
#define ICON_SIZE 16,16
#define BACKGROUND_COLOR QColor(0,0,0,0)
#define FOREGROUND_COLOR_NORMAL qApp->palette().text().color()
#define FOREGROUND_COLOR_HOVER QColor(55,144,250,255)
#define FOREGROUND_COLOR_PRESS QColor(36,109,212,255)
#define OUTER_PATH 8,8,16,16
#define INNER_PATH 9,9,14,14
#define TEXT_POS 14,5,16,16,0
#define BUTTON_SIZE 36,36
#define THEME_SCHAME "org.ukui.style"
#define COLOR_THEME "styleName"
InfoButton::InfoButton(QWidget *parent) : QPushButton(parent)
{
this->setFixedSize(BUTTON_SIZE);
initUI();
const QByteArray style_id(THEME_SCHAME);
if (QGSettings::isSchemaInstalled(style_id)) {
m_styleGsettings = new QGSettings(style_id);
connect(m_styleGsettings, &QGSettings::changed, this, &InfoButton::onGSettingChaned);
} else {
qDebug() << "Gsettings interface \"org.ukui.style\" is not exist!";
}
}
void InfoButton::initUI()
{
this->setFixedSize(BUTTON_SIZE);
m_backgroundColor = BACKGROUND_COLOR;
m_foregroundColor = FOREGROUND_COLOR_NORMAL;
}
void InfoButton::onGSettingChaned(const QString &key)
{
if (key == COLOR_THEME) {
m_foregroundColor = FOREGROUND_COLOR_NORMAL;
this->repaint();
}
}
void InfoButton::paintEvent(QPaintEvent *event)
{
QPalette pal = this->palette();
pal.setColor(QPalette::Base, m_backgroundColor);
pal.setColor(QPalette::Text, m_foregroundColor);
QPainterPath cPath;
cPath.addRect(0, 0, ICON_SIZE);
cPath.addEllipse(0, 0, ICON_SIZE);
QPainterPath outerPath;
outerPath.addEllipse(OUTER_PATH);
QPainterPath innerPath;
innerPath.addEllipse(INNER_PATH);
outerPath -= innerPath;
QPainter painter(this);
painter.setRenderHint(QPainter:: Antialiasing, true); //设置渲染,启动反锯齿
painter.setPen(Qt::NoPen);
painter.setBrush(pal.color(QPalette::Base));
painter.drawPath(cPath);
painter.fillPath(outerPath, pal.color(QPalette::Text));
painter.setPen(m_foregroundColor);
QFont font("Noto Sans CJK SC", 11, QFont::Normal, false);
painter.setFont(font);
painter.drawText(TEXT_POS, "i");
}
void InfoButton::enterEvent(QEvent *event)
{
m_foregroundColor = FOREGROUND_COLOR_HOVER;
this->repaint();
}
void InfoButton::leaveEvent(QEvent *event)
{
m_foregroundColor = FOREGROUND_COLOR_NORMAL;
this->repaint();
}
void InfoButton::mousePressEvent(QMouseEvent *event)
{
m_foregroundColor = FOREGROUND_COLOR_PRESS;
this->repaint();
return QPushButton::mousePressEvent(event);
}
void InfoButton::mouseReleaseEvent(QMouseEvent *event)
{
m_foregroundColor = FOREGROUND_COLOR_HOVER;
this->repaint();
return QPushButton::mouseReleaseEvent(event);
}

View File

@ -0,0 +1,35 @@
#ifndef INFOBUTTON_H
#define INFOBUTTON_H
#include <QPushButton>
#include <QIcon>
#include <QGSettings>
class InfoButton : public QPushButton
{
Q_OBJECT
public:
explicit InfoButton(QWidget * parent = nullptr);
~InfoButton() = default;
protected:
void paintEvent(QPaintEvent *event);
void enterEvent(QEvent *event);
void leaveEvent(QEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
private:
void initUI();
private:
QColor m_backgroundColor;
QColor m_foregroundColor;
//监听主题的Gsettings
QGSettings * m_styleGsettings = nullptr;
private slots:
void onGSettingChaned(const QString &key);
};
#endif // INFOBUTTON_H

View File

@ -0,0 +1,9 @@
#LIBINTERFACE_NAME = $$qtLibraryTarget(infobutton)
SOURCES += \
$$PWD/InfoButton/infobutton.cpp \
HEADERS += \
$$PWD/InfoButton/infobutton.h \

View File

@ -22,9 +22,9 @@ void DrownLabel::setDropDownStatus(bool status)
void DrownLabel::loadPixmap(bool isChecked)
{
if (isChecked) {
setPixmap(QIcon::fromTheme("ukui-up-symbolic", QIcon(":/img/plugins/netconnect/up.svg")).pixmap(ICONSIZE));
setPixmap(QIcon::fromTheme("ukui-up-symbolic").pixmap(ICONSIZE));
} else {
setPixmap(QIcon::fromTheme("ukui-down-symbolic", QIcon(":/img/plugins/netconnect/down.svg")).pixmap(ICONSIZE));
setPixmap(QIcon::fromTheme("ukui-down-symbolic").pixmap(ICONSIZE));
}
}

View File

@ -10,7 +10,7 @@
#include <QDebug>
#include <QImage>
#include "fixlabel.h"
#include "infobutton.h"
#include "../component/InfoButton/infobutton.h"
class LanItem : public QPushButton
{

View File

@ -170,7 +170,6 @@ void NetConnect::initComponent() {
wiredSwitch->blockSignals(true);
wiredSwitch->setChecked(true);
wiredSwitch->blockSignals(false);
initNet();
qDebug()<<"[Netconnect] org.ukui.kylin-nm.switch is not installed!";
}
@ -182,7 +181,7 @@ void NetConnect::initComponent() {
}
initNet();
if (deviceStatusMap.isEmpty() || !m_interface->isValid()) {
if (!wiredSwitch->isChecked() || deviceStatusMap.isEmpty() || !m_interface->isValid()) {
hideLayout(ui->availableLayout);
}
@ -313,11 +312,9 @@ void NetConnect::initNet()
}
//再填充每个设备的列表
for (int i = 0; i < deviceList.size(); ++i) {
if (deviceStatusMap[deviceList.at(i)]) {
initNetListFromDevice(deviceList.at(i));
}
}
}
void NetConnect::runExternalApp() {
QString cmd = "nm-connection-editor";
@ -343,10 +340,6 @@ void NetConnect::deActiveConnect(QString ssid, QString deviceName, int type) {
void NetConnect::initNetListFromDevice(QString deviceName)
{
qDebug() << "[NetConnect]initNetListFromDevice " << deviceName;
if (!wiredSwitch->isChecked()) {
qDebug() << "[NetConnect]initNetListFromDevice " << deviceName << " switch off";
return;
}
if (!deviceFrameMap.contains(deviceName)) {
qDebug() << "[NetConnect]initNetListFromDevice " << deviceName << " not exist";
return;
@ -468,8 +461,11 @@ void NetConnect::addDeviceFrame(QString devName)
itemFrame->deviceFrame->deviceSwitch->setChecked(enable);
if (enable) {
itemFrame->lanItemFrame->show();
itemFrame->deviceFrame->dropDownLabel->show();
} else {
itemFrame->lanItemFrame->hide();
itemFrame->deviceFrame->dropDownLabel->hide();
itemFrame->deviceFrame->dropDownLabel->setDropDownStatus(false);
}
deviceFrameMap.insert(devName, itemFrame);
qDebug() << "[NetConnect]deviceFrameMap insert" << devName;
@ -481,20 +477,13 @@ void NetConnect::addDeviceFrame(QString devName)
if (checked) {
qDebug() << "[NetConnect]set " << devName << "status" << true;
itemFrame->lanItemFrame->show();
initNetListFromDevice(devName);
itemFrame->deviceFrame->dropDownLabel->show();
itemFrame->deviceFrame->dropDownLabel->setDropDownStatus(true);
deviceStatusMap[devName] = true;
} else {
qDebug() << "[NetConnect]set " << devName << "status" << false;
if (itemFrame->lanItemFrame->layout() != NULL) {
QLayoutItem* item;
while ((item = itemFrame->lanItemFrame->layout()->takeAt(0)) != NULL) {
delete item->widget();
delete item;
item = nullptr;
}
itemFrame->itemMap.clear();
}
itemFrame->lanItemFrame->hide();
itemFrame->deviceFrame->dropDownLabel->hide();
deviceStatusMap[devName] = false;
}
});
@ -514,6 +503,15 @@ void NetConnect::removeDeviceFrame(QString devName)
qDebug() << "[NetConnect]removeDeviceFrame " << devName;
if (deviceFrameMap.contains(devName)) {
ItemFrame *item = deviceFrameMap[devName];
if (item->lanItemFrame->layout() != NULL) {
QLayoutItem* layoutItem;
while ((layoutItem = item->lanItemFrame->layout()->takeAt(0)) != NULL) {
delete layoutItem->widget();
delete layoutItem;
layoutItem = nullptr;
}
item->itemMap.clear();
}
delete item;
item = nullptr;
deviceFrameMap.remove(devName);
@ -560,10 +558,8 @@ void NetConnect::onDeviceStatusChanged()
for (int i = 0; i < addList.size(); ++i) {
qDebug() << "add a device " << addList.at(i) << "status" << map[addList.at(i)];
addDeviceFrame(addList.at(i));
if (map[addList.at(i)]) {
initNetListFromDevice(addList.at(i));
}
}
deviceStatusMap = map;
if (deviceStatusMap.isEmpty()) {
wiredSwitch->setDisabledFlag(true);
@ -606,9 +602,6 @@ void NetConnect::onDeviceNameChanged(QString oldName, QString newName, int type)
void NetConnect::onLanAdd(QString deviceName, QStringList lanInfo)
{
qDebug()<<"[NetConnect]onLanAdd "<< deviceName << " " << lanInfo;
if(!wiredSwitch->isChecked()) {
return;
}
if (!deviceName.isEmpty() && !deviceStatusMap.contains(deviceName)) {
return;
@ -737,10 +730,6 @@ void NetConnect::removeOneLanFrame(ItemFrame *frame, QString deviceName, QString
//activeconnect status change
void NetConnect::onActiveConnectionChanged(QString deviceName, QString uuid, int status)
{
if (!wiredSwitch->isChecked()) {
qDebug() << "[NetConnect]onActiveConnectionChanged but wiredSwitch is off";
return;
}
if (uuid.isEmpty()) {
qDebug() << "[NetConnect]onActiveConnectionChanged but uuid is empty";
return;
@ -848,6 +837,10 @@ int NetConnect::getInsertPos(QString connName, QString deviceName)
auto dbusArg = result.arguments().at(0).value<QDBusArgument>();
QMap<QString, QVector<QStringList>> variantList;
dbusArg >> variantList;
if (!variantList.contains(deviceName)) {
qDebug() << "[NetConnect] getInsertPos but " << deviceName << "not exist";
return 0;
}
for (int i = 0; i < variantList[deviceName].size(); ++i ) {
if (variantList[deviceName].at(i).at(0) == connName) {
qDebug() << "pos in kylin-nm is " << i;

View File

@ -3,6 +3,7 @@ TEMPLATE = lib
CONFIG += plugin
include(../component/switchbutton.pri)
include(../component/infobutton.pri)
TARGET = $$qtLibraryTarget(netconnect)
DESTDIR = ../..

View File

@ -26,12 +26,12 @@ void DrownLabel::loadPixmap(bool isChecked)
if (QIcon::fromTheme("ukui-up-symbolic").isNull()) {
qDebug() << "ukui-up-symbolic is missing";
}
setPixmap(QIcon::fromTheme("ukui-up-symbolic", QIcon(":/img/plugins/netconnect/up.svg")).pixmap(ICONSIZE));
setPixmap(QIcon::fromTheme("ukui-up-symbolic").pixmap(ICONSIZE));
} else {
if (QIcon::fromTheme("ukui-down-symbolic").isNull()) {
qDebug() << "ukui-down-symbolic is missing";
}
setPixmap(QIcon::fromTheme("ukui-down-symbolic", QIcon(":/img/plugins/netconnect/down.svg")).pixmap(ICONSIZE));
setPixmap(QIcon::fromTheme("ukui-down-symbolic").pixmap(ICONSIZE));
}
}

View File

@ -214,6 +214,7 @@ void WlanConnect::initComponent() {
//网卡name处理
connect(m_interface, SIGNAL(deviceNameChanged(QString, QString, int)), this, SLOT(onDeviceNameChanged(QString, QString, int)), Qt::QueuedConnection);
connect(m_interface, SIGNAL(timeToUpdate()), this, SLOT(updateList()), Qt::QueuedConnection);
//高级设置
connect(ui->detailBtn, &QPushButton::clicked, this, [=](bool checked) {
Q_UNUSED(checked)
@ -226,9 +227,9 @@ void WlanConnect::initComponent() {
connect(m_scanTimer, &QTimer::timeout, this, &WlanConnect::reScan, Qt::QueuedConnection);
reScan();
m_updateTimer = new QTimer(this);
m_updateTimer->start(UPDATETIMER);
connect(m_scanTimer, &QTimer::timeout, this, &WlanConnect::updateList, Qt::QueuedConnection);
// m_updateTimer = new QTimer(this);
// m_updateTimer->start(UPDATETIMER);
}
void WlanConnect::reScan()
@ -241,7 +242,7 @@ void WlanConnect::reScan()
}
}
//定时5秒更新列表顺序
//更新列表顺序
void WlanConnect::updateList()
{
if (!wifiSwtch->isChecked()) {
@ -300,6 +301,19 @@ void WlanConnect::resortWifiList(ItemFrame *frame, QVector<QStringList> list)
}
} else {
qDebug() << " no active connection when resort";
if (!frame->uuid.isEmpty()) {
QMap<QString, WlanItem*>::iterator itemIter;
for (itemIter = frame->itemMap.begin(); itemIter != frame->itemMap.end(); itemIter++) {
if (itemIter.value()->uuid == frame->uuid ) {
WlanItem * item= nullptr;
item = itemIter.value();
qDebug() << "a active connect missing when resort";
itemIter.value()->uuid.clear();
itemActiveConnectionStatusChanged(item, DEACTIVATED);
break;
}
}
}
frame->uuid.clear();
}
@ -469,7 +483,7 @@ void WlanConnect::onActiveConnectionChanged(QString deviceName, QString ssid, QS
}
WlanItem * item= nullptr;
//device ssid 有可能均为空
if (deviceName.isEmpty() && ssid.isEmpty()) {
if (deviceName.isEmpty() || ssid.isEmpty()) {
if (status == ACTIVATING || status == ACTIVATED) {
return;
}
@ -490,9 +504,6 @@ void WlanConnect::onActiveConnectionChanged(QString deviceName, QString ssid, QS
}
}
} else {
if (deviceName.isEmpty() || ssid.isEmpty()) {
return;
}
if (!deviceFrameMap.contains(deviceName)) {
return;
}
@ -834,6 +845,15 @@ void WlanConnect::removeDeviceFrame(QString devName)
qDebug() << "[WlanConnect]removeDeviceFrame " << devName;
if (deviceFrameMap.contains(devName)) {
ItemFrame *item = deviceFrameMap[devName];
if (item->lanItemFrame->layout() != NULL) {
QLayoutItem* layoutItem;
while ((layoutItem = item->lanItemFrame->layout()->takeAt(0)) != NULL) {
delete layoutItem->widget();
delete layoutItem;
item = nullptr;
}
item->itemMap.clear();
}
delete item;
item = nullptr;
deviceFrameMap.remove(devName);

View File

@ -141,7 +141,7 @@ private:
// DeviceWlanlistInfo deviceWlanlistInfo;
QTimer * m_scanTimer = nullptr;
QTimer * m_updateTimer = nullptr;
// QTimer * m_updateTimer = nullptr;
private:
SwitchButton *wifiSwtch;
bool mFirstLoad;

View File

@ -3,6 +3,7 @@ TEMPLATE = lib
CONFIG += plugin
include(../component/switchbutton.pri)
include(../component/infobutton.pri)
TARGET = $$qtLibraryTarget(wlanconnect)
DESTDIR = ../..

View File

@ -10,7 +10,7 @@
#include <QGSettings>
#include <QImage>
#include "fixlabel.h"
#include "infobutton.h"
#include "../component/InfoButton/infobutton.h"
class WlanItem : public QPushButton
{

View File

@ -108,6 +108,8 @@ Q_SIGNALS: // SIGNALS
void signalStrengthChange(QString devName, QString ssid, int strength);
//安全性变化
void secuTypeChange(QString devName, QString ssid, QString secuType);
//列表排序
void timeToUpdate();
};
#endif

View File

@ -17,6 +17,9 @@
#define THEME_SCHAME "org.ukui.style"
#define COLOR_THEME "styleName"
#define LAN_PAGE_INDEX 0
#define WLAN_PAGE_INDEX 1
#include <kwindowsystem.h>
#include <kwindowsystem_export.h>
@ -216,6 +219,8 @@ void MainWindow::initDbusConnnect()
connect(m_wlanWidget, &WlanPage::hotspotActivated, this, &MainWindow::hotspotActivated);
connect(m_wlanWidget, &WlanPage::secuTypeChange, this, &MainWindow::secuTypeChange);
connect(m_wlanWidget, &WlanPage::signalStrengthChange, this, &MainWindow::signalStrengthChange);
connect(m_wlanWidget, &WlanPage::timeToUpdate , this, &MainWindow::timeToUpdate);
connect(m_wlanWidget, &WlanPage::showMainWindow, this, &MainWindow::onShowByWlanPage);
}
/**
@ -339,9 +344,9 @@ void MainWindow::showControlCenter()
{
QProcess process;
if (!m_lanWidget->lanIsConnected() && m_wlanWidget->wlanIsConnected()){
process.startDetached("ukui-control-center --wlanconnect");
process.startDetached("ukui-control-center -m wlanconnect");
} else {
process.startDetached("ukui-control-center --wiredconnect");
process.startDetached("ukui-control-center -m netconnect");
}
}
@ -422,6 +427,19 @@ void MainWindow::onWlanConnectStatusToChangeTrayIcon(int state)
}
}
void MainWindow::onShowByWlanPage()
{
m_centralWidget->setCurrentIndex(WLAN_PAGE_INDEX);
if(QApplication::activeWindow() != this) {
this->resetWindowPosition();
this->showNormal();
this->raise();
this->activateWindow();
emit this->mainWindowVisibleChanged(true);
}
}
/**
* @brief MainWindow::keyPressEvent esc键关闭主界面
* @param event

View File

@ -79,6 +79,8 @@ signals:
//安全性变化
void secuTypeChange(QString devName, QString ssid, QString secuType);
void mainWindowVisibleChanged(const bool &visible);
//列表排序
void timeToUpdate();
public slots:
protected:
@ -133,6 +135,7 @@ private slots:
void onSetTrayIconLoading();
void onLanConnectStatusToChangeTrayIcon(int state);
void onWlanConnectStatusToChangeTrayIcon(int state);
void onShowByWlanPage();
};
#endif // MAINWINDOW_H

View File

@ -1103,8 +1103,13 @@ bool LanPage::eventFilter(QObject *watched, QEvent *event)
void LanPage::activateWired(const QString& devName, const QString& connUuid)
{
qDebug() << "[LanPage] activateWired" << devName << connUuid;
if (!m_deviceResource->wiredDeviceCarriered(devName)) {
qDebug() << LOG_FLAG << devName << "is not carried, so can not activate connection";
this->showDesktopNotify(tr("Wired Device not carried"));
} else {
m_wiredConnectOperation->activateConnection(connUuid, devName);
}
}
void LanPage::deactivateWired(const QString& devName, const QString& connUuid)
{

View File

@ -170,6 +170,7 @@ void WlanPage::initTimer()
m_refreshIconTimer = new QTimer(this);
connect(m_refreshIconTimer, &QTimer::timeout, this, &WlanPage::onRefreshIconTimer);
m_refreshIconTimer->start(ICON_REFRESH_INTERVAL);
}
/**
@ -227,7 +228,7 @@ void WlanPage::initDeviceCombox()
}
connect(m_deviceComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
this, &WlanPage::onDeviceComboxIndexChanged);
this, &WlanPage::onDeviceComboxIndexChanged, Qt::DirectConnection);
return;
}
@ -927,6 +928,7 @@ void WlanPage::onItemHeightChanged(const bool isExpanded, const QString &ssid)
void WlanPage::onDeviceComboxIndexChanged(int currentIndex)
{
qDebug() << "onDeviceComboxIndexChanged";
if (!m_deviceComboBox || currentIndex < 0) {
return;
}
@ -994,6 +996,13 @@ void WlanPage::onWifiEnabledChanged(bool isWifiOn)
void WlanPage::onRefreshIconTimer()
{
emit timeToUpdate();
if(!this->isVisible()) {
return;
}
qDebug() << "onRefreshIconTimer";
if (m_expandedItem) {
qDebug()<< LOG_FLAG << "Has expanded item and forbid refresh wifi strength" << Q_FUNC_INFO << __LINE__;
return;
@ -1180,31 +1189,31 @@ void WlanPage::activateWirelessConnection(const QString& devName, const QString&
return;
}
if (wirelessNetItem.m_isConfigured) {
m_wirelessConnectOpreation->activeWirelessConnect(devName, wirelessNetItem.m_connectUuid);
} else {
//todo: 显示界面输入密码 无需密码的wifi
# if 0
if (devName != m_currentDevice) {
//todo
int index = m_deviceComboBox->findText(devName);
if (index >= 0) {
m_deviceComboBox->setCurrentIndex(index);
} else {
qDebug() << "[WlanPage]activateWirelessConnection no such " << devName;
return;
}
}
QListWidgetItem *p_listWidgetItem = nullptr;
WlanListItem *p_wlanItem = nullptr;
if (m_wirelessNetItemMap.contains(ssid)) {
p_listWidgetItem = m_wirelessNetItemMap.value(ssid);
p_wlanItem = (WlanListItem*)m_inactivatedNetListWidget->itemWidget(p_listWidgetItem);
int row = m_inactivatedNetListWidget->row(p_listWidgetItem);
// m_inactivatedNetListArea->scrollToItem(p_listWidgetItem, QAbstractItemView::EnsureVisible);
m_inactivatedNetListArea->verticalScrollBar()->setValue((p_listWidgetItem->sizeHint().height()*(row+1)/m_inactivatedNetListWidget->height())*m_inactivatedNetListArea->verticalScrollBar()->maximumHeight());
m_inactivatedNetListWidget->scrollToItem(p_listWidgetItem, QAbstractItemView::EnsureVisible);
bool a = true;
p_wlanItem->setExpanded(a);
QMouseEvent *event = new QMouseEvent(QEvent::MouseButtonPress, QPoint(0,0), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
QApplication::postEvent(p_wlanItem, event);
emit showMainWindow();
}
}
#endif
} else {
qDebug() << "[WlanPage]activateWirelessConnection no such " << ssid << "in" << devName;
}
return;
}
@ -1236,11 +1245,11 @@ void WlanPage::onMainWindowVisibleChanged(const bool &visible)
//打开页面时先触发一次扫描然后定时扫描wifi热点和刷新icon
requestScan();
m_scanTimer->start(AP_SCAN_INTERVAL);
m_refreshIconTimer->start(ICON_REFRESH_INTERVAL);
// m_refreshIconTimer->start(ICON_REFRESH_INTERVAL);
} else {
//界面关闭的时候停止wifi扫描和刷新
m_scanTimer->stop();
m_refreshIconTimer->stop();
// m_refreshIconTimer->stop();
}
return;

View File

@ -60,6 +60,9 @@ signals:
void secuTypeChange(QString devName, QString ssid, QString secuType);
void hiddenWlanClicked();
void wlanConnectChanged(int state);
void timeToUpdate();
void showMainWindow();
public slots:
void onMainWindowVisibleChanged(const bool &visible);