From a60e2a0c3433060c9c1beb0b5cedebe7825d53c1 Mon Sep 17 00:00:00 2001
From: Kevin Whitaker <eyecreate@gmail.com>
Date: Sat, 28 Jan 2017 00:56:22 -0500
Subject: [PATCH] Make GroovePlayer a singleton to avoid being created for each
 browser. Add login UI component to eventually hold landing screen. Actually
 start server with initial interface.

---
 CMakeLists.txt       |  2 +-
 src/GroovePlayer.cpp |  5 +++++
 src/GroovePlayer.h   |  9 +++++++++
 src/WebInterface.cpp | 22 ++++++++++++++++++++++
 src/WebInterface.h   |  7 +++++++
 src/main.cpp         | 26 ++++++++++++++++++++++++--
 6 files changed, 68 insertions(+), 3 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index c755f35..5ee701b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -8,7 +8,7 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")
 find_package(Wt REQUIRED)
 find_package(Groove REQUIRED)
 
-add_executable(arbitrateor src/main.cpp src/WebInterface.cpp src/GroovePlayer.cpp)
+add_executable(arbitrateor src/main.cpp src/WebInterface.cpp src/GroovePlayer.cpp src/ui/LoginInterface.cpp)
 target_link_libraries(arbitrateor ${Wt_LIBRARIES} ${GROOVE_LIBRARY})
 
 install(TARGETS arbitrateor RUNTIME DESTINATION bin)
diff --git a/src/GroovePlayer.cpp b/src/GroovePlayer.cpp
index aef1540..3f20b1d 100644
--- a/src/GroovePlayer.cpp
+++ b/src/GroovePlayer.cpp
@@ -18,3 +18,8 @@
  */
 
 #include "GroovePlayer.h"
+
+GroovePlayer::GroovePlayer()
+{
+}
+
diff --git a/src/GroovePlayer.h b/src/GroovePlayer.h
index 6150665..35e1233 100644
--- a/src/GroovePlayer.h
+++ b/src/GroovePlayer.h
@@ -22,6 +22,15 @@
 
 class GroovePlayer
 {
+public:
+    static GroovePlayer* getInstance() {
+        static GroovePlayer instance;
+        return &instance;
+    };
+    GroovePlayer(GroovePlayer const&) = delete;
+    void operator=(GroovePlayer const&) = delete;
+private:
+    GroovePlayer();
 };
 
 #endif // GROOVEPLAYER_H
diff --git a/src/WebInterface.cpp b/src/WebInterface.cpp
index 68b2f02..896ea69 100644
--- a/src/WebInterface.cpp
+++ b/src/WebInterface.cpp
@@ -18,3 +18,25 @@
  */
 
 #include "WebInterface.h"
+#include "ui/LoginInterface.h"
+#include <Wt/WText>
+
+struct WebInterface::internal
+{
+    LoginInterface* loginUI;
+};
+
+WebInterface::WebInterface(const Wt::WEnvironment& env) : Wt::WApplication(env)
+{
+    priv_int = new internal;
+    setTitle("Arbitrateor - Audio Jukebox");
+    priv_int->loginUI = new LoginInterface(this);
+    root()->addWidget(priv_int->loginUI);
+}
+
+void WebInterface::loginCompleted()
+{
+    //Login completed, now bring up main inteface.
+    root()->removeWidget(priv_int->loginUI);
+    root()->addWidget(new Wt::WText("you did it"));
+}
diff --git a/src/WebInterface.h b/src/WebInterface.h
index 3a157e1..012b9d4 100644
--- a/src/WebInterface.h
+++ b/src/WebInterface.h
@@ -21,9 +21,16 @@
 #define WEBINTERFACE_H
 
 #include <Wt/WApplication>
+#include "GroovePlayer.h"
 
 class WebInterface : public Wt::WApplication
 {
+public:
+    WebInterface(const Wt::WEnvironment& env);
+    void loginCompleted();
+private:
+    struct internal;
+    internal* priv_int = 0;
 };
 
 #endif // WEBINTERFACE_H
diff --git a/src/main.cpp b/src/main.cpp
index 4a1cab3..2f6bf9d 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,8 +1,30 @@
 #include <iostream>
 #include "WebInterface.h"
+#include <Wt/WServer>
+#include <Wt/WConfig.h>
+#include "GroovePlayer.h"
+
+Wt::WApplication* createApplication(const Wt::WEnvironment& env)
+{
+    return new WebInterface(env);
+}
 
 int main ( int argc, char** argv )
 {
-    std::cout << "Hello, world!" << std::endl;
-    return 0;
+    try {
+        Wt::WServer server(argv[0]);
+        server.setServerConfiguration(argc, argv, WTHTTP_CONFIGURATION);
+        server.addEntryPoint(Wt::Application, createApplication);
+        if(server.start())
+        {
+            int sig = Wt::WServer::waitForShutdown(argv[0]);
+            server.stop();
+        }
+        return 0;
+    }
+    catch (Wt::WServer::Exception& e)
+    {
+        std::cerr << e.what() << "\n";
+        return 1;
+    }
 }
-- 
GitLab