Initial import (main window mostly implemented)

main
Aaron Rainbolt 1 year ago
commit 18f24e03ab

@ -0,0 +1,85 @@
cmake_minimum_required(VERSION 3.16)
project(lubuntu-connection-editor VERSION 0.1 LANGUAGES CXX)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(KF5_MIN_VERSION "5.102.0")
find_package(ECM ${KF5_MIN_VERSION} REQUIRED NO_MODULE)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH})
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets Network LinguistTools)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets Network LinguistTools)
find_package(KF5 ${KF5_MIN_VERSION} REQUIRED NetworkManagerQt)
set(TS_FILES lubuntu-connection-editor_en_US.ts)
set(PROJECT_SOURCES
main.cpp
networkselector.cpp
networkselector.h
networkselector.ui
ethernetsettings.h
ethernetsettings.cpp
ethernetsettings.ui
networkcreator.h
networkcreator.cpp
networkcreator.ui
networkdeleter.h
networkdeleter.cpp
networkdeleter.ui
${TS_FILES}
)
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
qt_add_executable(lubuntu-connection-editor
MANUAL_FINALIZATION
${PROJECT_SOURCES}
)
# Define target properties for Android with Qt 6 as:
# set_property(TARGET lubuntu-connection-editor APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
# ${CMAKE_CURRENT_SOURCE_DIR}/android)
# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation
qt_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${TS_FILES})
else()
if(ANDROID)
add_library(lubuntu-connection-editor SHARED
${PROJECT_SOURCES}
)
# Define properties for Android with Qt 5 after find_package() calls as:
# set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
else()
add_executable(lubuntu-connection-editor
${PROJECT_SOURCES}
)
endif()
qt5_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${TS_FILES})
endif()
target_link_libraries(lubuntu-connection-editor PRIVATE Qt${QT_VERSION_MAJOR}::Widgets KF5::NetworkManagerQt)
set_target_properties(lubuntu-connection-editor PROPERTIES
MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
MACOSX_BUNDLE TRUE
WIN32_EXECUTABLE TRUE
)
install(TARGETS lubuntu-connection-editor
BUNDLE DESTINATION .
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
if(QT_VERSION_MAJOR EQUAL 6)
qt_finalize_executable(lubuntu-connection-editor)
endif()

@ -0,0 +1,15 @@
#include "ethernetsettings.h"
#include "ui_ethernetsettings.h"
EthernetSettings::EthernetSettings(QString title, QWidget *parent) :
QDialog(parent),
ui(new Ui::EthernetSettings)
{
ui->setupUi(this);
this->setWindowTitle(title);
}
EthernetSettings::~EthernetSettings()
{
delete ui;
}

@ -0,0 +1,22 @@
#ifndef ETHERNETSETTINGS_H
#define ETHERNETSETTINGS_H
#include <QDialog>
namespace Ui {
class EthernetSettings;
}
class EthernetSettings : public QDialog
{
Q_OBJECT
public:
explicit EthernetSettings(QString title, QWidget *parent = nullptr);
~EthernetSettings();
private:
Ui::EthernetSettings *ui;
};
#endif // ETHERNETSETTINGS_H

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>EthernetSettings</class>
<widget class="QDialog" name="EthernetSettings">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
</widget>
<resources/>
<connections/>
</ui>

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="en_US"></TS>

@ -0,0 +1,23 @@
#include "networkselector.h"
#include <QApplication>
#include <QLocale>
#include <QTranslator>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTranslator translator;
const QStringList uiLanguages = QLocale::system().uiLanguages();
for (const QString &locale : uiLanguages) {
const QString baseName = "lubuntu-connection-editor_" + QLocale(locale).name();
if (translator.load(":/i18n/" + baseName)) {
a.installTranslator(&translator);
break;
}
}
NetworkSelector w;
w.show();
return a.exec();
}

@ -0,0 +1,14 @@
#include "networkcreator.h"
#include "ui_networkcreator.h"
NetworkCreator::NetworkCreator(QWidget *parent) :
QDialog(parent),
ui(new Ui::NetworkCreator)
{
ui->setupUi(this);
}
NetworkCreator::~NetworkCreator()
{
delete ui;
}

