From 2bd9cc1a8779baac58a6fab3d7ef4374f1113e53 Mon Sep 17 00:00:00 2001 From: Qv2ray-dev <59914293+Qv2ray-dev@users.noreply.github.com> Date: Fri, 1 May 2020 22:39:15 +0800 Subject: [PATCH] add: basic group manager without subscription feature --- CMakeLists.txt | 6 ++ makespec/BUILDVERSION | 2 +- src/ui/w_GroupManager.cpp | 89 ++++++++++++--------- src/ui/w_GroupManager.hpp | 20 +++-- src/ui/w_GroupManager.ui | 77 +++++++----------- src/ui/w_ImportConfig.cpp | 2 +- src/ui/w_MainWindow.cpp | 2 +- src/ui/w_PreferencesWindow.ui | 2 +- src/ui/widgets/ConnectionSettingsWidget.cpp | 16 ++++ src/ui/widgets/ConnectionSettingsWidget.hpp | 16 ++++ src/ui/widgets/ConnectionSettingsWidget.ui | 21 +++++ src/ui/widgets/InboundSettingsWidget.cpp | 26 ++++++ src/ui/widgets/InboundSettingsWidget.hpp | 18 +++++ src/ui/widgets/InboundSettingsWidget.ui | 21 +++++ 14 files changed, 220 insertions(+), 98 deletions(-) create mode 100644 src/ui/widgets/ConnectionSettingsWidget.cpp create mode 100644 src/ui/widgets/ConnectionSettingsWidget.hpp create mode 100644 src/ui/widgets/ConnectionSettingsWidget.ui create mode 100644 src/ui/widgets/InboundSettingsWidget.cpp create mode 100644 src/ui/widgets/InboundSettingsWidget.hpp create mode 100644 src/ui/widgets/InboundSettingsWidget.ui diff --git a/CMakeLists.txt b/CMakeLists.txt index 5dbca442..8f0302ee 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -204,6 +204,8 @@ set(QV2RAY_SOURCES src/ui/widgets/QvAutoCompleteTextEdit.cpp src/ui/widgets/StreamSettingsWidget.cpp src/ui/widgets/RouteSettingsMatrix.cpp + src/ui/widgets/InboundSettingsWidget.cpp + src/ui/widgets/ConnectionSettingsWidget.cpp src/ui/w_ImportConfig.cpp src/ui/w_MainWindow.cpp src/ui/w_MainWindow_extra.cpp @@ -222,6 +224,8 @@ set(QV2RAY_SOURCES src/ui/widgets/ConnectionInfoWidget.ui src/ui/widgets/ConnectionItemWidget.ui src/ui/widgets/RouteSettingsMatrix.ui + src/ui/widgets/InboundSettingsWidget.ui + src/ui/widgets/ConnectionSettingsWidget.ui src/ui/w_MainWindow.ui src/ui/w_PreferencesWindow.ui src/ui/w_PluginManager.ui @@ -285,6 +289,8 @@ set(QV2RAY_SOURCES src/ui/widgets/QvAutoCompleteTextEdit.hpp src/ui/widgets/StreamSettingsWidget.hpp src/ui/widgets/RouteSettingsMatrix.hpp + src/ui/widgets/InboundSettingsWidget.hpp + src/ui/widgets/ConnectionSettingsWidget.hpp src/ui/w_ImportConfig.hpp src/ui/w_MainWindow.hpp src/ui/w_PreferencesWindow.hpp diff --git a/makespec/BUILDVERSION b/makespec/BUILDVERSION index 0cf9f71e..34f9d9a3 100644 --- a/makespec/BUILDVERSION +++ b/makespec/BUILDVERSION @@ -1 +1 @@ -5343 +5348 \ No newline at end of file diff --git a/src/ui/w_GroupManager.cpp b/src/ui/w_GroupManager.cpp index 21864a9d..74eae0fb 100644 --- a/src/ui/w_GroupManager.cpp +++ b/src/ui/w_GroupManager.cpp @@ -4,106 +4,113 @@ #include "core/handler/ConfigHandler.hpp" #include "core/settings/SettingsBackend.hpp" -SubscriptionEditor::SubscriptionEditor(QWidget *parent) : QDialog(parent) +GroupManager::GroupManager(QWidget *parent) : QDialog(parent) { setupUi(this); - QvMessageBusConnect(SubscriptionEditor); + QvMessageBusConnect(GroupManager); UpdateColorScheme(); - for (auto subs : ConnectionManager->Subscriptions()) + connectionListRCMenu->addMenu(connectionListRCMenu_CopyToMenu); + connectionListRCMenu->addMenu(connectionListRCMenu_MoveToMenu); + for (auto group : ConnectionManager->AllGroups()) { - groupList->addTopLevelItem(new QTreeWidgetItem(QStringList{ GetDisplayName(subs), subs.toString() })); + auto item = new QListWidgetItem(GetDisplayName(group)); + item->setData(Qt::UserRole, group.toString()); + groupList->addItem(item); } - if (groupList->topLevelItemCount() > 0) + if (groupList->count() > 0) { - groupList->setCurrentItem(groupList->topLevelItem(0)); + groupList->setCurrentItem(groupList->item(0)); } } -void SubscriptionEditor::UpdateColorScheme() +void GroupManager::UpdateColorScheme() { - addSubsButton->setIcon(QICON_R("add.png")); - removeSubsButton->setIcon(QICON_R("delete.png")); + addGroupButton->setIcon(QICON_R("add.png")); + removeGroupButton->setIcon(QICON_R("delete.png")); } -QvMessageBusSlotImpl(SubscriptionEditor) +QvMessageBusSlotImpl(GroupManager) { switch (msg) { - MBShowDefaultImpl MBHideDefaultImpl MBRetranslateDefaultImpl MBUpdateColorSchemeDefaultImpl + MBShowDefaultImpl; + MBHideDefaultImpl; + MBRetranslateDefaultImpl; + MBUpdateColorSchemeDefaultImpl } } -tuple SubscriptionEditor::GetSelectedConfig() +tuple GroupManager::GetSelectedConfig() { return { GetDisplayName(currentConnectionId), ConnectionManager->GetConnectionRoot(currentConnectionId) }; } -SubscriptionEditor::~SubscriptionEditor() +GroupManager::~GroupManager() { } -void SubscriptionEditor::on_addSubsButton_clicked() +void GroupManager::on_addGroupButton_clicked() { auto const key = QSTRN(QTime::currentTime().msecsSinceStartOfDay()); auto id = ConnectionManager->CreateGroup(key, true); // - groupList->addTopLevelItem(new QTreeWidgetItem(QStringList{ key, id.toString() })); + auto item = new QListWidgetItem(key); + item->setData(Qt::UserRole, id.toString()); + groupList->addItem(item); } -void SubscriptionEditor::on_updateButton_clicked() +void GroupManager::on_updateButton_clicked() { if (QvMessageBoxAsk(this, tr("Reload Subscription"), tr("Would you like to reload the subscription?")) == QMessageBox::Yes) { this->setEnabled(false); ConnectionManager->UpdateSubscription(currentSubId); // this->setEnabled(true); - on_groupList_itemClicked(groupList->currentItem(), 0); + on_groupList_itemClicked(groupList->currentItem()); } } -void SubscriptionEditor::on_removeSubsButton_clicked() +void GroupManager::on_removeGroupButton_clicked() { if (QvMessageBoxAsk(this, tr("Deleting a subscription"), tr("All connections will be moved to default group, do you want to continue?")) == QMessageBox::Yes) { ConnectionManager->DeleteGroup(currentSubId); // auto item = groupList->currentItem(); - groupList->removeItemWidget(item, 0); + groupList->removeItemWidget(item); delete item; - if (groupList->topLevelItemCount() > 0) + if (groupList->count() > 0) { - groupList->setCurrentItem(groupList->topLevelItem(0)); - on_groupList_itemClicked(groupList->topLevelItem(0), 0); + groupList->setCurrentItem(groupList->item(0)); + on_groupList_itemClicked(groupList->item(0)); } else { - groupBox_2->setEnabled(false); + groupInfoGroupBox->setEnabled(false); } } } -void SubscriptionEditor::on_buttonBox_accepted() +void GroupManager::on_buttonBox_accepted() { // Nothing? } -void SubscriptionEditor::on_groupList_itemSelectionChanged() +void GroupManager::on_groupList_itemSelectionChanged() { - groupBox_2->setEnabled(groupList->selectedItems().count() > 0); + groupInfoGroupBox->setEnabled(groupList->selectedItems().count() > 0); } -void SubscriptionEditor::on_groupList_itemClicked(QTreeWidgetItem *item, int column) +void GroupManager::on_groupList_itemClicked(QListWidgetItem *item) { - Q_UNUSED(column) if (item == nullptr) { return; } - // - groupBox_2->setEnabled(true); - currentSubId = GroupId(item->text(1)); + groupInfoGroupBox->setEnabled(true); + currentSubId = GroupId(item->data(Qt::UserRole).toString()); // groupNameTxt->setText(GetDisplayName(currentSubId)); auto const [addr, lastUpdated, updateInterval] = ConnectionManager->GetSubscriptionData(currentSubId); @@ -119,31 +126,31 @@ void SubscriptionEditor::on_groupList_itemClicked(QTreeWidgetItem *item, int col } } -void SubscriptionEditor::on_groupList_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) +void GroupManager::on_groupList_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous) { Q_UNUSED(previous) - on_groupList_itemClicked(current, 0); + on_groupList_itemClicked(current); } -void SubscriptionEditor::on_subNameTxt_textEdited(const QString &arg1) +void GroupManager::on_subNameTxt_textEdited(const QString &arg1) { - groupList->selectedItems().first()->setText(0, arg1); + groupList->selectedItems().first()->setText(arg1); ConnectionManager->RenameGroup(currentSubId, arg1.trimmed()); } -void SubscriptionEditor::on_subAddrTxt_textEdited(const QString &arg1) +void GroupManager::on_subAddrTxt_textEdited(const QString &arg1) { auto newUpdateInterval = updateIntervalSB->value(); ConnectionManager->SetSubscriptionData(currentSubId, arg1, newUpdateInterval); } -void SubscriptionEditor::on_updateIntervalSB_valueChanged(double arg1) +void GroupManager::on_updateIntervalSB_valueChanged(double arg1) { auto newAddress = subAddrTxt->text().trimmed(); ConnectionManager->SetSubscriptionData(currentSubId, newAddress, arg1); } -void SubscriptionEditor::on_connectionsList_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous) +void GroupManager::on_connectionsList_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous) { Q_UNUSED(previous) if (current != nullptr) @@ -151,3 +158,9 @@ void SubscriptionEditor::on_connectionsList_currentItemChanged(QListWidgetItem * currentConnectionId = ConnectionManager->GetConnectionIdByDisplayName(current->text(), currentSubId); } } + +void GroupManager::on_connectionsList_customContextMenuRequested(const QPoint &pos) +{ + Q_UNUSED(pos) + connectionListRCMenu->popup(QCursor::pos()); +} diff --git a/src/ui/w_GroupManager.hpp b/src/ui/w_GroupManager.hpp index a29cdfc7..debdf6c0 100644 --- a/src/ui/w_GroupManager.hpp +++ b/src/ui/w_GroupManager.hpp @@ -6,35 +6,36 @@ #include "ui_w_GroupManager.h" #include +#include -class SubscriptionEditor +class GroupManager : public QDialog , private Ui::w_GroupManager { Q_OBJECT public: - explicit SubscriptionEditor(QWidget *parent = nullptr); - ~SubscriptionEditor(); + explicit GroupManager(QWidget *parent = nullptr); + ~GroupManager(); tuple GetSelectedConfig(); private: QvMessageBusSlotDecl; private slots: - void on_addSubsButton_clicked(); + void on_addGroupButton_clicked(); void on_updateButton_clicked(); - void on_removeSubsButton_clicked(); + void on_removeGroupButton_clicked(); void on_buttonBox_accepted(); void on_groupList_itemSelectionChanged(); - void on_groupList_itemClicked(QTreeWidgetItem *item, int column); + void on_groupList_itemClicked(QListWidgetItem *item); - void on_groupList_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); + void on_groupList_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous); void on_subNameTxt_textEdited(const QString &arg1); @@ -44,7 +45,12 @@ class SubscriptionEditor void on_connectionsList_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous); + void on_connectionsList_customContextMenuRequested(const QPoint &pos); + private: + QMenu *connectionListRCMenu = new QMenu(this); + QMenu *connectionListRCMenu_CopyToMenu = new QMenu(tr("Copy to...")); + QMenu *connectionListRCMenu_MoveToMenu = new QMenu(tr("Move to...")); void UpdateColorScheme(); bool isUpdateInProgress = false; GroupId currentSubId = NullGroupId; diff --git a/src/ui/w_GroupManager.ui b/src/ui/w_GroupManager.ui index 3b4d7ea3..4bb0bf74 100644 --- a/src/ui/w_GroupManager.ui +++ b/src/ui/w_GroupManager.ui @@ -27,7 +27,7 @@ - + Group Info @@ -66,27 +66,13 @@ - + QAbstractItemView::SingleSelection QAbstractItemView::SelectRows - - false - - - false - - - true - - - - 1 - - @@ -105,7 +91,7 @@ - + 0 @@ -125,7 +111,7 @@ - + 0 @@ -198,9 +184,15 @@ + + Qt::CustomContextMenu + QAbstractItemView::NoEditTriggers + + QAbstractItemView::MultiSelection + QListView::Adjust @@ -210,41 +202,41 @@ - Subscription + Subscription Settings - + Subscription Address - + - + Update Interval - + - + Last Updated - + @@ -281,14 +273,14 @@ - + Update Subscription Data - + Qt::Vertical @@ -301,36 +293,23 @@ + + + + This group is a subscription + + + - - - General Settings - - - - - Inbound Settings - - - - - Routing - - - - - Connection Settings - - groupList - addSubsButton - removeSubsButton + addGroupButton + removeGroupButton subAddrTxt updateIntervalSB diff --git a/src/ui/w_ImportConfig.cpp b/src/ui/w_ImportConfig.cpp index 19e13618..5df57199 100644 --- a/src/ui/w_ImportConfig.cpp +++ b/src/ui/w_ImportConfig.cpp @@ -288,7 +288,7 @@ void ImportConfigWindow::on_cancelImportBtn_clicked() void ImportConfigWindow::on_subscriptionButton_clicked() { hide(); - SubscriptionEditor w(this); + GroupManager w(this); w.exec(); auto importToComplex = !keepImportedInboundCheckBox->isEnabled(); connections.clear(); diff --git a/src/ui/w_MainWindow.cpp b/src/ui/w_MainWindow.cpp index e1f604f0..b11c6ab6 100644 --- a/src/ui/w_MainWindow.cpp +++ b/src/ui/w_MainWindow.cpp @@ -604,7 +604,7 @@ void MainWindow::on_action_RCM_EditAsComplex_triggered() void MainWindow::on_subsButton_clicked() { - SubscriptionEditor().exec(); + GroupManager().exec(); } void MainWindow::on_connectionListWidget_itemDoubleClicked(QTreeWidgetItem *item, int column) diff --git a/src/ui/w_PreferencesWindow.ui b/src/ui/w_PreferencesWindow.ui index 8e50a231..f00a6b9d 100644 --- a/src/ui/w_PreferencesWindow.ui +++ b/src/ui/w_PreferencesWindow.ui @@ -33,7 +33,7 @@ - 0 + 3 diff --git a/src/ui/widgets/ConnectionSettingsWidget.cpp b/src/ui/widgets/ConnectionSettingsWidget.cpp new file mode 100644 index 00000000..98dfe1f0 --- /dev/null +++ b/src/ui/widgets/ConnectionSettingsWidget.cpp @@ -0,0 +1,16 @@ +#include "ConnectionSettingsWidget.hpp" + +ConnectionSettingsWidget::ConnectionSettingsWidget(QWidget *parent) : QWidget(parent) +{ + setupUi(this); +} + +void ConnectionSettingsWidget::changeEvent(QEvent *e) +{ + QWidget::changeEvent(e); + switch (e->type()) + { + case QEvent::LanguageChange: retranslateUi(this); break; + default: break; + } +} diff --git a/src/ui/widgets/ConnectionSettingsWidget.hpp b/src/ui/widgets/ConnectionSettingsWidget.hpp new file mode 100644 index 00000000..32bb1c3c --- /dev/null +++ b/src/ui/widgets/ConnectionSettingsWidget.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include "ui_ConnectionSettingsWidget.h" + +class ConnectionSettingsWidget + : public QWidget + , private Ui::ConnectionSettingsWidget +{ + Q_OBJECT + + public: + explicit ConnectionSettingsWidget(QWidget *parent = nullptr); + + protected: + void changeEvent(QEvent *e); +}; diff --git a/src/ui/widgets/ConnectionSettingsWidget.ui b/src/ui/widgets/ConnectionSettingsWidget.ui new file mode 100644 index 00000000..bb32e6ad --- /dev/null +++ b/src/ui/widgets/ConnectionSettingsWidget.ui @@ -0,0 +1,21 @@ + + + + + ConnectionSettingsWidget + + + + 0 + 0 + 400 + 300 + + + + Form + + + + + diff --git a/src/ui/widgets/InboundSettingsWidget.cpp b/src/ui/widgets/InboundSettingsWidget.cpp new file mode 100644 index 00000000..2810577f --- /dev/null +++ b/src/ui/widgets/InboundSettingsWidget.cpp @@ -0,0 +1,26 @@ +#include "InboundSettingsWidget.hpp" +InboundSettingsWidget::InboundSettingsWidget(QWidget *parent) : QWidget(parent) +{ + setupUi(this); +} + +QvMessageBusSlotImpl(InboundSettingsWidget) +{ + switch (msg) + { + MBRetranslateDefaultImpl; + case HIDE_WINDOWS: + case SHOW_WINDOWS: break; + default: break; + } +} + +void InboundSettingsWidget::changeEvent(QEvent *e) +{ + QWidget::changeEvent(e); + switch (e->type()) + { + case QEvent::LanguageChange: retranslateUi(this); break; + default: break; + } +} diff --git a/src/ui/widgets/InboundSettingsWidget.hpp b/src/ui/widgets/InboundSettingsWidget.hpp new file mode 100644 index 00000000..1f1c1241 --- /dev/null +++ b/src/ui/widgets/InboundSettingsWidget.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include "ui/messaging/QvMessageBus.hpp" +#include "ui_InboundSettingsWidget.h" + +class InboundSettingsWidget + : public QWidget + , private Ui::InboundSettingsWidget +{ + Q_OBJECT + QvMessageBusSlotDecl; + + public: + explicit InboundSettingsWidget(QWidget *parent = nullptr); + + protected: + void changeEvent(QEvent *e); +}; diff --git a/src/ui/widgets/InboundSettingsWidget.ui b/src/ui/widgets/InboundSettingsWidget.ui new file mode 100644 index 00000000..cb8d57f7 --- /dev/null +++ b/src/ui/widgets/InboundSettingsWidget.ui @@ -0,0 +1,21 @@ + + + + + InboundSettingsWidget + + + + 0 + 0 + 400 + 300 + + + + Form + + + + +