玉兔远程控制 0.1.0-bate11
载入中...
搜索中...
未找到
DlgSetFreeRDP.cpp
1// Author: Kang Lin <kl222@126.com>
2
3#if HAVE_OPENSSL
4#include <openssl/tls1.h>
5#endif
6
7#include <QApplication>
8#include <QScreen>
9#include <QFileSystemModel>
10#include <QButtonGroup>
11#include <QLoggingCategory>
12
13#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
14 #include <QMediaDevices>
15 #include <QAudioDevice>
16#else
17 #include <QAudioDeviceInfo>
18#endif
19
20#include "RabbitCommonTools.h"
21#include "DlgDesktopSize.h"
22#include "freerdp/version.h"
23
24#include "ParameterNetUI.h"
25#include "ui_DlgSetFreeRDP.h"
26#include "DlgSetFreeRDP.h"
27
28static Q_LOGGING_CATEGORY(log, "FreeRDP.Parameter.Dlg")
29
30CDlgSetFreeRDP::CDlgSetFreeRDP(CParameterFreeRDP *pSettings, QWidget *parent) :
31 QDialog(parent)
32 , ui(new Ui::CDlgSetFreeRDP)
33 , m_pSettings(pSettings)
34 , m_pFileModel(nullptr)
35 , m_pProxyUI(nullptr)
36 , m_pRecordUI(nullptr)
37 , m_pButtonGroup(nullptr)
38{
39 setAttribute(Qt::WA_DeleteOnClose);
40 ui->setupUi(this);
41
42 ui->leName->setText(m_pSettings->GetName());
43
44 // Server
45 ui->leDomain->setText(m_pSettings->GetDomain());
46 ui->wNet->SetParameter(&m_pSettings->m_Net);
47
48 ui->cbOnlyView->setChecked(m_pSettings->GetOnlyView());
49 ui->cbClipboard->setChecked(m_pSettings->GetClipboard());
50 ui->cbShowServerName->setChecked(m_pSettings->GetShowServerName());
51
52 m_pProxyUI = new CParameterProxyUI(ui->tabWidget);
53 m_pProxyUI->SetParameter(&m_pSettings->m_Proxy);
54 InsertView(m_pProxyUI, 1);
55
56 m_pRecordUI = new CParameterRecordUI(ui->tabWidget);
57 m_pRecordUI->SetParameter(&m_pSettings->m_Record);
58 QList<QWidget *> ws;
59 ws << m_pRecordUI;
60 AddViewers(ws);
61
62 // Display
63 // It has to be the first. GetScreenGeometry depends on it
64 ui->cbAllMonitor->setChecked(m_pSettings->GetUseMultimon());
65 UpdateDesktopSize();
66 int width = GetScreenGeometry().width();
67 int height = GetScreenGeometry().height();
68 QString curSize = QString::number(width) + "×" + QString::number(height);
69 UINT32 desktopWidth = 0, desktopHeight = 0;
70 desktopWidth = m_pSettings->GetDesktopWidth();
71 desktopHeight = m_pSettings->GetDesktopHeight();
72 if(width == desktopWidth && height == desktopHeight)
73 {
74 ui->rbLocalScreen->setChecked(true);
75 ui->cbDesktopSize->setCurrentText(curSize);
76 } else {
77 ui->rbSelect->setChecked(true);
78 curSize = QString::number(desktopWidth)
79 + "×" + QString::number(desktopHeight);
80 ui->cbDesktopSize->setCurrentText(curSize);
81 }
82
83 ui->cbColorDepth->addItem(tr("8 bits"), 8);
84 ui->cbColorDepth->addItem(tr("16 bits"), 16);
85 ui->cbColorDepth->addItem(tr("24 bits"), 24);
86 ui->cbColorDepth->addItem(tr("32 bits"), 32);
87 int nIndex = ui->cbColorDepth->findData(
88 m_pSettings->GetColorDepth());
89 if(-1 != nIndex)
90 ui->cbColorDepth->setCurrentIndex(nIndex);
91
92 ui->sbReconnect->setValue(m_pSettings->GetReconnectInterval());
93
94 // Redirection printer
95 ui->cbPrinter->setChecked(m_pSettings->GetRedirectionPrinter());
96
97 ui->cbEnableLocalInputMethod->setChecked(m_pSettings->GetEnableLocalInputMethod());
98
99 // Redirection audio output
100 ui->gbAudio->setEnabled(HasAudioOutput() || HasAudioInput());
101 if(m_pSettings->GetRedirectionSound() == CParameterFreeRDP::RedirecionSoundType::Disable)
102 ui->rbAudioDisable->setChecked(true);
103 if(m_pSettings->GetRedirectionSound() == CParameterFreeRDP::RedirecionSoundType::Local)
104 ui->rbAudioLocal->setChecked(true);
105 if(m_pSettings->GetRedirectionSound() == CParameterFreeRDP::RedirecionSoundType::Remote)
106 ui->rbAudioRemote->setChecked(true);
107 QString szRdpSndParameters
108 = tr("- [sys:<sys>,][dev:<dev>,][format:<format>,][rate:<rate>,][channel:<channel>]\n"
109 #if defined (Q_OS_WINDOWS) || defined(Q_OS_WIN) || defined(Q_OS_WIN32) || defined(Q_OS_WINRT)
110 "- sys:winmm"
111 #elif defined(Q_OS_IOS)
112 "- sys:ios\n"
113 "- sys:mac"
114 #elif defined (Q_OS_ANDROID)
115 "- sys:opensles"
116 #elif defined (Q_OS_LINUX) || defined (Q_OS_UNIX)
117 "- sys:alsa\n"
118 "- sys:oss\n"
119 "- sys:oss,dev:1,format:1\n"
120 "- sys:sndio"
121 #endif
122 );
123 QString szRdpSnd = tr("Options for redirection of audio output:\n") + szRdpSndParameters;
124 ui->leRdpSnd->setToolTip(szRdpSnd);
125 ui->leRdpSnd->setStatusTip(szRdpSnd);
126 ui->leRdpSnd->setWhatsThis(szRdpSnd);
127 ui->leRdpSnd->setEnabled(HasAudioOutput());
128 ui->leRdpSnd->setText(m_pSettings->GetRedirectionSoundParameters());
129 // Redirection audio input
130 QString szAudin = tr("Options for redirection of audio input:\n") + szRdpSndParameters;
131 ui->leAudin->setToolTip(szAudin);
132 ui->leAudin->setStatusTip(szAudin);
133 ui->leAudin->setWhatsThis(szAudin);
134 ui->leAudin->setText(m_pSettings->GetRedirectionMicrophoneParameters());
135 if(HasAudioInput()) {
136 ui->cbAudin->setChecked(m_pSettings->GetRedirectionMicrophone());
137 } else {
138 ui->cbAudin->setChecked(false);
139 ui->cbAudin->setEnabled(false);
140 ui->leAudin->setEnabled(false);
141 }
142
143 // Drive
144 m_pFileModel= new QFileSystemModel();
145 m_pFileModel->setNameFilterDisables(false);
146 m_pFileModel->setFilter(QDir::Drives | QDir::Dirs | QDir::NoDotAndDotDot);
147 m_pFileModel->setRootPath("");
148 ui->tvDrive->setModel(m_pFileModel);
149 ui->tvDrive->setEditTriggers(QAbstractItemView::NoEditTriggers);
150 int count = m_pFileModel->columnCount();
151 for(int i = 1; i < count; i++)
152 ui->tvDrive->hideColumn(i);
153 bool check = connect(ui->tvDrive->selectionModel(),
154 SIGNAL(selectionChanged(const QItemSelection &,
155 const QItemSelection &)),
156 this,
157 SLOT(slotSelectionChanged(QItemSelection,QItemSelection)));
158 Q_ASSERT(check);
159 QStringList lstDrives = m_pSettings->GetRedirectionDrives();
160 foreach(auto path, lstDrives)
161 {
162 QModelIndex index;
163 if(!path.isEmpty()) {
164 index = m_pFileModel->index(path);
165 ui->tvDrive->setCurrentIndex(index);
166 }
167 }
168 ShowDriveSelected(lstDrives.size());
169
170 // Security
171 ui->cbSecurityEnable->setChecked(m_pSettings->GetNegotiateSecurityLayer());
172 on_cbSecurityEnable_stateChanged(ui->cbSecurityEnable->checkState());
173 CParameterFreeRDP::Security security = m_pSettings->GetSecurity();
174 if(CParameterFreeRDP::Security::RDP & (uint)security)
175 ui->cbSecurityRDP->setChecked(true);
176 if(CParameterFreeRDP::Security::TLS & (uint)security)
177 ui->cbSecurityTls->setChecked(true);
178 if(CParameterFreeRDP::Security::NLA & (uint)security)
179 ui->cbSecurityNLA->setChecked(true);
180 if(CParameterFreeRDP::Security::NLA_Ext & (uint)security)
181 ui->cbSecurityNlaExt->setChecked(true);
182 if(CParameterFreeRDP::Security::RDSAAD & (uint)security)
183 ui->cbSecurityRDSAAD->setChecked(true);
184 if(CParameterFreeRDP::Security::RDSTLS & (uint)security)
185 ui->cbSecurityRDSTLS->setChecked(true);
186#if FREERDP_VERSION_MAJOR >= 3
187 ui->cbSecurityRDSAAD->setVisible(true);
188 ui->cbSecurityRDSTLS->setVisible(true);
189#else
190 ui->cbSecurityRDSAAD->setVisible(false);
191 ui->cbSecurityRDSTLS->setVisible(false);
192#endif
193 // Tls version
194 switch(m_pSettings->GetTlsVersion())
195 {
196 case TLS1_VERSION:
197 ui->rbTls1_0->setChecked(true);
198 break;
199 case TLS1_1_VERSION:
200 ui->rbTls1_1->setChecked(true);
201 break;
202 case TLS1_2_VERSION:
203 ui->rbTls1_2->setChecked(true);
204 break;
205 case TLS1_3_VERSION:
206 ui->rbTls1_3->setChecked(true);
207 break;
208 }
209
210 // Initial default performance flags
211 m_vPerformanceFlags[CONNECTION_TYPE_MODEM - 1] = PERF_DISABLE_WALLPAPER | PERF_DISABLE_FULLWINDOWDRAG | PERF_DISABLE_MENUANIMATIONS | PERF_DISABLE_THEMING;
212 m_vPerformanceFlags[CONNECTION_TYPE_BROADBAND_LOW - 1] = PERF_DISABLE_WALLPAPER | PERF_DISABLE_FULLWINDOWDRAG | PERF_DISABLE_MENUANIMATIONS;
213 m_vPerformanceFlags[CONNECTION_TYPE_SATELLITE - 1] = PERF_DISABLE_WALLPAPER | PERF_ENABLE_DESKTOP_COMPOSITION | PERF_DISABLE_FULLWINDOWDRAG | PERF_DISABLE_MENUANIMATIONS;
214 m_vPerformanceFlags[CONNECTION_TYPE_BROADBAND_HIGH - 1] = PERF_DISABLE_WALLPAPER | PERF_ENABLE_DESKTOP_COMPOSITION | PERF_DISABLE_FULLWINDOWDRAG | PERF_DISABLE_MENUANIMATIONS;
215 m_vPerformanceFlags[CONNECTION_TYPE_WAN - 1] = PERF_ENABLE_FONT_SMOOTHING | PERF_ENABLE_DESKTOP_COMPOSITION;
216 m_vPerformanceFlags[CONNECTION_TYPE_LAN - 1] = PERF_ENABLE_FONT_SMOOTHING | PERF_ENABLE_DESKTOP_COMPOSITION;
217 m_vPerformanceFlags[CONNECTION_TYPE_AUTODETECT - 1] = PERF_ENABLE_FONT_SMOOTHING | PERF_ENABLE_DESKTOP_COMPOSITION;
218 // Load performance flags
219 if(m_pSettings->GetConnectType() > 0 && m_pSettings->GetPerformanceFlags() > 0)
220 m_vPerformanceFlags[m_pSettings->GetConnectType() - 1] = m_pSettings->GetPerformanceFlags();
221 // Connect type
222 ui->cbConnectType->addItem(tr("Modem(56 kbps)"), CONNECTION_TYPE_MODEM);
223 ui->cbConnectType->addItem(tr("Broadband low(256 kbps - 2 Mbps)"), CONNECTION_TYPE_BROADBAND_LOW);
224 ui->cbConnectType->addItem(tr("Satellite(2 Mbps - 16 Mbps, High latency)"), CONNECTION_TYPE_SATELLITE);
225 ui->cbConnectType->addItem(tr("Broadband high(2 Mbps - 10 Mbps)"), CONNECTION_TYPE_BROADBAND_HIGH);
226 ui->cbConnectType->addItem(tr("Wan(10 Mbps or higher speed, High latency)"), CONNECTION_TYPE_WAN);
227 ui->cbConnectType->addItem(tr("Lan(10 Mbps or higher speed)"), CONNECTION_TYPE_LAN);
228 ui->cbConnectType->addItem(tr("Automatically detect"), CONNECTION_TYPE_AUTODETECT);
229 ui->cbConnectType->setCurrentIndex(ui->cbConnectType->findData(m_pSettings->GetConnectType()));
230
231}
232
233CDlgSetFreeRDP::~CDlgSetFreeRDP()
234{
235 delete ui;
236}
237
238// [Check validity and accept]
239void CDlgSetFreeRDP::accept()
240{
241 int nRet = 0;
242
243 if(!ui->wNet->CheckValidity(true)) {
244 ui->tabWidget->setCurrentIndex(0);
245 return;
246 }
247 if(!m_pProxyUI->CheckValidity(true)) {
248 ui->tabWidget->setCurrentWidget(m_pProxyUI);
249 return;
250 }
251 if(!m_pRecordUI->CheckValidity(true)) {
252 ui->tabWidget->setCurrentWidget(m_pRecordUI);
253 return;
254 }
255
256 m_pSettings->SetName(ui->leName->text());
257
258 // Server
259 m_pSettings->SetDomain(ui->leDomain->text());
260 nRet = ui->wNet->Accept();
261 if(nRet) return;
262
263 nRet = m_pProxyUI->Accept();
264 if(nRet) return;
265
266 nRet = m_pRecordUI->Accept();
267 if(nRet) return;
268
269 m_pSettings->SetOnlyView(ui->cbOnlyView->isChecked());
270 m_pSettings->SetClipboard(ui->cbClipboard->isChecked());
271 m_pSettings->SetShowServerName(ui->cbShowServerName->isChecked());
272
273 // Display
274 m_pSettings->SetUseMultimon(ui->cbAllMonitor->isChecked());
275 QString szSize = ui->cbDesktopSize->currentText();
276 int index = szSize.indexOf("×");
277 if(-1 < index)
278 {
279 UINT32 width = szSize.left(index).toInt();
280 UINT32 height = szSize.right(szSize.length() - index - 1).toInt();
281 m_pSettings->SetDesktopWidth(width);
282 m_pSettings->SetDesktopHeight(height);
283 }
284 m_pSettings->SetColorDepth(ui->cbColorDepth->currentData().toInt());
285 m_pSettings->SetReconnectInterval(ui->sbReconnect->value());
286
287 // Redirection
288 m_pSettings->SetRedirectionPrinter(ui->cbPrinter->isChecked());
289 m_pSettings->SetEnableLocalInputMethod(ui->cbEnableLocalInputMethod->isChecked());
290 if(HasAudioOutput()) {
291 CParameterFreeRDP::RedirecionSoundType tRdirectionSound
292 = CParameterFreeRDP::RedirecionSoundType::Disable;
293 if(ui->rbAudioDisable->isChecked())
294 tRdirectionSound = CParameterFreeRDP::RedirecionSoundType::Disable;
295 else if(ui->rbAudioLocal->isChecked())
296 tRdirectionSound = CParameterFreeRDP::RedirecionSoundType::Local;
297 else if(ui->rbAudioRemote->isChecked())
298 tRdirectionSound = CParameterFreeRDP::RedirecionSoundType::Remote;
299 m_pSettings->SetRedirectionSound(tRdirectionSound);
300 } else {
301 m_pSettings->SetRedirectionSound(
302 CParameterFreeRDP::RedirecionSoundType::Disable);
303 }
304 m_pSettings->SetRedirectionSoundParameters(ui->leRdpSnd->text());
305 if(HasAudioInput())
306 m_pSettings->SetRedirectionMicrophone(ui->cbAudin->isChecked());
307 else
308 m_pSettings->SetRedirectionMicrophone(false);
309 m_pSettings->SetRedirectionMicrophoneParameters(ui->leAudin->text());
310
311 QStringList lstDrives;
312 //获取选中的行,默认获取选中行的第一列数据(0),列的索引值和上面一样0、1、2、3......
313 QModelIndexList selected = ui->tvDrive->selectionModel()->selectedRows(0);
314 QList<QModelIndex>::iterator it;
315 QModelIndex modelIndex;
316 QString szPath;
317 for (it = selected.begin(); it != selected.end(); ++it)
318 {
319 modelIndex = *it;
320 szPath = m_pFileModel->filePath(modelIndex);
321 if(!szPath.isEmpty())
322 lstDrives.append(szPath);
323 }
324 m_pSettings->SetRedirectionDrives(lstDrives);
325
326 // Security
327 m_pSettings->SetNegotiateSecurityLayer(ui->cbSecurityEnable->isChecked());
328 uint security = 0;
329 if(ui->cbSecurityRDP->isChecked())
330 security |= CParameterFreeRDP::Security::RDP;
331 if(ui->cbSecurityTls->isChecked())
332 security |= CParameterFreeRDP::Security::TLS;
333 if(ui->cbSecurityNLA->isChecked())
334 security |= CParameterFreeRDP::Security::NLA;
335 if(ui->cbSecurityNlaExt->isChecked())
336 security |= CParameterFreeRDP::Security::NLA_Ext;
337 if(ui->cbSecurityRDSTLS->isChecked())
338 security |= CParameterFreeRDP::Security::RDSTLS;
339 if(ui->cbSecurityRDSAAD->isChecked())
340 security |= CParameterFreeRDP::Security::RDSAAD;
341 m_pSettings->SetSecurity((CParameterFreeRDP::Security)security);
342
343 // Tls version
344 if(ui->rbTls1_0->isChecked())
345 m_pSettings->SetTlsVersion(TLS1_VERSION);
346 else if(ui->rbTls1_1->isChecked())
347 m_pSettings->SetTlsVersion(TLS1_1_VERSION);
348 else if(ui->rbTls1_2->isChecked())
349 m_pSettings->SetTlsVersion(TLS1_2_VERSION);
350 else if(ui->rbTls1_3->isChecked())
351 m_pSettings->SetTlsVersion(TLS1_3_VERSION);
352
353 // Connect type
354 m_pSettings->SetConnectType(ui->cbConnectType->currentData().toUInt());
355 // Performance flags
356 UINT32 performanceFlags = 0;
357 if(!ui->cbDesktopBackground->isChecked())
358 performanceFlags |= PERF_DISABLE_WALLPAPER;
359 if(!ui->cbWindowDrag->isChecked())
360 performanceFlags |= PERF_DISABLE_FULLWINDOWDRAG;
361 if(!ui->cbMenuAnims->isChecked())
362 performanceFlags |= PERF_DISABLE_MENUANIMATIONS;
363 if(!ui->cbThemes->isChecked())
364 performanceFlags |= PERF_DISABLE_THEMING;
365 if(ui->cbFontSmoothing->isChecked())
366 performanceFlags |= PERF_ENABLE_FONT_SMOOTHING;
367 if(ui->cbDesktopCompositing->isChecked())
368 performanceFlags |= PERF_ENABLE_DESKTOP_COMPOSITION;
369 m_pSettings->SetPerformanceFlags(performanceFlags);
370
371 QDialog::accept();
372}
373// [Check validity and accept]
374
375void CDlgSetFreeRDP::on_rbLocalScreen_clicked(bool checked)
376{
377 if(!checked) return;
378 int width = GetScreenGeometry().width();
379 int height = GetScreenGeometry().height();
380 QString curSize = QString::number(width) + "×" + QString::number(height);
381 ui->rbLocalScreen->setText(tr("Local screen") + ": " + curSize);
382 if(ui->cbDesktopSize->findText(curSize) == -1)
383 InsertDesktopSize(width, height);
384 ui->cbDesktopSize->setCurrentText(curSize);
385}
386
387QRect CDlgSetFreeRDP::GetScreenGeometry()
388{
389 QRect r;
390 QScreen* pScreen = QApplication::primaryScreen();
391 if(ui->cbAllMonitor->isChecked())
392 {
393 //TODO: check this is a virtual geometry
394 r = pScreen->virtualGeometry();
395 /*
396 auto lstScreen = QApplication::screens();
397 qDebug(log) << "Screen counts:" << lstScreen.count();
398 int i = 0;
399 foreach(auto pScreen, lstScreen)
400 {
401 //r = r.united(pScreen->geometry());
402 qDebug(log)
403 << "ID:" << i++
404 << "geometry:" << pScreen->geometry()
405 << "availableGeometry:" << pScreen->availableGeometry()
406 << "virtualGeometry" << pScreen->virtualGeometry()
407 << "availableVirtualGeometry" << pScreen->availableVirtualGeometry();
408 }//*/
409 } else {
410 r = pScreen->geometry();
411 }
412 return r;
413}
414
415int CDlgSetFreeRDP::UpdateDesktopSize()
416{
417 ui->cbDesktopSize->clear();
418 QStringList lstDesktopSizes;
419 lstDesktopSizes <<"640×480"
420 <<"800×600"
421 <<"1024×600"
422 <<"1024×768"
423 <<"1280×720"
424 <<"1280×854"
425 <<"1280×960"
426 <<"1280×1024"
427 <<"1366×768"
428 <<"1400×1050"
429 <<"1440×900"
430 <<"1600×900"
431 <<"1600×1024"
432 <<"1600×1200"
433 <<"1680×1050"
434 <<"1920×1080"
435 <<"1920×1200";
436 ui->cbDesktopSize->addItems(lstDesktopSizes);
437
438 int width = GetScreenGeometry().width();
439 int height = GetScreenGeometry().height();
440 QString curSize = QString::number(width) + "×" + QString::number(height);
441 ui->rbLocalScreen->setText(tr("Local screen") + ": " + curSize);
442 if(ui->cbDesktopSize->findText(curSize) == -1)
443 InsertDesktopSize(width, height);
444 return 0;
445}
446
447int CDlgSetFreeRDP::InsertDesktopSize(QString szSize)
448{
449 int w, h;
450 int nIndex = szSize.indexOf("×");
451 if(nIndex > -1)
452 {
453 bool ok = false;
454 w = szSize.left(nIndex).toInt(&ok);
455 if(ok)
456 h = szSize.right(szSize.length() - nIndex - 1).toInt(&ok);
457 if(!ok)
458 return -1;
459 }
460 return InsertDesktopSize(w, h);
461}
462
463int CDlgSetFreeRDP::InsertDesktopSize(int width, int height)
464{
465 QString curSize = QString::number(width) + "×" + QString::number(height);
466 if(ui->cbDesktopSize->findText(curSize) > -1)
467 return 0;
468
469 int nCount = ui->cbDesktopSize->count();
470 for(int i = 0; i < nCount; i++)
471 {
472 QString curText = ui->cbDesktopSize->itemText(i);
473 int nIndex = curText.indexOf("×");
474 if(nIndex > -1)
475 {
476 int w = curText.left(nIndex).toInt();
477 int h = curText.right(curText.length() - nIndex - 1).toInt();
478 if(w > width)
479 {
480 ui->cbDesktopSize->insertItem(i, curSize);
481 return 0;
482 } else if(w == width) {
483 if(h > height)
484 {
485 ui->cbDesktopSize->insertItem(i, curSize);
486 return 0;
487 } if(h == height) {
488 return 0;
489 } else {
490 int j = i + 1;
491 while(j < nCount) {
492 QString curText = ui->cbDesktopSize->itemText(j);
493 int nIndex = curText.indexOf("×");
494 if(-1 >= nIndex) {
495 j++;
496 } else {
497 int w = curText.left(nIndex).toInt();
498 int h = curText.right(curText.length() - nIndex - 1).toInt();
499 if(w != width) {
500 ui->cbDesktopSize->insertItem(j, curSize);
501 return 0;
502 } else {
503 if(h > height)
504 {
505 ui->cbDesktopSize->insertItem(j, curSize);
506 return 0;
507 } else if(h == height)
508 return 0;
509 else
510 j++;
511 }
512 }
513 }
514 }
515 }
516 }
517 }
518
519 if(ui->cbDesktopSize->findText(curSize) == -1)
520 ui->cbDesktopSize->addItem(curSize);
521
522 return 0;
523}
524
525
526void CDlgSetFreeRDP::on_rbAudioDisable_toggled(bool checked)
527{
528 ui->leRdpSnd->setEnabled(!checked);
529}
530
531void CDlgSetFreeRDP::on_rbAudioLocal_toggled(bool checked)
532{
533 ui->leRdpSnd->setEnabled(checked);
534}
535
536void CDlgSetFreeRDP::on_rbAudioRemote_toggled(bool checked)
537{
538 ui->leRdpSnd->setEnabled(!checked);
539 ui->leAudin->setEnabled(!checked);
540 ui->cbAudin->setEnabled(!checked);
541}
542
543bool CDlgSetFreeRDP::HasAudioOutput()
544{
545#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
546 auto d = QMediaDevices::defaultAudioOutput();
547 return !d.isNull();
548#else
549 return !QAudioDeviceInfo::defaultOutputDevice().isNull();
550#endif
551}
552
553bool CDlgSetFreeRDP::HasAudioInput()
554{
555#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
556 auto d = QMediaDevices::defaultAudioInput();
557 return !d.isNull();
558#else
559 return !QAudioDeviceInfo::defaultInputDevice().isNull();
560#endif
561}
562
563void CDlgSetFreeRDP::on_pbSizeEdit_clicked()
564{
565 CDlgDesktopSize dlg;
566 QStringList lstSize;
567 for(int i = 0; i < ui->cbDesktopSize->count(); i++)
568 lstSize << ui->cbDesktopSize->itemText(i);
569 dlg.SetDesktopSizes(lstSize);
570 if(QDialog::Accepted == RC_SHOW_WINDOW(&dlg))
571 {
572 ui->cbDesktopSize->clear();
573 foreach(auto s, dlg.GetDesktopSize())
574 {
575 InsertDesktopSize(s);
576 }
577 }
578}
579
580void CDlgSetFreeRDP::on_pbDriveClearAll_clicked()
581{
582 ui->tvDrive->clearSelection();
583 ShowDriveSelected(0);
584}
585
586void CDlgSetFreeRDP::slotSelectionChanged(const QItemSelection &selected,
587 const QItemSelection &deselected)
588{
589 QModelIndexList s = ui->tvDrive->selectionModel()->selectedRows(0);
590 ShowDriveSelected(s.size());
591}
592
593int CDlgSetFreeRDP::ShowDriveSelected(int counts)
594{
595 ui->lbDriveSelected->setText(tr("Selected counts: ") + QString::number(counts));
596 return 0;
597}
598
599void CDlgSetFreeRDP::on_cbAllMonitor_stateChanged(int arg1)
600{
601 on_rbLocalScreen_clicked(true);
602}
603
604void CDlgSetFreeRDP::on_cbSecurityEnable_stateChanged(int arg1)
605{
606 if(m_pButtonGroup) {
607 m_pButtonGroup->deleteLater();
608 m_pButtonGroup = nullptr;
609 }
610 if(!ui->cbSecurityEnable->isChecked()) {
611 m_pButtonGroup = new QButtonGroup(this);
612 m_pButtonGroup->addButton(ui->cbSecurityRDP);
613 m_pButtonGroup->addButton(ui->cbSecurityTls);
614 m_pButtonGroup->addButton(ui->cbSecurityNLA);
615 m_pButtonGroup->addButton(ui->cbSecurityNlaExt);
616 m_pButtonGroup->addButton(ui->cbSecurityRDSAAD);
617 m_pButtonGroup->addButton(ui->cbSecurityRDSTLS);
618 }
619}
620
621void CDlgSetFreeRDP::on_cbConnectType_currentIndexChanged(int index)
622{
623 UINT32 type = ui->cbConnectType->itemData(index).toUInt();
624 if(0 >= type || CONNECTION_TYPE_AUTODETECT < type)
625 return;
626
627 UINT32 performanceFlags = m_vPerformanceFlags[type - 1];
628 if(CONNECTION_TYPE_AUTODETECT == type)
629 {
630 performanceFlags = PERF_ENABLE_FONT_SMOOTHING | PERF_ENABLE_DESKTOP_COMPOSITION;
631 }
632
633 ui->cbDesktopBackground->setChecked(!(PERF_DISABLE_WALLPAPER & performanceFlags));
634 ui->cbWindowDrag->setChecked(!(PERF_DISABLE_FULLWINDOWDRAG & performanceFlags));
635 ui->cbMenuAnims->setChecked(!(PERF_DISABLE_MENUANIMATIONS & performanceFlags));
636 ui->cbThemes->setChecked(!(PERF_DISABLE_THEMING & performanceFlags));
637 ui->cbFontSmoothing->setChecked(PERF_ENABLE_FONT_SMOOTHING & performanceFlags);
638 ui->cbDesktopCompositing->setChecked(PERF_ENABLE_DESKTOP_COMPOSITION & performanceFlags);
639
640 ui->cbDesktopBackground->setEnabled(!(CONNECTION_TYPE_AUTODETECT == type));
641 ui->cbWindowDrag->setEnabled(!(CONNECTION_TYPE_AUTODETECT == type));
642 ui->cbMenuAnims->setEnabled(!(CONNECTION_TYPE_AUTODETECT == type));
643 ui->cbThemes->setEnabled(!(CONNECTION_TYPE_AUTODETECT == type));
644 ui->cbFontSmoothing->setEnabled(!(CONNECTION_TYPE_AUTODETECT == type));
645 ui->cbDesktopCompositing->setEnabled(!(CONNECTION_TYPE_AUTODETECT == type));
646}
647
648void CDlgSetFreeRDP::InsertView(QWidget* pView, int pos)
649{
650 QString szMsg;
651 if(!pView) return;
652
653 // [connect accepted to slotAccept of widget]
654 bool check = false;
655 check = connect(this, SIGNAL(accepted()), pView, SLOT(slotAccept()));
656 if(!check)
657 {
658 szMsg = "Class '" + QString(pView->metaObject()->className())
659 + "' must has slot slotAccept(), please add it. "
660 + "Or the class derived from CParameterUI";
661 qCritical(log) << szMsg;
662 }
663 Q_ASSERT_X(check, "CDlgSetFreeRDP", szMsg.toStdString().c_str());
664 // [connect accepted to slotAccept of widget]
665
666 bool bScroll = false;
667 int nWidth = 0;
668 int nHeigth = 0;
669 nWidth = qMax(nWidth, pView->frameSize().width());
670 nHeigth = qMax(nHeigth, pView->frameSize().height());
671
672 QSize size = this->size();
673 if(nWidth > size.width() || nHeigth > size.height())
674 bScroll = true;
675
676 QWidget* p = pView;
677 if(bScroll)
678 {
679 QScrollArea* pScroll = new QScrollArea(ui->tabWidget);
680 if(!pScroll) return;
681 pScroll->setWidget(pView);
682 p = pScroll;
683 }
684 ui->tabWidget->insertTab(pos, p, pView->windowIcon(), pView->windowTitle());
685
686}
687
688void CDlgSetFreeRDP::AddViewers(const QList<QWidget *> &wViewer)
689{
690 int nWidth = 0;
691 int nHeigth = 0;
692 foreach(auto p, wViewer) {
693 if(!p) continue;
694 nWidth = qMax(nWidth, p->frameSize().width());
695 nHeigth = qMax(nHeigth, p->frameSize().height());
696 }
697 bool bScroll = false;
698#ifdef Q_OS_ANDROID
699 bScroll = true;
700#else
701 QSize size = this->size();
702 if(nWidth > size.width() || nHeigth > size.height())
703 bScroll = true;
704#endif
705 // [connect accepted to slotAccept of widget]
706 foreach(auto p, wViewer)
707 {
708 QString szMsg;
709 QWidget* pView = p;
710 if(bScroll)
711 {
712 QScrollArea* pScroll = new QScrollArea(ui->tabWidget);
713 if(!pScroll) continue;
714 pScroll->setWidget(p);
715 pView = pScroll;
716 }
717 ui->tabWidget->addTab(pView, p->windowIcon(), p->windowTitle());
718 bool check = false;
719 check = connect(this, SIGNAL(accepted()), p, SLOT(slotAccept()));
720 if(!check)
721 {
722 szMsg = "Class '" + QString(p->metaObject()->className())
723 + "' must has slot slotAccept(), please add it. "
724 + "Or the class derived from CParameterUI";
725 qCritical(log) << szMsg;
726 }
727 Q_ASSERT_X(check, "CParameterDlgSettings", szMsg.toStdString().c_str());
728 }
729 // [connect accepted to slotAccept of widget]
730}
[Declare CParameterFreeRDP]
The proxy parameter UI