You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

maindialog.cpp 6.6KB

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