Skip to content

Commit

Permalink
GUI2/Loading Screen: improved animation
Browse files Browse the repository at this point in the history
  • Loading branch information
Vultraz committed Jan 24, 2021
1 parent 673937d commit 454bed9
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 29 deletions.
46 changes: 38 additions & 8 deletions data/gui/window/loadscreen.cfg
Expand Up @@ -78,13 +78,14 @@
[image]
definition = "logo"
label = "misc/logo-bg.png"
#label = "wesnoth-logo-256.png"
[/image]

[/column]

[/row]

{GUI_FILLER_ROW HEIGHT=30}
{GUI_FILLER_ROW HEIGHT=25}

[row]
grow_factor = 0
Expand Down Expand Up @@ -114,15 +115,44 @@
grow_factor = 1
border = "all"
border_size = 5
horizontal_grow = true
horizontal_alignment = "center"
vertical_alignment = "center"

[label]
text_alignment = "center"
definition = "default_large"
id = "test_animation"
label = " "
[/label]
[drawing]
definition = "default"
id = "animation"

width = 250
height = 30

#{_WIDGET_DEBUG_BORDER}

[draw]

[text]
#
# Uses a bezier in-out easing to calculate the position of the dot each frame.
#
# First, it gets a normalized [0, 1] value based on the value of `tick` in the range [0, steps], then uses
# this value multiplied by the width of the drawing canvas (sans the width of the text, since there still
# needs to be enough horizontal space to render the dot on the last step of the loop) to get this frame's
# x-coordinate. Note that `steps` *must* be a decimal or the formula won't work.
#
# For the record, the original linear formula I came up with was:
# "(floor(jump * (tick % steps)) where jump = (width / steps) where steps = 40)"
#
x = "(round(w * (t * t * (3.0 - 2.0 * t))) where w = (width - text_width) where t = ((tick % steps) / steps) where steps = 40.0)"
y = 0
w = "(text_width)"
h = "(height)"
text = ""
font_size = {GUI_FONT_SIZE_DEFAULT}
color = {GUI__FONT_COLOR_ENABLED__DEFAULT}
[/text]

[/draw]

[/drawing]

[/column]

Expand Down
26 changes: 8 additions & 18 deletions src/gui/dialogs/loading_screen.cpp
Expand Up @@ -24,16 +24,17 @@
#include "gettext.hpp"
#include "gui/auxiliary/find_widget.hpp"
#include "gui/core/timer.hpp"
#include "gui/widgets/drawing.hpp"
#include "gui/widgets/label.hpp"
#include "gui/widgets/settings.hpp"
#include "gui/widgets/window.hpp"
#include "log.hpp"
#include "preferences/general.hpp"
#include <functional>
#include "video.hpp"

#include <chrono>
#include <cstdlib>
#include <functional>

static lg::log_domain log_loadscreen("loadscreen");
#define ERR_LS LOG_STREAM(err, log_loadscreen)
Expand Down Expand Up @@ -79,22 +80,13 @@ loading_screen::loading_screen(std::function<void()> f)
, worker_result_()
, cursor_setter_()
, progress_stage_label_(nullptr)
, animation_label_(nullptr)
, animation_(nullptr)
, current_stage_(loading_stage::none)
, visible_stages_()
, animation_stages_()
, current_visible_stage_()
{
for(const auto& pair : stage_names) {
visible_stages_[pair.first] = t_string(pair.second, "wesnoth-lib") + "...";
}

animation_stages_.reserve(20);

for(int i = 0; i != 20; ++i) {
std::string s(20, ' ');
s[i] = '.';
animation_stages_.push_back(std::move(s));
for(const auto& [stage, description] : stage_names) {
visible_stages_[stage] = t_string(description, "wesnoth-lib") + "...";
}

current_visible_stage_ = visible_stages_.end();
Expand All @@ -119,7 +111,7 @@ void loading_screen::pre_show(window& window)
}

progress_stage_label_ = find_widget<label>(&window, "status", false, true);
animation_label_ = find_widget<label>(&window, "test_animation", false, true);
animation_ = find_widget<drawing>(&window, "animation", false, true);

// Add a draw callback to handle the animation, et al.
window.connect_signal<event::DRAW>(
Expand Down Expand Up @@ -168,10 +160,8 @@ void loading_screen::draw_callback()
progress_stage_label_->set_label(iter->second);
}

++animation_counter_;
if(animation_counter_ % 2 == 0) {
animation_label_->set_label(animation_stages_[(animation_counter_ / 2) % animation_stages_.size()]);
}
animation_->get_drawing_canvas().set_variable("tick", wfl::variant(animation_counter_++));
animation_->set_is_dirty(true);
}

loading_screen::~loading_screen()
Expand Down
5 changes: 2 additions & 3 deletions src/gui/dialogs/loading_screen.hpp
Expand Up @@ -63,6 +63,7 @@ enum class loading_stage

namespace gui2
{
class drawing;
class label;
class window;

Expand Down Expand Up @@ -104,14 +105,12 @@ class loading_screen : public modal_dialog, public events::pump_monitor
std::unique_ptr<cursor::setter> cursor_setter_;

label* progress_stage_label_;
label* animation_label_;
drawing* animation_;

std::atomic<loading_stage> current_stage_;

using stage_map = std::map<loading_stage, t_string>;
stage_map visible_stages_;

std::vector<t_string> animation_stages_;
stage_map::const_iterator current_visible_stage_;
};

Expand Down

0 comments on commit 454bed9

Please sign in to comment.