mirror of
https://github.com/Mr-Wiseguy/Zelda64Recomp.git
synced 2025-02-15 19:19:19 +01:00
Restore spacer animations.
This commit is contained in:
parent
1f77670d67
commit
fdb97a4df3
@ -137,6 +137,60 @@ void ModEntryButton::process_event(const Event& e) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ModEntrySpacer
|
||||||
|
|
||||||
|
void ModEntrySpacer::check_height_distance() {
|
||||||
|
constexpr float tolerance = 0.01f;
|
||||||
|
if (abs(target_height - height) < tolerance) {
|
||||||
|
height = target_height;
|
||||||
|
set_height(height, Unit::Dp);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
queue_update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ModEntrySpacer::process_event(const Event &e) {
|
||||||
|
switch (e.type) {
|
||||||
|
case EventType::Update: {
|
||||||
|
std::chrono::high_resolution_clock::duration now = ultramodern::time_since_start();
|
||||||
|
float delta_time = std::chrono::duration<float>(now - last_time).count();
|
||||||
|
constexpr float dp_speed = 1000.0f;
|
||||||
|
last_time = now;
|
||||||
|
|
||||||
|
if (target_height < height) {
|
||||||
|
height += std::max(-dp_speed * delta_time, target_height - height);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
height += std::min(dp_speed * delta_time, target_height - height);
|
||||||
|
}
|
||||||
|
|
||||||
|
set_height(height, Unit::Dp);
|
||||||
|
check_height_distance();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ModEntrySpacer::ModEntrySpacer(Element *parent) : Element(parent) {
|
||||||
|
// Do nothing.
|
||||||
|
}
|
||||||
|
|
||||||
|
void ModEntrySpacer::set_target_height(float target_height, bool animate_to_target) {
|
||||||
|
this->target_height = target_height;
|
||||||
|
|
||||||
|
if (animate_to_target) {
|
||||||
|
last_time = ultramodern::time_since_start();
|
||||||
|
check_height_distance();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
height = target_height;
|
||||||
|
set_height(target_height, Unit::Dp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ModMenu
|
// ModMenu
|
||||||
|
|
||||||
void ModMenu::refresh_mods() {
|
void ModMenu::refresh_mods() {
|
||||||
@ -188,6 +242,7 @@ void ModMenu::mod_selected(uint32_t mod_index) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ModMenu::mod_dragged(uint32_t mod_index, EventDrag drag) {
|
void ModMenu::mod_dragged(uint32_t mod_index, EventDrag drag) {
|
||||||
|
constexpr float spacer_height = 110.0f;
|
||||||
switch (drag.phase) {
|
switch (drag.phase) {
|
||||||
case DragPhase::Start: {
|
case DragPhase::Start: {
|
||||||
for (size_t i = 0; i < mod_entry_buttons.size(); i++) {
|
for (size_t i = 0; i < mod_entry_buttons.size(); i++) {
|
||||||
@ -215,8 +270,7 @@ void ModMenu::mod_dragged(uint32_t mod_index, EventDrag drag) {
|
|||||||
mod_drag_view_coordinates[1] = top;
|
mod_drag_view_coordinates[1] = top;
|
||||||
|
|
||||||
mod_drag_target_index = mod_index;
|
mod_drag_target_index = mod_index;
|
||||||
mod_drag_spacer_height = height;
|
mod_entry_spacers[mod_drag_target_index]->set_target_height(spacer_height, false);
|
||||||
mod_entry_spacers[mod_drag_target_index]->set_height(mod_drag_spacer_height, Unit::Px);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DragPhase::Move: {
|
case DragPhase::Move: {
|
||||||
@ -239,8 +293,8 @@ void ModMenu::mod_dragged(uint32_t mod_index, EventDrag drag) {
|
|||||||
mod_entry_floating_view->set_left(mod_drag_view_coordinates[0] + delta_x, Unit::Px);
|
mod_entry_floating_view->set_left(mod_drag_view_coordinates[0] + delta_x, Unit::Px);
|
||||||
mod_entry_floating_view->set_top(mod_drag_view_coordinates[1] + delta_y, Unit::Px);
|
mod_entry_floating_view->set_top(mod_drag_view_coordinates[1] + delta_y, Unit::Px);
|
||||||
if (mod_drag_target_index != new_index) {
|
if (mod_drag_target_index != new_index) {
|
||||||
mod_entry_spacers[mod_drag_target_index]->set_height(0.0f, Unit::Px);
|
mod_entry_spacers[mod_drag_target_index]->set_target_height(0.0f, true);
|
||||||
mod_entry_spacers[new_index]->set_height(mod_drag_spacer_height, Unit::Px);
|
mod_entry_spacers[new_index]->set_target_height(spacer_height, true);
|
||||||
mod_drag_target_index = new_index;
|
mod_drag_target_index = new_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -250,7 +304,7 @@ void ModMenu::mod_dragged(uint32_t mod_index, EventDrag drag) {
|
|||||||
// Dragging has ended, hide the floating view.
|
// Dragging has ended, hide the floating view.
|
||||||
mod_entry_buttons[mod_index]->set_display(Display::Block);
|
mod_entry_buttons[mod_index]->set_display(Display::Block);
|
||||||
mod_entry_buttons[mod_index]->set_selected(false);
|
mod_entry_buttons[mod_index]->set_selected(false);
|
||||||
mod_entry_spacers[mod_drag_target_index]->set_height(0.0f, Unit::Px);
|
mod_entry_spacers[mod_drag_target_index]->set_target_height(0.0f, false);
|
||||||
mod_entry_floating_view->set_display(Display::None);
|
mod_entry_floating_view->set_display(Display::None);
|
||||||
|
|
||||||
// Result needs a small substraction when dragging downwards.
|
// Result needs a small substraction when dragging downwards.
|
||||||
@ -368,7 +422,7 @@ void ModMenu::create_mod_list() {
|
|||||||
loaded_thumbnails.emplace(thumbnail_name);
|
loaded_thumbnails.emplace(thumbnail_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
Element *spacer = context.create_element<Element>(list_scroll_container);
|
ModEntrySpacer *spacer = context.create_element<ModEntrySpacer>(list_scroll_container);
|
||||||
mod_entry_spacers.emplace_back(spacer);
|
mod_entry_spacers.emplace_back(spacer);
|
||||||
|
|
||||||
ModEntryButton *mod_entry = context.create_element<ModEntryButton>(list_scroll_container, mod_index);
|
ModEntryButton *mod_entry = context.create_element<ModEntryButton>(list_scroll_container, mod_index);
|
||||||
@ -380,7 +434,7 @@ void ModMenu::create_mod_list() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Add one extra spacer at the bottom.
|
// Add one extra spacer at the bottom.
|
||||||
Element *spacer = context.create_element<Element>(list_scroll_container);
|
ModEntrySpacer *spacer = context.create_element<ModEntrySpacer>(list_scroll_container);
|
||||||
mod_entry_spacers.emplace_back(spacer);
|
mod_entry_spacers.emplace_back(spacer);
|
||||||
|
|
||||||
mod_entry_middles.resize(mod_entry_buttons.size());
|
mod_entry_middles.resize(mod_entry_buttons.size());
|
||||||
|
@ -37,7 +37,7 @@ public:
|
|||||||
void set_mod_thumbnail(const std::string &thumbnail);
|
void set_mod_thumbnail(const std::string &thumbnail);
|
||||||
void set_selected(bool selected);
|
void set_selected(bool selected);
|
||||||
protected:
|
protected:
|
||||||
virtual void process_event(const Event &e);
|
virtual void process_event(const Event &e) override;
|
||||||
private:
|
private:
|
||||||
uint32_t mod_index = 0;
|
uint32_t mod_index = 0;
|
||||||
ModEntryView *view = nullptr;
|
ModEntryView *view = nullptr;
|
||||||
@ -45,6 +45,20 @@ private:
|
|||||||
std::function<void(uint32_t, EventDrag)> drag_callback = nullptr;
|
std::function<void(uint32_t, EventDrag)> drag_callback = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class ModEntrySpacer : public Element {
|
||||||
|
private:
|
||||||
|
float height = 0.0f;
|
||||||
|
float target_height = 0.0f;
|
||||||
|
std::chrono::high_resolution_clock::duration last_time;
|
||||||
|
|
||||||
|
void check_height_distance();
|
||||||
|
protected:
|
||||||
|
virtual void process_event(const Event &e) override;
|
||||||
|
public:
|
||||||
|
ModEntrySpacer(Element *parent);
|
||||||
|
void set_target_height(float target_height, bool animate_to_target);
|
||||||
|
};
|
||||||
|
|
||||||
class ModMenu : public Element {
|
class ModMenu : public Element {
|
||||||
public:
|
public:
|
||||||
ModMenu(Element *parent);
|
ModMenu(Element *parent);
|
||||||
@ -70,13 +84,12 @@ private:
|
|||||||
Button *mods_folder_button = nullptr;
|
Button *mods_folder_button = nullptr;
|
||||||
int32_t active_mod_index = -1;
|
int32_t active_mod_index = -1;
|
||||||
std::vector<ModEntryButton *> mod_entry_buttons;
|
std::vector<ModEntryButton *> mod_entry_buttons;
|
||||||
std::vector<Element *> mod_entry_spacers;
|
std::vector<ModEntrySpacer *> mod_entry_spacers;
|
||||||
std::vector<float> mod_entry_middles;
|
std::vector<float> mod_entry_middles;
|
||||||
ModEntryView *mod_entry_floating_view = nullptr;
|
ModEntryView *mod_entry_floating_view = nullptr;
|
||||||
float mod_drag_start_coordinates[2] = {};
|
float mod_drag_start_coordinates[2] = {};
|
||||||
float mod_drag_view_coordinates[2] = {};
|
float mod_drag_view_coordinates[2] = {};
|
||||||
uint32_t mod_drag_target_index = 0;
|
uint32_t mod_drag_target_index = 0;
|
||||||
float mod_drag_spacer_height = 0.0f;
|
|
||||||
std::vector<recomp::mods::ModDetails> mod_details{};
|
std::vector<recomp::mods::ModDetails> mod_details{};
|
||||||
std::unordered_set<std::string> loaded_thumbnails;
|
std::unordered_set<std::string> loaded_thumbnails;
|
||||||
std::string game_mod_id;
|
std::string game_mod_id;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user