mirror of
https://github.com/MatsuriDayo/nekoray.git
synced 2025-12-17 20:44:38 +03:00
speedtest current selected
This commit is contained in:
@@ -1163,7 +1163,7 @@
|
|||||||
<translation>کد QR یافت نشد</translation>
|
<translation>کد QR یافت نشد</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Resolving current group domain to IP, if support.</source>
|
<source>Resolving domain to IP, if support.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
@@ -1244,6 +1244,10 @@ End: %2</source>
|
|||||||
<source>Stopping profile %1</source>
|
<source>Stopping profile %1</source>
|
||||||
<translation>متوقف کردن پروفایل %1</translation>
|
<translation>متوقف کردن پروفایل %1</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Current Select</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>ProxyItem</name>
|
<name>ProxyItem</name>
|
||||||
|
|||||||
@@ -1202,8 +1202,8 @@ End: %2</source>
|
|||||||
<translation>将服务器域名解析为 IP</translation>
|
<translation>将服务器域名解析为 IP</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Resolving current group domain to IP, if support.</source>
|
<source>Resolving domain to IP, if support.</source>
|
||||||
<translation>将当前分组内服务器域名解析为 IP(如果支持)。</translation>
|
<translation>将服务器域名解析为 IP(如果支持)。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Export %1 config</source>
|
<source>Export %1 config</source>
|
||||||
@@ -1255,6 +1255,10 @@ Split by line.</source>
|
|||||||
<source>Edit</source>
|
<source>Edit</source>
|
||||||
<translation>编辑</translation>
|
<translation>编辑</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Current Select</source>
|
||||||
|
<translation>当前选中</translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>ProxyItem</name>
|
<name>ProxyItem</name>
|
||||||
|
|||||||
@@ -341,6 +341,42 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi
|
|||||||
connect(ui->menu_url_test, &QAction::triggered, this, [=]() { speedtest_current_group(1); });
|
connect(ui->menu_url_test, &QAction::triggered, this, [=]() { speedtest_current_group(1); });
|
||||||
connect(ui->menu_full_test, &QAction::triggered, this, [=]() { speedtest_current_group(2); });
|
connect(ui->menu_full_test, &QAction::triggered, this, [=]() { speedtest_current_group(2); });
|
||||||
//
|
//
|
||||||
|
auto set_selected_or_group = [=](int mode) {
|
||||||
|
// 0=group 1=select 2=unknown(menu is hide)
|
||||||
|
ui->menu_server->setProperty("selected_or_group", mode);
|
||||||
|
};
|
||||||
|
auto move_tests_to_menu = [=](bool menuCurrent_Select) {
|
||||||
|
return [=] {
|
||||||
|
if (menuCurrent_Select) {
|
||||||
|
ui->menuCurrent_Select->insertAction(ui->actionfake_4, ui->menu_tcp_ping);
|
||||||
|
ui->menuCurrent_Select->insertAction(ui->actionfake_4, ui->menu_url_test);
|
||||||
|
ui->menuCurrent_Select->insertAction(ui->actionfake_4, ui->menu_full_test);
|
||||||
|
ui->menuCurrent_Select->insertAction(ui->actionfake_4, ui->menu_clear_test_result);
|
||||||
|
ui->menuCurrent_Select->insertAction(ui->actionfake_4, ui->menu_resolve_domain);
|
||||||
|
} else {
|
||||||
|
ui->menuCurrent_Group->insertAction(ui->actionfake_5, ui->menu_tcp_ping);
|
||||||
|
ui->menuCurrent_Group->insertAction(ui->actionfake_5, ui->menu_url_test);
|
||||||
|
ui->menuCurrent_Group->insertAction(ui->actionfake_5, ui->menu_full_test);
|
||||||
|
ui->menuCurrent_Group->insertAction(ui->actionfake_5, ui->menu_clear_test_result);
|
||||||
|
ui->menuCurrent_Group->insertAction(ui->actionfake_5, ui->menu_resolve_domain);
|
||||||
|
}
|
||||||
|
ui->menu_full_test->setVisible(!IS_NEKO_BOX);
|
||||||
|
set_selected_or_group(menuCurrent_Select ? 1 : 0);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
connect(ui->menuCurrent_Select, &QMenu::aboutToShow, this, move_tests_to_menu(true));
|
||||||
|
connect(ui->menuCurrent_Group, &QMenu::aboutToShow, this, move_tests_to_menu(false));
|
||||||
|
connect(ui->menu_server, &QMenu::aboutToHide, this, [=] {
|
||||||
|
auto timer = new QTimer(this);
|
||||||
|
timer->setInterval(100);
|
||||||
|
connect(timer, &QTimer::timeout, this, [=] {
|
||||||
|
set_selected_or_group(2);
|
||||||
|
timer->deleteLater();
|
||||||
|
});
|
||||||
|
timer->start();
|
||||||
|
});
|
||||||
|
set_selected_or_group(2);
|
||||||
|
//
|
||||||
connect(ui->menu_share_item, &QMenu::aboutToShow, this, [=] {
|
connect(ui->menu_share_item, &QMenu::aboutToShow, this, [=] {
|
||||||
QString name;
|
QString name;
|
||||||
auto selected = get_now_selected();
|
auto selected = get_now_selected();
|
||||||
@@ -351,9 +387,6 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi
|
|||||||
ui->menu_export_config->setVisible(name == software_core_name);
|
ui->menu_export_config->setVisible(name == software_core_name);
|
||||||
ui->menu_export_config->setText(tr("Export %1 config").arg(name));
|
ui->menu_export_config->setText(tr("Export %1 config").arg(name));
|
||||||
});
|
});
|
||||||
connect(ui->menugroup, &QMenu::aboutToShow, this, [=] {
|
|
||||||
ui->menu_full_test->setVisible(!IS_NEKO_BOX);
|
|
||||||
});
|
|
||||||
refresh_status();
|
refresh_status();
|
||||||
|
|
||||||
// Prepare core
|
// Prepare core
|
||||||
@@ -1166,8 +1199,7 @@ void MainWindow::on_menu_scan_qr_triggered() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_menu_clear_test_result_triggered() {
|
void MainWindow::on_menu_clear_test_result_triggered() {
|
||||||
for (const auto &profile: NekoRay::profileManager->profiles) {
|
for (const auto &profile: get_selected_or_group()) {
|
||||||
if (NekoRay::dataStore->current_group != profile->gid) continue;
|
|
||||||
profile->latency = 0;
|
profile->latency = 0;
|
||||||
profile->full_test_report = "";
|
profile->full_test_report = "";
|
||||||
profile->Save();
|
profile->Save();
|
||||||
@@ -1241,20 +1273,17 @@ void MainWindow::on_menu_remove_unavailable_triggered() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_menu_resolve_domain_triggered() {
|
void MainWindow::on_menu_resolve_domain_triggered() {
|
||||||
|
auto profiles = get_selected_or_group();
|
||||||
|
if (profiles.isEmpty()) return;
|
||||||
|
|
||||||
if (QMessageBox::question(this,
|
if (QMessageBox::question(this,
|
||||||
tr("Confirmation"),
|
tr("Confirmation"),
|
||||||
tr("Resolving current group domain to IP, if support.")) != QMessageBox::StandardButton::Yes) {
|
tr("Resolving domain to IP, if support.")) != QMessageBox::StandardButton::Yes) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (mw_sub_updating) return;
|
if (mw_sub_updating) return;
|
||||||
mw_sub_updating = true;
|
mw_sub_updating = true;
|
||||||
|
|
||||||
auto group = NekoRay::profileManager->CurrentGroup();
|
|
||||||
if (group == nullptr) return;
|
|
||||||
|
|
||||||
auto profiles = group->ProfilesWithOrder();
|
|
||||||
NekoRay::dataStore->resolve_count = profiles.length();
|
|
||||||
|
|
||||||
for (const auto &profile: profiles) {
|
for (const auto &profile: profiles) {
|
||||||
profile->bean->ResolveDomainToIP([=] {
|
profile->bean->ResolveDomainToIP([=] {
|
||||||
profile->Save();
|
profile->Save();
|
||||||
@@ -1280,6 +1309,29 @@ QMap<int, QSharedPointer<NekoRay::ProxyEntity>> MainWindow::get_now_selected() {
|
|||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QList<QSharedPointer<NekoRay::ProxyEntity>> MainWindow::get_now_selected_list() {
|
||||||
|
auto items = ui->proxyListTable->selectedItems();
|
||||||
|
QList<QSharedPointer<NekoRay::ProxyEntity>> list;
|
||||||
|
for (auto item: items) {
|
||||||
|
auto id = item->data(114514).toInt();
|
||||||
|
auto ent = NekoRay::profileManager->GetProfile(id);
|
||||||
|
if (ent != nullptr && !list.contains(ent)) list += ent;
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<QSharedPointer<NekoRay::ProxyEntity>> MainWindow::get_selected_or_group() {
|
||||||
|
auto selected_or_group = ui->menu_server->property("selected_or_group").toInt();
|
||||||
|
QList<QSharedPointer<NekoRay::ProxyEntity>> profiles;
|
||||||
|
if (selected_or_group > 0) {
|
||||||
|
profiles = get_now_selected_list();
|
||||||
|
if (profiles.isEmpty() && selected_or_group == 2) profiles = NekoRay::profileManager->CurrentGroup()->ProfilesWithOrder();
|
||||||
|
} else {
|
||||||
|
profiles = NekoRay::profileManager->CurrentGroup()->ProfilesWithOrder();
|
||||||
|
}
|
||||||
|
return profiles;
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::keyPressEvent(QKeyEvent *event) {
|
void MainWindow::keyPressEvent(QKeyEvent *event) {
|
||||||
switch (event->key()) {
|
switch (event->key()) {
|
||||||
case Qt::Key_Escape:
|
case Qt::Key_Escape:
|
||||||
|
|||||||
@@ -153,6 +153,10 @@ private:
|
|||||||
|
|
||||||
QMap<int, QSharedPointer<NekoRay::ProxyEntity>> get_now_selected();
|
QMap<int, QSharedPointer<NekoRay::ProxyEntity>> get_now_selected();
|
||||||
|
|
||||||
|
QList<QSharedPointer<NekoRay::ProxyEntity>> get_now_selected_list();
|
||||||
|
|
||||||
|
QList<QSharedPointer<NekoRay::ProxyEntity>> get_selected_or_group();
|
||||||
|
|
||||||
void dialog_message_impl(const QString &sender, const QString &info);
|
void dialog_message_impl(const QString &sender, const QString &info);
|
||||||
|
|
||||||
void refresh_proxy_list_impl(const int &id = -1, NekoRay::GroupSortAction groupSortAction = {});
|
void refresh_proxy_list_impl(const int &id = -1, NekoRay::GroupSortAction groupSortAction = {});
|
||||||
|
|||||||
@@ -523,21 +523,28 @@
|
|||||||
<addaction name="menu_copy_links"/>
|
<addaction name="menu_copy_links"/>
|
||||||
<addaction name="menu_copy_links_nkr"/>
|
<addaction name="menu_copy_links_nkr"/>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QMenu" name="menugroup">
|
<widget class="QMenu" name="menuCurrent_Group">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Current Group</string>
|
<string>Current Group</string>
|
||||||
</property>
|
</property>
|
||||||
|
<addaction name="actionfake_5"/>
|
||||||
<addaction name="menu_tcp_ping"/>
|
<addaction name="menu_tcp_ping"/>
|
||||||
<addaction name="menu_url_test"/>
|
<addaction name="menu_url_test"/>
|
||||||
<addaction name="menu_full_test"/>
|
<addaction name="menu_full_test"/>
|
||||||
<addaction name="menu_remove_unavailable"/>
|
|
||||||
<addaction name="menu_clear_test_result"/>
|
<addaction name="menu_clear_test_result"/>
|
||||||
<addaction name="separator"/>
|
|
||||||
<addaction name="menu_delete_repeat"/>
|
|
||||||
<addaction name="menu_resolve_domain"/>
|
<addaction name="menu_resolve_domain"/>
|
||||||
<addaction name="separator"/>
|
<addaction name="separator"/>
|
||||||
|
<addaction name="menu_remove_unavailable"/>
|
||||||
|
<addaction name="menu_delete_repeat"/>
|
||||||
|
<addaction name="separator"/>
|
||||||
<addaction name="menu_update_subscription"/>
|
<addaction name="menu_update_subscription"/>
|
||||||
</widget>
|
</widget>
|
||||||
|
<widget class="QMenu" name="menuCurrent_Select">
|
||||||
|
<property name="title">
|
||||||
|
<string>Current Select</string>
|
||||||
|
</property>
|
||||||
|
<addaction name="actionfake_4"/>
|
||||||
|
</widget>
|
||||||
<addaction name="menu_add_from_input"/>
|
<addaction name="menu_add_from_input"/>
|
||||||
<addaction name="menu_add_from_clipboard"/>
|
<addaction name="menu_add_from_clipboard"/>
|
||||||
<addaction name="separator"/>
|
<addaction name="separator"/>
|
||||||
@@ -552,7 +559,8 @@
|
|||||||
<addaction name="separator"/>
|
<addaction name="separator"/>
|
||||||
<addaction name="menu_share_item"/>
|
<addaction name="menu_share_item"/>
|
||||||
<addaction name="separator"/>
|
<addaction name="separator"/>
|
||||||
<addaction name="menugroup"/>
|
<addaction name="menuCurrent_Select"/>
|
||||||
|
<addaction name="menuCurrent_Group"/>
|
||||||
<addaction name="separator"/>
|
<addaction name="separator"/>
|
||||||
<addaction name="menu_profile_debug_info"/>
|
<addaction name="menu_profile_debug_info"/>
|
||||||
<addaction name="separator"/>
|
<addaction name="separator"/>
|
||||||
@@ -846,6 +854,22 @@
|
|||||||
<string>Open Config Folder</string>
|
<string>Open Config Folder</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
<action name="actionfake_4">
|
||||||
|
<property name="text">
|
||||||
|
<string notr="true">fake</string>
|
||||||
|
</property>
|
||||||
|
<property name="visible">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionfake_5">
|
||||||
|
<property name="text">
|
||||||
|
<string notr="true">fake</string>
|
||||||
|
</property>
|
||||||
|
<property name="visible">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
<customwidgets>
|
<customwidgets>
|
||||||
<customwidget>
|
<customwidget>
|
||||||
|
|||||||
@@ -41,8 +41,11 @@ void MainWindow::setup_grpc() {
|
|||||||
inline bool speedtesting = false;
|
inline bool speedtesting = false;
|
||||||
|
|
||||||
void MainWindow::speedtest_current_group(int mode) {
|
void MainWindow::speedtest_current_group(int mode) {
|
||||||
#ifndef NKR_NO_GRPC
|
|
||||||
if (speedtesting) return;
|
if (speedtesting) return;
|
||||||
|
auto profiles = get_selected_or_group();
|
||||||
|
if (profiles.isEmpty()) return;
|
||||||
|
auto group = NekoRay::profileManager->CurrentGroup();
|
||||||
|
if (group->archive) return;
|
||||||
|
|
||||||
QStringList full_test_flags;
|
QStringList full_test_flags;
|
||||||
if (mode == libcore::FullTest) {
|
if (mode == libcore::FullTest) {
|
||||||
@@ -59,23 +62,13 @@ void MainWindow::speedtest_current_group(int mode) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
speedtesting = true;
|
speedtesting = true;
|
||||||
|
#ifndef NKR_NO_GRPC
|
||||||
runOnNewThread([=]() {
|
runOnNewThread([this, profiles, mode, full_test_flags]() {
|
||||||
auto group = NekoRay::profileManager->CurrentGroup();
|
|
||||||
if (group->archive) return;
|
|
||||||
auto order = ui->proxyListTable->order; // copy
|
|
||||||
|
|
||||||
QMutex lock_write;
|
QMutex lock_write;
|
||||||
QMutex lock_return;
|
QMutex lock_return;
|
||||||
QList<QSharedPointer<NekoRay::ProxyEntity>> profiles;
|
|
||||||
int threadN = mode == libcore::FullTest ? 1 : NekoRay::dataStore->test_concurrent;
|
int threadN = mode == libcore::FullTest ? 1 : NekoRay::dataStore->test_concurrent;
|
||||||
int threadN_finished = 0;
|
int threadN_finished = 0;
|
||||||
|
auto profiles_test = profiles; // copy
|
||||||
// 这个是按照显示的顺序
|
|
||||||
for (auto id: order) {
|
|
||||||
auto profile = NekoRay::profileManager->GetProfile(id);
|
|
||||||
if (profile != nullptr) profiles += profile;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Threads
|
// Threads
|
||||||
lock_return.lock();
|
lock_return.lock();
|
||||||
@@ -84,13 +77,13 @@ void MainWindow::speedtest_current_group(int mode) {
|
|||||||
forever {
|
forever {
|
||||||
//
|
//
|
||||||
lock_write.lock();
|
lock_write.lock();
|
||||||
if (profiles.isEmpty()) {
|
if (profiles_test.isEmpty()) {
|
||||||
threadN_finished++;
|
threadN_finished++;
|
||||||
if (threadN == threadN_finished) lock_return.unlock();
|
if (threadN == threadN_finished) lock_return.unlock();
|
||||||
lock_write.unlock();
|
lock_write.unlock();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto profile = profiles.takeFirst();
|
auto profile = profiles_test.takeFirst();
|
||||||
lock_write.unlock();
|
lock_write.unlock();
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|||||||
Reference in New Issue
Block a user