// // Created by Symeon on 23/12/2018. // #ifndef FEIS_EDITORSTATE_H #define FEIS_EDITORSTATE_H #include #include #include #include "Fumen.h" #include "Marker.h" #include "Widgets.h" #include "History.h" #include "HistoryActions.h" #include "Widgets.h" #include "TimeSelection.h" #include "NotesClipboard.h" #include "ChartWithHistory.h" class ActionWithMessage; class OpenChart; /* * The god class, holds everything there is to know about the currently open .memon file */ class EditorState { public: explicit EditorState(Fumen& fumen); std::optional chart; Fumen fumen; Widgets::Playfield playfield; Widgets::DensityGraph densityGraph; Widgets::LinearView linearView; // the snap but divided by 4 because you can't set a snap to anything lower than 4ths int snap = 1; std::optional music; int musicVolume = 10; // 0 -> 10 void setMusicVolume(int newMusicVolume); void musicVolumeUp() {setMusicVolume(musicVolume+1);}; void musicVolumeDown() {setMusicVolume(musicVolume-1);}; int musicSpeed = 10; // 1 -> 20 void setMusicSpeed(int newMusicSpeed); void musicSpeedUp() {setMusicSpeed(musicSpeed+1);}; void musicSpeedDown() {setMusicSpeed(musicSpeed-1);}; std::optional albumCover; bool playing; sf::Time previousPos; sf::Time playbackPosition; sf::Time previewEnd; // sf::Time at which the chart preview stops, can be after the end of the audio void setPlaybackAndMusicPosition(sf::Time newPosition); float getBeats () {return getBeatsAt(playbackPosition.asSeconds());}; float getBeatsAt (float seconds) {return ((seconds+fumen.offset)/60.f)* fumen.BPM;}; float getCurrentTick () {return getTicksAt(playbackPosition.asSeconds());}; float getTicksAt (float seconds) {return getBeatsAt(seconds) * getResolution();} float getSecondsAt (int tick) {return (60.f * tick)/(fumen.BPM * getResolution()) - fumen.offset;}; int getResolution () {return chart ? chart->ref.getResolution() : 240;}; int getSnapStep () {return getResolution() / snap;}; float ticksToSeconds (int ticks) {return (60.f * ticks)/(fumen.BPM * getResolution());}; float getChartRuntime () {return previewEnd.asSeconds() + fumen.offset;}; void reloadFromFumen(); void reloadMusic(); void reloadPlaybackPositionAndPreviewEnd(); void reloadAlbumCover(); bool showPlayfield = true; bool showProperties; bool showStatus; bool showPlaybackStatus = true; bool showTimeline = true; bool showChartList; bool showNewChartDialog; bool showChartProperties; bool showHistory; bool showSoundSettings; bool showLinearView; void displayPlayfield(Marker& marker, MarkerEndingState markerEndingState); void displayLongNote(const Note& note, int& ImGuiIndex, Marker& marker, MarkerEndingState& markerEndingState); void displayProperties(); void displayStatus(); void displayPlaybackStatus(); void displayTimeline(); void displayChartList(); void displayLinearView(); void alertSaveChanges(sf::Window& window); void updateVisibleNotes(); std::set visibleNotes; void toggleNoteAtCurrentTime(int pos); }; namespace ESHelper { void save(EditorState& ed); void open(std::optional& ed); void openFromFile(std::optional& ed, std::filesystem::path path); class NewChartDialog { public: std::optional display(EditorState& editorState); void resetValues() {level = 1; resolution = 240; difficulty = ""; comboPreview = ""; showCustomDifName = false;}; private: int level = 1; int resolution = 240; std::string difficulty; std::string comboPreview; bool showCustomDifName = false; }; class ChartPropertiesDialog { public: void display(EditorState& editorState); bool shouldRefreshValues = true; private: int level; std::string difficulty_name; std::string comboPreview; std::set difNamesInUse; bool showCustomDifName = false; }; } #endif //FEIS_EDITORSTATE_H