#pragma once #include #include "include/global/NekoGui.hpp" #include "include/stats/connections/connectionLister.hpp" #ifndef MW_INTERFACE #include #include #include #include #include #include #include #include #include #include #include "group/GroupSort.hpp" #include "include/dataStore/ProxyEntity.hpp" #include "include/global/GuiUtils.hpp" #include "ui_mainwindow.h" #endif namespace NekoGui_sys { class CoreProcess; } QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow() override; void refresh_proxy_list(const int &id = -1); void show_group(int gid); void refresh_groups(); void refresh_status(const QString &traffic_update = ""); void neko_start(int _id = -1); void neko_stop(bool crash = false, bool sem = false, bool manual = false); void neko_set_spmode_system_proxy(bool enable, bool save = true); void neko_toggle_system_proxy(); void neko_set_spmode_vpn(bool enable, bool save = true); bool get_elevated_permissions(int reason = 3); void show_log_impl(const QString &log); void start_select_mode(QObject *context, const std::function &callback); void RegisterHotkey(bool unregister); bool StopVPNProcess(); void DownloadAssets(const QString &geoipUrl, const QString &geositeUrl); void UpdateConnectionList(const QMap& toUpdate, const QMap& toAdd); void UpdateConnectionListWithRecreate(const QList& connections); signals: void profile_selected(int id); public slots: void on_commitDataRequest(); void on_menu_exit_triggered(); #ifndef MW_INTERFACE private slots: void on_masterLogBrowser_customContextMenuRequested(const QPoint &pos); void on_menu_basic_settings_triggered(); void on_menu_routing_settings_triggered(); void on_menu_vpn_settings_triggered(); void on_menu_hotkey_settings_triggered(); void on_menu_add_from_input_triggered(); static void on_menu_add_from_clipboard_triggered(); void on_menu_clone_triggered(); void on_menu_delete_repeat_triggered(); void on_menu_delete_triggered(); void on_menu_reset_traffic_triggered(); void on_menu_copy_links_triggered(); void on_menu_copy_links_nkr_triggered(); void on_menu_export_config_triggered(); void display_qr_link(bool nkrFormat = false); void on_menu_scan_qr_triggered(); void on_menu_clear_test_result_triggered(); void on_menu_manage_groups_triggered(); void on_menu_select_all_triggered(); void on_menu_remove_unavailable_triggered(); void on_menu_remove_invalid_triggered(); void on_menu_resolve_selected_triggered(); void on_menu_resolve_domain_triggered(); void on_menu_update_subscription_triggered(); void on_proxyListTable_itemDoubleClicked(QTableWidgetItem *item); void on_proxyListTable_customContextMenuRequested(const QPoint &pos); void on_tabWidget_currentChanged(int index); void on_tabWidget_customContextMenuRequested(const QPoint& p); private: Ui::MainWindow *ui; QSystemTrayIcon *tray; QShortcut *shortcut_ctrl_f = new QShortcut(QKeySequence("Ctrl+F"), this); QShortcut *shortcut_esc = new QShortcut(QKeySequence("Esc"), this); // QThreadPool *speedTestThreadPool = new QThreadPool(this); std::atomic stopSpeedtest = false; QMutex speedtestRunning; // NekoGui_sys::CoreProcess *core_process; qint64 vpn_pid = 0; // bool qvLogAutoScoll = true; QTextDocument *qvLogDocument = new QTextDocument(this); // QString title_error; int icon_status = -1; std::shared_ptr running; QString traffic_update_cache; QTime last_test_time; // int proxy_last_order = -1; bool select_mode = false; QMutex mu_starting; QMutex mu_stopping; QMutex mu_exit; QSemaphore sem_stopped; int exit_reason = 0; // QMutex mu_download_assets; QList> get_now_selected_list(); QList> get_selected_or_group(); void dialog_message_impl(const QString &sender, const QString &info); void refresh_proxy_list_impl(const int &id = -1, GroupSortAction groupSortAction = {}); void refresh_proxy_list_impl_refresh_data(const int &id = -1, bool stopping = false); void refresh_table_item(int row, const std::shared_ptr& profile, bool stopping); void keyPressEvent(QKeyEvent *event) override; void closeEvent(QCloseEvent *event) override; // void HotkeyEvent(const QString &key); void RegisterShortcuts(); // grpc static void setup_grpc(); void speedtest_current_group(const QList>& profiles); void stopSpeedTests(); void RunSpeedTest(const QString& config, bool useDefault, const QStringList& outboundTags, const QMap& tag2entID, int entID = -1); void url_test_current(); static void stop_core_daemon(); bool set_system_dns(bool set, bool save_set = true); void CheckUpdate(); void setupConnectionList(); protected: bool eventFilter(QObject *obj, QEvent *event) override; #endif // MW_INTERFACE }; inline MainWindow *GetMainWindow() { return (MainWindow *) mainwindow; } void UI_InitMainWindow();