add: basic group manager without subscription feature

This commit is contained in:
Qv2ray-dev 2020-05-01 22:39:15 +08:00
parent a5d9c3d253
commit 2bd9cc1a87
14 changed files with 220 additions and 98 deletions

View File

@ -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

View File

@ -1 +1 @@
5343
5348

View File

@ -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<QString, CONFIGROOT> SubscriptionEditor::GetSelectedConfig()
tuple<QString, CONFIGROOT> 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());
}

View File

@ -6,35 +6,36 @@
#include "ui_w_GroupManager.h"
#include <QDialog>
#include <QMenu>
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<QString, CONFIGROOT> 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;

View File

@ -27,7 +27,7 @@
</property>
<layout class="QGridLayout" name="gridLayout" columnstretch="2,5">
<item row="0" column="1">
<widget class="QGroupBox" name="groupBox_2">
<widget class="QGroupBox" name="groupInfoGroupBox">
<property name="title">
<string>Group Info</string>
</property>
@ -66,27 +66,13 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QTreeWidget" name="groupList">
<widget class="QListWidget" name="groupList">
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="rootIsDecorated">
<bool>false</bool>
</property>
<property name="uniformRowHeights">
<bool>false</bool>
</property>
<property name="headerHidden">
<bool>true</bool>
</property>
<column>
<property name="text">
<string notr="true">1</string>
</property>
</column>
</widget>
</item>
<item>
@ -105,7 +91,7 @@
</spacer>
</item>
<item>
<widget class="QToolButton" name="addSubsButton">
<widget class="QToolButton" name="addGroupButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
@ -125,7 +111,7 @@
</widget>
</item>
<item>
<widget class="QToolButton" name="removeSubsButton">
<widget class="QToolButton" name="removeGroupButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
@ -198,9 +184,15 @@
</item>
<item row="0" column="0" colspan="2">
<widget class="QListWidget" name="connectionsList">
<property name="contextMenuPolicy">
<enum>Qt::CustomContextMenu</enum>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::MultiSelection</enum>
</property>
<property name="resizeMode">
<enum>QListView::Adjust</enum>
</property>
@ -210,41 +202,41 @@
</widget>
<widget class="QWidget" name="tab_2">
<attribute name="title">
<string>Subscription</string>
<string>Subscription Settings</string>
</attribute>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Subscription Address</string>
</property>
</widget>
</item>
<item row="0" column="1">
<item row="1" column="1">
<widget class="QLineEdit" name="subAddrTxt"/>
</item>
<item row="1" column="0">
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Update Interval</string>
</property>
</widget>
</item>
<item row="1" column="1">
<item row="2" column="1">
<widget class="QLabel" name="lastUpdatedLabel">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="2" column="0">
<item row="3" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Last Updated</string>
</property>
</widget>
</item>
<item row="2" column="1">
<item row="3" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QDoubleSpinBox" name="updateIntervalSB">
@ -281,14 +273,14 @@
</item>
</layout>
</item>
<item row="4" column="0" colspan="2">
<item row="5" column="0" colspan="2">
<widget class="QPushButton" name="updateButton">
<property name="text">
<string>Update Subscription Data</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<item row="4" column="0" colspan="2">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
@ -301,36 +293,23 @@
</property>
</spacer>
</item>
<item row="0" column="0" colspan="2">
<widget class="QCheckBox" name="groupIsSubscriptionCB">
<property name="text">
<string>This group is a subscription</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_5">
<attribute name="title">
<string>General Settings</string>
</attribute>
</widget>
<widget class="QWidget" name="tab_3">
<attribute name="title">
<string>Inbound Settings</string>
</attribute>
</widget>
<widget class="QWidget" name="tab_6">
<attribute name="title">
<string>Routing</string>
</attribute>
</widget>
<widget class="QWidget" name="tab_4">
<attribute name="title">
<string>Connection Settings</string>
</attribute>
</widget>
</widget>
</item>
</layout>
</widget>
<tabstops>
<tabstop>groupList</tabstop>
<tabstop>addSubsButton</tabstop>
<tabstop>removeSubsButton</tabstop>
<tabstop>addGroupButton</tabstop>
<tabstop>removeGroupButton</tabstop>
<tabstop>subAddrTxt</tabstop>
<tabstop>updateIntervalSB</tabstop>
</tabstops>

View File

@ -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();

View File

@ -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)

View File

@ -33,7 +33,7 @@
<item row="0" column="0">
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>0</number>
<number>3</number>
</property>
<widget class="QWidget" name="tabWidgetPage1">
<attribute name="title">

View File

@ -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;
}
}

View File

@ -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);
};

View File

@ -0,0 +1,21 @@
<ui version="4.0">
<author/>
<comment/>
<exportmacro/>
<class>ConnectionSettingsWidget</class>
<widget class="QWidget" name="ConnectionSettingsWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
</widget>
<pixmapfunction/>
<connections/>
</ui>

View File

@ -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;
}
}

View File

@ -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);
};

View File

@ -0,0 +1,21 @@
<ui version="4.0">
<author/>
<comment/>
<exportmacro/>
<class>InboundSettingsWidget</class>
<widget class="QWidget" name="InboundSettingsWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
</widget>
<pixmapfunction/>
<connections/>
</ui>