@ -0,0 +1,22 @@
#ifndef NETWORKCREATOR_H
#define NETWORKCREATOR_H
#include <QDialog>
namespace Ui {
class NetworkCreator;
}
class NetworkCreator : public QDialog
{
Q_OBJECT
public:
explicit NetworkCreator(QWidget *parent = nullptr);
~NetworkCreator();
private:
Ui::NetworkCreator *ui;
};
#endif // NETWORKCREATOR_H

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>NetworkCreator</class>
<widget class="QDialog" name="NetworkCreator">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Create New Connection...</string>
</property>
</widget>
<resources/>
<connections/>
</ui>

@ -0,0 +1,15 @@
#include "networkdeleter.h"
#include "ui_networkdeleter.h"
NetworkDeleter::NetworkDeleter(QString networkName, QString networkUuidStr, QWidget *parent) :
QDialog(parent),
ui(new Ui::NetworkDeleter)
{
ui->setupUi(this);
this->setWindowTitle("Delete connection " + networkName + "?");
}
NetworkDeleter::~NetworkDeleter()
{
delete ui;
}

@ -0,0 +1,22 @@
#ifndef NETWORKDELETER_H
#define NETWORKDELETER_H
#include <QDialog>
namespace Ui {
class NetworkDeleter;
}
class NetworkDeleter : public QDialog
{
Q_OBJECT
public:
explicit NetworkDeleter(QString networkName, QString networkUuidStr, QWidget *parent = nullptr);
~NetworkDeleter();
private:
Ui::NetworkDeleter *ui;
};
#endif // NETWORKDELETER_H

@ -0,0 +1,18 @@
<ui version="4.0">
<class>NetworkDeleter</class>
<widget class="QDialog" name="NetworkDeleter">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
</widget>
<resources/>
<connections/>
</ui>

