From 1cc755d1effb256721a84255e2902dcc1d921311 Mon Sep 17 00:00:00 2001 From: "R. Aidan Campbell" Date: Sat, 28 Apr 2018 16:21:30 -0700 Subject: [PATCH 01/12] now with window closing confirmation --- mainwindow.cpp | 17 +++ mainwindow.h | 4 + moonlight-qt.pro.user | 336 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 357 insertions(+) create mode 100644 moonlight-qt.pro.user diff --git a/mainwindow.cpp b/mainwindow.cpp index 57f85959..d47684da 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -8,6 +8,23 @@ MainWindow::MainWindow(QWidget *parent) : ui->setupUi(this); } +void MainWindow::closeEvent(QCloseEvent *event) +{ + const QMessageBox::StandardButton ret + = QMessageBox::warning(this, tr("Application"), + tr("something-something-close?"), + QMessageBox::Yes | QMessageBox::No); + switch (ret) { + case QMessageBox::Yes: + event->accept(); + break; + case QMessageBox::No: + default: + event->ignore(); + break; + } +} + MainWindow::~MainWindow() { delete ui; diff --git a/mainwindow.h b/mainwindow.h index 450992cd..1487d0ed 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -2,6 +2,7 @@ #define MAINWINDOW_H #include +#include namespace Ui { class MainWindow; @@ -15,6 +16,9 @@ public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); +protected: + void closeEvent(QCloseEvent *event) override; + private slots: void on_actionExit_triggered(); diff --git a/moonlight-qt.pro.user b/moonlight-qt.pro.user new file mode 100644 index 00000000..0578f775 --- /dev/null +++ b/moonlight-qt.pro.user @@ -0,0 +1,336 @@ + + + + + + EnvironmentId + {4670429c-020d-4244-91b2-7400759b936c} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + true + false + 0 + true + true + 0 + 8 + true + 1 + true + true + true + false + + + + ProjectExplorer.Project.PluginSettings + + + + ProjectExplorer.Project.Target.0 + + Desktop Qt 5.10.1 clang 64bit + Desktop Qt 5.10.1 clang 64bit + qt.qt5.5101.clang_64_kit + 0 + 0 + 0 + + /Users/aidan/Desktop/build-moonlight-qt-Desktop_Qt_5_10_1_clang_64bit-Debug + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + false + false + + + true + Make + + Qt4ProjectManager.MakeStep + + -w + -r + + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + -w + -r + + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Debug + + Qt4ProjectManager.Qt4BuildConfiguration + 2 + true + + + /Users/aidan/Desktop/build-moonlight-qt-Desktop_Qt_5_10_1_clang_64bit-Release + + + true + qmake + + QtProjectManager.QMakeBuildStep + false + + false + false + false + + + true + Make + + Qt4ProjectManager.MakeStep + + -w + -r + + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + -w + -r + + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Release + + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + + /Users/aidan/Desktop/build-moonlight-qt-Desktop_Qt_5_10_1_clang_64bit-Profile + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + true + false + + + true + Make + + Qt4ProjectManager.MakeStep + + -w + -r + + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + -w + -r + + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Profile + + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + 3 + + + 0 + Deploy + + ProjectExplorer.BuildSteps.Deploy + + 1 + Deploy locally + + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + false + false + 1000 + + true + + false + false + false + false + true + 0.01 + 10 + true + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + moonlight-qt + + Qt4ProjectManager.Qt4RunConfiguration:/Users/aidan/Desktop/moonlight-qt/moonlight-qt.pro + true + + moonlight-qt.pro + false + + /moonlight-qt.app/Contents/MacOS + 3768 + false + true + false + false + true + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 18 + + + Version + 18 + + From 10ba3ed78c53fb432f8e9952c9a1dec3e8ad67b0 Mon Sep 17 00:00:00 2001 From: "R. Aidan Campbell" Date: Sat, 28 Apr 2018 16:41:07 -0700 Subject: [PATCH 02/12] ignore qt.pro.user files --- .gitignore | 1 + moonlight-qt.pro.user | 336 ------------------------------------------ 2 files changed, 1 insertion(+), 336 deletions(-) create mode 100644 .gitignore delete mode 100644 moonlight-qt.pro.user diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..ec68b91b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*pro.user diff --git a/moonlight-qt.pro.user b/moonlight-qt.pro.user deleted file mode 100644 index 0578f775..00000000 --- a/moonlight-qt.pro.user +++ /dev/null @@ -1,336 +0,0 @@ - - - - - - EnvironmentId - {4670429c-020d-4244-91b2-7400759b936c} - - - ProjectExplorer.Project.ActiveTarget - 0 - - - ProjectExplorer.Project.EditorSettings - - true - false - true - - Cpp - - CppGlobal - - - - QmlJS - - QmlJSGlobal - - - 2 - UTF-8 - false - 4 - false - 80 - true - true - 1 - true - false - 0 - true - true - 0 - 8 - true - 1 - true - true - true - false - - - - ProjectExplorer.Project.PluginSettings - - - - ProjectExplorer.Project.Target.0 - - Desktop Qt 5.10.1 clang 64bit - Desktop Qt 5.10.1 clang 64bit - qt.qt5.5101.clang_64_kit - 0 - 0 - 0 - - /Users/aidan/Desktop/build-moonlight-qt-Desktop_Qt_5_10_1_clang_64bit-Debug - - - true - qmake - - QtProjectManager.QMakeBuildStep - true - - false - false - false - - - true - Make - - Qt4ProjectManager.MakeStep - - -w - -r - - false - - - - 2 - Build - - ProjectExplorer.BuildSteps.Build - - - - true - Make - - Qt4ProjectManager.MakeStep - - -w - -r - - true - clean - - - 1 - Clean - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Debug - - Qt4ProjectManager.Qt4BuildConfiguration - 2 - true - - - /Users/aidan/Desktop/build-moonlight-qt-Desktop_Qt_5_10_1_clang_64bit-Release - - - true - qmake - - QtProjectManager.QMakeBuildStep - false - - false - false - false - - - true - Make - - Qt4ProjectManager.MakeStep - - -w - -r - - false - - - - 2 - Build - - ProjectExplorer.BuildSteps.Build - - - - true - Make - - Qt4ProjectManager.MakeStep - - -w - -r - - true - clean - - - 1 - Clean - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Release - - Qt4ProjectManager.Qt4BuildConfiguration - 0 - true - - - /Users/aidan/Desktop/build-moonlight-qt-Desktop_Qt_5_10_1_clang_64bit-Profile - - - true - qmake - - QtProjectManager.QMakeBuildStep - true - - false - true - false - - - true - Make - - Qt4ProjectManager.MakeStep - - -w - -r - - false - - - - 2 - Build - - ProjectExplorer.BuildSteps.Build - - - - true - Make - - Qt4ProjectManager.MakeStep - - -w - -r - - true - clean - - - 1 - Clean - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Profile - - Qt4ProjectManager.Qt4BuildConfiguration - 0 - true - - 3 - - - 0 - Deploy - - ProjectExplorer.BuildSteps.Deploy - - 1 - Deploy locally - - ProjectExplorer.DefaultDeployConfiguration - - 1 - - - false - false - 1000 - - true - - false - false - false - false - true - 0.01 - 10 - true - 1 - 25 - - 1 - true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - 2 - - moonlight-qt - - Qt4ProjectManager.Qt4RunConfiguration:/Users/aidan/Desktop/moonlight-qt/moonlight-qt.pro - true - - moonlight-qt.pro - false - - /moonlight-qt.app/Contents/MacOS - 3768 - false - true - false - false - true - - 1 - - - - ProjectExplorer.Project.TargetCount - 1 - - - ProjectExplorer.Project.Updater.FileVersion - 18 - - - Version - 18 - - From 7f6d0c7484a3da90b55e0359396e2cf96b1b6c7d Mon Sep 17 00:00:00 2001 From: "R. Aidan Campbell" Date: Sat, 28 Apr 2018 16:42:20 -0700 Subject: [PATCH 03/12] copy over icons from moonlight-chrome --- res/ic_add_to_queue_white_48px.svg | 4 ++++ res/ic_remove_circle_outline_white_48px.svg | 4 ++++ res/ic_remove_from_queue_white_48px.svg | 9 +++++++++ res/ic_tv_white_48px.svg | 4 ++++ res/ic_videogame_asset_white_48px.svg | 4 ++++ res/icon128.png | Bin 0 -> 12901 bytes res/no_app_image.png | Bin 0 -> 1622 bytes 7 files changed, 25 insertions(+) create mode 100644 res/ic_add_to_queue_white_48px.svg create mode 100644 res/ic_remove_circle_outline_white_48px.svg create mode 100644 res/ic_remove_from_queue_white_48px.svg create mode 100644 res/ic_tv_white_48px.svg create mode 100644 res/ic_videogame_asset_white_48px.svg create mode 100644 res/icon128.png create mode 100644 res/no_app_image.png diff --git a/res/ic_add_to_queue_white_48px.svg b/res/ic_add_to_queue_white_48px.svg new file mode 100644 index 00000000..2323513c --- /dev/null +++ b/res/ic_add_to_queue_white_48px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/res/ic_remove_circle_outline_white_48px.svg b/res/ic_remove_circle_outline_white_48px.svg new file mode 100644 index 00000000..22468895 --- /dev/null +++ b/res/ic_remove_circle_outline_white_48px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/res/ic_remove_from_queue_white_48px.svg b/res/ic_remove_from_queue_white_48px.svg new file mode 100644 index 00000000..9ad352f4 --- /dev/null +++ b/res/ic_remove_from_queue_white_48px.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/res/ic_tv_white_48px.svg b/res/ic_tv_white_48px.svg new file mode 100644 index 00000000..b163cf7f --- /dev/null +++ b/res/ic_tv_white_48px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/res/ic_videogame_asset_white_48px.svg b/res/ic_videogame_asset_white_48px.svg new file mode 100644 index 00000000..c771cf4e --- /dev/null +++ b/res/ic_videogame_asset_white_48px.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/res/icon128.png b/res/icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..05d4ae90f0e0865e3f69d76e0a5427669dd0ad1b GIT binary patch literal 12901 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 NN^+{QrP9U${{x%rIluq_ literal 0 HcmV?d00001 diff --git a/res/no_app_image.png b/res/no_app_image.png new file mode 100644 index 0000000000000000000000000000000000000000..4cbad3e0439718265ea3c96656475d0c83fd4a49 GIT binary patch literal 1622 zcma)7eKb^Q93Iz=>-!ePwxb;nth!;%kJrq-E+@--+Q0)d!FC>d*9!E?&&=q zbREt0ngjwthq24W8_Z$?K}8c$15f^X>wg53+97wk3qiSbUAbNQ13)yQcLl~02wM6} zLxqr=Zv;T~?-)#)`mlyEOwx$R9IPP_R>>GHpMR0iuNYKZ$lYa>)FXK~q>LMR;7UVt zJ!vr~BAL(lj&^y~UeEKJ7++~W^kEL@+-T%19@7ZvG2{_o2vWh5FpNY(Q3QcuXleWx z^jGA+qL!gM#(OLMwq&vvM)%y=VSUMcD)E!Jpf<0KM$(=;y#t_X)3;;E( zawqAyTdyt6&7xnhSTd=JPjsgoOwIBp>hkoIWJt=smIX8%FL%XH=D;mMomQf%`i`zm zsFRB%?!5P$bS)d7$ZF>=bTjHOVMj-q#P=254CSQlxY=%nZg^nJyg59soJ}sogb}5^ z7H5itX|-B-w1Y0sIV<#|HrZ{{fm@hhwV+Ue!soc}W|Z?d^|fg2NDa>feZTe|r|GO9%2*qZj%pgF z_uA@mv232y+l|y|UE=NLC8-7UTCgeQ<(~6#l~};TxS*`icj11Gt6J){ThaN&_gBY% zL6N2>uM^UX%nLdCSFzaxh0`2ue8MMq{Asr`>9PhE~YPvU}Rm@%kniqA1wS85~x6^YW@FgEe z+AfVwrFKP`8z7Pg&tpf9vcFHovMb6hz1_g_h4z`OKlo%1>r%KSzM{|aOwmLVj8o#N z8(4J%Ib1DnM4`h*bjZk#Pp*;qkvi!aMdp!Y10=SU;!^nBRR^bpeI~*Jx@QuBurdqF z?y`GBt&@YuxFAECmysQu?Bz^qXm!jyADYt_jZ^$3aao}+F@*bWqwmGgR}xSNuhoQ4 zwpne6#10Mcuywn84f5{aD?WmX^J{hB!z@$wj1?3Z?R1${KPbAklN9^N9u;S}mk+WH zTPcq7$Vjfj6d6eoL=~HBh7s}3z*%RK!`R0I3j55qVw()Cs=%Z4w@CX9SCX(X(Dc-< zf*|-%BaRJ)1HE`vyc2Aie7b*54a$+vI~}PnusMy5we!?)GTxQm?F;--Wry-9lF&l5dzjhBh!wp zVK5-cFp@*S(oHz8hd&8XL2>fLUK{w0E77lQwK&7kK989$dr>w?XEvrx;jlWakAn_gugWucp)?=uK*QapmyEv z(ZIDsWj{>?22e~_)HPA Date: Sat, 28 Apr 2018 17:21:05 -0700 Subject: [PATCH 04/12] Now with a picture-button that does a thing --- mainwindow.cpp | 7 +++++++ mainwindow.h | 1 + moonlight-qt.pro | 3 +++ resources.qrc | 11 +++++++++++ 4 files changed, 22 insertions(+) create mode 100644 resources.qrc diff --git a/mainwindow.cpp b/mainwindow.cpp index d47684da..f1931c7a 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -6,6 +6,12 @@ MainWindow::MainWindow(QWidget *parent) : ui(new Ui::MainWindow) { ui->setupUi(this); + + myButton = new QPushButton(this); + myButton->setIcon(QIcon(":/res/icon128.png")); + myButton->setIconSize(QSize(128, 128)); + myButton->resize(QSize(128, 128)); + connect(myButton, &QAbstractButton::clicked, this, &MainWindow::on_actionExit_triggered); } void MainWindow::closeEvent(QCloseEvent *event) @@ -28,6 +34,7 @@ void MainWindow::closeEvent(QCloseEvent *event) MainWindow::~MainWindow() { delete ui; + delete myButton; } void MainWindow::on_actionExit_triggered() diff --git a/mainwindow.h b/mainwindow.h index 1487d0ed..8f564cfa 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -24,6 +24,7 @@ private slots: private: Ui::MainWindow *ui; + QAbstractButton *myButton = nullptr; }; #endif // MAINWINDOW_H diff --git a/moonlight-qt.pro b/moonlight-qt.pro index ca0080e2..40157b2b 100644 --- a/moonlight-qt.pro +++ b/moonlight-qt.pro @@ -34,3 +34,6 @@ HEADERS += \ FORMS += \ mainwindow.ui + +RESOURCES += \ + resources.qrc diff --git a/resources.qrc b/resources.qrc new file mode 100644 index 00000000..0fce81cc --- /dev/null +++ b/resources.qrc @@ -0,0 +1,11 @@ + + + res/icon128.png + res/ic_add_to_queue_white_48px.svg + res/ic_remove_circle_outline_white_48px.svg + res/ic_remove_from_queue_white_48px.svg + res/ic_tv_white_48px.svg + res/ic_videogame_asset_white_48px.svg + res/no_app_image.png + + From 073d965f6d810fe0c75a7354b7bbcf279f63fb16 Mon Sep 17 00:00:00 2001 From: "R. Aidan Campbell" Date: Sat, 28 Apr 2018 18:18:43 -0700 Subject: [PATCH 05/12] now with pairing button and dialog --- mainwindow.cpp | 17 ++ mainwindow.h | 3 + mainwindow.ui | 484 ++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 500 insertions(+), 4 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index f1931c7a..4f3e2cb0 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -41,3 +41,20 @@ void MainWindow::on_actionExit_triggered() { exit(EXIT_SUCCESS); } + +void MainWindow::on_newHostBtn_clicked() +{ + bool ok; + QString responseHost + = QInputDialog::getText(this, tr("Add Host Manually"), + tr("IP Address or Hostname of GeForce PC"), + QLineEdit::Normal, + tr("default string"), + &ok); + if (ok && !responseHost.isEmpty()) { + // TODO: send pair request to "responseHost" + } else { + // silently close, user canceled + } + +} diff --git a/mainwindow.h b/mainwindow.h index 8f564cfa..aa56fbb5 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -21,10 +21,13 @@ protected: private slots: void on_actionExit_triggered(); + void on_newHostBtn_clicked(); private: Ui::MainWindow *ui; QAbstractButton *myButton = nullptr; + QAbstractButton *newHostBtn = nullptr; + }; #endif // MAINWINDOW_H diff --git a/mainwindow.ui b/mainwindow.ui index 0c8dc36f..577f74a3 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -7,20 +7,494 @@ 0 0 400 - 300 + 483 MainWindow - + + + + + 50 + 30 + 306 + 191 + + + + + QLayout::SetDefaultConstraint + + + 10 + + + 10 + + + 10 + + + 10 + + + + + PointingHandCursor + + + Add New Host + + + + :/res/icon128.png:/res/icon128.png + + + + + + + + + + + + 0 + 0 + 0 + + + + + + + 50 + 166 + 255 + + + + + + + 178 + 222 + 255 + + + + + + + 114 + 194 + 255 + + + + + + + 25 + 83 + 127 + + + + + + + 33 + 110 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 50 + 166 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 152 + 210 + 255 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 50 + 166 + 255 + + + + + + + 178 + 222 + 255 + + + + + + + 114 + 194 + 255 + + + + + + + 25 + 83 + 127 + + + + + + + 33 + 110 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 50 + 166 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 152 + 210 + 255 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + + + 25 + 83 + 127 + + + + + + + 50 + 166 + 255 + + + + + + + 178 + 222 + 255 + + + + + + + 114 + 194 + 255 + + + + + + + 25 + 83 + 127 + + + + + + + 33 + 110 + 170 + + + + + + + 25 + 83 + 127 + + + + + + + 255 + 255 + 255 + + + + + + + 25 + 83 + 127 + + + + + + + 50 + 166 + 255 + + + + + + + 50 + 166 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 50 + 166 + 255 + + + + + + + 255 + 255 + 220 + + + + + + + 0 + 0 + 0 + + + + + + + + PointingHandCursor + + + false + + + dummy host 1 + + + + :/res/ic_tv_white_48px.svg:/res/ic_tv_white_48px.svg + + + + + + 0 0 400 - 24 + 22 @@ -50,6 +524,8 @@ - + + + From a2ba98e38ea3bd179f6151ed6ab8b768987a8d5b Mon Sep 17 00:00:00 2001 From: "R. Aidan Campbell" Date: Sat, 28 Apr 2018 18:47:19 -0700 Subject: [PATCH 06/12] Now with (unused) code for a pin dialog --- mainwindow.cpp | 20 +++++++++++++++++++- mainwindow.h | 4 +++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index 4f3e2cb0..6f728fd2 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -35,6 +35,7 @@ MainWindow::~MainWindow() { delete ui; delete myButton; + delete pinMsgBox; } void MainWindow::on_actionExit_triggered() @@ -56,5 +57,22 @@ void MainWindow::on_newHostBtn_clicked() } else { // silently close, user canceled } - +} + +// this opens a non-blocking informative message telling the user to enter the given pin +// it is open-loop: if the user cancels, nothing happens +// it is expected that upon pairing completion, the ::closePinDialog function will be called. +void MainWindow::displayPinDialog(QString pin = tr("ERROR")) { + + pinMsgBox = new QMessageBox( this ); + pinMsgBox->setAttribute( Qt::WA_DeleteOnClose ); //makes sure the msgbox is deleted automatically when closed + pinMsgBox->setStandardButtons( QMessageBox::Ok ); + pinMsgBox->setText("Please enter the number " + pin + " on the GFE dialog on the computer."); + pinMsgBox->setInformativeText("This dialog will be dismissed once complete."); + pinMsgBox->open(); +} + +// to be called when the pairing is complete +void MainWindow::closePinDialog() { + pinMsgBox->close(); } diff --git a/mainwindow.h b/mainwindow.h index aa56fbb5..8edff78b 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -22,11 +22,13 @@ protected: private slots: void on_actionExit_triggered(); void on_newHostBtn_clicked(); + void displayPinDialog(QString pin); + void closePinDialog(); private: Ui::MainWindow *ui; QAbstractButton *myButton = nullptr; - QAbstractButton *newHostBtn = nullptr; + QMessageBox *pinMsgBox = nullptr; }; From 0651062b81cffbe390c4e84d94b3354592b6709f Mon Sep 17 00:00:00 2001 From: "R. Aidan Campbell" Date: Sun, 29 Apr 2018 07:55:31 -0700 Subject: [PATCH 07/12] now with a dropdown to select a host, and associated filling logic --- mainwindow.cpp | 18 ++ mainwindow.h | 2 + mainwindow.ui | 433 +------------------------------------------------ 3 files changed, 22 insertions(+), 431 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index 6f728fd2..4c57191f 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -7,6 +7,7 @@ MainWindow::MainWindow(QWidget *parent) : { ui->setupUi(this); + myButton = new QPushButton(this); myButton->setIcon(QIcon(":/res/icon128.png")); myButton->setIconSize(QSize(128, 128)); @@ -76,3 +77,20 @@ void MainWindow::displayPinDialog(QString pin = tr("ERROR")) { void MainWindow::closePinDialog() { pinMsgBox->close(); } + + +void MainWindow::addHostToDisplay(QMap hostMdnsMap) { + + QMapIterator i(hostMdnsMap); + while (i.hasNext()) { + i.next(); + ui->hostSelectCombo->addItem(i.key()); + // we can ignore the mdns for now, it's only useful for displaying unpairing options + } +} + +void MainWindow::on_selectHostComboBox_activated(const QString &selectedHostname) +{ + // TODO: get all the applications that "selectedHostname" has listed + // probably populate another combobox of applications for the time being +} diff --git a/mainwindow.h b/mainwindow.h index 8edff78b..91b02c6f 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -24,6 +24,8 @@ private slots: void on_newHostBtn_clicked(); void displayPinDialog(QString pin); void closePinDialog(); + void addHostToDisplay(QMap); + void on_selectHostComboBox_activated(const QString &); private: Ui::MainWindow *ui; diff --git a/mainwindow.ui b/mainwindow.ui index 577f74a3..bb2092ec 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -23,7 +23,7 @@ 191 - + QLayout::SetDefaultConstraint @@ -54,436 +54,7 @@ - - - - - - - - 0 - 0 - 0 - - - - - - - 50 - 166 - 255 - - - - - - - 178 - 222 - 255 - - - - - - - 114 - 194 - 255 - - - - - - - 25 - 83 - 127 - - - - - - - 33 - 110 - 170 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 50 - 166 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 152 - 210 - 255 - - - - - - - 255 - 255 - 220 - - - - - - - 0 - 0 - 0 - - - - - - - - - 0 - 0 - 0 - - - - - - - 50 - 166 - 255 - - - - - - - 178 - 222 - 255 - - - - - - - 114 - 194 - 255 - - - - - - - 25 - 83 - 127 - - - - - - - 33 - 110 - 170 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 50 - 166 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 152 - 210 - 255 - - - - - - - 255 - 255 - 220 - - - - - - - 0 - 0 - 0 - - - - - - - - - 25 - 83 - 127 - - - - - - - 50 - 166 - 255 - - - - - - - 178 - 222 - 255 - - - - - - - 114 - 194 - 255 - - - - - - - 25 - 83 - 127 - - - - - - - 33 - 110 - 170 - - - - - - - 25 - 83 - 127 - - - - - - - 255 - 255 - 255 - - - - - - - 25 - 83 - 127 - - - - - - - 50 - 166 - 255 - - - - - - - 50 - 166 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 50 - 166 - 255 - - - - - - - 255 - 255 - 220 - - - - - - - 0 - 0 - 0 - - - - - - - - PointingHandCursor - - - false - - - dummy host 1 - - - - :/res/ic_tv_white_48px.svg:/res/ic_tv_white_48px.svg - - + From 05fb4008798ec49ccb9bc38272b6d53e690c6472 Mon Sep 17 00:00:00 2001 From: "R. Aidan Campbell" Date: Sun, 29 Apr 2018 08:17:31 -0700 Subject: [PATCH 08/12] Refactored popups into a new class --- mainwindow.cpp | 49 +++++++++++------------------------------------- mainwindow.h | 4 ---- moonlight-qt.pro | 6 ++++-- popupmanager.cpp | 38 +++++++++++++++++++++++++++++++++++++ popupmanager.h | 18 ++++++++++++++++++ 5 files changed, 71 insertions(+), 44 deletions(-) create mode 100644 popupmanager.cpp create mode 100644 popupmanager.h diff --git a/mainwindow.cpp b/mainwindow.cpp index 4c57191f..e856dfb3 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1,5 +1,6 @@ #include "mainwindow.h" #include "ui_mainwindow.h" +#include "popupmanager.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), @@ -7,12 +8,13 @@ MainWindow::MainWindow(QWidget *parent) : { ui->setupUi(this); - - myButton = new QPushButton(this); - myButton->setIcon(QIcon(":/res/icon128.png")); - myButton->setIconSize(QSize(128, 128)); - myButton->resize(QSize(128, 128)); - connect(myButton, &QAbstractButton::clicked, this, &MainWindow::on_actionExit_triggered); +// sample code for an iconized button performing an action +// will be useful to implement the game grid UI later +// myButton = new QPushButton(this); +// myButton->setIcon(QIcon(":/res/icon128.png")); +// myButton->setIconSize(QSize(128, 128)); +// myButton->resize(QSize(128, 128)); +// connect(myButton, &QAbstractButton::clicked, this, &MainWindow::on_actionExit_triggered); } void MainWindow::closeEvent(QCloseEvent *event) @@ -35,8 +37,6 @@ void MainWindow::closeEvent(QCloseEvent *event) MainWindow::~MainWindow() { delete ui; - delete myButton; - delete pinMsgBox; } void MainWindow::on_actionExit_triggered() @@ -46,39 +46,12 @@ void MainWindow::on_actionExit_triggered() void MainWindow::on_newHostBtn_clicked() { - bool ok; - QString responseHost - = QInputDialog::getText(this, tr("Add Host Manually"), - tr("IP Address or Hostname of GeForce PC"), - QLineEdit::Normal, - tr("default string"), - &ok); - if (ok && !responseHost.isEmpty()) { - // TODO: send pair request to "responseHost" - } else { - // silently close, user canceled + QString hostname = popupmanager::getHostnameDialog(); + if (!hostname.isEmpty()) { + //TODO: pairTo(hostname) } } -// this opens a non-blocking informative message telling the user to enter the given pin -// it is open-loop: if the user cancels, nothing happens -// it is expected that upon pairing completion, the ::closePinDialog function will be called. -void MainWindow::displayPinDialog(QString pin = tr("ERROR")) { - - pinMsgBox = new QMessageBox( this ); - pinMsgBox->setAttribute( Qt::WA_DeleteOnClose ); //makes sure the msgbox is deleted automatically when closed - pinMsgBox->setStandardButtons( QMessageBox::Ok ); - pinMsgBox->setText("Please enter the number " + pin + " on the GFE dialog on the computer."); - pinMsgBox->setInformativeText("This dialog will be dismissed once complete."); - pinMsgBox->open(); -} - -// to be called when the pairing is complete -void MainWindow::closePinDialog() { - pinMsgBox->close(); -} - - void MainWindow::addHostToDisplay(QMap hostMdnsMap) { QMapIterator i(hostMdnsMap); diff --git a/mainwindow.h b/mainwindow.h index 91b02c6f..58affa92 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -22,15 +22,11 @@ protected: private slots: void on_actionExit_triggered(); void on_newHostBtn_clicked(); - void displayPinDialog(QString pin); - void closePinDialog(); void addHostToDisplay(QMap); void on_selectHostComboBox_activated(const QString &); private: Ui::MainWindow *ui; - QAbstractButton *myButton = nullptr; - QMessageBox *pinMsgBox = nullptr; }; diff --git a/moonlight-qt.pro b/moonlight-qt.pro index cb58a097..4e5f4b53 100644 --- a/moonlight-qt.pro +++ b/moonlight-qt.pro @@ -28,14 +28,16 @@ SOURCES += \ mainwindow.cpp \ nvhttp.cpp \ nvpairingmanager.cpp \ - identitymanager.cpp + identitymanager.cpp \ + popupmanager.cpp HEADERS += \ mainwindow.h \ nvhttp.h \ nvpairingmanager.h \ identitymanager.h \ - utils.h + utils.h \ + popupmanager.h FORMS += \ mainwindow.ui diff --git a/popupmanager.cpp b/popupmanager.cpp new file mode 100644 index 00000000..5d968c14 --- /dev/null +++ b/popupmanager.cpp @@ -0,0 +1,38 @@ +#include "popupmanager.h" + +popupmanager::popupmanager(); + +// this opens a non-blocking informative message telling the user to enter the given pin +// it is open-loop: if the user cancels, nothing happens +// it is expected that upon pairing completion, the ::closePinDialog function will be called. +static void popupmanager::displayPinDialog(QString pin) { + + pinMsgBox = new QMessageBox( this ); + pinMsgBox->setAttribute( Qt::WA_DeleteOnClose ); //makes sure the msgbox is deleted automatically when closed + pinMsgBox->setStandardButtons( QMessageBox::Ok ); + pinMsgBox->setText("Please enter the number " + pin + " on the GFE dialog on the computer."); + pinMsgBox->setInformativeText("This dialog will be dismissed once complete."); + pinMsgBox->open(); +} + +// to be called when the pairing is complete +static void popupmanager::closePinDialog() { + pinMsgBox->close(); + delete pinMsgBox; +} + +static QString popupmanager::getHostnameDialog() { + bool ok; + QString responseHost + = QInputDialog::getText(this, tr("Add Host Manually"), + tr("IP Address or Hostname of GeForce PC"), + QLineEdit::Normal, + tr("default string"), + &ok); + if (ok && !responseHost.isEmpty()) { + return responseHost; + } else { + return tr(""); + } +} + diff --git a/popupmanager.h b/popupmanager.h new file mode 100644 index 00000000..3284af7e --- /dev/null +++ b/popupmanager.h @@ -0,0 +1,18 @@ +#ifndef POPUPMANAGER_H +#define POPUPMANAGER_H + +#include + +class popupmanager +{ +public: + popupmanager(); + static void displayPinDialog(QString pin); + static void closePinDialog(); + static QString getHostnameDialog(); + +private slots: + QMessageBox *pinMsgBox = nullptr; +}; + +#endif // POPUPMANAGER_H From 21e0066be08ae2ca72f256c01a2b17e6015b921c Mon Sep 17 00:00:00 2001 From: "R. Aidan Campbell" Date: Mon, 30 Apr 2018 19:09:31 -0700 Subject: [PATCH 09/12] learning static c++ --- mainwindow.cpp | 2 +- moonlight-qt.pro | 3 +++ popupmanager.cpp | 19 +++++++++---------- popupmanager.h | 9 ++++----- 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index e856dfb3..198cd4cd 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -46,7 +46,7 @@ void MainWindow::on_actionExit_triggered() void MainWindow::on_newHostBtn_clicked() { - QString hostname = popupmanager::getHostnameDialog(); + QString hostname = popupmanager::getHostnameDialog(this); if (!hostname.isEmpty()) { //TODO: pairTo(hostname) } diff --git a/moonlight-qt.pro b/moonlight-qt.pro index 4e5f4b53..d51a30f0 100644 --- a/moonlight-qt.pro +++ b/moonlight-qt.pro @@ -22,6 +22,8 @@ DEFINES += QT_DEPRECATED_WARNINGS # You can also select to disable deprecated APIs only up to a certain version of Qt. DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 +INCLUDEPATH += \ + /usr/local/opt/openssl/include SOURCES += \ main.cpp \ @@ -46,5 +48,6 @@ RESOURCES += \ resources.qrc LIBS += \ + -L/usr/local/opt/openssl/lib \ -lssl \ -lcrypto diff --git a/popupmanager.cpp b/popupmanager.cpp index 5d968c14..aacfcbb5 100644 --- a/popupmanager.cpp +++ b/popupmanager.cpp @@ -1,13 +1,11 @@ #include "popupmanager.h" -popupmanager::popupmanager(); - // this opens a non-blocking informative message telling the user to enter the given pin // it is open-loop: if the user cancels, nothing happens // it is expected that upon pairing completion, the ::closePinDialog function will be called. -static void popupmanager::displayPinDialog(QString pin) { +void popupmanager::displayPinDialog(QString pin, QWidget* parent) { - pinMsgBox = new QMessageBox( this ); + pinMsgBox = new QMessageBox( parent ); pinMsgBox->setAttribute( Qt::WA_DeleteOnClose ); //makes sure the msgbox is deleted automatically when closed pinMsgBox->setStandardButtons( QMessageBox::Ok ); pinMsgBox->setText("Please enter the number " + pin + " on the GFE dialog on the computer."); @@ -16,23 +14,24 @@ static void popupmanager::displayPinDialog(QString pin) { } // to be called when the pairing is complete -static void popupmanager::closePinDialog() { +void popupmanager::closePinDialog() { pinMsgBox->close(); delete pinMsgBox; } -static QString popupmanager::getHostnameDialog() { +QString popupmanager::getHostnameDialog(QWidget* parent) { bool ok; QString responseHost - = QInputDialog::getText(this, tr("Add Host Manually"), - tr("IP Address or Hostname of GeForce PC"), + = QInputDialog::getText(parent, QObject::tr("Add Host Manually"), + QObject::tr("IP Address or Hostname of GeForce PC"), QLineEdit::Normal, - tr("default string"), + QObject::tr("default string"), &ok); if (ok && !responseHost.isEmpty()) { return responseHost; } else { - return tr(""); + return QObject::tr(""); } } + diff --git a/popupmanager.h b/popupmanager.h index 3284af7e..93faf25d 100644 --- a/popupmanager.h +++ b/popupmanager.h @@ -1,18 +1,17 @@ #ifndef POPUPMANAGER_H #define POPUPMANAGER_H -#include +#include class popupmanager { public: - popupmanager(); - static void displayPinDialog(QString pin); + static void displayPinDialog(QString pin, QWidget* parent); static void closePinDialog(); - static QString getHostnameDialog(); + static QString getHostnameDialog(QWidget* parent); private slots: - QMessageBox *pinMsgBox = nullptr; + static QMessageBox *pinMsgBox; }; #endif // POPUPMANAGER_H From 69e36050c8370c3c43e2aa14dea73358d01ba76d Mon Sep 17 00:00:00 2001 From: "R. Aidan Campbell" Date: Mon, 30 Apr 2018 19:45:20 -0700 Subject: [PATCH 10/12] more c++ bug fixes --- popupmanager.cpp | 16 ++++++++++------ popupmanager.h | 3 ++- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/popupmanager.cpp b/popupmanager.cpp index aacfcbb5..83a17aec 100644 --- a/popupmanager.cpp +++ b/popupmanager.cpp @@ -1,16 +1,20 @@ #include "popupmanager.h" +QMessageBox *popupmanager::pinMsgBox = nullptr; + +popupmanager::popupmanager(){} + // this opens a non-blocking informative message telling the user to enter the given pin // it is open-loop: if the user cancels, nothing happens // it is expected that upon pairing completion, the ::closePinDialog function will be called. void popupmanager::displayPinDialog(QString pin, QWidget* parent) { - pinMsgBox = new QMessageBox( parent ); - pinMsgBox->setAttribute( Qt::WA_DeleteOnClose ); //makes sure the msgbox is deleted automatically when closed - pinMsgBox->setStandardButtons( QMessageBox::Ok ); - pinMsgBox->setText("Please enter the number " + pin + " on the GFE dialog on the computer."); - pinMsgBox->setInformativeText("This dialog will be dismissed once complete."); - pinMsgBox->open(); + popupmanager::pinMsgBox = new QMessageBox( parent ); + popupmanager::pinMsgBox->setAttribute( Qt::WA_DeleteOnClose ); //makes sure the msgbox is deleted automatically when closed + popupmanager::pinMsgBox->setStandardButtons( QMessageBox::Ok ); + popupmanager::pinMsgBox->setText("Please enter the number " + pin + " on the GFE dialog on the computer."); + popupmanager::pinMsgBox->setInformativeText("This dialog will be dismissed once complete."); + popupmanager::pinMsgBox->open(); } // to be called when the pairing is complete diff --git a/popupmanager.h b/popupmanager.h index 93faf25d..934ba79d 100644 --- a/popupmanager.h +++ b/popupmanager.h @@ -6,11 +6,12 @@ class popupmanager { public: + popupmanager(); static void displayPinDialog(QString pin, QWidget* parent); static void closePinDialog(); static QString getHostnameDialog(QWidget* parent); -private slots: +private: static QMessageBox *pinMsgBox; }; From 004e6913fa8a66d21b34ae79ac82b9fece8e2cdb Mon Sep 17 00:00:00 2001 From: "R. Aidan Campbell" Date: Mon, 30 Apr 2018 19:52:59 -0700 Subject: [PATCH 11/12] Fixed menu bar being merged with native in osx --- main.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/main.cpp b/main.cpp index b48f94ec..ef04b215 100644 --- a/main.cpp +++ b/main.cpp @@ -3,9 +3,14 @@ int main(int argc, char *argv[]) { + // MacOS directive to prevent the menu bar from being merged into the native bar + // i.e. it's in the window, and not the top left of the screen + QCoreApplication::setAttribute(Qt::AA_DontUseNativeMenuBar); + QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); + } From 9b663c95b7495e2957d926d7d596636070c3f80e Mon Sep 17 00:00:00 2001 From: "R. Aidan Campbell" Date: Mon, 30 Apr 2018 20:33:42 -0700 Subject: [PATCH 12/12] wired up pairing button --- mainwindow.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index 198cd4cd..68dcbac9 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1,6 +1,9 @@ #include "mainwindow.h" #include "ui_mainwindow.h" #include "popupmanager.h" +#include "identitymanager.h" +#include "nvpairingmanager.h" +#include "nvhttp.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), @@ -48,7 +51,13 @@ void MainWindow::on_newHostBtn_clicked() { QString hostname = popupmanager::getHostnameDialog(this); if (!hostname.isEmpty()) { - //TODO: pairTo(hostname) + + IdentityManager im = IdentityManager(QDir(QDir::current())); + NvPairingManager pm(hostname, im); + + QString pin = pm.generatePinString(); + NvHTTP http(hostname, im); + pm.pair(http.getServerInfo(), pin); } }