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 zcmah{du$VR9RFTl*WO)wLvatmd5ma)Dd-HsnkDU8GUy+`NS$c1ES~Le-I4aLv{$-` zQq&~|Gsv`n#26q%BjGVa8jKPIADNG6d;~FQVnQ~Ygqe`wGL6a9&uz5E8a0>8_wM)m zejeY)+jo7kWcZGPZ3#Jt97MJTa=zJ3MI^ju7cVvv&0A{!Ksbz;a6B6N4us6{ z^y8<9xRZ_pk+X<9oqX>y;AWh4D<@%8cP@YBH6r_Q=fiL8!~IXr=O%9dp`%@xcYR61l(N*EatEf_{GJ>>gCIojR!`)a5bg{Vu0W_w2!41D2i?LG&k7(|EgC!ET$mEyZT=QQ+r^L1ci{e{6zX{h zu}(_7(|```k#?;58U~L^lP5-DBqUuQMTOE0@2<{Oh>N{1Bwoh(HSceiEuEiz3t9(p ze$aRP!hCe}kgPl~K7xvO%i5N42u5V>C`RB8$WKjnqSdd;XD)z%|5g5e7o2nRHK3+T zQ`{g|kSI(l=@cVINw?KLm-U8KJ;su}^|?k`U>oMu+1HI>ug$ABA! zvT$S~n)p*`fC3eQc@}|UWRxs36*Hp_1Pax3H5C0jyaIMdZ-S~JwSZ`pqBJD|RcJkY zphFd)7}ZkgBvaNK@qZLq?6(K*siiJZga8c#s^ekk&|h_nUD1#dHguiE%;M|zaG?dF% z;%plRtLSQq`AfadD_otMwpI^yD`ryi^L`sHvsfvE@)ZV0w$I3y;+_$%yB4@KBvs7S zs{E#0B~{F&XfKp_`I6YH9b+Zi6b`dzT%LVHAH9k##&Jm z^BjOuZnoF);+J H_uKyjBq=;p delta 1121 zcma)3dx#8i9RJSk&CI^+Y#yCF&aZTF59H)=QqHZsuP*L{IM(jC9k;VHW@eoeyW&c8 z>|iDDN1pE!|4ws--6N8ukmQwKzn? zec&pd-32a>n_gH+lwZu%bRWQc3)i`VBl2`{7h3ibxmUS-4-0{N@4D_iL}?0+%U@dc z1jI$WxTXZeDZXH076kA3?b-fBv|rfJyA$(5VNYNth=vHACsz=8M+!IJv|xXg@On!X zRuU_R4j>YW#o47VAbeR|Y;VH3Wn$~a-4G0kox9E>=uPou$uk%^E`FU`pN8Y@?rAed zLg1sjzWfe&9=X4{h7s{2JeB1#4nFsUd-6el+LK)J2}XOog(n6(a^A`tmmqk~yK$Qr zhP!-`=w}GF`LxtN;70kbls*Q3$am}VESwkpRrR$vzs|qB7J+@XKQ(#T12{AM+0Jel zxZba=p&dkxfuR*h=8*#@?++vjHb|`Z6b!wRl(oGe+9WB*hv5I9v^iS?Ls99%ecBQf8i297&%ArK7Apf8EQEGcUU_u zf}lYPVmPsqSfdDKAxxCYFhTJ2e!ZhG`Q-EzrmM_I_)# zFU890MG-^MEtb@yVM~sdu|L)NBWf9|F=W$ZDW`H~Y0PX=tVrzF3vk*H=F831Vcn^m zn`eh4nXiK-*}f{3j$tt7n079~X(oa-j>~4~#z4t2%vR^jqa!;jwQ)!7&B5| 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 zcmZuvdrTX39RFT>y*ql>c5{e(ARKcV910tXv)eK{m>ngdgI&9_42z|`mc!D+K89Tw zm5Ff`SSz?e=He^P7+sv&XqE+WapKhZSTZndiI0F=%rMSG+~Q2YZ_$=n{p0ex`+h%< z@Avb&cXP+`4^$Ffi|pIf}38aw-#MOfzRpQ;R86pqx7-96S% zlO4amWHxTT0}WR(_R_ORf0db4<|1F4WhfO9SCZv8hsiOUvO@JUXq>HPi{Hb#O`Z3~ zQgl0|&M%Mrh(?FhhEGPYU{~*XQjLNqSh*7?XI@}W6H+)7ZGhqcEJ#h?1xRv5c5N2F<7 zmE>}XKE7G>iv^iv(s?etJ`JVJa!_)LDNrP3LB^r(MjA!dg`{8#lY-K|Bx~{j2R9V zw-hw$(mt#pwYGUhzD9PX_rMtkG|Kx|X_IKMf&dk<@0>>$I98#8uatd0(HR_AtK9G~ zXDJC4{zqD84T${z%g1abRlSA{_okaJjtn%*?TP2;9Yhu9o)O>f8HxCk;tMN= z+FXv{-_n^Ol09xqbs9;xJN!P$=NY)jgss({dt$Qr+OFQZ=0@uUP+bDa6ka2LjN zV9@Rz4;99<=Qzt<+m~6io+DjX`ts+vZI1|7&6jM2W_Ga2w#H^Kv$4H5Z8KD{zZUac!0d?Nn zsQU@c(-vc2r7Z8duqM>PbSr=+n<~27j(sx~t)KvyGU{s60pz$f?6Y*_p48ki9)&Ql zFSKj(UZL=?j&V;%@G0Gx*>MEi*X@iC2LP4c*s~k^rF3iR5(Ipqqo*qnc$U83*M#r+ z^oOl^cmrb{KLS8|ky)DAi@XA6Rb(@E-!jeD_Ts=vOtj?+2K~&upZ*RxN0=W4&MyXiU?*`s! z#!Zbz)E{E`s&4>#6Dx(<&}U(9WxhndoqcdKA9Z#v&*{Jg<6OA|1MAOop}D2qxY;r; z9=(g;H$(PUcOZyQ9dE&8Oh)SIry~J4jfwP}LF0ClSlff3s7dTJW4+w8C0>L{yG&P~ zqE9>8^m^At4A3p2X+dm7N;(y}tj&&?b(ygXx;a#A9OI#4o%(}R%w^1{A_-OukF6{z zF60euGu)(HTRW-J1i3&U17_(F1T>y8d_a~3pGr0e^>Kmt@Rh@NH;;&mT}1 zOTM5Wt4m#8fzl*h4Si)Dwt@iy%?A`!@(yMQ_dB#3c;~#odY>eFU7o@8{qo!fb9Gk5 z7x!1;T!Q;QK*F4aB{<#yp|%;t48Q*0cmqQUOL$rIhgA~rSGiQ7DvJ!3vwxE;QX~tC zLPE(uAgV-^I#K0o{{4~Uvh;GHzR>0W^9QASdiP1T@9ylfW_wK~_*xy!_QDoRuxVxr z5L-rlLpf~^2Bt2s?QM5@o&`S!n-ZL3O7S>HYW0zZzLtqe*}Be>PqtoL7an%?%+*#K zyKhTbW5PU;;Y8#*my^9x5r|uoiRkeN)h-Y52V}pb2nrDuqNuXStDbt|m!%qUy@)|$ J!-m{R`3)iR9CZKy 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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 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);