mirror of
https://github.com/tildearrow/furnace.git
synced 2024-11-01 18:42:40 +00:00
GUI: remove unused tutorial code
This commit is contained in:
parent
5b086e103e
commit
9dbda09cd0
3 changed files with 0 additions and 322 deletions
|
@ -4811,8 +4811,6 @@ bool FurnaceGUI::loop() {
|
||||||
if (keyHit1[i]<0.0f) keyHit1[i]=0.0f;
|
if (keyHit1[i]<0.0f) keyHit1[i]=0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
activateTutorial(GUI_TUTORIAL_OVERVIEW);
|
|
||||||
|
|
||||||
if (inspectorOpen) ImGui::ShowMetricsWindow(&inspectorOpen);
|
if (inspectorOpen) ImGui::ShowMetricsWindow(&inspectorOpen);
|
||||||
|
|
||||||
if (firstFrame) {
|
if (firstFrame) {
|
||||||
|
@ -6806,7 +6804,6 @@ bool FurnaceGUI::init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
initSystemPresets();
|
initSystemPresets();
|
||||||
initTutorial();
|
|
||||||
|
|
||||||
e->setAutoNotePoly(noteInputPoly);
|
e->setAutoNotePoly(noteInputPoly);
|
||||||
|
|
||||||
|
|
|
@ -890,12 +890,6 @@ enum FurnaceGUIChanOscRef {
|
||||||
GUI_OSCREF_MAX
|
GUI_OSCREF_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
enum FurnaceGUITutorials {
|
|
||||||
GUI_TUTORIAL_OVERVIEW=0,
|
|
||||||
|
|
||||||
GUI_TUTORIAL_MAX
|
|
||||||
};
|
|
||||||
|
|
||||||
enum PasteMode {
|
enum PasteMode {
|
||||||
GUI_PASTE_MODE_NORMAL=0,
|
GUI_PASTE_MODE_NORMAL=0,
|
||||||
GUI_PASTE_MODE_MIX_FG,
|
GUI_PASTE_MODE_MIX_FG,
|
||||||
|
@ -1266,31 +1260,6 @@ struct FurnaceGUISysCategory {
|
||||||
description(NULL) {}
|
description(NULL) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::function<void()> TutorialFunc;
|
|
||||||
|
|
||||||
struct FurnaceGUITutorialStep {
|
|
||||||
const char* text;
|
|
||||||
int waitForTrigger;
|
|
||||||
TutorialFunc run;
|
|
||||||
TutorialFunc runBefore;
|
|
||||||
TutorialFunc runAfter;
|
|
||||||
|
|
||||||
FurnaceGUITutorialStep(const char* t, int trigger=-1, TutorialFunc activeFunc=NULL, TutorialFunc beginFunc=NULL, TutorialFunc endFunc=NULL):
|
|
||||||
text(t),
|
|
||||||
waitForTrigger(trigger),
|
|
||||||
run(activeFunc),
|
|
||||||
runBefore(beginFunc),
|
|
||||||
runAfter(endFunc) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct FurnaceGUITutorialDef {
|
|
||||||
const char* name;
|
|
||||||
std::vector<FurnaceGUITutorialStep> steps;
|
|
||||||
FurnaceGUITutorialDef():
|
|
||||||
name("Help!") {}
|
|
||||||
FurnaceGUITutorialDef(const char* n, std::initializer_list<FurnaceGUITutorialStep> step);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct FurnaceGUIMacroDesc {
|
struct FurnaceGUIMacroDesc {
|
||||||
DivInstrumentMacro* macro;
|
DivInstrumentMacro* macro;
|
||||||
int min, max;
|
int min, max;
|
||||||
|
@ -2052,15 +2021,11 @@ class FurnaceGUI {
|
||||||
} settings;
|
} settings;
|
||||||
|
|
||||||
struct Tutorial {
|
struct Tutorial {
|
||||||
int userComesFrom;
|
|
||||||
bool introPlayed;
|
bool introPlayed;
|
||||||
bool protoWelcome;
|
bool protoWelcome;
|
||||||
bool taken[GUI_TUTORIAL_MAX];
|
|
||||||
Tutorial():
|
Tutorial():
|
||||||
userComesFrom(0),
|
|
||||||
introPlayed(false),
|
introPlayed(false),
|
||||||
protoWelcome(false) {
|
protoWelcome(false) {
|
||||||
memset(taken,0,GUI_TUTORIAL_MAX*sizeof(bool));
|
|
||||||
}
|
}
|
||||||
} tutorial;
|
} tutorial;
|
||||||
|
|
||||||
|
@ -2184,7 +2149,6 @@ class FurnaceGUI {
|
||||||
std::vector<std::pair<DivInstrument*,bool>> pendingIns;
|
std::vector<std::pair<DivInstrument*,bool>> pendingIns;
|
||||||
|
|
||||||
std::vector<FurnaceGUISysCategory> sysCategories;
|
std::vector<FurnaceGUISysCategory> sysCategories;
|
||||||
FurnaceGUITutorialDef tutorials[GUI_TUTORIAL_MAX];
|
|
||||||
|
|
||||||
bool wavePreviewOn;
|
bool wavePreviewOn;
|
||||||
SDL_Scancode wavePreviewKey;
|
SDL_Scancode wavePreviewKey;
|
||||||
|
@ -2733,8 +2697,6 @@ class FurnaceGUI {
|
||||||
|
|
||||||
void applyUISettings(bool updateFonts=true);
|
void applyUISettings(bool updateFonts=true);
|
||||||
void initSystemPresets();
|
void initSystemPresets();
|
||||||
void initTutorial();
|
|
||||||
void activateTutorial(FurnaceGUITutorials which);
|
|
||||||
|
|
||||||
void initRandomDemoSong();
|
void initRandomDemoSong();
|
||||||
bool loadRandomDemoSong();
|
bool loadRandomDemoSong();
|
||||||
|
|
|
@ -24,8 +24,6 @@
|
||||||
|
|
||||||
#include "gif_load.h"
|
#include "gif_load.h"
|
||||||
|
|
||||||
#define TS FurnaceGUITutorialStep
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include "../utfutils.h"
|
#include "../utfutils.h"
|
||||||
|
@ -555,224 +553,16 @@ static const char* cvText[]={
|
||||||
(const char*)1
|
(const char*)1
|
||||||
};
|
};
|
||||||
|
|
||||||
void FurnaceGUI::initTutorial() {
|
|
||||||
tutorials[GUI_TUTORIAL_OVERVIEW]=FurnaceGUITutorialDef("Overview",{
|
|
||||||
TS(
|
|
||||||
"hello! this is the Furnace tutorial!\n"
|
|
||||||
"I will teach you how to use Furnace.\n"
|
|
||||||
"if you wish to skip these tutorials, click on one of the Skip buttons. otherwise, click the " ICON_FA_CHEVRON_RIGHT " icon to continue."
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
"Furnace is a chiptune tracker!\n"
|
|
||||||
"in a tracker, the song is written down in patterns, which are lists of notes, instruments and effects to play.\n"
|
|
||||||
"a playhead scrolls down through these patterns, and plays the notes that are written in them as it moves.\n"
|
|
||||||
"think of it as a piano roll, but replace the dots in the position of notes with note names (e.g. A-4)."
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
"these are called \"patterns\" because they may appear more than once in the song.\n"
|
|
||||||
"this is useful for (in example) percussion, avoiding duplication.\n"
|
|
||||||
"the order in which these patterns appear is determined by an order list which also scrolls down as the playhead moves between patterns."
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
"this is the Pattern window. it displays a pattern (which contains the notes and stuff).",
|
|
||||||
-1,
|
|
||||||
[this]() {
|
|
||||||
highlightWindow("Pattern");
|
|
||||||
},
|
|
||||||
[this]() {
|
|
||||||
nextWindow=GUI_WINDOW_PATTERN;
|
|
||||||
}
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
"this is the Orders window. it displays which patterns are going to play.",
|
|
||||||
-1,
|
|
||||||
[this]() {
|
|
||||||
highlightWindow("Orders");
|
|
||||||
},
|
|
||||||
[this]() {
|
|
||||||
nextWindow=GUI_WINDOW_ORDERS;
|
|
||||||
}
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
"this is the Instruments window. it shows a list of instruments (sounds) in the song.",
|
|
||||||
-1,
|
|
||||||
[this]() {
|
|
||||||
highlightWindow("Instruments");
|
|
||||||
},
|
|
||||||
[this]() {
|
|
||||||
nextWindow=GUI_WINDOW_INS_LIST;
|
|
||||||
}
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
"this is the Song Information window, which allows you to change some song properties.",
|
|
||||||
-1,
|
|
||||||
[this]() {
|
|
||||||
highlightWindow("Song Info##Song Information");
|
|
||||||
},
|
|
||||||
[this]() {
|
|
||||||
nextWindow=GUI_WINDOW_SONG_INFO;
|
|
||||||
}
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
"this is the Speed window, which contains speed parameters.",
|
|
||||||
-1,
|
|
||||||
[this]() {
|
|
||||||
highlightWindow("Speed");
|
|
||||||
},
|
|
||||||
[this]() {
|
|
||||||
nextWindow=GUI_WINDOW_SPEED;
|
|
||||||
}
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
"and here are the Play Controls. you can use these to play the song and do some other things.\n"
|
|
||||||
"now that I am done explaining the interface, let's make a song!",
|
|
||||||
-1,
|
|
||||||
[this]() {
|
|
||||||
highlightWindow("Play Controls");
|
|
||||||
},
|
|
||||||
[this]() {
|
|
||||||
nextWindow=GUI_WINDOW_EDIT_CONTROLS;
|
|
||||||
}
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
"we'll start by creating an instrument.\n"
|
|
||||||
"while it's possible to work without instruments, we would be stuck with the default sound!\n"
|
|
||||||
"so let's create one... for that you click on the " ICON_FA_PLUS " button in the Instruments window."
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
""
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
"now let's type in some notes!\n"
|
|
||||||
"first, enable Edit Mode with the Space key.\n"
|
|
||||||
"after that, click on the pattern editor to focus it (the first empty column to be specific).\n"
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
"the keyboard layout for inserting notes resembles that of a piano:\n"
|
|
||||||
"- Z-M: low octave\n"
|
|
||||||
"- Q-U: mid octave\n"
|
|
||||||
"- I-P and beyond: high octave\n"
|
|
||||||
"the keys one row above the mentioned octaves are the upper keys of a piano.\n"
|
|
||||||
"let's press some of these keys to insert notes!"
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
""
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
"and now, let's play the song! hit Enter to play it (and press it while playing to stop)."
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
""
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
"great!\n"
|
|
||||||
"by the way, you can move around the pattern view using the arrow keys or by clicking in the pattern."
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
"now let me teach you about these columns in the pattern editor.\n"
|
|
||||||
"each big column represents a channel.\n"
|
|
||||||
"a channel consists of five (or more) smaller columns:\n"
|
|
||||||
"- the first column contains notes.\n"
|
|
||||||
"- the second one represents the instruments to play (these will be filled in automatically when you have an instrument selected).\n"
|
|
||||||
"- the third one has volume changes (will explain these later).\n"
|
|
||||||
"- the last two ones are effects and effect values (you can have multiple effect columns, but that's something I will be covering later as well.)\n"
|
|
||||||
"the instrument, volume and effect columns are continuous. this means that if nothing is specified, the last value will be used."
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
"let's add some volume changes to show you what I mean."
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
""
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
"as you can hear, volume changes affects all notes which are placed next to, or after it.\n"
|
|
||||||
"let's place some bass notes."
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
""
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
"oh wait! the keyboard layout only contains 2 octaves!\n"
|
|
||||||
"however, we can change the octave range by using the Octave setting in the play/edit controls."
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
""
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
"now let's type in the notes..."
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
""
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
"...and play this?"
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
""
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
"cool, huh? but we're running out of space here.\n"
|
|
||||||
"let's expand the song."
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
"for that we go in the Orders window, which contains the order these patterns will appear in.\n"
|
|
||||||
"the first column is position while the other columns contain pattern numbers of every channel."
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
"clicking on the " ICON_FA_PLUS " button adds one row to the orders..."
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
""
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
"and then clicking on a cell of the first column takes us there."
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
""
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
"now let's add more to the song."
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
""
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
"and after that, let's hear it!\n"
|
|
||||||
"note that playing the song by pressing Enter will play from the current position in the Orders view - that is, order 1!\n"
|
|
||||||
"we want to play from order 0 (the first order), so we go back to it first and then hit Enter."
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
""
|
|
||||||
),
|
|
||||||
TS(
|
|
||||||
"congratulations! you made it\n"
|
|
||||||
"what else?"
|
|
||||||
)
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void FurnaceGUI::syncTutorial() {
|
void FurnaceGUI::syncTutorial() {
|
||||||
// tutorial.userComesFrom=e->getConfInt("tutUserComesFrom",0);
|
|
||||||
tutorial.introPlayed=e->getConfBool("tutIntroPlayed",false);
|
tutorial.introPlayed=e->getConfBool("tutIntroPlayed",false);
|
||||||
tutorial.protoWelcome=e->getConfBool("tutProtoWelcome2",false);
|
tutorial.protoWelcome=e->getConfBool("tutProtoWelcome2",false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FurnaceGUI::commitTutorial() {
|
void FurnaceGUI::commitTutorial() {
|
||||||
// e->setConf("tutUserComesFrom",tutorial.userComesFrom);
|
|
||||||
e->setConf("tutIntroPlayed",tutorial.introPlayed);
|
e->setConf("tutIntroPlayed",tutorial.introPlayed);
|
||||||
e->setConf("tutProtoWelcome2",tutorial.protoWelcome);
|
e->setConf("tutProtoWelcome2",tutorial.protoWelcome);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FurnaceGUI::activateTutorial(FurnaceGUITutorials which) {
|
|
||||||
/*
|
|
||||||
if (tutorial.protoWelcome && !tutorial.taken[which] && !ImGui::IsPopupOpen((const char*)NULL,ImGuiPopupFlags_AnyPopupId|ImGuiPopupFlags_AnyPopupLevel) && curTutorial==-1 && introPos>=10.0) {
|
|
||||||
logV("activating tutorial %d.",which);
|
|
||||||
curTutorial=which;
|
|
||||||
curTutorialStep=0;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
void FurnaceGUI::initRandomDemoSong() {
|
void FurnaceGUI::initRandomDemoSong() {
|
||||||
std::vector<String> subDirs;
|
std::vector<String> subDirs;
|
||||||
#if !defined(IS_MOBILE) && defined(FURNACE_DATADIR) && defined(SHOW_OPEN_ASSETS_MENU_ENTRY)
|
#if !defined(IS_MOBILE) && defined(FURNACE_DATADIR) && defined(SHOW_OPEN_ASSETS_MENU_ENTRY)
|
||||||
|
@ -960,72 +750,6 @@ void FurnaceGUI::drawTutorial() {
|
||||||
ImGui::EndPopup();
|
ImGui::EndPopup();
|
||||||
}
|
}
|
||||||
|
|
||||||
// tutorial
|
|
||||||
if (curTutorial>=0 && curTutorial<GUI_TUTORIAL_MAX) {
|
|
||||||
FurnaceGUITutorialStep& step=tutorials[curTutorial].steps[curTutorialStep];
|
|
||||||
ImGui::SetNextWindowPos(ImVec2(0,0));
|
|
||||||
ImGui::SetNextWindowSize(ImVec2(canvasW,canvasH));
|
|
||||||
if (ImGui::Begin("Tutorial",NULL,ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoBackground|ImGuiWindowFlags_NoDocking)) {
|
|
||||||
ImDrawList* dl=ImGui::GetWindowDrawList();
|
|
||||||
if (step.run!=NULL) {
|
|
||||||
step.run();
|
|
||||||
} else {
|
|
||||||
ImU32 col=ImGui::GetColorU32(uiColors[GUI_COLOR_MODAL_BACKDROP]);
|
|
||||||
dl->AddRectFilled(
|
|
||||||
ImVec2(0,0),
|
|
||||||
ImVec2(canvasW,canvasH),
|
|
||||||
col
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (step.text[0]) {
|
|
||||||
ImVec2 avail=ImGui::GetContentRegionAvail();
|
|
||||||
ImVec2 textSize=ImGui::CalcTextSize(step.text,NULL,false,avail.x);
|
|
||||||
textSize.x+=ImGui::GetStyle().WindowPadding.y*2.0f;
|
|
||||||
textSize.y+=ImGui::GetStyle().WindowPadding.y*2.0f+ImGui::GetFrameHeightWithSpacing();
|
|
||||||
if (textSize.x>avail.x) textSize.x=avail.x;
|
|
||||||
if (textSize.y>avail.y) textSize.y=avail.y;
|
|
||||||
|
|
||||||
ImGui::SetCursorPos(ImVec2(
|
|
||||||
(canvasW-textSize.x)*0.5,
|
|
||||||
(canvasH-textSize.y)*0.5
|
|
||||||
));
|
|
||||||
|
|
||||||
dl->AddRectFilled(
|
|
||||||
ImGui::GetCursorPos(),
|
|
||||||
ImVec2(
|
|
||||||
ImGui::GetCursorPos().x+textSize.x,
|
|
||||||
ImGui::GetCursorPos().y+textSize.y
|
|
||||||
),
|
|
||||||
ImGui::GetColorU32(ImGuiCol_PopupBg)
|
|
||||||
);
|
|
||||||
|
|
||||||
if (ImGui::BeginChild("TutText",textSize,true,ImGuiWindowFlags_NoScrollbar|ImGuiWindowFlags_NoScrollWithMouse)) {
|
|
||||||
ImGui::TextWrapped("%s",step.text);
|
|
||||||
|
|
||||||
if (ImGui::Button("Skip")) {
|
|
||||||
tutorial.taken[curTutorial]=true;
|
|
||||||
curTutorial=-1;
|
|
||||||
curTutorialStep=0;
|
|
||||||
}
|
|
||||||
ImGui::SameLine();
|
|
||||||
if (ImGui::Button(ICON_FA_CHEVRON_RIGHT)) {
|
|
||||||
curTutorialStep++;
|
|
||||||
if (step.runAfter!=NULL) step.runAfter();
|
|
||||||
if (curTutorialStep>=(int)tutorials[curTutorial].steps.size()) {
|
|
||||||
tutorial.taken[curTutorial]=true;
|
|
||||||
curTutorial=-1;
|
|
||||||
curTutorialStep=0;
|
|
||||||
} else {
|
|
||||||
if (tutorials[curTutorial].steps[curTutorialStep].runBefore) tutorials[curTutorial].steps[curTutorialStep].runBefore();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ImGui::EndChild();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ImGui::End();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cvOpen) {
|
if (cvOpen) {
|
||||||
ImGui::SetNextWindowPos(ImVec2(0,0));
|
ImGui::SetNextWindowPos(ImVec2(0,0));
|
||||||
ImGui::SetNextWindowSize(ImVec2(canvasW,canvasH));
|
ImGui::SetNextWindowSize(ImVec2(canvasW,canvasH));
|
||||||
|
@ -1271,11 +995,6 @@ void FurnaceGUI::highlightWindow(const char* winName) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FurnaceGUITutorialDef::FurnaceGUITutorialDef(const char* n, std::initializer_list<FurnaceGUITutorialStep> step):
|
|
||||||
name(n) {
|
|
||||||
steps=step;
|
|
||||||
}
|
|
||||||
|
|
||||||
// CV
|
// CV
|
||||||
// 320x224
|
// 320x224
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue