Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

maindialog.cpp 6.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. #include <QApplication>
  2. #include <QDesktopWidget>
  3. #include <QUuid>
  4. #include <QDebug>
  5. #include "maindialog.h"
  6. #include "ui_maindialog.h"
  7. #include "rdesktoplauncher.h"
  8. #include "rdpoptionshelper.h"
  9. MainDialog::MainDialog(QWidget *parent) :
  10. QDialog(parent),
  11. ui(new Ui::MainDialog),
  12. m_launcher(0)
  13. {
  14. ui->setupUi(this);
  15. connect(ui->lineComputer->lineEdit(), SIGNAL(returnPressed()), ui->btnConnect, SLOT(animateClick()));
  16. connect(ui->lineComputer->lineEdit(), SIGNAL(textChanged(QString)), this, SLOT(textChanged(QString)));
  17. computeResolutions();
  18. QStringList layouts;
  19. for (int l = QLocale::Abkhazian; l <= QLocale::Shambala; ++l)
  20. {
  21. QString name = QLocale((QLocale::Language)l).name().replace("_", "-").toLower();
  22. if (!layouts.contains(name))
  23. layouts.append(name);
  24. }
  25. layouts.sort();
  26. ui->comboKeyboard->addItems(layouts);
  27. ui->comboKeyboard->lineEdit()->setText("en-us");
  28. loadAll();
  29. }
  30. MainDialog::~MainDialog()
  31. {
  32. delete ui;
  33. }
  34. RdpOptions MainDialog::getRdpOptions() const
  35. {
  36. RdpOptions opt;
  37. opt.setHost(ui->lineComputer->currentText());
  38. opt.setUsername(ui->lineUsername->text());
  39. opt.setPassword(ui->linePassword->text());
  40. opt.setFullscreen(ui->slidResolution->value() == m_resolutions.size());
  41. if (!opt.fullscreen())
  42. opt.setResolution(m_resolutions.at(m_resolutions.size() - 1));
  43. opt.setUseAllMonitors(ui->checkAllDisplays->isChecked());
  44. int colors = ui->comboColors->currentIndex();
  45. RdpOptions::Colors c;
  46. if (colors == 0)
  47. c = RdpOptions::HighColor_15;
  48. else if (colors == 1)
  49. c = RdpOptions::HighColor_16;
  50. else if (colors == 2)
  51. c = RdpOptions::TrueColor;
  52. else if (colors == 3)
  53. c = RdpOptions::HighestQuality;
  54. opt.setColors(c);
  55. opt.setFullscreenBar(ui->checkFullscreenBar->isChecked());
  56. int meta = ui->comboMetaKeys->currentIndex();
  57. opt.setMetaKeys(meta == 0 || (opt.fullscreen() && meta == 2));
  58. opt.setUseShell(ui->checkShell->isChecked());
  59. if (opt.useShell())
  60. {
  61. opt.setShell(ui->lineShellPath->text());
  62. opt.setShellWorkingDir(ui->lineShellWorkingDir->text());
  63. }
  64. opt.setExperience((RdpOptions::Experience)ui->comboExperience->currentIndex());
  65. opt.setBitmapCache(ui->checkCacheBitmap->isChecked());
  66. opt.setAutoReconnect(ui->checkAutoReconnect->isChecked());
  67. opt.setKeymap(ui->comboKeyboard->currentText());
  68. return opt;
  69. }
  70. void MainDialog::setRdpOptions(const RdpOptions &opt)
  71. {
  72. ui->lineComputer->lineEdit()->setText(opt.host());
  73. ui->lineUsername->setText(opt.username());
  74. ui->linePassword->setText(opt.password());
  75. if (opt.fullscreen())
  76. {
  77. ui->slidResolution->setValue(ui->slidResolution->maximum());
  78. }
  79. else
  80. {
  81. ui->slidResolution->setValue(ui->slidResolution->maximum() - 1);
  82. }
  83. ui->checkAllDisplays->setChecked(opt.useAllMonitors());
  84. int index = 0;
  85. RdpOptions::Colors c = opt.colors();
  86. if (c == RdpOptions::HighColor_15)
  87. index = 0;
  88. else if (c == RdpOptions::HighColor_16)
  89. index = 1;
  90. else if (c == RdpOptions::TrueColor)
  91. index = 2;
  92. else if (c == RdpOptions::HighestQuality)
  93. index = 3;
  94. ui->comboColors->setCurrentIndex(index);
  95. ui->checkFullscreenBar->setChecked(opt.fullscreenBar());
  96. ui->comboMetaKeys->setCurrentIndex(opt.metaKeys() ? 2 : 1);
  97. ui->checkShell->setChecked(opt.useShell());
  98. ui->lineShellPath->setText(opt.shell());
  99. ui->lineShellWorkingDir->setText(opt.shellWorkingDir());
  100. ui->comboExperience->setCurrentIndex((int)opt.experience());
  101. ui->checkCacheBitmap->setChecked(opt.bitmapCache());
  102. ui->checkAutoReconnect->setChecked(opt.autoReconnect());
  103. ui->comboKeyboard->lineEdit()->setText(opt.keymap());
  104. }
  105. void MainDialog::loadAll()
  106. {
  107. m_rdpOptions = RdpOptionsHelper::loadAll();
  108. ui->lineComputer->clear();
  109. ui->lineComputer->addItem("");
  110. for (int i = 1; i < m_rdpOptions.size(); ++i)
  111. {
  112. RdpOptions opt = m_rdpOptions.at(i);
  113. ui->lineComputer->addItem(opt.visibleName());
  114. }
  115. ui->lineComputer->setFocus();
  116. }
  117. void MainDialog::on_btnConnect_clicked()
  118. {
  119. if (m_launcher) {
  120. return;
  121. }
  122. ui->lblExitStatus->clear();
  123. RdpOptions opt = getRdpOptions();
  124. RdpOptionsHelper::save(opt);
  125. opt.setWindowTitle("rdesktop " + QUuid::createUuid().toString());
  126. m_launcher = new RDesktopLauncher(this);
  127. connect(m_launcher, SIGNAL(finished(int)), this, SLOT(onProcessFinished(int)));
  128. connect(m_launcher, SIGNAL(windowFound(WId)), this, SLOT(onWindowFound(WId)));
  129. m_launcher->start(opt);
  130. m_dlgConnecting = new DialogConnecting(this);
  131. connect(m_dlgConnecting, SIGNAL(canceled()), m_launcher, SLOT(kill()));
  132. m_dlgConnecting->setModal(true);
  133. m_dlgConnecting->show();
  134. }
  135. void MainDialog::textChanged(QString)
  136. {
  137. ui->btnConnect->setEnabled(!ui->lineComputer->lineEdit()->text().isEmpty());
  138. }
  139. void MainDialog::computeResolutions()
  140. {
  141. m_resolutions.append(QApplication::desktop()->availableGeometry().size());
  142. ui->slidResolution->setMinimum(0);
  143. ui->slidResolution->setMaximum(m_resolutions.size());
  144. ui->slidResolution->setValue(m_resolutions.size());
  145. }
  146. void MainDialog::on_slidResolution_valueChanged(int value)
  147. {
  148. if (value < m_resolutions.size())
  149. {
  150. QSize reso = m_resolutions.at(value);
  151. ui->lblResolution->setText(QString("%1x%2").arg(reso.width()).arg(reso.height()));
  152. }
  153. else
  154. {
  155. ui->lblResolution->setText(tr("Plein écran"));
  156. }
  157. }
  158. void MainDialog::on_btnSaveSession_clicked()
  159. {
  160. RdpOptions options = getRdpOptions();
  161. RdpOptionsHelper::save(getRdpOptions());
  162. loadAll();
  163. setRdpOptions(options);
  164. }
  165. void MainDialog::on_btnSaveAsSession_clicked()
  166. {
  167. on_btnSaveSession_clicked();
  168. }
  169. void MainDialog::on_btnOpenSession_clicked()
  170. {
  171. }
  172. void MainDialog::on_lineComputer_currentIndexChanged(int index)
  173. {
  174. if (index >= 0 && index < m_rdpOptions.size())
  175. {
  176. setRdpOptions(m_rdpOptions.at(index));
  177. }
  178. }
  179. void MainDialog::on_btnRemoveSession_clicked()
  180. {
  181. RdpOptionsHelper::remove(getRdpOptions());
  182. loadAll();
  183. }
  184. void MainDialog::onProcessFinished(int status)
  185. {
  186. ui->lblExitStatus->setText(RDesktopLauncher::getExitStatusString(status));
  187. m_launcher->deleteLater();
  188. m_launcher = 0;
  189. m_dlgConnecting->deleteLater();
  190. m_dlgConnecting = 0;
  191. show();
  192. }
  193. void MainDialog::onWindowFound(WId wid)
  194. {
  195. m_dlgConnecting->deleteLater();
  196. m_dlgConnecting = 0;
  197. hide();
  198. }