diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index a40ee45dd..53018ef1b 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -5496,6 +5496,7 @@ bool FurnaceGUI::init() { } initSystemPresets(); + initTutorial(); e->setAutoNotePoly(noteInputPoly); @@ -6329,7 +6330,9 @@ FurnaceGUI::FurnaceGUI(): monitorPos(0.0), mustClear(2), initialScreenWipe(1.0f), - introSkipDo(false) { + introSkipDo(false), + curTutorial(-1), + curTutorialStep(0) { // value keys valueKeys[SDLK_0]=0; valueKeys[SDLK_1]=1; diff --git a/src/gui/gui.h b/src/gui/gui.h index b64f25722..743bb2c17 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -998,6 +998,29 @@ struct FurnaceGUISysCategory { description(NULL) {} }; +typedef std::function TutorialFunc; + +struct FurnaceGUITutorialStep { + const char* text; + int waitForTrigger; + TutorialFunc run; + TutorialFunc runAfter; + + FurnaceGUITutorialStep(const char* t, int trigger=-1, TutorialFunc activeFunc=NULL, TutorialFunc endFunc=NULL): + text(t), + waitForTrigger(trigger), + run(activeFunc), + runAfter(endFunc) {} +}; + +struct FurnaceGUITutorialDef { + const char* name; + std::vector steps; + FurnaceGUITutorialDef(): + name("Help!") {} + FurnaceGUITutorialDef(const char* n, std::initializer_list step); +}; + struct FurnaceGUIMacroDesc { DivInstrumentMacro* macro; int min, max; @@ -1615,6 +1638,7 @@ class FurnaceGUI { std::vector> pendingIns; std::vector sysCategories; + FurnaceGUITutorialDef tutorials[GUI_TUTORIAL_MAX]; bool wavePreviewOn; SDL_Scancode wavePreviewKey; @@ -1846,6 +1870,9 @@ class FurnaceGUI { bool introSkipDo; ImVec2 introMin, introMax; + // tutorial + int curTutorial, curTutorialStep; + void drawSSGEnv(unsigned char type, const ImVec2& size); void drawWaveform(unsigned char type, bool opz, const ImVec2& size); void drawAlgorithm(unsigned char alg, FurnaceGUIFMAlgs algType, const ImVec2& size); @@ -2031,6 +2058,7 @@ class FurnaceGUI { void applyUISettings(bool updateFonts=true); void initSystemPresets(); + void initTutorial(); void encodeMMLStr(String& target, int* macro, int macroLen, int macroLoop, int macroRel, bool hex=false, bool bit30=false); void decodeMMLStr(String& source, int* macro, unsigned char& macroLen, unsigned char& macroLoop, int macroMin, int macroMax, unsigned char& macroRel, bool bit30=false); diff --git a/src/gui/tutorial.cpp b/src/gui/tutorial.cpp index cabc58058..eeb509960 100644 --- a/src/gui/tutorial.cpp +++ b/src/gui/tutorial.cpp @@ -20,6 +20,16 @@ #include "gui.h" #include +#define TS FurnaceGUITutorialStep + +void FurnaceGUI::initTutorial() { + tutorials[GUI_TUTORIAL_OVERVIEW]=FurnaceGUITutorialDef("Overview",{ + TS("step 1"), + TS("step 2"), + TS("step 3") + }); +} + void FurnaceGUI::syncTutorial() { tutorial.userComesFrom=e->getConfInt("tutUserComesFrom",0); tutorial.introPlayed=e->getConfBool("tutIntroPlayed",false); @@ -102,3 +112,8 @@ void FurnaceGUI::drawTutorial() { ImGui::EndPopup(); } } + +FurnaceGUITutorialDef::FurnaceGUITutorialDef(const char* n, std::initializer_list step): + name(n) { + steps=step; +}