From f0a500bfc011585f2d5988b2c9926c7f57a06f47 Mon Sep 17 00:00:00 2001 From: zhanghongyuan Date: Wed, 30 Jul 2025 09:14:56 +0800 Subject: [PATCH] feat: add Port history record feature - Implement Port history storage - Ensure unique Port entries in history - Remove empty ip history config Log: Add the ability to save the history of previously connected ports when using wireless connections. --- QtScrcpy/ui/dialog.cpp | 70 +++++++++++++++++++++++++++++++++++++--- QtScrcpy/ui/dialog.h | 4 +++ QtScrcpy/ui/dialog.ui | 19 ++++++----- QtScrcpy/util/config.cpp | 38 ++++++++++++++++++++++ QtScrcpy/util/config.h | 5 +++ 5 files changed, 123 insertions(+), 13 deletions(-) diff --git a/QtScrcpy/ui/dialog.cpp b/QtScrcpy/ui/dialog.cpp index ea59d23..a47cda4 100644 --- a/QtScrcpy/ui/dialog.cpp +++ b/QtScrcpy/ui/dialog.cpp @@ -168,12 +168,22 @@ void Dialog::initUI() // 加载IP历史记录 loadIpHistory(); + // 加载端口历史记录 + loadPortHistory(); + // 为deviceIpEdt添加右键菜单 if (ui->deviceIpEdt->lineEdit()) { ui->deviceIpEdt->lineEdit()->setContextMenuPolicy(Qt::CustomContextMenu); connect(ui->deviceIpEdt->lineEdit(), &QWidget::customContextMenuRequested, this, &Dialog::showIpEditMenu); } + + // 为devicePortEdt添加右键菜单 + if (ui->devicePortEdt->lineEdit()) { + ui->devicePortEdt->lineEdit()->setContextMenuPolicy(Qt::CustomContextMenu); + connect(ui->devicePortEdt->lineEdit(), &QWidget::customContextMenuRequested, + this, &Dialog::showPortEditMenu); + } } void Dialog::updateBootConfig(bool toView) @@ -361,12 +371,14 @@ void Dialog::on_wirelessConnectBtn_clicked() return; } QString addr = ui->deviceIpEdt->currentText().trimmed(); - if (!ui->devicePortEdt->text().isEmpty()) { + if (addr.isEmpty()) { + outLog("error: device ip is null", false); + return; + } + + if (!ui->devicePortEdt->currentText().isEmpty()) { addr += ":"; - addr += ui->devicePortEdt->text().trimmed(); - } else if (!ui->devicePortEdt->placeholderText().isEmpty()) { - addr += ":"; - addr += ui->devicePortEdt->placeholderText().trimmed(); + addr += ui->devicePortEdt->currentText().trimmed(); } else { outLog("error: device port is null", false); return; @@ -377,6 +389,12 @@ void Dialog::on_wirelessConnectBtn_clicked() if (!ip.isEmpty()) { saveIpHistory(ip); } + + // 保存端口历史记录 + QString port = addr.split(":").last(); + if (!port.isEmpty() && port != ip) { + savePortHistory(port); + } outLog("wireless connect...", false); QStringList adbArgs; @@ -831,3 +849,45 @@ void Dialog::showIpEditMenu(const QPoint &pos) menu->exec(ui->deviceIpEdt->lineEdit()->mapToGlobal(pos)); delete menu; } + +void Dialog::loadPortHistory() +{ + QStringList portList = Config::getInstance().getPortHistory(); + ui->devicePortEdt->clear(); + ui->devicePortEdt->addItems(portList); + ui->devicePortEdt->setContentsMargins(0, 0, 0, 0); + + if (ui->devicePortEdt->lineEdit()) { + ui->devicePortEdt->lineEdit()->setMaxLength(6); + ui->devicePortEdt->lineEdit()->setPlaceholderText("5555"); + } +} + +void Dialog::savePortHistory(const QString &port) +{ + if (port.isEmpty()) { + return; + } + + Config::getInstance().savePortHistory(port); + + // 更新ComboBox + loadPortHistory(); + ui->devicePortEdt->setCurrentText(port); +} + +void Dialog::showPortEditMenu(const QPoint &pos) +{ + QMenu *menu = ui->devicePortEdt->lineEdit()->createStandardContextMenu(); + menu->addSeparator(); + + QAction *clearHistoryAction = new QAction(tr("Clear History"), menu); + connect(clearHistoryAction, &QAction::triggered, this, [this]() { + Config::getInstance().clearPortHistory(); + loadPortHistory(); + }); + + menu->addAction(clearHistoryAction); + menu->exec(ui->devicePortEdt->lineEdit()->mapToGlobal(pos)); + delete menu; +} diff --git a/QtScrcpy/ui/dialog.h b/QtScrcpy/ui/dialog.h index 6766017..577ef5a 100644 --- a/QtScrcpy/ui/dialog.h +++ b/QtScrcpy/ui/dialog.h @@ -82,6 +82,10 @@ private: const QString &getServerPath(); void loadIpHistory(); void saveIpHistory(const QString &ip); + void loadPortHistory(); + void savePortHistory(const QString &port); + + void showPortEditMenu(const QPoint &pos); protected: void closeEvent(QCloseEvent *event); diff --git a/QtScrcpy/ui/dialog.ui b/QtScrcpy/ui/dialog.ui index 7a7702d..3d9aff9 100644 --- a/QtScrcpy/ui/dialog.ui +++ b/QtScrcpy/ui/dialog.ui @@ -1094,22 +1094,25 @@ - + 0 0 - + + + 100 + 0 + + + + true + + - - 6 - - - 5555 - diff --git a/QtScrcpy/util/config.cpp b/QtScrcpy/util/config.cpp index 8d32737..146d6c5 100644 --- a/QtScrcpy/util/config.cpp +++ b/QtScrcpy/util/config.cpp @@ -116,6 +116,11 @@ #define IP_HISTORY_DEF "" #define IP_HISTORY_MAX 10 +// Port history +#define PORT_HISTORY_KEY "PortHistory" +#define PORT_HISTORY_DEF "" +#define PORT_HISTORY_MAX 10 + QString Config::s_configPath = ""; Config::Config(QObject *parent) : QObject(parent) @@ -412,6 +417,7 @@ void Config::saveIpHistory(const QString &ip) QStringList Config::getIpHistory() { QStringList ipList = m_userData->value(IP_HISTORY_KEY, IP_HISTORY_DEF).toStringList(); + ipList.removeAll(""); return ipList; } @@ -420,3 +426,35 @@ void Config::clearIpHistory() m_userData->remove(IP_HISTORY_KEY); m_userData->sync(); } + +void Config::savePortHistory(const QString &port) +{ + QStringList portList = getPortHistory(); + + // 移除已存在的相同Port(避免重复) + portList.removeAll(port); + + // 将新Port添加到开头 + portList.prepend(port); + + // 限制历史记录数量 + while (portList.size() > PORT_HISTORY_MAX) { + portList.removeLast(); + } + + m_userData->setValue(PORT_HISTORY_KEY, portList); + m_userData->sync(); +} + +QStringList Config::getPortHistory() +{ + QStringList portList = m_userData->value(PORT_HISTORY_KEY, PORT_HISTORY_DEF).toStringList(); + portList.removeAll(""); + return portList; +} + +void Config::clearPortHistory() +{ + m_userData->remove(PORT_HISTORY_KEY); + m_userData->sync(); +} diff --git a/QtScrcpy/util/config.h b/QtScrcpy/util/config.h index e45e4cd..187622a 100644 --- a/QtScrcpy/util/config.h +++ b/QtScrcpy/util/config.h @@ -68,6 +68,11 @@ public: QStringList getIpHistory(); void clearIpHistory(); + // Port history methods + void savePortHistory(const QString &port); + QStringList getPortHistory(); + void clearPortHistory(); + private: explicit Config(QObject *parent = nullptr); const QString &getConfigPath();