From c65d7ed14c8ce99348fa62fc512515943d8bb542 Mon Sep 17 00:00:00 2001 From: msnh2012 Date: Sun, 11 Apr 2021 18:22:46 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E4=B8=80=E9=94=AE?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E4=BF=9D=E5=AD=98=E5=8A=9F=E8=83=BD=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8E=86=E5=8F=B2=E8=AE=BE=E5=A4=87=E8=AE=BF?= =?UTF-8?q?=E9=97=AE=EF=BC=8C=E6=B7=BB=E5=8A=A0=E8=AE=BE=E5=A4=87=E5=91=BD?= =?UTF-8?q?=E5=90=8D=20(#386)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 添加一键连接功能,添加参数保存功能,添加历史设备访问,添加设备命名 添加一键连接功能,添加参数保存功能,添加历史设备访问,添加设备命名 * 修复mac os注释,命名统一 --- QtScrcpy/QtScrcpy.pro | 1 - QtScrcpy/dialog.cpp | 236 ++++++++++++++++++++++++++++++- QtScrcpy/dialog.h | 30 +++- QtScrcpy/dialog.ui | 116 ++++++++++++--- QtScrcpy/main.cpp | 4 +- QtScrcpy/res/i18n/QtScrcpy_en.qm | Bin 4793 -> 5193 bytes QtScrcpy/res/i18n/QtScrcpy_en.ts | 176 +++++++++++++++++------ QtScrcpy/res/i18n/QtScrcpy_zh.qm | Bin 3634 -> 4052 bytes QtScrcpy/res/i18n/QtScrcpy_zh.ts | 176 +++++++++++++++++------ QtScrcpy/res/image/tray/logo.png | Bin 0 -> 11965 bytes QtScrcpy/res/res.qrc | 3 +- QtScrcpy/util/config.cpp | 73 +++++++++- QtScrcpy/util/config.h | 20 ++- 13 files changed, 716 insertions(+), 119 deletions(-) create mode 100644 QtScrcpy/res/image/tray/logo.png diff --git a/QtScrcpy/QtScrcpy.pro b/QtScrcpy/QtScrcpy.pro index 0afdc4e..e61704c 100644 --- a/QtScrcpy/QtScrcpy.pro +++ b/QtScrcpy/QtScrcpy.pro @@ -179,7 +179,6 @@ macos { APP_CONFIG.files = $$files($$PWD/../config/config.ini) APP_CONFIG.path = Contents/MacOS/config QMAKE_BUNDLE_DATA += APP_CONFIG - # mac application icon ICON = $$PWD/res/QtScrcpy.icns QMAKE_INFO_PLIST = $$PWD/res/Info_Mac.plist diff --git a/QtScrcpy/dialog.cpp b/QtScrcpy/dialog.cpp index e5f6827..b7ea3c1 100644 --- a/QtScrcpy/dialog.cpp +++ b/QtScrcpy/dialog.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -74,6 +74,20 @@ Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) outLog(log, newLine); } }); + + m_hideIcon = new QSystemTrayIcon(); + m_hideIcon->setIcon(QIcon(":/image/tray/logo.png")); + m_menu = new QMenu(); + m_quit = new QAction(); + m_showWindow = new QAction();; + m_showWindow->setText(tr("show")); + m_quit->setText(tr("quit")); + m_menu->addAction(m_showWindow); + m_menu->addAction(m_quit); + m_hideIcon->setContextMenu(m_menu); + connect(m_showWindow, &QAction::triggered, this, &Dialog::slotShow); + connect(m_quit, SIGNAL(triggered()), this, SLOT(close())); + connect(m_hideIcon, &QSystemTrayIcon::activated,this,&Dialog::slotActivated); } Dialog::~Dialog() @@ -119,14 +133,18 @@ void Dialog::initUI() ui->recordPathEdt->setText(Config::getInstance().getRecordPath()); ui->framelessCheck->setChecked(Config::getInstance().getFramelessWindow()); + on_useSingleModeCheck_clicked(); + + updateConnectedList(); + #ifdef Q_OS_OSX // mac need more width - setFixedWidth(520); + setFixedWidth(550); #endif #ifdef Q_OS_LINUX // linux need more width - setFixedWidth(480); + setFixedWidth(520); #endif } @@ -140,6 +158,15 @@ void Dialog::execAdbCmd() m_adb.execute(ui->serialBox->currentText().trimmed(), cmd.split(" ", Qt::SkipEmptyParts)); } +void Dialog::delayMs(int ms) +{ + QTime dieTime = QTime::currentTime().addMSecs(ms); + + while (QTime::currentTime() < dieTime) { + QCoreApplication::processEvents(QEventLoop::AllEvents, 100); + } +} + QString Dialog::getGameScript(const QString &fileName) { QFile loadFile(KeyMap::getKeyMapPath() + "/" + fileName); @@ -153,6 +180,77 @@ QString Dialog::getGameScript(const QString &fileName) return ret; } +void Dialog::slotShow() +{ + this->show(); + m_hideIcon->hide(); +} + +void Dialog::slotActivated(QSystemTrayIcon::ActivationReason reason) +{ + switch (reason) { + case QSystemTrayIcon::Trigger: + this->show(); + m_hideIcon->hide(); + break; + default: + break; + } +} + +void Dialog::updateConnectedList() +{ + ui->connectedPhoneList->clear(); + QStringList list = Config::getInstance().getConnectedGroups(); + + QRegExp regIP("\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\:([0-9]|[1-9]\\d|[1-9]\\d{2}|[1-9]\\d{3}|[1-5]\\d{4}|6[0-4]\\d{3}|65[0-4]\\d{2}|655[0-2]\\d|6553[0-5])\\b"); + + for (int i = 0; i < list.length(); ++i) + { + QString phone = QString(list[i]); + if(phone != "common" /*&& regIP.exactMatch(phone)*/) + { + ui->connectedPhoneList->addItem(phone+"-"+Config::getInstance().getUserName(phone)); + } + } +} + +void Dialog::updateUser() +{ + +} + +void Dialog::loadUser() +{ + +} + +void Dialog::closeEvent(QCloseEvent *event) +{ + int res = QMessageBox::question(this,tr("warning"),tr("Quit or set tray?"),tr("Quit"),tr("Set tray"),tr("Cancel")); + + if(res == 0) + { + event->accept(); + } + else if(res == 1) + { + this->hide(); + m_hideIcon->show(); + m_hideIcon->showMessage(tr("Notice"), + tr("Hidden here!"), + QSystemTrayIcon::Information, + 3000); + event->ignore(); + } + else + { + event->ignore(); + } + + +} + void Dialog::on_updateDevice_clicked() { if (checkAdbRun()) { @@ -166,6 +264,21 @@ void Dialog::on_startServerBtn_clicked() { outLog("start server...", false); + UserBootConfig config; + + config.recordScreen = ui->recordScreenCheck->isChecked(); + config.recordBackground = ui->notDisplayCheck->isChecked(); + config.reverseConnect = ui->useReverseCheck->isChecked(); + config.showFPS = ui->fpsCheck->isChecked(); + config.windowOnTop = ui->alwaysTopCheck->isChecked(); + config.autoOffScreen = ui->closeScreenCheck->isChecked(); + config.windowFrameless = ui->framelessCheck->isChecked(); + config.keepAlive = ui->stayAwakeCheck->isChecked(); + + Config::getInstance().setUserBootConfig(ui->serialBox->currentText(),config); + + updateConnectedList(); + QString absFilePath; if (ui->recordScreenCheck->isChecked()) { QString fileDir(ui->recordPathEdt->text().trimmed()); @@ -422,3 +535,120 @@ void Dialog::on_framelessCheck_stateChanged(int arg1) Q_UNUSED(arg1) Config::getInstance().setFramelessWindow(ui->framelessCheck->isChecked()); } + +void Dialog::on_usbConnectBtn_clicked() +{ + on_stopAllServerBtn_clicked(); + delayMs(200); + on_updateDevice_clicked(); + delayMs(200); + if(ui->serialBox->count()==0) + { + qWarning() << "No device is found!"; + return; + } + + QRegExp regIP("\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\:([0-9]|[1-9]\\d|[1-9]\\d{2}|[1-9]\\d{3}|[1-5]\\d{4}|6[0-4]\\d{3}|65[0-4]\\d{2}|655[0-2]\\d|6553[0-5])\\b"); + + for (int i = 0; i < ui->serialBox->count(); ++i) + { + if(!regIP.exactMatch(ui->serialBox->itemText(i))) + { + ui->serialBox->setCurrentIndex(i); + on_startServerBtn_clicked(); + break; + } + } + + updateConnectedList(); +} + +void Dialog::on_wifiConnectBtn_clicked() +{ + on_stopAllServerBtn_clicked(); + delayMs(200); + + on_updateDevice_clicked(); + delayMs(200); + if(ui->serialBox->count()==0) + { + qWarning() << "No device is found!"; + return; + } + + on_getIPBtn_clicked(); + delayMs(200); + + on_startAdbdBtn_clicked(); + delayMs(1000); + + on_wirelessConnectBtn_clicked(); + delayMs(2000); + + ui->serialBox->clear(); + + ui->serialBox->addItem(ui->deviceIpEdt->text()+":5555"); + + on_startServerBtn_clicked(); + delayMs(200); + + updateConnectedList(); +} + +void Dialog::on_connectedPhoneList_itemDoubleClicked(QListWidgetItem *item) +{ + ui->serialBox->clear(); + ui->serialBox->addItem(item->text().split("-")[0]); + ui->serialBox->setCurrentIndex(0); + + UserBootConfig config = Config::getInstance().getUserBootConfig(ui->serialBox->currentText()); + + ui->recordScreenCheck->setChecked(config.recordScreen); + ui->notDisplayCheck->setChecked(config.recordBackground); + ui->useReverseCheck->setChecked(config.reverseConnect); + ui->fpsCheck->setChecked(config.showFPS); + ui->alwaysTopCheck->setChecked(config.windowOnTop); + ui->closeScreenCheck->setChecked(config.autoOffScreen); + ui->framelessCheck->setChecked(config.windowFrameless); + ui->stayAwakeCheck->setChecked(config.keepAlive); + ui->userNameEdt->setText(Config::getInstance().getUserName(ui->serialBox->currentText())); + + on_startServerBtn_clicked(); +} + +void Dialog::on_updateNameBtn_clicked() +{ + if(ui->serialBox->count()!=0) + { + if(ui->userNameEdt->text().isEmpty()) + Config::getInstance().setUserName(ui->serialBox->currentText(),"PHONE"); + else + Config::getInstance().setUserName(ui->serialBox->currentText(),ui->userNameEdt->text()); + + updateConnectedList(); + + qDebug()<<"Update OK!"; + } + else + { + qWarning()<<"No device is connected!"; + } +} + +void Dialog::on_useSingleModeCheck_clicked() +{ + if(ui->useSingleModeCheck->isChecked()) + { + ui->configGroupBox->hide(); + ui->adbGroupBox->hide(); + ui->wirelessGroupBox->hide(); + ui->usbGroupBox->hide(); + } + else + { + ui->configGroupBox->show(); + ui->adbGroupBox->show(); + ui->wirelessGroupBox->show(); + ui->usbGroupBox->show(); + } +} diff --git a/QtScrcpy/dialog.h b/QtScrcpy/dialog.h index 20eae6f..bae8044 100644 --- a/QtScrcpy/dialog.h +++ b/QtScrcpy/dialog.h @@ -1,8 +1,13 @@ -#ifndef DIALOG_H +#ifndef DIALOG_H #define DIALOG_H #include #include +#include +#include +#include +#include + #include "adbprocess.h" #include "devicemanage.h" @@ -66,16 +71,39 @@ private slots: void on_framelessCheck_stateChanged(int arg1); + void on_usbConnectBtn_clicked(); + + void on_wifiConnectBtn_clicked(); + + void on_connectedPhoneList_itemDoubleClicked(QListWidgetItem *item); + + void on_updateNameBtn_clicked(); + + void on_useSingleModeCheck_clicked(); + private: bool checkAdbRun(); void initUI(); void execAdbCmd(); + void delayMs(int ms); QString getGameScript(const QString &fileName); + void slotShow(); + void slotActivated(QSystemTrayIcon::ActivationReason reason); + void updateConnectedList(); + void updateUser(); + void loadUser(); + +protected: + void closeEvent(QCloseEvent *event); private: Ui::Dialog *ui; AdbProcess m_adb; DeviceManage m_deviceManage; + QSystemTrayIcon *m_hideIcon; + QMenu *m_menu; + QAction *m_showWindow; + QAction *m_quit; }; #endif // DIALOG_H diff --git a/QtScrcpy/dialog.ui b/QtScrcpy/dialog.ui index ae80cab..ed900ab 100644 --- a/QtScrcpy/dialog.ui +++ b/QtScrcpy/dialog.ui @@ -6,19 +6,19 @@ 0 0 - 420 - 517 + 500 + 745 - 420 + 500 0 - 420 + 500 16777215 @@ -26,6 +26,56 @@ QtScrcpy + + + + Use Simple Mode + + + true + + + + + + + Simple Mode + + + false + + + + + + + + WIFI Connect + + + + + + + USB Connect + + + + + + + + + + 16777215 + 16777215 + + + + + + + @@ -350,21 +400,43 @@ USB line - - 3 - - - 5 - - - 5 - - - 5 - - - 5 - + + + + + + + 110 + 0 + + + + device name: + + + + + + + + 16777215 + 16777215 + + + + + + + + update name + + + false + + + + + @@ -382,6 +454,12 @@ + + + 110 + 0 + + device serial: diff --git a/QtScrcpy/main.cpp b/QtScrcpy/main.cpp index bac0c2c..50178f0 100644 --- a/QtScrcpy/main.cpp +++ b/QtScrcpy/main.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -106,7 +106,7 @@ int main(int argc, char *argv[]) qInfo( "%s", - QObject::tr("This software is completely open source and free. Use for illegal purposes is strictly prohibited, or at your own risk. You can download it at the " + QObject::tr("This software is completely open source and free. Strictly used for illegal purposes, or at your own risk. You can download it at the " "following address:") .toUtf8() .data()); diff --git a/QtScrcpy/res/i18n/QtScrcpy_en.qm b/QtScrcpy/res/i18n/QtScrcpy_en.qm index 87eb16a9b7bc1a594bc456c4b40ff13e081f8778..99b69d0e43fa7537f04a2ca49924a62c329ec9d6 100644 GIT binary patch delta 1440 zcmdm~dQxM8Y(0|(18WZp0|S#J1M9XJ1_r)s3~b*_85sEgGO*i(GB60JF|dQ=*)KA% z&rfGy;8J3c*=)hUAn=00OmqoVRrBgMeL zx{pcU@hSrY(?MqLt8xqsf||^SxfU=m2&S_{I^AMmU`b_ZOxno6z_^xWhUXpz2F3rJjL-A%X2hgA)S-0|UE*v@in$$9Z;l?WYV3%oXfCd-@m{1ghEB^zL9_ z;QP=1OzRN?19vI=ch5Km2LAmVHjc^+3~WUlaYm;Z7#MDF{9~43U|^re>0p$~z`(tc zGw}io0|QqLXKBP21_o9EE^fW83=G`Qx#U(!FfedFdPVw41)9d6^tLRV_@Lu<G6XE89a|KPvd zxs`!|Q6!UrLGat=FN`gW^*jvD42cYR49N_s3^^R2;A3N8U|@4j%u7zqVFxi?G81$1 z(;1l=7#JiNJQy+=QW#PgQW^3X6c{oXQW=UEQW+HC8hJc2Q&Lj%6f#naQWep)^Dy`^ zzsSG6y3JfI-MGT1yl??W90|Y?^DC8F@6sMLbloTaa+Sj8SC%_PlsvWMGBN(a) zU5gk)FheFoE<*uB4nrz~0)sC@J}89X8o7fra|?1(6@2qkFg!WAg4te2j3JaEn8Arb zfx(#}pCOMSk0F&I8Oh(=p}|fH&iQ$HsmUdimoq!p%Q1w4eW^geX8zFPR0TY?OE82p zcrv&#c;d90C*0G`6J|He6kJl2 onOu@nsZd&+nxc@FU!;(klardBn4?foT2zon;00FLm0|)4>2(Ci!=0SIx{dZeqywIbdG_6kBQM<&Vhk}MUye$ z=yV1K#shmE5$0|WDCjyR*!3=9l6IQ}uqFfg#nb2=EMGB9vF;Y_^1 z!oa}3p0hOK3j+hw1unT&5+Lii9FFZ{U|`$ERn^SJz`(MTJ2~Ym0|VDY?){vw{&YmPE7Fdycf zm_CbvfhC(y+Oma#fisnF^<@zT27z>bg~#g{7+9b4XJ$QSU|_G|&s-tJz`#0_zxH(i z0|QeE|E|lk7#LWC`0sXZWnf?w$z)&<*tgk-sfBT}FRT6J6RgIYo7j37H~Vs2VchJ& zrNy*)CeJ*^$&2~s)idZZBr}vU6fqPrq%!0&lrShTWHY2PR5Ii;Br+5*C@|zQhK|Hy%s3e6AvZrI)k;Ctkez{nLBKPwptQs} zKd&scsKh-nHSJJF z%gZmyP0YcqZ5Bf?Lo!1VLncE3*juFx1q>++i3}wSsSGI$It&UR=hPGBb0qu08Uw(g zRm@P#pukWE4>1L>&lDJn8Oj+l8A=$E88YBT-6fxv8WH4khB!L~D%8)YoHUC7$rITv~ zjPyf`Qx($kixe_*a#GV1a})|niwg3KQ;QWcixrAXiZYW+aw-)Hit;lulQK(EQ#M}| Hs9**FtE3i` diff --git a/QtScrcpy/res/i18n/QtScrcpy_en.ts b/QtScrcpy/res/i18n/QtScrcpy_en.ts index 9d74059..e2ae0fe 100644 --- a/QtScrcpy/res/i18n/QtScrcpy_en.ts +++ b/QtScrcpy/res/i18n/QtScrcpy_en.ts @@ -49,93 +49,129 @@ Dialog - + Wireless Wireless - + wireless connect wireless connect - + wireless disconnect wireless disconnect - + Start Config Start Config - + record save path: record save path: - - + + select path select path - + record format: record format: - + record screen record screen - + frameless frameless - + + Use Simple Mode + Use Simple Mode + Use Simple Mode + + + + Simple Mode + Simple Mode + Simple Mode + + + + WIFI Connect + WIFI Connect + WIFI Connect + + + + USB Connect + USB Connect + USB Connect + + + lock orientation: lock orientation: - + show fps show fps - + stay awake stay awake - + + device name: + device name: + device name: + + + + update name + update name + update name + + + stop all server stop all server - + adb command: adb command: - + terminate terminate - + execute execute - + clear clear - + reverse connection reverse connection @@ -144,57 +180,57 @@ auto enable - + background record background record - + screen-off screen-off - + apply apply - + max size: max size: - + always on top always on top - + refresh script refresh script - + get device IP get device IP - + USB line USB line - + stop server stop server - + start server start server - + device serial: device serial: @@ -203,47 +239,101 @@ Config - + bit rate: bit rate: - + start adbd start adbd - + refresh devices refresh devices - + + show + show + show + + + + quit + quit + quit + + + original original - + no lock no lock + + + warning + Warning + Warning + + + + Quit or set tray? + Quit or set tray? + Quit or set tray? + + + + Quit + Quit + Quit + + + + Set tray + Set tray + Set tray + + + + Cancel + Cancel + Cancel + + + + Notice + Notice + Notice + + + + Hidden here! + Hidden here! + Hidden here! + InputConvertGame current keymap mode: %1 - current keymap mode: %1 + custom - custom + normal - normal + @@ -251,7 +341,7 @@ Script updated, current keymap mode:normal, Press ~ key to switch keymap mode - Script updated, current keymap mode:normal, Press ~ key to switch keymap mode + @@ -266,14 +356,10 @@ Strictly used for illegal purposes, or at your own risk. You can download it at the following address: This software is completely open source and free.\nStrictly used for illegal purposes, or at your own risk.\nYou can download it at the following address: - - This software is completely open source and free. Strictly used for illegal purposes, or at your own risk. You can download it at the following address: - This software is completely open source and free. Strictly used for illegal purposes, or at your own risk. You can download it at the following address: - - This software is completely open source and free. Use for illegal purposes is strictly prohibited, or at your own risk. You can download it at the following address: - This software is completely open source and free. Use for illegal purposes is strictly prohibited, or at your own risk. You can download it at the following address: + This software is completely open source and free. Strictly used for illegal purposes, or at your own risk. You can download it at the following address: + This software is completely open source and free. Strictly used for illegal purposes, or at your own risk. You can download it at the following address: diff --git a/QtScrcpy/res/i18n/QtScrcpy_zh.qm b/QtScrcpy/res/i18n/QtScrcpy_zh.qm index dfe62bfaa45c453b23a1b144f58f267b765957f8..16fef0dc63d2df057cf92af3be7674df139c1972 100644 GIT binary patch delta 1346 zcmdlab47lFY(0|(18WZp0|Vni2G(sc3=G_23~b*_85p>KGO*i(GBEHcFtCH<*-RPO z=ch9;u)kxF*=)hUz_X9ROmqSSP0|Sc(+XOxr z1_sXcY{y@<)H5(JxUs!xaAII!U|@HU7G_{z`_AsJ{gi=$=@fg5`e4lb_DW%)r1P z7Tp;f93L9vU&S5QKW#$m`EZT?oBtW%+IT!NQ&Lj%6f#naQWeoPvm{@rw1O*T^UE*E zOiqO8tHL7Eiu zixi4eOB70q5-aV|O%QEenjw@Sn8B(4Uh-0ep3q;S8P(ZVa9%7Vw07x_QEE*c`*`#;C~Ey)TkIgtzho10wi& zQc}w@lT#J)5_40nHcw)yVH8FS`NGo7lFk2EmoW;nq}d@w97}OVe);Ap>|u-^JZWE2 zH+1i-&jT5b@M38}N@5AbX!Jm2=}rsrf~#aNPb|vI%uAnqi=#5sD_y5Q-|t&=Phdto zL*9fy-(JiAJbtQ`jinlXebeJ|u9j*{5c$s&q820>!k0d$@l~(isnZX>1OlA_GylAKC~(&E$VXJuD#lXN6#WsP@g@J+X6Wf~Au?!6C>)DRKYGGht zaASMX;Kabdz`*VxEzH2cvX$Lk`zZqhqbGaV3=CY&95#;13=GVy9C1dc85kIraQtJIVPIf>&*@;4%D}*OiZk&7 z3j+h|P0rGYFANM!YFu)wBp4W2>$n__?PFkImEo#t=3-!Ap2?k@@|A&sgP%LUZYl!< znTbo1c6aSC(2-;+~kB%E-*Xz`)k{DteZm zC)@LEHti*gflu&IYAw`!D1*NOd<_9b=0e;#xX{Fee5 z_Ma!2lc8>^UJ!e760-N;miPuI7iAXImnf7Lq$HN4rsybO^C!e5Itl?rsl~+#b)Ya% zD9KkSF3&7U&H(XXAp&wNn|ErZZ(;#B45GT9_UHS3OVf|;3CxIR$eR$-6X@G(S=M5} z#Gv4(TG<%G7FbrQVdvL3Juc^J*}Jlq|2!dTL6RYS>2n%i^~!^kC9DX3@AuU2oZnMF z?r?)}2S4uq+UVy0QgA;koxGRFNI$eVRUs|ENFg&PCpA4WN1>p!s35;MwOApuSfRM2 aC^NYvr&6JyC_f`JDYGOsWwRjfVI}|}@*H&l diff --git a/QtScrcpy/res/i18n/QtScrcpy_zh.ts b/QtScrcpy/res/i18n/QtScrcpy_zh.ts index eee9e68..9315d44 100644 --- a/QtScrcpy/res/i18n/QtScrcpy_zh.ts +++ b/QtScrcpy/res/i18n/QtScrcpy_zh.ts @@ -49,93 +49,129 @@ Dialog - + Wireless 无线 - + wireless connect 无线连接 - + wireless disconnect 无线断开 - + Start Config 启动配置 - + record save path: 录像保存路径: - - + + select path 选择路径 - + record format: 录制格式: - + record screen 录制屏幕 - + frameless 无边框 - + + Use Simple Mode + 启用一键模式 + 启用一键模式 + + + + Simple Mode + 一键模式 + 一键模式 + + + + WIFI Connect + 一键WIFI连接 + 一键WIFI连接 + + + + USB Connect + 一键USB连接 + 一键USB连接 + + + lock orientation: 锁定方向: - + show fps 显示fps - + stay awake 保持唤醒 - + + device name: + 设备名称: + 设备名称: + + + + update name + 更新设置名称 + 更新设置名称 + + + stop all server 停止所有服务 - + adb command: adb命令: - + terminate 终止 - + execute 执行 - + clear 清理 - + reverse connection 反向连接 @@ -144,57 +180,57 @@ 自动启用脚本 - + background record 后台录制 - + screen-off 自动息屏 - + apply 应用脚本 - + max size: 最大尺寸: - + always on top 窗口置顶 - + refresh script 刷新脚本 - + get device IP 获取设备IP - + USB line USB线 - + stop server 停止服务 - + start server 启动服务 - + device serial: 设备序列号: @@ -203,47 +239,101 @@ 配置 - + bit rate: 比特率: - + start adbd 启动adbd - + refresh devices 刷新设备列表 - + + show + 显示 + 显示 + + + + quit + 退出 + 退出 + + + original 原始 - + no lock 不锁定 + + + warning + 警告 + 警告 + + + + Quit or set tray? + 退出还是最小化到托盘? + 退出还是最小化到托盘? + + + + Quit + 退出 + 退出 + + + + Set tray + 最小化到系统托盘 + 最小化到系统托盘 + + + + Cancel + 取消 + 取消 + + + + Notice + 提示 + 提示 + + + + Hidden here! + 安卓录屏程序隐藏在这! + 安卓录屏程序隐藏在这! + InputConvertGame current keymap mode: %1 - 当前按键映射模式: %1 + custom - 自定义 + normal - 正常 + @@ -251,7 +341,7 @@ Script updated, current keymap mode:normal, Press ~ key to switch keymap mode - 脚本已更新,当前按键映射模式:正常,按~键切换按键映射模式 + @@ -266,14 +356,10 @@ Strictly used for illegal purposes, or at your own risk. You can download it at the following address: 本软件完全开源免费.\n严禁用于非法用途,否则后果自负.\n你可以在下面地址下载: - - This software is completely open source and free. Strictly used for illegal purposes, or at your own risk. You can download it at the following address: - 本软件完全开源免费,严禁用于非法用途,否则后果自负,你可以在下面地址下载: - - This software is completely open source and free. Use for illegal purposes is strictly prohibited, or at your own risk. You can download it at the following address: - 该软件是完全开源和免费的。 严禁将其用于非法目的,否则后果自负。 您可以从以下地址下载它: + This software is completely open source and free. Strictly used for illegal purposes, or at your own risk. You can download it at the following address: + 本软件完全开源免费,严禁用于非法用途,否则后果自负,你可以在下面地址下载: diff --git a/QtScrcpy/res/image/tray/logo.png b/QtScrcpy/res/image/tray/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8fbaafe2e4c986114e34dd9434bc9f4e25f778be GIT binary patch literal 11965 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 SL2e8T3=E#GelF{r5}E+=iT)%2 literal 0 HcmV?d00001 diff --git a/QtScrcpy/res/res.qrc b/QtScrcpy/res/res.qrc index 840268d..d2f53a4 100644 --- a/QtScrcpy/res/res.qrc +++ b/QtScrcpy/res/res.qrc @@ -2,7 +2,7 @@ font/fontawesome-webfont.ttf image/videoform/phone-h.png - image/videoform/phone-v.png + image/videoform/phone-v.png qss/psblack.css qss/psblack/add_bottom.png qss/psblack/add_left.png @@ -24,5 +24,6 @@ qss/psblack/radiobutton_unchecked_disable.png i18n/QtScrcpy_en.qm i18n/QtScrcpy_zh.qm + image/tray/logo.png diff --git a/QtScrcpy/util/config.cpp b/QtScrcpy/util/config.cpp index 8966a7d..b9393ad 100644 --- a/QtScrcpy/util/config.cpp +++ b/QtScrcpy/util/config.cpp @@ -1,6 +1,7 @@ -#include +#include #include #include +#include #include "config.h" @@ -62,6 +63,16 @@ #define SERIAL_WINDOW_RECT_KEY_H "WindowRectH" #define SERIAL_WINDOW_RECT_KEY_DEF -1 +#define USER_NAME "PHONE" +#define USER_RECORD_SCREEN "RecordScreen" +#define USER_RECORD_BACKGROUD "RecordBackGround" +#define USER_REVERSE_CONNECT "ReverseConnect" +#define USER_SHOW_FPS "ShowFPS" +#define USER_WINDOW_ON_TOP "WindowOnTop" +#define USER_AUTO_OFF_SCREEN "AutoOffScreen" +#define USER_WINDOW_FRAMELESS "WindowFrameless" +#define USER_KEEP_ALIVE "KeepAlive" + #define COMMON_FRAMELESS_WINDOW_KEY "FramelessWindow" #define COMMON_FRAMELESS_WINDOW_DEF false @@ -76,6 +87,8 @@ Config::Config(QObject *parent) : QObject(parent) m_userData = new QSettings(getConfigPath() + "/userdata.ini", QSettings::IniFormat); m_userData->setIniCodec("UTF-8"); + + qDebug()<childGroups(); } Config &Config::getInstance() @@ -113,6 +126,37 @@ void Config::setRecordPath(const QString &path) m_userData->endGroup(); } +void Config::setUserBootConfig(const QString &serial, const UserBootConfig &config) +{ + m_userData->beginGroup(serial); + m_userData->setValue(USER_RECORD_SCREEN, config.recordScreen); + m_userData->setValue(USER_RECORD_BACKGROUD, config.recordBackground); + m_userData->setValue(USER_REVERSE_CONNECT, config.reverseConnect); + m_userData->setValue(USER_SHOW_FPS, config.showFPS); + m_userData->setValue(USER_WINDOW_ON_TOP, config.windowOnTop); + m_userData->setValue(USER_AUTO_OFF_SCREEN, config.autoOffScreen); + m_userData->setValue(USER_WINDOW_FRAMELESS, config.windowFrameless); + m_userData->setValue(USER_KEEP_ALIVE, config.keepAlive); + m_userData->endGroup(); + m_userData->sync(); +} + +UserBootConfig Config::getUserBootConfig(const QString &serial) +{ + UserBootConfig config; + m_userData->beginGroup(serial); + config.recordScreen = m_userData->value(USER_RECORD_SCREEN, false).toBool(); + config.recordBackground = m_userData->value(USER_RECORD_BACKGROUD, false).toBool(); + config.reverseConnect = m_userData->value(USER_REVERSE_CONNECT, true).toBool(); + config.showFPS = m_userData->value(USER_SHOW_FPS, false).toBool(); + config.windowOnTop = m_userData->value(USER_WINDOW_ON_TOP, false).toBool(); + config.autoOffScreen = m_userData->value(USER_AUTO_OFF_SCREEN, false).toBool(); + config.windowFrameless = m_userData->value(USER_WINDOW_FRAMELESS, false).toBool(); + config.keepAlive = m_userData->value(USER_KEEP_ALIVE, false).toBool(); + m_userData->endGroup(); + return config; +} + int Config::getBitRateIndex() { int bitRateIndex; @@ -191,6 +235,23 @@ void Config::setFramelessWindow(bool frameless) m_userData->endGroup(); } +void Config::setUserName(const QString &serial, const QString &name) +{ + m_userData->beginGroup(serial); + m_userData->setValue(USER_NAME, name); + m_userData->endGroup(); + m_userData->sync(); +} + +QString Config::getUserName(const QString &serial) +{ + QString name; + m_userData->beginGroup(serial); + name = m_userData->value(USER_NAME,"PHONE").toString(); + m_userData->endGroup(); + return name; +} + bool Config::getFramelessWindow() { bool framelessWindow = false; @@ -301,6 +362,16 @@ QString Config::getCodecName() return codecName; } +QStringList Config::getConnectedGroups() +{ + return m_userData->childGroups(); +} + +void Config::deleteGroup(const QString &serial) +{ + m_userData->remove(serial); +} + QString Config::getTitle() { QString title; diff --git a/QtScrcpy/util/config.h b/QtScrcpy/util/config.h index e0e7f51..af3104d 100644 --- a/QtScrcpy/util/config.h +++ b/QtScrcpy/util/config.h @@ -1,15 +1,27 @@ -#ifndef CONFIG_H +#ifndef CONFIG_H #define CONFIG_H #include #include #include +struct UserBootConfig +{ + bool recordScreen = false; + bool recordBackground = false; + bool reverseConnect = true; + bool showFPS = false; + bool windowOnTop = false; + bool autoOffScreen = false; + bool windowFrameless = false; + bool keepAlive = false; +}; class QSettings; class Config : public QObject { Q_OBJECT public: + static Config &getInstance(); // config QString getTitle(); @@ -24,6 +36,8 @@ public: QString getLogLevel(); QString getCodecOptions(); QString getCodecName(); + QStringList getConnectedGroups(); + void deleteGroup(const QString &serial); // user data QString getRecordPath(); @@ -38,6 +52,10 @@ public: QRect getRect(const QString &serial); bool getFramelessWindow(); void setFramelessWindow(bool frameless); + void setUserName(const QString &serial, const QString &name); + QString getUserName(const QString &serial); + void setUserBootConfig(const QString &serial, const UserBootConfig &config); + UserBootConfig getUserBootConfig(const QString &serial); private: explicit Config(QObject *parent = nullptr);