2022-03-02 23:59:19 +01:00
|
|
|
#pragma once
|
2019-03-28 02:17:15 +01:00
|
|
|
|
2022-03-26 00:23:13 +01:00
|
|
|
#include <filesystem>
|
|
|
|
#include <optional>
|
|
|
|
#include <variant>
|
|
|
|
#include <utility>
|
|
|
|
|
2022-03-17 02:50:30 +01:00
|
|
|
#include "better_note.hpp"
|
2022-03-23 02:20:07 +01:00
|
|
|
#include "better_notes.hpp"
|
2022-03-16 02:10:18 +01:00
|
|
|
#include "better_song.hpp"
|
2022-03-26 00:23:13 +01:00
|
|
|
#include "generic_interval.hpp"
|
2021-12-31 14:59:39 +01:00
|
|
|
#include "history.hpp"
|
2021-12-31 00:57:06 +01:00
|
|
|
#include "notes_clipboard.hpp"
|
2022-03-27 03:32:13 +02:00
|
|
|
#include "notifications_queue.hpp"
|
2021-12-31 00:57:06 +01:00
|
|
|
#include "widgets/density_graph.hpp"
|
2019-04-06 22:35:17 +02:00
|
|
|
|
2022-03-23 02:20:07 +01:00
|
|
|
using TapNotePair = std::pair<better::TapNote, better::TapNote>;
|
2022-01-04 01:31:17 +01:00
|
|
|
|
2022-03-27 03:32:13 +02:00
|
|
|
enum class NotesToggle {
|
|
|
|
Inserted,
|
|
|
|
Removed
|
|
|
|
};
|
|
|
|
|
2022-03-16 02:10:18 +01:00
|
|
|
struct ChartState {
|
2022-03-24 01:42:41 +01:00
|
|
|
ChartState(better::Chart& c, const std::string& name, std::filesystem::path assets);
|
2022-03-16 02:10:18 +01:00
|
|
|
better::Chart& chart;
|
2022-03-24 01:42:41 +01:00
|
|
|
const std::string& difficulty_name;
|
2022-03-27 03:32:13 +02:00
|
|
|
|
|
|
|
void cut(NotificationsQueue& nq);
|
|
|
|
void copy(NotificationsQueue& nq);
|
2022-04-06 15:47:04 +02:00
|
|
|
void paste(Fraction at_beat, NotificationsQueue& nq);
|
2022-03-27 03:32:13 +02:00
|
|
|
void delete_(NotificationsQueue& nq);
|
|
|
|
|
2022-04-04 04:30:02 +02:00
|
|
|
Interval<Fraction> visible_beats(const sf::Time& playback_position, const better::Timing& timing);
|
|
|
|
void update_visible_notes(const sf::Time& playback_position, const better::Timing& timing);
|
2022-04-14 00:13:38 +02:00
|
|
|
better::Notes visible_notes;
|
2022-03-27 03:32:13 +02:00
|
|
|
|
2022-04-04 04:30:02 +02:00
|
|
|
void toggle_note(
|
|
|
|
const sf::Time& playback_position,
|
|
|
|
std::uint64_t snap,
|
|
|
|
const better::Position& button,
|
|
|
|
const better::Timing& timing
|
|
|
|
);
|
2022-03-27 03:32:13 +02:00
|
|
|
|
2022-03-23 02:20:07 +01:00
|
|
|
better::Notes selected_notes;
|
2022-03-16 02:10:18 +01:00
|
|
|
NotesClipboard notes_clipboard;
|
2022-04-04 04:30:02 +02:00
|
|
|
|
|
|
|
void handle_time_selection_tab(Fraction beats);
|
2022-03-26 00:23:13 +01:00
|
|
|
std::optional<Interval<Fraction>> time_selection;
|
2022-03-23 02:20:07 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
The long note currently being created, represented as a pair of tap notes.
|
|
|
|
Time span of the represented long note is the span between both taps
|
|
|
|
1st note's position defines the long note's position
|
|
|
|
2nd note's position suggests where the tail should start
|
|
|
|
*/
|
|
|
|
std::optional<TapNotePair> long_note_being_created;
|
|
|
|
|
|
|
|
// Is the user currently holding right click ? (over the playfield or not)
|
2022-03-16 02:10:18 +01:00
|
|
|
bool creating_long_note;
|
2022-04-09 00:54:06 +02:00
|
|
|
History history;
|
2022-03-16 02:10:18 +01:00
|
|
|
DensityGraph density_graph;
|
2019-03-28 02:17:15 +01:00
|
|
|
};
|
2022-03-23 02:20:07 +01:00
|
|
|
|
|
|
|
/*
|
2022-03-25 02:20:22 +01:00
|
|
|
Construct a note to be displayed on the playfield as a preview of the long note
|
|
|
|
currently being created. It's basically the same at the real long note being
|
|
|
|
created but its start time is set to exactly the (given) current beat so the
|
|
|
|
long note drawing routine of the playfield can be repurposed as-is for the
|
|
|
|
preview
|
2022-03-23 02:20:07 +01:00
|
|
|
*/
|
|
|
|
better::LongNote make_long_note_dummy(
|
|
|
|
Fraction current_beat,
|
|
|
|
const TapNotePair& long_note_being_created
|
|
|
|
);
|
|
|
|
|
|
|
|
// Turn the tap pair into the real long note the user wants to create
|
|
|
|
better::LongNote make_long_note(const TapNotePair& long_note_being_created);
|
|
|
|
|
|
|
|
better::Position closest_tail_position(
|
|
|
|
const better::Position& anchor,
|
|
|
|
const better::Position& requested_tail
|
|
|
|
);
|
|
|
|
|
|
|
|
better::Position smallest_possible_tail(const better::Position& anchor);
|