#pragma once #include #include #ifndef Q_MOC_RUN #include #endif #include "include/global/Configs.hpp" #include "include/stats/connections/connectionLister.hpp" #include "3rdparty/qv2ray/v2/ui/widgets/speedchart/SpeedWidget.hpp" #ifdef Q_OS_LINUX #include #endif #ifndef MW_INTERFACE #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 Configs_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 prepare_exit(); void refresh_proxy_list(const int &id = -1); void show_group(int gid); void refresh_groups(); void refresh_status(const QString &traffic_update = ""); void update_traffic_graph(int proxyDl, int proxyUp, int directDl, int directUp); void profile_start(int _id = -1); void profile_stop(bool crash = false, bool block = false, bool manual = false); void set_spmode_system_proxy(bool enable, bool save = true); void toggle_system_proxy(); void 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 UpdateConnectionList(const QMap& toUpdate, const QMap& toAdd); void UpdateConnectionListWithRecreate(const QList& connections); void UpdateDataView(bool force = false); void setDownloadReport(const DownloadProgressReport& report, bool show); 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 *parallelCoreCallPool = new QThreadPool(this); std::atomic stopSpeedtest = false; QMutex speedtestRunning; // Configs_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; qint64 last_test_time = 0; // int proxy_last_order = -1; bool select_mode = false; QMutex mu_starting; QMutex mu_stopping; QMutex mu_exit; int exit_reason = 0; // QMutex mu_download_update; // int toolTipID; // SpeedWidget *speedChartWidget; // // for data view QDateTime lastUpdated = QDateTime::currentDateTime(); QString currentSptProfileName; bool showSpeedtestData = false; bool showDownloadData = false; libcore::SpeedTestResult currentTestResult; DownloadProgressReport currentDownloadReport; // could use a list, but don't think can show more than one anyways // shortcuts QList hiddenMenuShortcuts; QStringList remoteRouteProfiles; QMutex mu_remoteRouteProfiles; // search bool searchEnabled = false; QString searchString; void setSearchState(bool enable); QList> filterProfilesList(const QList& profiles); 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 parseQrImage(const QPixmap *image); void keyPressEvent(QKeyEvent *event) override; void closeEvent(QCloseEvent *event) override; void dragEnterEvent(QDragEnterEvent *event); void dropEvent(QDropEvent* event) override; // void HotkeyEvent(const QString &key); void RegisterHiddenMenuShortcuts(bool unregister = false); void setActionsData(); QList getActionsForShortcut(); void loadShortcuts(); // rpc static void setup_rpc(); void urltest_current_group(const QList>& profiles); void stopTests(); void runURLTest(const QString& config, bool useDefault, const QStringList& outboundTags, const QMap& tag2entID, int entID = -1); void url_test_current(); void speedtest_current_group(const QList>& profiles, bool testCurrent = false); void runSpeedTest(const QString& config, bool useDefault, bool testCurrent, const QStringList& outboundTags, const QMap& tag2entID, int entID = -1); bool set_system_dns(bool set, bool save_set = true); void CheckUpdate(); void setupConnectionList(); void querySpeedtest(QDateTime lastProxyListUpdate, const QMap& tag2entID, bool testCurrent); void queryCountryTest(const QMap& tag2entID, bool testCurrent); protected: bool eventFilter(QObject *obj, QEvent *event) override; #endif // MW_INTERFACE }; inline MainWindow *GetMainWindow() { return (MainWindow *) mainwindow; } void UI_InitMainWindow(); #ifdef Q_OS_LINUX /* * Proxy class for interface org.freedesktop.portal.Request */ class OrgFreedesktopPortalRequestInterface : public QDBusAbstractInterface { Q_OBJECT public: OrgFreedesktopPortalRequestInterface(const QString& service, const QString& path, const QDBusConnection& connection, QObject* parent = nullptr); ~OrgFreedesktopPortalRequestInterface(); public Q_SLOTS: inline QDBusPendingReply<> Close() { QList argumentList; return asyncCallWithArgumentList(QStringLiteral("Close"), argumentList); } Q_SIGNALS: // SIGNALS void Response(uint response, QVariantMap results); }; namespace org { namespace freedesktop { namespace portal { typedef ::OrgFreedesktopPortalRequestInterface Request; } } } #endif