Add GUI control panel (first draft)
[mouse-tracker-for-cubism.git] / include / mouse_cursor_tracker.h
index a53713f..ca667a9 100644 (file)
@@ -26,8 +26,18 @@ SOFTWARE.
 ****/
 
 #include <string>
-#include <map>
 #include <thread>
+#include <vector>
+#include <utility>
+#include <mutex>
+#include <map>
+#include <gtkmm/application.h>
+#include <gtkmm/builder.h>
+#include <gtkmm/scale.h>
+#include <gtkmm/checkbutton.h>
+#include <gtkmm/button.h>
+#include <gtkmm/window.h>
+
 extern "C"
 {
 #include <xdo.h>
@@ -37,28 +47,38 @@ extern "C"
 class MouseCursorTracker
 {
 public:
-    MouseCursorTracker(std::string cfgPath);
+    MouseCursorTracker(std::string cfgPath,
+                       std::vector<std::pair<std::string, int> > motions = {},
+                       std::vector<std::string> expressions = {});
     ~MouseCursorTracker();
 
+    enum class MotionPriority
+    {
+        // See LAppDefine.cpp in Demo
+        none,
+        idle,
+        normal,
+        force
+    };
+
     struct Params
     {
-        double leftEyeOpenness;
-        double rightEyeOpenness;
-        double leftEyeSmile;
-        double rightEyeSmile;
-        double mouthOpenness;
-        double mouthForm;
-        double faceXAngle;
-        double faceYAngle;
-        double faceZAngle;
+        std::map<std::string, double> live2d;
+
         bool autoBlink;
         bool autoBreath;
-        bool randomMotion;
+        bool randomIdleMotion;
         bool useLipSync;
         double lipSyncParam;
+
+        MotionPriority motionPriority;
+        std::string motionGroup;
+        int motionNumber;
+
+        std::string expression;
     };
 
-    Params getParams(void) const;
+    Params getParams(void);
 
     void stop(void);
 
@@ -76,7 +96,7 @@ private:
         int sleepMs;
         bool autoBlink;
         bool autoBreath;
-        bool randomMotion;
+        bool randomIdleMotion;
         bool useLipSync;
         double lipSyncGain;
         double lipSyncCutOff;
@@ -87,9 +107,11 @@ private:
         int left;
         int right;
         int screen;
-        Coord middle;
+        Coord origin;
     } m_cfg;
 
+    std::map<std::string, double> m_overrideMap;
+
     bool m_stop;
 
     Coord m_curPos;
@@ -97,12 +119,39 @@ private:
     xdo_t *m_xdo;
 
     std::thread m_getVolumeThread;
+    std::thread m_parseCommandThread;
+    std::thread m_guiThread;
     void audioLoop(void);
+    void cliLoop(void);
+    void guiLoop(void);
+    void processCommand(std::string);
     double m_currentVol;
     pa_simple *m_pulse;
 
+    MotionPriority m_motionPriority;
+    std::string m_motionGroup;
+    int m_motionNumber;
+    std::mutex m_motionMutex;
+    std::string m_expression;
+
     void populateDefaultConfig(void);
     void parseConfig(std::string cfgPath);
+
+    Glib::RefPtr<Gtk::Application> m_gtkapp;
+    Glib::RefPtr<Gtk::Builder> m_builder;
+
+    std::vector<std::string> m_onClearResettingParams;
+
+    // GUI signal handlers
+    void onMotionStartButton(void);
+    void onExpressionStartButton(void);
+    void onParamUpdateButton(Gtk::Scale *scale, bool isInc);
+    void onParamValChanged(Glib::RefPtr<Gtk::Adjustment> adj, std::string paramName);
+    void onAutoToggle(Gtk::CheckButton *check, Gtk::Scale *scale,
+                      Gtk::Button *buttonDec, Gtk::Button *buttonInc,
+                      std::string paramName);
+    void onClearButton(Glib::RefPtr<Gtk::Button> button, std::string paramName, Glib::RefPtr<Gtk::Adjustment> adj);
+    void onExpanderChange(Gtk::Window *window);
 };
 
 #endif