@ -0,0 +1,280 @@
#include "networkselector.h"
#include "./ui_networkselector.h"
#include <QDebug>
NetworkSelector::NetworkSelector(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::NetworkSelector)
{
ui->setupUi(this);
regenConnTree();
ui->modifyConnButton->setEnabled(false);
connect(ui->connTree, &QTreeView::clicked, this, &NetworkSelector::onTreeSingleClicked);
connect(ui->connTree, &QTreeView::doubleClicked, this, &NetworkSelector::onTreeDoubleClicked);
connect(ui->createConnButton, &QPushButton::clicked, this, &NetworkSelector::onCreateClicked);
connect(ui->deleteConnButton, &QPushButton::clicked, this, &NetworkSelector::onDeleteClicked);
connect(ui->modifyConnButton, &QPushButton::clicked, this, &NetworkSelector::onModifyClicked);
}
NetworkSelector::~NetworkSelector()
{
delete ui;
delete connTreeModel;
}
void NetworkSelector::onTreeSingleClicked(QModelIndex index)
{
QVariant connUuid = index.data(Qt::UserRole+1);
if (!connUuid.isValid()) {
ui->modifyConnButton->setEnabled(false);
return;
}
ui->modifyConnButton->setEnabled(true);
}
void NetworkSelector::onTreeDoubleClicked(QModelIndex index)
{
modifyConnection(index);
}
void NetworkSelector::onCreateClicked()
{
dialogWindow = new NetworkCreator();
dialogWindow->exec();
delete dialogWindow;
regenConnTree();
}
void NetworkSelector::onDeleteClicked()
{
QModelIndexList selectedNetworks = ui->connTree->selectionModel()->selectedIndexes();
if (selectedNetworks.length() == 0) {
return;
}
if (!selectedNetworks[0].data(Qt::UserRole+1).isValid()) {
return;
}
dialogWindow = new NetworkDeleter(selectedNetworks[0].data().toString(), selectedNetworks[0].data(Qt::UserRole+1).toString());
dialogWindow->exec();
delete dialogWindow;
regenConnTree();
}
void NetworkSelector::onModifyClicked()
{
QModelIndexList selectedNetworks = ui->connTree->selectionModel()->selectedIndexes();
if (selectedNetworks.length() == 0) {
return;
}
if (!selectedNetworks[0].data(Qt::UserRole+1).isValid()) {
return;
}
modifyConnection(selectedNetworks[0]);
}
QStandardItem *NetworkSelector::connGroupItem(QString itemName)
{
for (int i = 0;i < connTreeList.length();i++) {
if (connTreeList[i]->text() == itemName) {
return connTreeList[i];
}
}
return NULL;
}
void NetworkSelector::regenConnTree()
{
if (connTreeModel != NULL) {
delete connTreeModel;
}
connTreeList = QList<QStandardItem *>();
connTreeModel = new QStandardItemModel(0, 2);
connTreeModel->setHeaderData(0, Qt::Orientation::Horizontal, "Connection");
connTreeModel->setHeaderData(1, Qt::Orientation::Horizontal, "Last used");
connList = NetworkManager::listConnections();
for (int i = 0;i < connList.length();i++) {
if (connList[i]->name() == "lo") { // don't show the loopback device
continue;
}
QList<QStandardItem *> infoRow;
infoRow.append(new QStandardItem(connList[i]->name()));
infoRow.append(new QStandardItem(connList[i]->settings()->timestamp().toString("yyyy-MM-dd hh:mm")));
// When the user double-clicks a cell in the tree, the double-click handler gets an object that can fetch a data value from the clicked cell.
// We need to identify the exact connection that was double-clicked on in order for this to work, so we bind the connection's UUID to both visible
// cells in the row representing a connection.
infoRow[0]->setData(connList[i]->uuid());
infoRow[1]->setData(connList[i]->uuid());
NetworkManager::ConnectionSettings::ConnectionType connType = connList[i]->settings()->connectionType();
QStandardItem *targetItem;
switch(connType) {
case NetworkManager::ConnectionSettings::Wired:
targetItem = connGroupItem("Ethernet");
if (targetItem == NULL) {
targetItem = new QStandardItem("Ethernet");
connTreeList.append(targetItem);
}
break;
case NetworkManager::ConnectionSettings::Wireless:
targetItem = connGroupItem("WiFi");
if (targetItem == NULL) {
targetItem = new QStandardItem("WiFi");
connTreeList.append(targetItem);
}
break;
case NetworkManager::ConnectionSettings::Adsl:
case NetworkManager::ConnectionSettings::Pppoe:
targetItem = connGroupItem("DSL");
if (targetItem == NULL) {
targetItem = new QStandardItem("DSL");
connTreeList.append(targetItem);
}
break;
case NetworkManager::ConnectionSettings::Bluetooth:
targetItem = connGroupItem("Bluetooth");
if (targetItem == NULL) {
targetItem = new QStandardItem("Bluetooth");
connTreeList.append(targetItem);
}
break;
case NetworkManager::ConnectionSettings::Bond:
case NetworkManager::ConnectionSettings::Bridge:
case NetworkManager::ConnectionSettings::Vlan:
targetItem = connGroupItem("Virtual");
if (targetItem == NULL) {
targetItem = new QStandardItem("Virtual");
connTreeList.append(targetItem);
}
break;
case NetworkManager::ConnectionSettings::Cdma:
case NetworkManager::ConnectionSettings::Gsm:
targetItem = connGroupItem("Mobile");
if (targetItem == NULL) {
targetItem = new QStandardItem("Mobile");
connTreeList.append(targetItem);
}
break;
case NetworkManager::ConnectionSettings::Infiniband:
targetItem = connGroupItem("Infiniband");
if (targetItem == NULL) {
targetItem = new QStandardItem("Infiniband");
connTreeList.append(targetItem);
}
break;
case NetworkManager::ConnectionSettings::OLPCMesh:
targetItem = connGroupItem("OLPC-Mesh");
if (targetItem == NULL) {
targetItem = new QStandardItem("OLPC-Mesh");
connTreeList.append(targetItem);
}
break;
case NetworkManager::ConnectionSettings::Vpn:
case NetworkManager::ConnectionSettings::Tun:
case NetworkManager::ConnectionSettings::IpTunnel:
case NetworkManager::ConnectionSettings::WireGuard:
targetItem = connGroupItem("VPN");
if (targetItem == NULL) {
targetItem = new QStandardItem("VPN");
connTreeList.append(targetItem);
}
break;
case NetworkManager::ConnectionSettings::Wimax:
targetItem = connGroupItem("WiMAX");
if (targetItem == NULL) {
targetItem = new QStandardItem("WiMAX");
connTreeList.append(targetItem);
}
break;
case NetworkManager::ConnectionSettings::Team:
targetItem = connGroupItem("Team");
if (targetItem == NULL) {
targetItem = new QStandardItem("Team");
connTreeList.append(targetItem);
}
break;
case NetworkManager::ConnectionSettings::Generic:
targetItem = connGroupItem("Generic");
if (targetItem == NULL) {
targetItem = new QStandardItem("Generic");
connTreeList.append(targetItem);
}
break;
case NetworkManager::ConnectionSettings::Unknown:
targetItem = connGroupItem("Unknown");
if (targetItem == NULL) {
targetItem = new QStandardItem("Unknown");
connTreeList.append(targetItem);
}
break;
}
targetItem->appendRow(infoRow);
}
for (int i = 0;i < connTreeList.length();i++) {
QList<QStandardItem *> currentItemWrap;
currentItemWrap.append(connTreeList[i]);
connTreeModel->appendRow(currentItemWrap);
}
ui->connTree->setModel(connTreeModel);
ui->connTree->setColumnWidth(0, 500);
}
void NetworkSelector::modifyConnection(QModelIndex index)
{
QVariant connUuid = index.data(Qt::UserRole+1);
if (!connUuid.isValid()) {
return;
}
for (int i = 0;i < connList.length();i++) {
if (connUuid.toString() == connList[i]->uuid()) {
NetworkManager::ConnectionSettings::ConnectionType connType = connList[i]->settings()->connectionType();
switch(connType) {
case NetworkManager::ConnectionSettings::Wired:
dialogWindow = new EthernetSettings(index.data().toString());
dialogWindow->exec();
delete dialogWindow;
break;
case NetworkManager::ConnectionSettings::Wireless:
case NetworkManager::ConnectionSettings::Adsl:
case NetworkManager::ConnectionSettings::Pppoe:
case NetworkManager::ConnectionSettings::Bluetooth:
case NetworkManager::ConnectionSettings::Bond:
case NetworkManager::ConnectionSettings::Bridge:
case NetworkManager::ConnectionSettings::Vlan:
case NetworkManager::ConnectionSettings::Cdma:
case NetworkManager::ConnectionSettings::Gsm:
case NetworkManager::ConnectionSettings::Infiniband:
case NetworkManager::ConnectionSettings::OLPCMesh:
case NetworkManager::ConnectionSettings::Vpn:
case NetworkManager::ConnectionSettings::Tun:
case NetworkManager::ConnectionSettings::IpTunnel:
case NetworkManager::ConnectionSettings::WireGuard:
case NetworkManager::ConnectionSettings::Wimax:
case NetworkManager::ConnectionSettings::Team:
case NetworkManager::ConnectionSettings::Generic:
case NetworkManager::ConnectionSettings::Unknown:
;
}
}
}
}

