[widgets] first step towards widget system

This commit is contained in:
thibaud keller 2024-12-27 11:04:40 +00:00
parent 62e2e2539f
commit 89f1c2af32
6 changed files with 117 additions and 22 deletions

View file

@ -22,6 +22,7 @@ set(HDRS
"Hardware/Controller.hpp" "Hardware/Controller.hpp"
"Hardware/DocumentPlugin.hpp" "Hardware/DocumentPlugin.hpp"
"Hardware/ApplicationPlugin.hpp" "Hardware/ApplicationPlugin.hpp"
"Hardware/IntervalWidget.hpp"
"score_addon_hardware.hpp" "score_addon_hardware.hpp"
) )
@ -34,6 +35,7 @@ set(SRCS
"${CMAKE_CURRENT_SOURCE_DIR}/Hardware/Controller.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Hardware/Controller.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/Hardware/DocumentPlugin.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Hardware/DocumentPlugin.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/Hardware/ApplicationPlugin.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/Hardware/ApplicationPlugin.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/Hardware/IntervalWidget.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/score_addon_hardware.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/score_addon_hardware.cpp"
) )

@ -1 +1 @@
Subproject commit 5641128efec62c92f12ff5082f2bee505c502a17 Subproject commit d804bdf0e95b507a081b701bdf4730c518889304

View file

@ -4,6 +4,7 @@
#include <Process/Style/ScenarioStyle.hpp> #include <Process/Style/ScenarioStyle.hpp>
#include "Controller.hpp" #include "Controller.hpp"
#include "Hardware/IntervalWidget.hpp"
namespace Hardware namespace Hardware
{ {
@ -19,12 +20,33 @@ Controller::Controller(const score::DocumentContext& document,
// src/plugins/score-plugin-scenario/Scenario/Process/MiniScenarioView.cpp#18 // src/plugins/score-plugin-scenario/Scenario/Process/MiniScenarioView.cpp#18
auto scnr = qobject_cast<Scenario::ProcessModel*>(&*interval.processes.begin()); auto scnr = qobject_cast<Scenario::ProcessModel*>(&*interval.processes.begin());
scnr->intervals.added.connect<&Controller::on_interval_changed>(this); scnr->intervals.mutable_added.connect<&Controller::on_interval_added>(this);
scnr->intervals.removed.connect<&Controller::on_interval_changed>(this); scnr->intervals.removed.connect<&Controller::on_interval_removed>(this);
connect(scnr, connect(scnr,
&Scenario::ProcessModel::intervalMoved, &Scenario::ProcessModel::intervalMoved,
[this] { update(); }); [this] { update(); });
for(Scenario::IntervalModel& c : scnr->intervals)
widgets.emplace_back(std::make_unique<IntervalWidget>(this, interval));
update();
}
void Controller::on_interval_added(Scenario::IntervalModel &interval)
{
widgets.emplace_back(std::make_unique<IntervalWidget>(this, interval));
update();
}
void Controller::on_interval_removed(const Scenario::IntervalModel& interval)
{
std::erase_if(widgets,
[&interval]
(auto& w)
{ return static_cast<IntervalWidget*>(w.get())->get_model().id() == interval.id(); });
update();
} }
void Controller::on_interval_changed(const Scenario::IntervalModel &) void Controller::on_interval_changed(const Scenario::IntervalModel &)
@ -32,25 +54,25 @@ void Controller::on_interval_changed(const Scenario::IntervalModel&)
update(); update();
} }
void Controller::paint(bugui::painter& painter) const void Controller::paint(bugui::painter& painter)
{ {
// Copied from MiniscenarioView // // Copied from MiniscenarioView
auto& skin = Process::Style::instance(); // auto& skin = Process::Style::instance();
const auto col = skin.IntervalBase().color(); // const auto col = skin.IntervalBase().color();
painter.set_color(col.red(), col.green(), col.blue(), col.alpha()); // painter.set_color(col.red(), col.green(), col.blue(), col.alpha());
auto scnr = qobject_cast<Scenario::ProcessModel*>(&*interval->processes.begin()); // auto scnr = qobject_cast<Scenario::ProcessModel*>(&*interval->processes.begin());
for(const Scenario::IntervalModel& c : scnr->intervals) // for(const Scenario::IntervalModel& c : scnr->intervals)
{ // {
int def = c.duration.defaultDuration().sec(); // int def = c.duration.defaultDuration().sec();
// auto def = c.duration.defaultDuration().sec() * h_zoom; // // auto def = c.duration.defaultDuration().sec() * h_zoom;
int st = c.date().sec() - h_ofset; // int st = c.date().sec() - h_ofset;
// auto st = (c.date().sec() * h_zoom) - h_ofset; // // auto st = (c.date().sec() * h_zoom) - h_ofset;
int y = (c.heightPercentage() * height()) + v_ofset; // int y = (c.heightPercentage() * height()) + v_ofset;
// auto y = (c.heightPercentage() * v_zoom) + v_ofset; // // auto y = (c.heightPercentage() * v_zoom) + v_ofset;
painter.draw_line({st, y}, {st + def, y}); // painter.draw_line({st, y}, {st + def, y});
} // }
} }
void Controller::on_grid(float x, float y, bool pressed) void Controller::on_grid(float x, float y, bool pressed)

