feat: Improve context menus and remove useless ones

This commit is contained in:
unknown 2024-07-26 15:25:43 +03:30
parent 6b82a75d85
commit 8f32828f9d
No known key found for this signature in database
GPG Key ID: C2CA486E4F771093
3 changed files with 40 additions and 118 deletions

View File

@ -332,6 +332,15 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi
}
auto currGroup = NekoGui::profileManager->GetGroup(NekoGui::dataStore->current_group);
if (!currGroup->Profiles().empty()) {
ui->menu_server->addAction(ui->menu_clear_test_result);
ui->menu_server->addAction(ui->menu_remove_unavailable);
} else {
ui->menu_server->removeAction(ui->menu_clear_test_result);
ui->menu_server->removeAction(ui->menu_remove_unavailable);
}
if (currGroup != nullptr && !currGroup->url.isEmpty()) {
ui->menu_server->addAction(ui->menu_update_subscription);
} else {
@ -1078,30 +1087,6 @@ void MainWindow::on_menu_clone_triggered() {
NekoGui_sub::groupUpdater->AsyncUpdate(sls.join("\n"));
}
void MainWindow::on_menu_move_triggered() {
auto ents = get_now_selected_list();
if (ents.isEmpty()) return;
auto items = QStringList{};
for (auto gid: NekoGui::profileManager->groupsTabOrder) {
auto group = NekoGui::profileManager->GetGroup(gid);
if (group == nullptr) continue;
items += Int2String(gid) + " " + group->name;
}
bool ok;
auto a = QInputDialog::getItem(nullptr,
tr("Move"),
tr("Move %1 item(s)").arg(ents.count()),
items, 0, false, &ok);
if (!ok) return;
auto gid = SubStrBefore(a, " ").toInt();
for (const auto &ent: ents) {
NekoGui::profileManager->MoveProfile(ent, gid);
}
refresh_proxy_list();
}
void MainWindow::on_menu_delete_triggered() {
auto ents = get_now_selected_list();
if (ents.count() == 0) return;
@ -1124,19 +1109,6 @@ void MainWindow::on_menu_reset_traffic_triggered() {
}
}
void MainWindow::on_menu_profile_debug_info_triggered() {
auto ents = get_now_selected_list();
if (ents.count() != 1) return;
auto btn = QMessageBox::information(this, software_name, ents.first()->ToJsonBytes(), "OK", "Edit", "Reload", 0, 0);
if (btn == 1) {
QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo(QString("profiles/%1.json").arg(ents.first()->id)).absoluteFilePath()));
} else if (btn == 2) {
NekoGui::dataStore->Load();
NekoGui::profileManager->LoadManager();
refresh_proxy_list();
}
}
void MainWindow::on_menu_copy_links_triggered() {
if (ui->masterLogBrowser->hasFocus()) {
ui->masterLogBrowser->copy();
@ -1321,32 +1293,6 @@ void MainWindow::on_menu_select_all_triggered() {
ui->proxyListTable->selectAll();
}
void MainWindow::on_menu_delete_repeat_triggered() {
QList<std::shared_ptr<NekoGui::ProxyEntity>> out;
QList<std::shared_ptr<NekoGui::ProxyEntity>> out_del;
NekoGui::ProfileFilter::Uniq(NekoGui::profileManager->CurrentGroup()->Profiles(), out, true, false);
NekoGui::ProfileFilter::OnlyInSrc_ByPointer(NekoGui::profileManager->CurrentGroup()->Profiles(), out, out_del);
int remove_display_count = 0;
QString remove_display;
for (const auto &ent: out_del) {
remove_display += ent->bean->DisplayTypeAndName() + "\n";
if (++remove_display_count == 20) {
remove_display += "...";
break;
}
}
if (out_del.length() > 0 &&
QMessageBox::question(this, tr("Confirmation"), tr("Remove %1 item(s) ?").arg(out_del.length()) + "\n" + remove_display) == QMessageBox::StandardButton::Yes) {
for (const auto &ent: out_del) {
NekoGui::profileManager->DeleteProfile(ent->id);
}
refresh_proxy_list();
}
}
bool mw_sub_updating = false;
void MainWindow::on_menu_update_subscription_triggered() {
@ -1384,29 +1330,6 @@ void MainWindow::on_menu_remove_unavailable_triggered() {
}
}
void MainWindow::on_menu_resolve_domain_triggered() {
auto profiles = get_selected_or_group();
if (profiles.isEmpty()) return;
if (QMessageBox::question(this,
tr("Confirmation"),
tr("Resolving domain to IP, if support.")) != QMessageBox::StandardButton::Yes) {
return;
}
if (mw_sub_updating) return;
mw_sub_updating = true;
NekoGui::dataStore->resolve_count = profiles.count();
for (const auto &profile: profiles) {
profile->bean->ResolveDomainToIP([=] {
profile->Save();
if (--NekoGui::dataStore->resolve_count != 0) return;
refresh_proxy_list();
mw_sub_updating = false;
});
}
}
void MainWindow::on_proxyListTable_customContextMenuRequested(const QPoint &pos) {
ui->menu_server->popup(ui->proxyListTable->viewport()->mapToGlobal(pos)); // 弹出菜单
}
@ -1494,10 +1417,6 @@ void MainWindow::show_log_impl(const QString &log) {
}
}
#define ADD_TO_CURRENT_ROUTE(a, b) \
NekoGui::dataStore->routing->a = (SplitLines(NekoGui::dataStore->routing->a) << (b)).join("\n"); \
NekoGui::dataStore->routing->Save();
void MainWindow::on_masterLogBrowser_customContextMenuRequested(const QPoint &pos) {
QMenu *menu = ui->masterLogBrowser->createStandardContextMenu();
@ -1612,7 +1531,13 @@ void MainWindow::on_tabWidget_customContextMenuRequested(const QPoint &p) {
});
menu->addAction(addAction);
menu->addAction(editAction);
auto group = NekoGui::profileManager->GetGroup(NekoGui::dataStore->current_group);
if (NekoGui::profileManager->groups.size() > 1) menu->addAction(deleteAction);
if (!group->Profiles().empty()) {
menu->addAction(ui->menu_clear_test_result);
menu->addAction(ui->menu_remove_unavailable);
}
if (!group->url.isEmpty()) menu->addAction(ui->menu_update_subscription);
menu->exec(ui->tabWidget->tabBar()->mapToGlobal(p));
return;
}