@ -0,0 +1,53 @@
#ifndef NETWORKSELECTOR_H
#define NETWORKSELECTOR_H
#include "ethernetsettings.h"
#include "networkcreator.h"
#include "networkdeleter.h"
#include <NetworkManagerQt/Connection>
#include <NetworkManagerQt/ConnectionSettings>
#include <NetworkManagerQt/Settings>
#include <QMessageBox>
#include <QMainWindow>
#include <QTreeView>
#include <QPushButton>
#include <QStandardItem>
#include <QStandardItemModel>
#include <QList>
#include <QUuid>
#include <QModelIndex>
QT_BEGIN_NAMESPACE
namespace Ui { class NetworkSelector; }
QT_END_NAMESPACE
class NetworkSelector : public QMainWindow
{
Q_OBJECT
public:
NetworkSelector(QWidget *parent = nullptr);
~NetworkSelector();
private slots:
void onTreeSingleClicked(QModelIndex index);
void onTreeDoubleClicked(QModelIndex index);
void onCreateClicked();
void onDeleteClicked();
void onModifyClicked();
private:
QStandardItem *connGroupItem(QString itemName);
void regenConnTree();
void modifyConnection(QModelIndex index);
Ui::NetworkSelector *ui;
QStandardItemModel *connTreeModel;
QList<QStandardItem *> connTreeList;
NetworkManager::Connection::List connList;
QDialog *dialogWindow;
};
#endif // NETWORKSELECTOR_H

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>NetworkSelector</class>
<widget class="QMainWindow" name="NetworkSelector">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>NetworkSelector</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QTreeView" name="connTree">
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="createConnButton">
<property name="text">
<string>Create</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="deleteConnButton">
<property name="text">
<string>Delete</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="modifyConnButton">
<property name="text">
<string>Modify</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
<resources/>
<connections/>
</ui>
Loading…
Cancel
Save