View file

@ -21,7 +21,7 @@ public:
Scenario::IntervalModel& interval, Scenario::IntervalModel& interval,
std::string_view device_name); std::string_view device_name);
void paint(bugui::painter& painter) const override; void paint(bugui::painter& painter) override;
void on_play(bool pressed); void on_play(bool pressed);
void on_stop(bool pressed); void on_stop(bool pressed);
@ -34,6 +34,8 @@ public:
void on_grid(float x, float y, bool pressed); void on_grid(float x, float y, bool pressed);
private: private:
void on_interval_added(Scenario::IntervalModel& interval);
void on_interval_removed(const Scenario::IntervalModel &interval);
void on_interval_changed(const Scenario::IntervalModel &); void on_interval_changed(const Scenario::IntervalModel &);
Scenario::IntervalModel* interval; Scenario::IntervalModel* interval;

View file

@ -0,0 +1,42 @@
#include "IntervalWidget.hpp"
namespace Hardware
{
IntervalWidget::IntervalWidget(base_widget* parent,
Scenario::IntervalModel& interval)
: bugui::base_widget{parent}
, model{interval}
, skin{Process::Style::instance()}
{
}
int IntervalWidget::x() const
{
return model.date().sec();
}
int IntervalWidget::y() const
{
return model.heightPercentage() * parent->height();
}
int IntervalWidget::width() const
{
return model.duration.defaultDuration().sec();
}
void IntervalWidget::paint(bugui::painter& painter)
{
// Copied from MiniscenarioView
const auto col = skin.IntervalBase().color();
painter.set_color(col.red(), col.green(), col.blue(), col.alpha());
painter.draw_line({x(), y()}, {x() + width(), y()});
}
const Scenario::IntervalModel &IntervalWidget::get_model() const
{
return model;
}
} // namespace hardware

View file

@ -0,0 +1,27 @@
#pragma once
#include <Scenario/Document/Interval/IntervalModel.hpp>
#include <Process/Style/ScenarioStyle.hpp>
#include <base_widget.hpp>
namespace Hardware
{
struct IntervalWidget : bugui::base_widget
{
explicit IntervalWidget(base_widget* parent,
Scenario::IntervalModel& interval);
int x() const override;
int y() const override;
int width() const override;
void paint(bugui::painter& painter) override;
const Scenario::IntervalModel& get_model() const;
private:
Scenario::IntervalModel& model;
const Process::Style& skin;
};
} // namespace Hardware