View File

@ -98,14 +98,10 @@ private slots:
void on_menu_clone_triggered();
void on_menu_move_triggered();
void on_menu_delete_triggered();
void on_menu_reset_traffic_triggered();
void on_menu_profile_debug_info_triggered();
void on_menu_copy_links_triggered();
void on_menu_copy_links_nkr_triggered();
@ -122,14 +118,10 @@ private slots:
void on_menu_select_all_triggered();
void on_menu_delete_repeat_triggered();
void on_menu_remove_unavailable_triggered();
void on_menu_update_subscription_triggered();
void on_menu_resolve_domain_triggered();
void on_proxyListTable_itemDoubleClicked(QTableWidgetItem *item);
void on_proxyListTable_customContextMenuRequested(const QPoint &pos);

View File

@ -38,10 +38,10 @@
</size>
</property>
<property name="popupMode">
<enum>QToolButton::ToolButtonPopupMode::InstantPopup</enum>
<enum>QToolButton::InstantPopup</enum>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonStyle::ToolButtonTextUnderIcon</enum>
<enum>Qt::ToolButtonTextUnderIcon</enum>
</property>
</widget>
</item>
@ -60,10 +60,10 @@
</size>
</property>
<property name="popupMode">
<enum>QToolButton::ToolButtonPopupMode::InstantPopup</enum>
<enum>QToolButton::InstantPopup</enum>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonStyle::ToolButtonTextUnderIcon</enum>
<enum>Qt::ToolButtonTextUnderIcon</enum>
</property>
</widget>
</item>
@ -82,10 +82,10 @@
</size>
</property>
<property name="popupMode">
<enum>QToolButton::ToolButtonPopupMode::InstantPopup</enum>
<enum>QToolButton::InstantPopup</enum>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonStyle::ToolButtonTextUnderIcon</enum>
<enum>Qt::ToolButtonTextUnderIcon</enum>
</property>
</widget>
</item>
@ -104,10 +104,10 @@
</size>
</property>
<property name="popupMode">
<enum>QToolButton::ToolButtonPopupMode::InstantPopup</enum>
<enum>QToolButton::InstantPopup</enum>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonStyle::ToolButtonTextUnderIcon</enum>
<enum>Qt::ToolButtonTextUnderIcon</enum>
</property>
</widget>
</item>
@ -138,7 +138,7 @@
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@ -160,7 +160,7 @@
<item>
<widget class="QSplitter" name="splitter">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
<enum>Qt::Vertical</enum>
</property>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
@ -192,19 +192,19 @@
<item row="0" column="0">
<widget class="MyTableWidget" name="proxyListTable">
<property name="contextMenuPolicy">
<enum>Qt::ContextMenuPolicy::CustomContextMenu</enum>
<enum>Qt::CustomContextMenu</enum>
</property>
<property name="editTriggers">
<set>QAbstractItemView::EditTrigger::NoEditTriggers</set>
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectionBehavior::SelectRows</enum>
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="horizontalScrollMode">
<enum>QAbstractItemView::ScrollMode::ScrollPerPixel</enum>
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
<property name="wordWrap">
<bool>false</bool>
@ -274,7 +274,7 @@
<item>
<widget class="QTextBrowser" name="masterLogBrowser">
<property name="contextMenuPolicy">
<enum>Qt::ContextMenuPolicy::CustomContextMenu</enum>
<enum>Qt::CustomContextMenu</enum>
</property>
<property name="openLinks">
<bool>false</bool>
@ -300,10 +300,10 @@
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Policy::Maximum</enum>
<enum>QSizePolicy::Maximum</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@ -337,7 +337,7 @@
<x>0</x>
<y>0</y>
<width>800</width>
<height>33</height>
<height>25</height>
</rect>
</property>
<widget class="QMenu" name="menu_program">
@ -411,12 +411,11 @@
<addaction name="menu_stop"/>
<addaction name="separator"/>
<addaction name="menu_select_all"/>
<addaction name="menu_move"/>
<addaction name="menu_clone"/>
<addaction name="menu_reset_traffic"/>
<addaction name="menu_delete"/>
<addaction name="separator"/>
<addaction name="menu_share_item"/>
<addaction name="separator"/>
<addaction name="actionUrl_Test_Selected"/>
<addaction name="actionUrl_Test_Group"/>
</widget>
@ -756,11 +755,17 @@
<property name="text">
<string>Url Test Selected</string>
</property>
<property name="shortcut">
<string>Ctrl+Shift+S</string>
</property>
</action>
<action name="actionUrl_Test_Group">
<property name="text">
<string>Url Test Group</string>
</property>
<property name="shortcut">
<string>Ctrl+Shift+G</string>
</property>
</action>
</widget>
<customwidgets>