[widgets] varius updates + widget ofset

This commit is contained in:
thibaud keller 2025-01-03 23:27:19 +00:00
parent d52e74eb27
commit 3255c144d1
9 changed files with 153 additions and 39 deletions

View file

@ -24,6 +24,7 @@ set(HDRS
"Hardware/ApplicationPlugin.hpp"
"Hardware/Widgets/ScenarioWidget.hpp"
"Hardware/Widgets/StateWidget.hpp"
"Hardware/Widgets/IntervalWidget.hpp"
"score_addon_hardware.hpp"
@ -39,6 +40,7 @@ set(SRCS
"${CMAKE_CURRENT_SOURCE_DIR}/Hardware/ApplicationPlugin.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/Hardware/Widgets/ScenarioWidget.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/Hardware/Widgets/StateWidget.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/Hardware/Widgets/IntervalWidget.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/score_addon_hardware.cpp"

@ -1 +1 @@
Subproject commit dfa356a6fe5d8fd215fae4e59d0b662938b17d7b
Subproject commit 586572a187266d3752e735774a6de62e1463af27

View file

@ -17,9 +17,7 @@ Controller::Controller(const score::DocumentContext& document,
{
auto scnr = qobject_cast<Scenario::ProcessModel*>(&*interval.processes.begin());
if (scnr)
bugui::container_widget::children.emplace_back(
std::make_unique<ScenarioWidget>(this, scnr));
if (scnr) add_widget<ScenarioWidget>(scnr);
update();
}
@ -47,65 +45,74 @@ void Controller::on_shift(bool pressed)
void Controller::on_up(bool pressed)
{
if (!pressed) return;
if (m_shift)
{
v_scale += .2;
vertical_scale += .2;
update();
}
else
{
v_ofset += .02;
if (vertical_ofset > -1) return;
vertical_ofset += 1;
update();
}
}
void Controller::on_down(bool pressed)
{
if (!pressed) return;
if (m_shift)
{
if (v_scale > .2)
if (vertical_scale > .2)
{
v_scale -= .2;
vertical_scale -= .2;
update();
}
}
else
{
v_ofset -= .02;
vertical_ofset -= 1;
update();
}
}
void Controller::on_left(bool pressed)
{
if (!pressed) return;
if (m_shift)
{
if (h_scale > .02)
if (horizontal_scale > .02)
{
h_scale -= .02;
horizontal_scale -= .02;
update();
}
}
else
{
if (h_ofset > 0)
{
h_ofset -= .02;
update();
}
if (horizontal_ofset > -1) return;
horizontal_ofset += 1;
update();
}
}
void Controller::on_right(bool pressed)
{
if (!pressed) return;
if (m_shift)
{
h_scale += .02;
horizontal_scale += .02;
update();
}
else
{
h_ofset += .02;
horizontal_ofset -= 1;
update();
}
}

View file

@ -2,13 +2,12 @@
namespace Hardware
{
IntervalWidget::IntervalWidget(container_widget *parent,
Scenario::IntervalModel& interval)
IntervalWidget::IntervalWidget(Scenario::IntervalModel& interval,
container_widget* parent)
: bugui::container_widget{parent}
, model{interval}
, skin{Process::Style::instance()}
{
}
{ }
int IntervalWidget::x() const
{
@ -34,7 +33,7 @@ void IntervalWidget::paint(bugui::painter& painter) const
painter.draw_line({x(), y()}, {x() + width(), y()});
}
bool IntervalWidget::is_inside(int px, int py) const
bool IntervalWidget::contains(int px, int py) const
{
if (px >= x() &&
px <= (x() + width()) &&
@ -46,7 +45,7 @@ bool IntervalWidget::is_inside(int px, int py) const
bool IntervalWidget::on_press(int x, int y, bool pressed)
{
if (!is_inside(x, y)) return false;
if (!contains(x, y)) return false;
qDebug() << "is inside!";
@ -55,7 +54,7 @@ bool IntervalWidget::on_press(int x, int y, bool pressed)
bool IntervalWidget::on_double_press(int x, int y)
{
if (!is_inside(x, y)) return false;
if (!contains(x, y)) return false;
qDebug() << "double pressed !";
@ -64,7 +63,7 @@ bool IntervalWidget::on_double_press(int x, int y)
bool IntervalWidget::on_drag(int from_x, int from_y, int to_x, int to_y)
{
if (!is_inside(from_x, from_y)) return false;
if (!contains(from_x, from_y)) return false;
if (from_y != to_y)
model.requestHeightChange(to_y / static_cast<double>(parent->height()));
@ -72,7 +71,7 @@ bool IntervalWidget::on_drag(int from_x, int from_y, int to_x, int to_y)
return true;
}
const Scenario::IntervalModel &IntervalWidget::get_model() const
const Scenario::IntervalModel& IntervalWidget::get_model() const
{
return model;
}

View file

@ -8,8 +8,8 @@ namespace Hardware
{
struct IntervalWidget final : bugui::container_widget
{
explicit IntervalWidget(container_widget* parent,
Scenario::IntervalModel& interval);
explicit IntervalWidget(Scenario::IntervalModel& interval,
container_widget* parent);
void paint(bugui::painter& painter) const override;
bool on_press(int x, int y, bool pressed) override;
@ -23,7 +23,7 @@ struct IntervalWidget final : bugui::container_widget
const Scenario::IntervalModel& get_model() const;
protected:
bool is_inside(int px, int py) const override;
bool contains(int px, int py) const override;
private:
Scenario::IntervalModel& model;

View file

@ -3,8 +3,8 @@
namespace Hardware
{
ScenarioWidget::ScenarioWidget(bugui::container_widget* parent,
Scenario::ProcessModel* scenario)
ScenarioWidget::ScenarioWidget(Scenario::ProcessModel* scenario,
bugui::container_widget* parent)
: bugui::container_widget{parent}
, model{scenario}
{
@ -16,7 +16,7 @@ ScenarioWidget::ScenarioWidget(bugui::container_widget* parent,
[this] { update(); });
for(Scenario::IntervalModel& s : model->intervals)
bugui::container_widget::children.emplace_back(std::make_unique<IntervalWidget>(this, s));
add_widget<IntervalWidget>(s);
}
int ScenarioWidget::x() const
@ -26,7 +26,7 @@ int ScenarioWidget::x() const
int ScenarioWidget::y() const
{
return bugui::base_widget::parent->x();
return bugui::base_widget::parent->y();
}
int ScenarioWidget::width() const
@ -41,14 +41,13 @@ int ScenarioWidget::height() const
void ScenarioWidget::on_interval_added(Scenario::IntervalModel& interval)
{
bugui::container_widget::children.emplace_back(std::make_unique<IntervalWidget>(this, interval));
add_widget<IntervalWidget>(interval);
update();
}
void ScenarioWidget::on_interval_removed(const Scenario::IntervalModel& interval)
{
std::erase_if(bugui::container_widget::children,
[&interval]
remove_widget([&interval]
(const auto& w)
{
auto ntrvl = static_cast<IntervalWidget*>(w.get());

View file

@ -14,8 +14,8 @@ class ScenarioWidget final
W_OBJECT(ScenarioWidget)
public:
explicit ScenarioWidget(bugui::container_widget* parent,
Scenario::ProcessModel* scenario);
explicit ScenarioWidget(Scenario::ProcessModel* scenario,
bugui::container_widget* parent);
int x() const override;
int y() const override;

View file

@ -0,0 +1,74 @@
#include "StateWidget.hpp"
namespace Hardware
{
StateWidget::StateWidget(Scenario::StateModel& state,
container_widget* parent)
: bugui::container_widget{parent}
, model{state}
, skin{Process::Style::instance()}
{ }
int StateWidget::x() const
{
return parent->x();
}
int StateWidget::y() const
{
return model.heightPercentage() * parent->height();
}
void StateWidget::paint(bugui::painter& painter) const
{
// 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()});
}
bool StateWidget::contains(int px, int py) const
{
if (px >= x() &&
px <= (x() + width()) &&
py == y())
return true;
return false;
}
bool StateWidget::on_press(int x, int y, bool pressed)
{
if (!contains(x, y)) return false;
qDebug() << "is inside!";
return true;
}
bool StateWidget::on_double_press(int x, int y)
{
if (!contains(x, y)) return false;
qDebug() << "double pressed !";
return true;
}
bool StateWidget::on_drag(int from_x, int from_y, int to_x, int to_y)
{
if (!contains(from_x, from_y)) return false;
if (from_y != to_y)
model.setHeightPercentage(to_y / static_cast<double>(parent->height()));
return true;
}
const Scenario::StateModel& StateWidget::get_model() const
{
return model;
}
}

View file

@ -0,0 +1,33 @@
#pragma once
#include <Scenario/Document/State/StateModel.hpp>
#include <Process/Style/ScenarioStyle.hpp>
#include <widgets/container_widget.hpp>
namespace Hardware
{
struct StateWidget final : bugui::container_widget
{
explicit StateWidget(Scenario::StateModel& state,
container_widget* parent);
void paint(bugui::painter& painter) const override;
bool on_press(int x, int y, bool pressed) override;
bool on_double_press(int x, int y) override;
bool on_drag(int from_x, int from_y, int to_x, int to_y) override;
int x() const override;
int y() const override;
const Scenario::StateModel& get_model() const;
protected:
bool contains(int px, int py) const override;
private:
Scenario::StateModel& model;
const Process::Style& skin;
};
} //namespace Hardware