diff --git a/sources/gui/src/generalwidget.cpp b/sources/gui/src/generalwidget.cpp index 0fc9d3d..844f0cb 100644 --- a/sources/gui/src/generalwidget.cpp +++ b/sources/gui/src/generalwidget.cpp @@ -189,9 +189,9 @@ void GeneralWidget::setSettings(const QMap settings) if (generalSettings[QString("Interface")].remove(QString("'")) == ui->comboBox_interface->itemText(i)) ui->comboBox_interface->setCurrentIndex(i); if (generalSettings.contains(QString("BindsToInterfaces"))) - ui->listWidget_bindto->addItems(generalSettings[QString("BindsToInterfaces")].split(QString(" "))); + ui->listWidget_bindto->addItems(generalSettings[QString("BindsToInterfaces")].split(QChar(' '))); if (generalSettings.contains(QString("After"))) - ui->listWidget_after->addItems(generalSettings[QString("After")].split(QString(" "))); + ui->listWidget_after->addItems(generalSettings[QString("After")].split(QChar(' '))); if (generalSettings.contains(QString("ExecUpPost"))) ui->lineEdit_execUpPost->setText(generalSettings[QString("ExecUpPost")].remove(QString("'"))); if (generalSettings.contains(QString("ExecDownPre"))) diff --git a/sources/gui/src/ipwidget.cpp b/sources/gui/src/ipwidget.cpp index 580cc5a..cd0c9aa 100644 --- a/sources/gui/src/ipwidget.cpp +++ b/sources/gui/src/ipwidget.cpp @@ -170,7 +170,7 @@ void IpWidget::keyPressEvent(QKeyEvent *pressedKey) QString IpWidget::getIp(const QString rawIp) { - QStringList ip = rawIp.split(QString(".")); + QStringList ip = rawIp.split(QChar('.')); // fix empty fields if (ip[0].isEmpty()) @@ -233,8 +233,8 @@ QString IpWidget::getPrefix6(const QString rawPrefix) void IpWidget::addIp() { - QString ip = getIp(ui->lineEdit_ipAddress->text().remove(" ").split(QString("/"))[0]); - QString prefix = getPrefix(ui->lineEdit_ipAddress->text().remove(" ").split(QString("/"))[1]); + QString ip = getIp(ui->lineEdit_ipAddress->text().remove(" ").split(QChar('/'))[0]); + QString prefix = getPrefix(ui->lineEdit_ipAddress->text().remove(" ").split(QChar('/'))[1]); ui->listWidget_ipAddress->addItem(ip + QString("/") + prefix); ui->lineEdit_ipAddress->clear(); @@ -243,8 +243,8 @@ void IpWidget::addIp() void IpWidget::addIpRoutes() { - QString ip = getIp(ui->lineEdit_ipRoutes->text().remove(" ").split(QString("/"))[0]); - QString prefix = getPrefix(ui->lineEdit_ipRoutes->text().remove(" ").split(QString("/"))[1]); + QString ip = getIp(ui->lineEdit_ipRoutes->text().remove(" ").split(QChar('/'))[0]); + QString prefix = getPrefix(ui->lineEdit_ipRoutes->text().remove(" ").split(QChar('/'))[1]); QString ipVia = getIp(ui->lineEdit_ipRoutes2->text().remove(" ")); ui->listWidget_ipRoutes->addItem(ip + QString("/") + prefix + QString(" via ") + ipVia); @@ -255,8 +255,8 @@ void IpWidget::addIpRoutes() void IpWidget::addIp6() { - QString ip = getIp6(ui->lineEdit_ipAddress6->text().remove(" ").split(QString("/"))[0]); - QString prefix = getPrefix6(ui->lineEdit_ipAddress6->text().remove(" ").split(QString("/"))[1]); + QString ip = getIp6(ui->lineEdit_ipAddress6->text().remove(" ").split(QChar('/'))[0]); + QString prefix = getPrefix6(ui->lineEdit_ipAddress6->text().remove(" ").split(QChar('/'))[1]); ui->listWidget_ipAddress6->addItem(ip + QString("/") + prefix); ui->lineEdit_ipAddress6->clear(); @@ -265,8 +265,8 @@ void IpWidget::addIp6() void IpWidget::addIpRoutes6() { - QString ip = getIp6(ui->lineEdit_ipRoutes6->text().remove(" ").split(QString("/"))[0]); - QString prefix = getPrefix6(ui->lineEdit_ipRoutes6->text().remove(" ").split(QString("/"))[1]); + QString ip = getIp6(ui->lineEdit_ipRoutes6->text().remove(" ").split(QChar('/'))[0]); + QString prefix = getPrefix6(ui->lineEdit_ipRoutes6->text().remove(" ").split(QChar('/'))[1]); QString ipVia = getIp6(ui->lineEdit_ipRoutes62->text().remove(" ")); ui->listWidget_ipRoutes6->addItem(ip + QString("/") + prefix + QString(" via ") + ipVia); @@ -502,11 +502,11 @@ void IpWidget::setSettings(const QMap settings) } } if (ipSettings.contains(QString("Address"))) - ui->listWidget_ipAddress->addItems(ipSettings[QString("Address")].remove(QString("'")).split(QString(" "))); + ui->listWidget_ipAddress->addItems(ipSettings[QString("Address")].remove(QString("'")).split(QChar(' '))); if (ipSettings.contains(QString("Gateway"))) ui->lineEdit_gateway->setText(ipSettings[QString("Gateway")].remove(QString("'"))); if (ipSettings.contains(QString("Routes"))) - ui->listWidget_ipRoutes->addItems(ipSettings[QString("Routes")].remove(QString("'")).split(QString(" "))); + ui->listWidget_ipRoutes->addItems(ipSettings[QString("Routes")].remove(QString("'")).split(QChar(' '))); if (ipSettings.contains(QString("IP6"))) { if (ipSettings[QString("IP6")].remove(QString("'")) == QString("no")) ui->checkBox_ip6->setCheckState(Qt::Unchecked); @@ -518,11 +518,11 @@ void IpWidget::setSettings(const QMap settings) } } if (ipSettings.contains(QString("Address6"))) - ui->listWidget_ipAddress6->addItems(ipSettings[QString("Address6")].remove(QString("'")).split(QString(" "))); + ui->listWidget_ipAddress6->addItems(ipSettings[QString("Address6")].remove(QString("'")).split(QChar(' '))); if (ipSettings.contains(QString("Gateway6"))) ui->lineEdit_gateway6->setText(ipSettings[QString("Gateway6")].remove(QString("'"))); if (ipSettings.contains(QString("Routes6"))) - ui->listWidget_ipRoutes6->addItems(ipSettings[QString("Routes6")].remove(QString("'")).split(QString(" "))); + ui->listWidget_ipRoutes6->addItems(ipSettings[QString("Routes6")].remove(QString("'")).split(QChar(' '))); if (ipSettings.contains(QString("IPCustom"))) { QStringList custom; if (ipSettings[QString("IPCustom")].contains(QString("\n"))) @@ -552,13 +552,13 @@ void IpWidget::setSettings(const QMap settings) if (ipSettings[QString("DHCPReleaseOnStop")].remove(QString("'")) == QString("yes")) ui->checkBox_dhcp->setCheckState(Qt::Checked); if (ipSettings.contains(QString("DNS"))) - ui->listWidget_dns->addItems(ipSettings[QString("DNS")].remove(QString("'")).split(QString(" "))); + ui->listWidget_dns->addItems(ipSettings[QString("DNS")].remove(QString("'")).split(QChar(' '))); if (ipSettings.contains(QString("DNSDomain"))) ui->lineEdit_dnsDomain->setText(ipSettings[QString("DNSDomain")].remove(QString("'"))); if (ipSettings.contains(QString("DNSSearch"))) ui->lineEdit_dnsSearch->setText(ipSettings[QString("DNSSearch")].remove(QString("'"))); if (ipSettings.contains(QString("DNSOptions"))) - ui->listWidget_dnsOptions->addItems(ipSettings[QString("DNSOptions")].remove(QString("'")).split(QString(" "))); + ui->listWidget_dnsOptions->addItems(ipSettings[QString("DNSOptions")].remove(QString("'")).split(QChar(' '))); ipEnable(ui->checkBox_ip->checkState()); changeIpMode(ui->comboBox_ip->currentText()); diff --git a/sources/gui/src/language.cpp b/sources/gui/src/language.cpp index 752ff54..d8698af 100644 --- a/sources/gui/src/language.cpp +++ b/sources/gui/src/language.cpp @@ -63,7 +63,7 @@ QString Language::defineLanguageFromFile(const QString configPath) fileStr = QString(configFile.readLine()); if (fileStr[0] != '#') { if (fileStr.contains(QString("LANGUAGE="))) - language = fileStr.split(QString("="))[1] + language = fileStr.split(QChar('='))[1] .remove(QString(" ")) .trimmed(); } diff --git a/sources/gui/src/macvlanwidget.cpp b/sources/gui/src/macvlanwidget.cpp index 3f74fcc..4aadf85 100644 --- a/sources/gui/src/macvlanwidget.cpp +++ b/sources/gui/src/macvlanwidget.cpp @@ -66,7 +66,7 @@ QMap MacvlanWidget::getSettings() return macvlanSettings; macvlanSettings[QString("Mode")] = ui->comboBox_mode->currentText(); - if (!ui->lineEdit_mac->text().split(QString(":")).join(QString("")).remove(QString(" ")).isEmpty()) + if (!ui->lineEdit_mac->text().split(QChar(':')).join(QString("")).remove(QString(" ")).isEmpty()) macvlanSettings[QString("MACAddress")] = ui->lineEdit_mac->text(); return macvlanSettings; diff --git a/sources/gui/src/mainwindow.cpp b/sources/gui/src/mainwindow.cpp index 7f971c9..291ac89 100644 --- a/sources/gui/src/mainwindow.cpp +++ b/sources/gui/src/mainwindow.cpp @@ -134,11 +134,15 @@ bool MainWindow::checkExternalApps(const QString apps = QString("all")) commandLine.append(configuration[QString("SUDO_PATH")]); if ((apps == QString("netctl")) || (apps == QString("all"))) { commandLine.append(configuration[QString("NETCTL_PATH")]); + commandLine.append(configuration[QString("NETCTLAUTO_PATH")]); } if ((apps == QString("wpasup")) || (apps == QString("all"))) { commandLine.append(configuration[QString("WPACLI_PATH")]); commandLine.append(configuration[QString("WPASUP_PATH")]); } + if ((apps == QString("wpaact")) || (apps == QString("all"))) { + commandLine.append(configuration[QString("WPAACTIOND_PATH")]); + } QProcess command; if (debug) qDebug() << "[MainWindow]" << "[checkExternalApps]" << ":" << "Run cmd" << commandLine.join(QString(" ")); command.start(commandLine.join(QString(" "))); @@ -171,6 +175,7 @@ void MainWindow::createActions() connect(ui->tabWidget, SIGNAL(currentChanged(int)), this, SLOT(updateTabs(int))); connect(ui->actionNetctlAuto, SIGNAL(triggered(bool)), netctlAutoWin, SLOT(showWindow())); + ui->actionNetctlAuto->setVisible(checkExternalApps(QString("all"))); connect(ui->actionSettings, SIGNAL(triggered(bool)), settingsWin, SLOT(showWindow())); connect(ui->actionQuit, SIGNAL(triggered(bool)), this, SLOT(close())); @@ -319,8 +324,8 @@ void MainWindow::updateMainTab() ui->tableWidget_main->setRowCount(profiles.count()); // create header - ui->tableWidget_main->setHorizontalHeaderLabels(QApplication::translate("MainWindow", "Name Description Status") - .split(QString(" "))); + ui->tableWidget_main->setHorizontalHeaderLabels(QApplication::translate("MainWindow", "Name==Description==Status") + .split(QString("=="))); // create items for (int i=0; itableWidget_wifi->setRowCount(scanResults.count()); // create header - ui->tableWidget_wifi->setHorizontalHeaderLabels(QApplication::translate("MainWindow", "Name Status Signal Security") - .split(QString(" "))); + ui->tableWidget_wifi->setHorizontalHeaderLabels(QApplication::translate("MainWindow", "Name==Status==Signal==Security") + .split(QString("=="))); // create items for (int i=0; isetupUi(this); netctlCommand = new Netctl(debug, settings); + + createActions(); } @@ -38,6 +40,7 @@ NetctlAutoWindow::~NetctlAutoWindow() if (debug) qDebug() << "[NetctlAutoWindow]" << "[~NetctlAutoWindow]"; delete ui; + delete netctlCommand; } @@ -45,29 +48,21 @@ void NetctlAutoWindow::createActions() { if (debug) qDebug() << "[NetctlAutoWindow]" << "[createActions]"; -// connect(ui->comboBox_language, SIGNAL(currentIndexChanged(int)), ui->label_info, SLOT(show())); -// connect(ui->buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked(bool)), this, SLOT(close())); -// connect(ui->buttonBox->button(QDialogButtonBox::Reset), SIGNAL(clicked(bool)), this, SLOT(setDefault())); -// connect(ui->buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked(bool)), this, SLOT(saveSettings())); -// connect(ui->buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked(bool)), this, SLOT(close())); -// // buttons -// connect(ui->pushButton_interfaceDir, SIGNAL(clicked(bool)), SLOT(selectIfaceDir())); -// connect(ui->pushButton_netctlPath, SIGNAL(clicked(bool)), SLOT(selectNetctlPath())); -// connect(ui->pushButton_profilePath, SIGNAL(clicked(bool)), SLOT(selectProfileDir())); -// connect(ui->pushButton_rfkill, SIGNAL(clicked(bool)), SLOT(selectRfkillDir())); -// connect(ui->pushButton_sudo, SIGNAL(clicked(bool)), SLOT(selectSudoPath())); -// connect(ui->pushButton_wpaCliPath, SIGNAL(clicked(bool)), SLOT(selectWpaCliPath())); -// connect(ui->pushButton_wpaSupPath, SIGNAL(clicked(bool)), SLOT(selectWpaSupPath())); -} + // menu actions + connect(ui->actionClose, SIGNAL(triggered(bool)), this, SLOT(close())); + connect(ui->actionDisableAll, SIGNAL(triggered(bool)), this, SLOT(netctlAutoDisableAllProfiles())); + connect(ui->actionEnable, SIGNAL(triggered(bool)), this, SLOT(netctlAutoEnableProfile())); + connect(ui->actionEnableAll, SIGNAL(triggered(bool)), this, SLOT(netctlAutoEnableAllProfiles())); + connect(ui->actionSwitch, SIGNAL(triggered(bool)), this, SLOT(netctlAutoStartProfile())); + // table actions + connect(ui->tableWidget, SIGNAL(itemActivated(QTableWidgetItem *)), this, SLOT(startProfile())); + connect(ui->tableWidget, SIGNAL(currentItemChanged(QTableWidgetItem *, QTableWidgetItem *)), this, SLOT(netctlAutoRefreshButtons(QTableWidgetItem *, QTableWidgetItem *))); + connect(ui->tableWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(netctlAutoContextualMenu(QPoint))); -// ESC press event -void NetctlAutoWindow::keyPressEvent(QKeyEvent *pressedKey) -{ - if (debug) qDebug() << "[NetctlAutoWindow]" << "[keyPressEvent]"; - - if (pressedKey->key() == Qt::Key_Escape) - close(); + // buttons + connect(ui->pushButton_enable, SIGNAL(clicked(bool)), SLOT(netctlAutoEnableProfile())); + connect(ui->pushButton_switch, SIGNAL(clicked(bool)), SLOT(netctlAutoStartProfile())); } @@ -75,37 +70,189 @@ void NetctlAutoWindow::showWindow() { if (debug) qDebug() << "[NetctlAutoWindow]" << "[showWindow]"; - clear(); - appendActiveProfiles(); - appendAvailableProfiles(); + netctlAutoAppendTable(); show(); } -void NetctlAutoWindow::appendActiveProfiles() +void NetctlAutoWindow::netctlAutoAppendTable() { - if (debug) qDebug() << "[NetctlAutoWindow]" << "[appendActiveProfiles]"; + if (debug) qDebug() << "[NetctlAutoWindow]" << "[appendTable]"; + QList profiles = netctlCommand->getProfileListFromNetctlAuto(); + ui->tableWidget->setSortingEnabled(false); + ui->tableWidget->selectRow(-1); + ui->tableWidget->sortByColumn(0, Qt::AscendingOrder); + ui->tableWidget->clear(); + ui->tableWidget->setRowCount(profiles.count()); + + // create header + ui->tableWidget->setHorizontalHeaderLabels(QApplication::translate("NetctlAutoWindow", "Profile==Description==Active==Disabled") + .split(QString("=="))); + // create items + for (int i=0; itableWidget->setItem(i, 0, new QTableWidgetItem(profiles[i][0])); + ui->tableWidget->item(i, 0)->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter); + // description + ui->tableWidget->setItem(i, 1, new QTableWidgetItem(profiles[i][1])); + ui->tableWidget->item(i, 1)->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter); + if (profiles[i][2] == "*") { + // active + ui->tableWidget->setItem(i, 2, new QTableWidgetItem(QApplication::translate("NetctlAutoWindow", "yes"))); + ui->tableWidget->item(i, 2)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); + } + else + ui->tableWidget->setItem(i, 2, new QTableWidgetItem(QString(""))); + if (profiles[i][2] == "!") { + // disabled + ui->tableWidget->setItem(i, 3, new QTableWidgetItem(QApplication::translate("NetctlAutoWindow", "yes"))); + ui->tableWidget->item(i, 3)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); + } + else + ui->tableWidget->setItem(i, 3, new QTableWidgetItem(QString(""))); + } + + ui->tableWidget->setSortingEnabled(true); + ui->tableWidget->resizeRowsToContents(); +#if QT_VERSION >= 0x050000 + ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); +#else + ui->tableWidget->horizontalHeader()->setResizeMode(QHeaderView::Stretch); +#endif + + update(); } -void NetctlAutoWindow::appendAvailableProfiles() +void NetctlAutoWindow::netctlAutoContextualMenu(const QPoint &pos) { - if (debug) qDebug() << "[NetctlAutoWindow]" << "[appendAvailableProfiles]"; + if (debug) qDebug() << "[NetctlAutoWindow]" << "[contextualMenu]"; - QList profiles = netctlCommand->getProfileList(); - for (int i=0; ilistWidget_available->addItem(profiles[i][0]); + if (ui->tableWidget->currentItem() == 0) + return; + + // create menu + QMenu menu(this); + QAction *startProfile = menu.addAction(QApplication::translate("NetctlAutoWindow", "Switch to profile")); + startProfile->setIcon(QIcon::fromTheme("dialog-apply")); + QAction *enableProfile = menu.addAction(QApplication::translate("NetctlAutoWindow", "Enable profile")); + menu.addSeparator(); + QAction *enableAllProfiles = menu.addAction(QApplication::translate("NetctlAutoWindow", "Enable all profiles")); + enableAllProfiles->setIcon(QIcon::fromTheme("edit-add")); + QAction *disableAllProfiles = menu.addAction(QApplication::translate("NetctlAutoWindow", "Disable all profiles")); + disableAllProfiles->setIcon(QIcon::fromTheme("edit-delete")); + + // set text + if (ui->tableWidget->item(ui->tableWidget->currentItem()->row(), 2)->text() == QString("yes")) { + enableProfile->setVisible(false); + startProfile->setVisible(false); + } + else { + enableProfile->setVisible(true); + startProfile->setVisible(true); + if (ui->tableWidget->item(ui->tableWidget->currentItem()->row(), 3)->text() == QString("yes")) { + enableProfile->setText(QApplication::translate("NetctlAutoWindow", "Disable")); + enableProfile->setIcon(QIcon::fromTheme("edit-delete")); + } + else { + // buttons + enableProfile->setText(QApplication::translate("NetctlAutoWindow", "Enable")); + enableProfile->setIcon(QIcon::fromTheme("edit-add")); + } + } + + // actions + QAction *action = menu.exec(ui->tableWidget->viewport()->mapToGlobal(pos)); + if (action == startProfile) { + if (debug) qDebug() << "[NetctlAutoWindow]" << "[contextualMenu]" << "Switch to profile"; + netctlAutoStartProfile(); + } + else if (action == enableProfile) { + if (debug) qDebug() << "[NetctlAutoWindow]" << "[contextualMenu]" << "Enable profile"; + netctlAutoEnableProfile(); + } + else if (action == enableAllProfiles) { + if (debug) qDebug() << "[NetctlAutoWindow]" << "[contextualMenu]" << "Enable all profiles"; + netctlAutoEnableAllProfiles(); + } + else if (action == disableAllProfiles) { + if (debug) qDebug() << "[NetctlAutoWindow]" << "[contextualMenu]" << "Disable all profiles"; + netctlAutoDisableAllProfiles(); + } } -void NetctlAutoWindow::clear() +void NetctlAutoWindow::netctlAutoDisableAllProfiles() { - if (debug) qDebug() << "[NetctlAutoWindow]" << "[clear]"; - - ui->listWidget_available->setCurrentRow(-1); - ui->listWidget_available->clear(); - ui->listWidget_active->clear(); - ui->listWidget_active->setCurrentRow(-1); + if (debug) qDebug() << "[NetctlAutoWindow]" << "[disableAllProfiles]"; +} + + +void NetctlAutoWindow::netctlAutoEnableProfile() +{ + if (debug) qDebug() << "[NetctlAutoWindow]" << "[enableProfile]"; +} + + +void NetctlAutoWindow::netctlAutoEnableAllProfiles() +{ + if (debug) qDebug() << "[NetctlAutoWindow]" << "[enableAllProfiles]"; +} + + +void NetctlAutoWindow::netctlAutoStartProfile() +{ + if (debug) qDebug() << "[NetctlAutoWindow]" << "[startProfile]"; +} + + +void NetctlAutoWindow::netctlAutoRefreshButtons(QTableWidgetItem *current, QTableWidgetItem *previous) +{ + Q_UNUSED(previous); + if (debug) qDebug() << "[NetctlAutoWindow]" << "[refreshButtons]" << current->row(); + + if (current == 0) { + // buttons + ui->pushButton_enable->setDisabled(true); + ui->pushButton_switch->setDisabled(true); + // menu + ui->actionEnable->setVisible(false); + ui->actionSwitch->setVisible(false); + return; + } + + if (ui->tableWidget->item(current->row(), 2)->text() == QString("yes")) { + // buttons + ui->pushButton_enable->setDisabled(true); + ui->pushButton_switch->setDisabled(true); + // menu + ui->actionEnable->setVisible(false); + ui->actionSwitch->setVisible(false); + } + else { + // buttons + ui->pushButton_enable->setEnabled(true); + ui->pushButton_switch->setEnabled(true); + // menu + ui->actionEnable->setVisible(true); + ui->actionSwitch->setVisible(true); + if (ui->tableWidget->item(current->row(), 3)->text() == QString("yes")) { + // buttons + ui->pushButton_enable->setText(QApplication::translate("NetctlAutoWindow", "Disable")); + ui->pushButton_enable->setIcon(QIcon::fromTheme("edit-delete")); + // menu + ui->actionEnable->setText(QApplication::translate("NetctlAutoWindow", "Disable profile")); + ui->actionEnable->setIcon(QIcon::fromTheme("edit-delete")); + } + else { + // buttons + ui->pushButton_enable->setText(QApplication::translate("NetctlAutoWindow", "Enable")); + ui->pushButton_enable->setIcon(QIcon::fromTheme("edit-add")); + // menu + ui->actionEnable->setText(QApplication::translate("NetctlAutoWindow", "Enable profile")); + ui->actionEnable->setIcon(QIcon::fromTheme("edit-add")); + } + } } diff --git a/sources/gui/src/netctlautowindow.h b/sources/gui/src/netctlautowindow.h index 0fed862..0ee3453 100644 --- a/sources/gui/src/netctlautowindow.h +++ b/sources/gui/src/netctlautowindow.h @@ -20,6 +20,7 @@ #include #include +#include class Netctl; @@ -42,17 +43,20 @@ public slots: void showWindow(); private slots: - void appendActiveProfiles(); - void appendAvailableProfiles(); - void clear(); + void netctlAutoAppendTable(); + // table + void netctlAutoContextualMenu(const QPoint &pos); + void netctlAutoDisableAllProfiles(); + void netctlAutoEnableProfile(); + void netctlAutoEnableAllProfiles(); + void netctlAutoStartProfile(); + void netctlAutoRefreshButtons(QTableWidgetItem *current, QTableWidgetItem *previous); private: Netctl *netctlCommand; Ui::NetctlAutoWindow *ui; bool debug; void createActions(); - // ESC pressed event - void keyPressEvent(QKeyEvent *pressedKey); }; diff --git a/sources/gui/src/netctlautowindow.ui b/sources/gui/src/netctlautowindow.ui index 40c5f9a..c822d09 100644 --- a/sources/gui/src/netctlautowindow.ui +++ b/sources/gui/src/netctlautowindow.ui @@ -6,7 +6,7 @@ 0 0 - 585 + 432 343 @@ -14,131 +14,85 @@ MainWindow - + - - - - - - - Available profiles - - - - - - - QAbstractItemView::NoEditTriggers - - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - - true - - - - - - - - - - - - true - - - - - - - - - - - - true - - - - - - - - - - - - true - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - Active profiles - - - - - - - QAbstractItemView::NoEditTriggers - - - - - - + + + Qt::CustomContextMenu + + + QAbstractItemView::NoEditTriggers + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + true + + + true + + + false + + + + Profile + + + + + Description + + + + + Active + + + + + Disabled + + + - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Reset - - + + + + + Enable + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Switch + + + + + + + @@ -147,7 +101,7 @@ 0 0 - 585 + 432 22 @@ -157,6 +111,10 @@ + + + + @@ -190,6 +148,25 @@ Close + + Esc + + + + + + + + Enable all profiles + + + + + + + + Disable all profiles + diff --git a/sources/gui/src/pppoewidget.cpp b/sources/gui/src/pppoewidget.cpp index 030c60b..250ac17 100644 --- a/sources/gui/src/pppoewidget.cpp +++ b/sources/gui/src/pppoewidget.cpp @@ -157,9 +157,9 @@ QMap PppoeWidget::getSettings() pppoeSettings[QString("PPPoEService")] = QString("'") + ui->lineEdit_service->text() + QString("'"); if (!ui->lineEdit_ac->text().isEmpty()) pppoeSettings[QString("PPPoEAC")] = QString("'") + ui->lineEdit_ac->text() + QString("'"); - if (!ui->lineEdit_session->text().split(QString(":")).join(QString("")).remove(QString(" ")).isEmpty()) + if (!ui->lineEdit_session->text().split(QChar(':')).join(QString("")).remove(QString(" ")).isEmpty()) pppoeSettings[QString("PPPoESession")] = QString("'") + ui->lineEdit_session->text().remove(QString(" ")) + QString("'"); - if (!ui->lineEdit_mac->text().split(QString(":")).join(QString("")).remove(QString(" ")).isEmpty()) + if (!ui->lineEdit_mac->text().split(QChar(':')).join(QString("")).remove(QString(" ")).isEmpty()) pppoeSettings[QString("PPPoEMAC")] = QString("'") + ui->lineEdit_mac->text() + QString("'"); if (ui->checkBox_ipv6->checkState() == Qt::Checked) pppoeSettings[QString("PPPoEIP6")] = QString("yes"); @@ -175,16 +175,16 @@ int PppoeWidget::isOk() if (!QFile(ui->lineEdit_options->text()).exists()) return 1; // mac address - if (!ui->lineEdit_mac->text().split(QString(":")).join(QString("")).remove(QString(" ")).isEmpty()) + if (!ui->lineEdit_mac->text().split(QChar(':')).join(QString("")).remove(QString(" ")).isEmpty()) if (ui->lineEdit_mac->text().contains(QString(" "))) return 2; // session id is not set - if (!ui->lineEdit_session->text().split(QString(":")).join(QString("")).remove(QString(" ")).isEmpty()) - if (ui->lineEdit_session->text().split(QString(":"))[0].remove(QString(" ")).isEmpty()) + if (!ui->lineEdit_session->text().split(QChar(':')).join(QString("")).remove(QString(" ")).isEmpty()) + if (ui->lineEdit_session->text().split(QChar(':'))[0].remove(QString(" ")).isEmpty()) return 3; // session mac address - if (!ui->lineEdit_session->text().split(QString(":")).join(QString("")).remove(QString(" ")).isEmpty()) { - QStringList item = ui->lineEdit_session->text().split(QString(":")); + if (!ui->lineEdit_session->text().split(QChar(':')).join(QString("")).remove(QString(" ")).isEmpty()) { + QStringList item = ui->lineEdit_session->text().split(QChar(':')); for (int i=1; i<7; i++) if (item[i].contains(QString(" "))) return 4; diff --git a/sources/gui/src/settingswindow.cpp b/sources/gui/src/settingswindow.cpp index 3ccc9fd..82f0b59 100644 --- a/sources/gui/src/settingswindow.cpp +++ b/sources/gui/src/settingswindow.cpp @@ -60,9 +60,11 @@ void SettingsWindow::createActions() // buttons connect(ui->pushButton_interfaceDir, SIGNAL(clicked(bool)), SLOT(selectIfaceDir())); connect(ui->pushButton_netctlPath, SIGNAL(clicked(bool)), SLOT(selectNetctlPath())); + connect(ui->pushButton_netctlAutoPath, SIGNAL(clicked(bool)), SLOT(selectNetctlAutoPath())); connect(ui->pushButton_profilePath, SIGNAL(clicked(bool)), SLOT(selectProfileDir())); connect(ui->pushButton_rfkill, SIGNAL(clicked(bool)), SLOT(selectRfkillDir())); connect(ui->pushButton_sudo, SIGNAL(clicked(bool)), SLOT(selectSudoPath())); + connect(ui->pushButton_wpaActiondPath, SIGNAL(clicked(bool)), SLOT(selectWpaActiondPath())); connect(ui->pushButton_wpaCliPath, SIGNAL(clicked(bool)), SLOT(selectWpaCliPath())); connect(ui->pushButton_wpaSupPath, SIGNAL(clicked(bool)), SLOT(selectWpaSupPath())); } @@ -139,6 +141,20 @@ void SettingsWindow::selectNetctlPath() } +void SettingsWindow::selectNetctlAutoPath() +{ + if (debug) qDebug() << "[SettingsWindow]" << "[selectNetctlAutoPath]"; + + QString filename = QFileDialog::getOpenFileName( + this, + QApplication::translate("SettingsWindow", "Select netctl-auto command"), + QString("/usr/bin/"), + QApplication::translate("SettingsWindow", "All files (*)")); + if (!filename.isEmpty()) + ui->lineEdit_netctlAutoPath->setText(filename); +} + + void SettingsWindow::selectProfileDir() { if (debug) qDebug() << "[SettingsWindow]" << "[selectProfileDir]"; @@ -179,6 +195,20 @@ void SettingsWindow::selectSudoPath() } +void SettingsWindow::selectWpaActiondPath() +{ + if (debug) qDebug() << "[SettingsWindow]" << "[selectWpaActiondPath]"; + + QString filename = QFileDialog::getOpenFileName( + this, + QApplication::translate("SettingsWindow", "Select wpa_actiond command"), + QString("/usr/bin/"), + QApplication::translate("SettingsWindow", "All files (*)")); + if (!filename.isEmpty()) + ui->lineEdit_wpaActiondPath->setText(filename); +} + + void SettingsWindow::selectWpaCliPath() { if (debug) qDebug() << "[SettingsWindow]" << "[selectWpaCliPath]"; @@ -228,11 +258,13 @@ QMap SettingsWindow::readSettings() settings[QString("IFACE_DIR")] = ui->lineEdit_interfacesDir->text(); settings[QString("LANGUAGE")] = ui->comboBox_language->currentText(); settings[QString("NETCTL_PATH")] = ui->lineEdit_netctlPath->text(); + settings[QString("NETCTLAUTO_PATH")] = ui->lineEdit_netctlAutoPath->text(); settings[QString("PID_FILE")] = ui->lineEdit_pid->text(); settings[QString("PREFERED_IFACE")] = ui->lineEdit_interface->text(); settings[QString("PROFILE_DIR")] = ui->lineEdit_profilePath->text(); settings[QString("RFKILL_DIR")] = ui->lineEdit_rfkill->text(); settings[QString("SUDO_PATH")] = ui->lineEdit_sudo->text(); + settings[QString("WPAACTIOND_PATH")] = ui->lineEdit_wpaActiondPath->text(); settings[QString("WPACLI_PATH")] = ui->lineEdit_wpaCliPath->text(); settings[QString("WPASUP_PATH")] = ui->lineEdit_wpaSupPath->text(); settings[QString("WPA_DRIVERS")] = ui->lineEdit_wpaSupDrivers->text(); @@ -257,11 +289,13 @@ void SettingsWindow::setSettings(const QMap settings) if (ui->comboBox_language->itemText(i) == settings[QString("LANGUAGE")]) ui->comboBox_language->setCurrentIndex(i); ui->lineEdit_netctlPath->setText(settings[QString("NETCTL_PATH")]); + ui->lineEdit_netctlAutoPath->setText(settings[QString("NETCTLAUTO_PATH")]); ui->lineEdit_pid->setText(settings[QString("PID_FILE")]); ui->lineEdit_interface->setText(settings[QString("PREFERED_IFACE")]); ui->lineEdit_profilePath->setText(settings[QString("PROFILE_DIR")]); ui->lineEdit_rfkill->setText(settings[QString("RFKILL_DIR")]); ui->lineEdit_sudo->setText(settings[QString("SUDO_PATH")]); + ui->lineEdit_wpaActiondPath->setText(settings[QString("WPAACTIOND_PATH")]); ui->lineEdit_wpaCliPath->setText(settings[QString("WPACLI_PATH")]); ui->lineEdit_wpaSupPath->setText(settings[QString("WPASUP_PATH")]); ui->lineEdit_wpaSupDrivers->setText(settings[QString("WPA_DRIVERS")]); @@ -283,11 +317,13 @@ QMap SettingsWindow::getDefault() settings[QString("IFACE_DIR")] = QString("/sys/class/net/"); settings[QString("LANGUAGE")] = QString("en"); settings[QString("NETCTL_PATH")] = QString("/usr/bin/netctl"); + settings[QString("NETCTLAUTO_PATH")] = QString("/usr/bin/netctl-auto"); settings[QString("PID_FILE")] = QString("/run/wpa_supplicant_netctl-gui.pid"); settings[QString("PREFERED_IFACE")] = QString(""); settings[QString("PROFILE_DIR")] = QString("/etc/netctl/"); settings[QString("RFKILL_DIR")] = QString("/sys/class/rfkill/"); settings[QString("SUDO_PATH")] = QString("/usr/bin/kdesu"); + settings[QString("WPAACTIOND_PATH")] = QString("/usr/bin/wpa_actiond"); settings[QString("WPACLI_PATH")] = QString("/usr/bin/wpa_cli"); settings[QString("WPASUP_PATH")] = QString("/usr/bin/wpa_supplicant"); settings[QString("WPA_DRIVERS")] = QString("nl80211,wext"); @@ -304,18 +340,18 @@ QMap SettingsWindow::getSettings() { if (debug) qDebug() << "[SettingsWindow]" << "[getSettings]"; - QMap settings; + QMap settings = getDefault(); QFile configFile(file); QString fileStr; if (!configFile.open(QIODevice::ReadOnly)) - return getDefault(); + return settings; while (true) { fileStr = QString(configFile.readLine()); if (fileStr[0] != '#') { if (fileStr.contains(QString("="))) - settings[fileStr.split(QString("="))[0]] = fileStr.split(QString("="))[1] - .remove(QString(" ")) + settings[fileStr.split(QChar('='))[0]] = fileStr.split(QChar('='))[1] + .remove(QChar(' ')) .trimmed(); } if (configFile.atEnd()) diff --git a/sources/gui/src/settingswindow.h b/sources/gui/src/settingswindow.h index 852a257..13e994b 100644 --- a/sources/gui/src/settingswindow.h +++ b/sources/gui/src/settingswindow.h @@ -50,9 +50,11 @@ private slots: // buttons void selectIfaceDir(); void selectNetctlPath(); + void selectNetctlAutoPath(); void selectProfileDir(); void selectRfkillDir(); void selectSudoPath(); + void selectWpaActiondPath(); void selectWpaCliPath(); void selectWpaSupPath(); diff --git a/sources/gui/src/settingswindow.ui b/sources/gui/src/settingswindow.ui index 367234c..b125944 100644 --- a/sources/gui/src/settingswindow.ui +++ b/sources/gui/src/settingswindow.ui @@ -6,8 +6,8 @@ 0 0 - 461 - 287 + 457 + 311 @@ -104,6 +104,37 @@ + + + + + + + 150 + 0 + + + + netctl-auto path + + + + + + + Path to netctl + + + + + + + Browse + + + + + @@ -268,6 +299,37 @@ + + + + + + + 150 + 0 + + + + wpa_actiond path + + + + + + + Path to wpa_cli + + + + + + + Browse + + + + + diff --git a/sources/gui/src/tunnelwidget.cpp b/sources/gui/src/tunnelwidget.cpp index bddcf1c..7769b01 100644 --- a/sources/gui/src/tunnelwidget.cpp +++ b/sources/gui/src/tunnelwidget.cpp @@ -63,7 +63,7 @@ void TunnelWidget::createFilter() QString TunnelWidget::getIp(const QString rawIp) { - QStringList ip = rawIp.split(QString(".")); + QStringList ip = rawIp.split(QChar('.')); // fix empty fields if (ip[0].isEmpty()) @@ -91,9 +91,9 @@ QMap TunnelWidget::getSettings() return tunnelSettings; tunnelSettings[QString("Mode")] = QString("'") + ui->comboBox_mode->currentText() + QString("'"); - if (!ui->lineEdit_local->text().split(QString(".")).join(QString("")).remove(QString(" ")).isEmpty()) + if (!ui->lineEdit_local->text().split(QChar('.')).join(QString("")).remove(QString(" ")).isEmpty()) tunnelSettings[QString("Local")] = QString("'") + getIp(ui->lineEdit_local->text().remove(QString(" "))) + QString("'"); - if (!ui->lineEdit_remote->text().split(QString(".")).join(QString("")).remove(QString(" ")).isEmpty()) + if (!ui->lineEdit_remote->text().split(QChar('.')).join(QString("")).remove(QString(" ")).isEmpty()) tunnelSettings[QString("Remote")] = QString("'") + getIp(ui->lineEdit_remote->text().remove(QString(" "))) + QString("'"); return tunnelSettings; diff --git a/sources/gui/src/wirelesswidget.cpp b/sources/gui/src/wirelesswidget.cpp index 19a4f94..9b6c714 100644 --- a/sources/gui/src/wirelesswidget.cpp +++ b/sources/gui/src/wirelesswidget.cpp @@ -327,7 +327,7 @@ void WirelessWidget::setSettings(const QMap settings) if (wirelessSettings[QString("AdHoc")].remove(QString("'")) == QString("yes")) ui->checkBox_adhoc->setCheckState(Qt::Checked); if (wirelessSettings.contains(QString("ScanFrequencies"))) - ui->listWidget_freq->addItems(wirelessSettings[QString("ScanFrequencies")].split(QString("\n"))); + ui->listWidget_freq->addItems(wirelessSettings[QString("ScanFrequencies")].split(QChar('\n'))); if (wirelessSettings.contains(QString("Frequency"))) ui->spinBox_frequency->setValue(wirelessSettings[QString("Frequency")].toInt()); if (wirelessSettings.contains(QString("Priority"))) @@ -337,7 +337,7 @@ void WirelessWidget::setSettings(const QMap settings) if (wirelessSettings.contains(QString("WPAGroup"))) ui->lineEdit_wpaGroup->setText(wirelessSettings[QString("WPAGroup")].remove(QString("'"))); if (wirelessSettings.contains(QString("WPADriver"))) - ui->listWidget_drivers->addItems(wirelessSettings[QString("WPADriver")].split(QString(","))); + ui->listWidget_drivers->addItems(wirelessSettings[QString("WPADriver")].split(QChar(','))); if (wirelessSettings.contains(QString("RFKill"))) for (int i=0; icomboBox_rfkill->count(); i++) if (wirelessSettings[QString("RFKill")].remove(QString("'")) == ui->comboBox_rfkill->itemText(i)) diff --git a/sources/netctlgui/include/netctlgui/netctlinteract.h b/sources/netctlgui/include/netctlgui/netctlinteract.h index fc39ad5..f7fa244 100644 --- a/sources/netctlgui/include/netctlgui/netctlinteract.h +++ b/sources/netctlgui/include/netctlgui/netctlinteract.h @@ -33,6 +33,8 @@ public: ~Netctl(); // general information QList getProfileList(); + QList getProfileListFromNetctlAuto(); + QString getProfileDescription(const QString profile); QStringList getProfileDescriptions(const QStringList profileList); QStringList getProfileStatuses(const QStringList profileList); QString getSsidFromProfile(const QString profile); @@ -48,6 +50,7 @@ public slots: private: bool debug; QString netctlCommand; + QString netctlAutoCommand; QDir *profileDirectory; QString sudoCommand; // functions diff --git a/sources/netctlgui/src/netctlinteract.cpp b/sources/netctlgui/src/netctlinteract.cpp index a1d4969..1c10f32 100644 --- a/sources/netctlgui/src/netctlinteract.cpp +++ b/sources/netctlgui/src/netctlinteract.cpp @@ -26,6 +26,7 @@ Netctl::Netctl(const bool debugCmd, const QMap settings) : debug(debugCmd) { netctlCommand = settings[QString("NETCTL_PATH")]; + netctlAutoCommand = settings[QString("NETCTLAUTO_PATH")]; profileDirectory = new QDir(settings[QString("PROFILE_DIR")]); sudoCommand = settings[QString("SUDO_PATH")]; } @@ -104,9 +105,62 @@ QList Netctl::getProfileList() } -QStringList Netctl::getProfileDescriptions(const QStringList profileList) +QList Netctl::getProfileListFromNetctlAuto() +{ + if (debug) qDebug() << "[Netctl]" << "[getProfileListFromNetctlAuto]"; + + QProcess command; + QString commandText = netctlAutoCommand + QString(" list"); + if (debug) qDebug() << "[Netctl]" << "[getProfileListFromNetctlAuto]" << ":" << "Run cmd" << commandText; + command.start(commandText); + command.waitForFinished(-1); + QStringList output = QString(command.readAllStandardOutput()).split(QChar('\n'), QString::SkipEmptyParts); + + QList fullProfilesInfo; + for (int i=0; iabsolutePath() + QDir::separator() + profileName; + if (debug) qDebug() << "[Netctl]" << "[getProfileDescription]" << ":" << "Check" << profileUrl; + QFile profile(profileUrl); + QString fileStr; + if (profile.open(QIODevice::ReadOnly)) + while (true) { + fileStr = QString(profile.readLine()); + if (fileStr[0] != '#') + if (fileStr.split(QChar('='), QString::SkipEmptyParts).count() == 2) + if (fileStr.split(QChar('='), QString::SkipEmptyParts)[0] == QString("Description")) + description = fileStr.split(QChar('='), QString::SkipEmptyParts)[1].trimmed(); + if (profile.atEnd()) + break; + } + else + description = QString(""); + + description.remove(QChar('\'')); + description.remove(QChar('"')); + + return description; +} + + +QStringList Netctl::getProfileDescriptions(const QStringList profileList) +{ + if (debug) qDebug() << "[Netctl]" << "[getProfileDescriptions]"; QStringList descriptions; for (int i=0; i NetctlProfile::getSettingsFromProfile(const QString profi while (true) { fileStr = QString(profileFile.readLine()); if (fileStr[0] != '#') { - if (fileStr.split(QString("="), QString::SkipEmptyParts).count() == 2) { - if ((fileStr.split(QString("="))[1][0] == QChar('(')) && - (fileStr.split(QString("="))[1][fileStr.split(QString("="))[1].size()-2] == QChar(')'))) - settings[fileStr.split(QString("="))[0]] = fileStr.split(QString("="))[1] + if (fileStr.split(QChar('='), QString::SkipEmptyParts).count() == 2) { + if ((fileStr.split(QChar('='))[1][0] == QChar('(')) && + (fileStr.split(QChar('='))[1][fileStr.split(QChar('='))[1].size()-2] == QChar(')'))) + settings[fileStr.split(QChar('='))[0]] = fileStr.split(QChar('='))[1] .remove(QString("(")) .remove(QString(")")) .trimmed(); - else if (fileStr.split(QString("="))[1][0] == QChar('(')) { - QString parameterName = fileStr.split(QString("="))[0]; + else if (fileStr.split(QChar('='))[1][0] == QChar('(')) { + QString parameterName = fileStr.split(QChar('='))[0]; QStringList parameter; - if (!fileStr.split(QString("="))[1] + if (!fileStr.split(QChar('='))[1] .remove(QString("(")) .remove(QString(")")) .trimmed() .isEmpty()) - parameter.append(fileStr.split(QString("="))[1] + parameter.append(fileStr.split(QChar('='))[1] .remove(QString("(")) .remove(QString(")")) .trimmed()); @@ -175,7 +175,7 @@ QMap NetctlProfile::getSettingsFromProfile(const QString profi settings[parameterName] = parameter.join(QString("\n")); } else - settings[fileStr.split(QString("="))[0]] = fileStr.split(QString("="))[1] + settings[fileStr.split(QChar('='))[0]] = fileStr.split(QChar('='))[1] .trimmed(); } diff --git a/sources/netctlgui/src/wpasupinteract.cpp b/sources/netctlgui/src/wpasupinteract.cpp index 63856df..1565cd2 100644 --- a/sources/netctlgui/src/wpasupinteract.cpp +++ b/sources/netctlgui/src/wpasupinteract.cpp @@ -167,18 +167,18 @@ QList WpaSup::scanWifi() return scanResults; SleepThread::sleep(3); - QStringList rawOutput = getWpaCliOutput(QString("scan_results")).split(QString("\n"), QString::SkipEmptyParts); + QStringList rawOutput = getWpaCliOutput(QString("scan_results")).split(QChar('\n'), QString::SkipEmptyParts); // remove table header rawOutput.removeFirst(); // remove duplicates QStringList rawList; for (int i=0; i 4) + if (rawOutput[i].split(QChar('\t'), QString::SkipEmptyParts).count() > 4) for (int j=0; j 4) - if (rawOutput[i].split(QString("\t"), QString::SkipEmptyParts)[4] == - rawList[j].split(QString("\t"), QString::SkipEmptyParts)[4]) + if (rawList[j].split(QChar('\t'), QString::SkipEmptyParts).count() > 4) + if (rawOutput[i].split(QChar('\t'), QString::SkipEmptyParts)[4] == + rawList[j].split(QChar('\t'), QString::SkipEmptyParts)[4]) exist = true; if (!exist) rawList.append(rawOutput[i]); @@ -188,8 +188,8 @@ QList WpaSup::scanWifi() QStringList wifiPoint; // point name - if (rawList[i].split(QString("\t"), QString::SkipEmptyParts).count() > 4) - wifiPoint.append(rawList[i].split(QString("\t"), QString::SkipEmptyParts)[4]); + if (rawList[i].split(QChar('\t'), QString::SkipEmptyParts).count() > 4) + wifiPoint.append(rawList[i].split(QChar('\t'), QString::SkipEmptyParts)[4]); else wifiPoint.append(QString("")); // profile status @@ -205,9 +205,9 @@ QList WpaSup::scanWifi() status = QString("new"); wifiPoint.append(status); // point signal - wifiPoint.append(rawList[i].split(QString("\t"), QString::SkipEmptyParts)[2]); + wifiPoint.append(rawList[i].split(QChar('\t'), QString::SkipEmptyParts)[2]); // point security - QString security = rawList[i].split(QString("\t"), QString::SkipEmptyParts)[3]; + QString security = rawList[i].split(QChar('\t'), QString::SkipEmptyParts)[3]; if (security.contains(QString("WPA2"))) security = QString("WPA2"); else if (security.contains(QString("WPA")))