玉兔远程控制 0.1.0-alpha.2
载入中...
搜索中...
未找到
DlgSettingsTerminal.cpp
1// Author: Kang Lin <kl222@126.com>
2
3#include <QMessageBox>
4#include <QLoggingCategory>
5#include <qtermwidget.h>
6#include <QFileInfo>
7#include <QFileDialog>
8#include <QUrl>
9
10#include "RabbitCommonTools.h"
11#include "DlgSettingsTerminal.h"
12#include "ui_DlgSettingsTerminal.h"
13
14static Q_LOGGING_CATEGORY(log, "Plugin.Terminal.DlgSettings")
15
17 QDialog(parent)
18 , ui(new Ui::CDlgSettingsTerminal)
19 , m_pPara(pPara)
20{
21 ui->setupUi(this);
22 ui->teHelp->hide();
23 ui->pbHelp->hide();
24
25#if defined(Q_OS_UNIX)
26 AddShell("/bin/sh");
27 AddShell("/bin/bash");
28 AddShell("/bin/dash");
29 AddShell(qgetenv("SHELL"));
30#elif defined(Q_OS_WIN)
31 AddShell("C:\\Windows\\System32\\cmd.exe");
32 AddShell("C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe");
33 QFileInfo fi;
34 if(fi.exists("c:\\msys64\\usr\\bin\\bash.exe"))
35 AddShell("C:\\Windows\\System32\\cmd.exe", "msys64 bash shell");
36 if(fi.exists("c:\\cygwin64\\bin\\bash.exe"))
37 AddShell("C:\\Windows\\System32\\cmd.exe", "cygwin64 bash shell");
38 if(fi.exists("C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat")) {
39 AddShell("C:\\Windows\\System32\\cmd.exe", tr("VS 2022 Community x86"));
40 AddShell("C:\\Windows\\System32\\cmd.exe", tr("VS 2022 Community x64"));
41 }
42 if(fi.exists("C:\\Program Files\\Microsoft Visual Studio\\2022\\Professional\\VC\\Auxiliary\\Build\\vcvarsall.bat")) {
43 AddShell("C:\\Windows\\System32\\cmd.exe", tr("VS 2022 Professional x86"));
44 AddShell("C:\\Windows\\System32\\cmd.exe", tr("VS 2022 Professional x64"));
45 }
46 if(fi.exists("C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Professional\\VC\\Auxiliary\\Build\\vcvarsall.bat")) {
47 AddShell("C:\\Windows\\System32\\cmd.exe", tr("VS 2019 Professional x86"));
48 AddShell("C:\\Windows\\System32\\cmd.exe", tr("VS 2019 Professional x64"));
49 }
50 AddShell(qgetenv("ComSpec"));
51 QString szHelp;
52 szHelp = tr("Help:") + "\n";
53 szHelp += tr("- Set bash shell:") + "\n";
54 szHelp += tr(" cmd shell with parameters:") + " \"/k %BASH_PATH% -l\"\n";
55 szHelp += tr(" eg:") + "\n";
56 szHelp += tr(" - msys64 bash shell default path:") + " \"c:\\msys64\\usr\\bin\\bash.exe\",\n";
57 szHelp += tr(" So that cmd shell with parameters:") + " \"/k \"c:\\msys64\\usr\\bin\\bash.exe\" -l\"\n";
58 szHelp += tr(" - cygwin64 bash shell default path:") + " \"c:\\cygwin64\\bin\\bash.exe\",\n";
59 szHelp += tr(" So that cmd shell with parameters:") + " \"/k \"c:\\cygwin64\\bin\\bash.exe\" -l\"\n";
60 szHelp += tr("- Set sh shell:") + "\n";
61 szHelp += tr(" cmd shell with parameters:") + " \"/k %SH_PATH% -l\"\n";
62 szHelp += tr(" eg:") + "\n";
63 szHelp += tr(" - msys64 sh shell default path:") + " \"c:\\msys64\\usr\\bin\\sh.exe\",\n";
64 szHelp += tr(" So that cmd shell with parameters:") + " \"/k \"c:\\msys64\\usr\\bin\\sh.exe\" -l\"\n";
65 szHelp += tr(" - cygwin64 sh shell default path:") + " \"c:\\cygwin64\\bin\\sh.exe\",\n";
66 szHelp += tr(" So that cmd shell with parameters:") + " \"/k \"c:\\cygwin64\\bin\\sh.exe\" -l\"\n";
67 szHelp += tr("- Set dash shell:") + "\n";
68 szHelp += tr(" cmd shell with parameters:") + " \"/k %DASH_PATH% -l\"\n";
69 szHelp += tr(" eg:") + "\n";
70 szHelp += tr(" - msys64 dash shell default path:") + " \"c:\\msys64\\usr\\bin\\dash.exe\",\n";
71 szHelp += tr(" So that cmd shell with parameters:") + " \"/k \"c:\\msys64\\usr\\bin\\dash.exe\" -l\"\n";
72 szHelp += tr(" - cygwin64 dash shell default path:") + " \"c:\\cygwin64\\bin\\dash.exe\",\n";
73 szHelp += tr(" So that cmd shell with parameters:") + " \"/k \"c:\\cygwin64\\bin\\dash.exe\" -l\"\n";
74 szHelp += tr("- Set VS sdk shell:") + "\n";
75 szHelp += tr(" cmd shell with parameters:") + " \"/k %SDK_PATH%\"\n";
76 szHelp += tr(" eg:") + "\n";
77 szHelp += tr(" - VS 2022 Community x64 default path:") + " \"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat\",\n";
78 szHelp += tr(" So that cmd shell with parameters:") + "/k \"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat\" x64\n";
79 szHelp += tr(" - VS 2022 Community x86 default path:") + " \"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat\",\n";
80 szHelp += tr(" So that cmd shell with parameters:") + "/k \"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat\" x86\n";
81 szHelp += tr(" - VS 2022 Professional x64 default path:") + " \"C:\\Program Files\\Microsoft Visual Studio\\2022\\Professional\\VC\\Auxiliary\\Build\\vcvarsall.bat\",\n";
82 szHelp += tr(" So that cmd shell with parameters:") + "/k \"C:\\Program Files\\Microsoft Visual Studio\\2022\\Professional\\VC\\Auxiliary\\Build\\vcvarsall.bat\" x64\n";
83 szHelp += tr(" - VS 2022 Professional x86 default path:") + " \"C:\\Program Files\\Microsoft Visual Studio\\2022\\Professional\\VC\\Auxiliary\\Build\\vcvarsall.bat\",\n";
84 szHelp += tr(" So that cmd shell with parameters:") + "/k \"C:\\Program Files\\Microsoft Visual Studio\\2022\\Professional\\VC\\Auxiliary\\Build\\vcvarsall.bat\" x86\n";
85 szHelp += tr(" - VS 2019 Professional x64 default path:") + " \"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Professional\\VC\\Auxiliary\\Build\\vcvarsall.bat\",\n";
86 szHelp += tr(" So that cmd shell with parameters:") + "/k \"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Professional\\VC\\Auxiliary\\Build\\vcvarsall.bat\" x64\n";
87 szHelp += tr(" - VS 2019 Professional x86 default path:") + " \"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Professional\\VC\\Auxiliary\\Build\\vcvarsall.bat\",\n";
88 szHelp += tr(" So that cmd shell with parameters:") + "/k \"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Professional\\VC\\Auxiliary\\Build\\vcvarsall.bat\" x86\n";
89 ui->teHelp->setMarkdown(szHelp);
90 ui->pbHelp->show();
91#endif
92
93 ui->leName->setText(m_pPara->GetName());
94
95 QString szShell(m_pPara->GetShell());
96 AddShell(szShell);
97
98 if(!m_pPara->GetShellName().isEmpty()) {
99 ui->cbShellName->setCurrentText(m_pPara->GetShellName());
100 int nIndex = ui->cbShellName->findText(m_pPara->GetShellName(), Qt::MatchFixedString);
101 if(-1 != nIndex)
102 ui->cbShellName->setCurrentIndex(nIndex);
103 }
104 ui->leShellPath->setText(m_pPara->GetShell());
105 ui->leParameters->setText(m_pPara->GetShellParameters());
106
107 ui->cbRestoreDirctory->setChecked(m_pPara->GetRestoreDirectory());
108 m_pFrmParaAppearnce =
109 new CParameterTerminalUI(this);
110 if(m_pFrmParaAppearnce) {
111 m_pFrmParaAppearnce->SetParameter(&m_pPara->m_Terminal);
112 ui->tabWidget->addTab(m_pFrmParaAppearnce,
113 m_pFrmParaAppearnce->windowTitle());
114 }
115
116 ui->cbTitleChanged->setChecked(m_pPara->GetEnableTitleChanged());
117
118 foreach(auto c, m_pPara->GetCommands()) {
119 ui->lvCommands->addItem(c);
120 }
121}
122
123CDlgSettingsTerminal::~CDlgSettingsTerminal()
124{
125 qDebug(log) << "CDlgSettingsTerminal::~CDlgSettingsTerminal()";
126 delete ui;
127}
128
129void CDlgSettingsTerminal::on_pbOk_clicked()
130{
131 if(ui->leShellPath->text().isEmpty())
132 {
133 ui->tabWidget->setCurrentIndex(0);
134 ui->leShellPath->setFocus();
135 QMessageBox::critical(this, tr("Error"), tr("The shell is empty"));
136 return;
137 }
138 m_pPara->SetName(ui->leName->text());
139 m_pPara->SetShellName(ui->cbShellName->currentText());
140 m_pPara->SetShell(ui->leShellPath->text());
141 m_pPara->SetShellParameters(ui->leParameters->text());
142 m_pPara->SetRestoreDirectory(ui->cbRestoreDirctory->isChecked());
143 if(m_pFrmParaAppearnce)
144 m_pFrmParaAppearnce->Accept();
145
146 m_pPara->SetEnableTitleChanged(ui->cbTitleChanged->isChecked());
147 QStringList cmds;
148 for(int i = 0; i < ui->lvCommands->count(); i++) {
149 auto c = ui->lvCommands->item(i)->data(Qt::DisplayRole).toString();
150 cmds << c;
151 }
152 if(!cmds.isEmpty())
153 m_pPara->SetCommands(cmds);
154
155 accept();
156}
157
158void CDlgSettingsTerminal::on_pbCancel_clicked()
159{
160 this->reject();
161}
162
163int CDlgSettingsTerminal::AddShell(QString szShell, const QString &name)
164{
165 int nIndex = 0;
166 QString szName = name;
167 QFileInfo fi(szShell);
168 if(!fi.exists())
169 {
170 qCritical(log) << "The shell is not exist:" << szShell;
171 return -1;
172 }
173 if(szName.isEmpty())
174 szName = fi.baseName();
175
176 nIndex = ui->cbShellName->findText(szName, Qt::MatchFixedString);
177 if(-1 == nIndex) {
178 ui->cbShellName->addItem(szName, szShell);
179 nIndex = ui->cbShellName->findText(szName, Qt::MatchFixedString);
180 }
181
182 ui->cbShellName->setItemData(nIndex, szShell, Qt::ToolTipRole);
183 ui->cbShellName->setItemData(nIndex, szShell, Qt::StatusTipRole);
184 ui->cbShellName->setCurrentIndex(nIndex);
185
186 return 0;
187}
188
189void CDlgSettingsTerminal::on_pbShellBrowse_clicked()
190{
191 QUrl url = QFileDialog::getOpenFileUrl(
192 this, tr("Select shell"),
193 QUrl::fromLocalFile(ui->leShellPath->text()));
194 if(url.isEmpty())
195 return;
196 AddShell(url.toLocalFile());
197}
198
199void CDlgSettingsTerminal::on_cbShellName_currentIndexChanged(int index)
200{
201 QString szData, szName;
202 szData = ui->cbShellName->itemData(index).toString();
203 szName = ui->cbShellName->itemText(index);
204 ui->cbShellName->setToolTip(szData);
205 ui->cbShellName->setStatusTip(szData);
206 ui->leShellPath->setText(szData);
207 ui->leParameters->setText("");
208
209 if("msys64 bash shell" == szName)
210 ui->leParameters->setText("/k c:\\msys64\\usr\\bin\\bash.exe -l");
211 if("cygwin64 bash shell" == szName)
212 ui->leParameters->setText("/k c:\\cygwin64\\bin\\bash.exe -l");
213 if(tr("VS 2022 Community x64") == szName)
214 ui->leParameters->setText("/k \"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat\" x64");
215 if(tr("VS 2022 Community x86") == szName)
216 ui->leParameters->setText("/k \"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat\" x86");
217 if(tr("VS 2022 Professional x64") == szName)
218 ui->leParameters->setText("/k \"C:\\Program Files\\Microsoft Visual Studio\\2022\\Professional\\VC\\Auxiliary\\Build\\vcvarsall.bat\" x64");
219 if(tr("VS 2022 Professional x86") == szName)
220 ui->leParameters->setText("/k \"C:\\Program Files\\Microsoft Visual Studio\\2022\\Professional\\VC\\Auxiliary\\Build\\vcvarsall.bat\" x86");
221 if(tr("VS 2019 Professional x64") == szName)
222 ui->leParameters->setText("/k \"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Professional\\VC\\Auxiliary\\Build\\vcvarsall.bat\" x64");
223 if(tr("VS 2019 Professional x86") == szName)
224 ui->leParameters->setText("/k \"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Professional\\VC\\Auxiliary\\Build\\vcvarsall.bat\" x86");
225
226 if(m_pPara->GetShellName() == szName)
227 ui->leParameters->setText(m_pPara->GetShellParameters());
228}
229
230void CDlgSettingsTerminal::on_pbAddCommand_clicked()
231{
232 QString szCmd = ui->leCommand->text();
233 if(szCmd.isEmpty())
234 return;
235 if(ui->lvCommands->findItems(szCmd, Qt::MatchCaseSensitive).isEmpty())
236 ui->lvCommands->addItem(szCmd);
237 ui->leCommand->setText(QString());
238}
239
240void CDlgSettingsTerminal::on_leCommand_editingFinished()
241{
242 on_pbAddCommand_clicked();
243}
244
245void CDlgSettingsTerminal::on_pbDeleteCommands_clicked()
246{
247 auto item = ui->lvCommands->currentItem();
248 delete item;
249}
250
251void CDlgSettingsTerminal::on_pbHelp_clicked()
252{
253 if(ui->teHelp->isVisible())
254 {
255 ui->teHelp->hide();
256 ui->pbHelp->setText(tr("Help(&H)"));
257 } else {
258 ui->teHelp->show();
259 ui->pbHelp->setText(tr("Hide help(&H)"));
260 }
261}
virtual int Accept() override
接受参数