diff --git a/CMakeLists.txt b/CMakeLists.txt index 8bb3df6..074b90d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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" diff --git a/Hardware/3rdparty/bugui b/Hardware/3rdparty/bugui index dfa356a..586572a 160000 --- a/Hardware/3rdparty/bugui +++ b/Hardware/3rdparty/bugui @@ -1 +1 @@ -Subproject commit dfa356a6fe5d8fd215fae4e59d0b662938b17d7b +Subproject commit 586572a187266d3752e735774a6de62e1463af27 diff --git a/Hardware/Controller.cpp b/Hardware/Controller.cpp index ab81a8b..054fb8f 100644 --- a/Hardware/Controller.cpp +++ b/Hardware/Controller.cpp @@ -17,9 +17,7 @@ Controller::Controller(const score::DocumentContext& document, { auto scnr = qobject_cast(&*interval.processes.begin()); - if (scnr) - bugui::container_widget::children.emplace_back( - std::make_unique(this, scnr)); + if (scnr) add_widget(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(); } } diff --git a/Hardware/Widgets/IntervalWidget.cpp b/Hardware/Widgets/IntervalWidget.cpp index 61c79da..ac72046 100644 --- a/Hardware/Widgets/IntervalWidget.cpp +++ b/Hardware/Widgets/IntervalWidget.cpp @@ -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(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; } diff --git a/Hardware/Widgets/IntervalWidget.hpp b/Hardware/Widgets/IntervalWidget.hpp index b24ecac..57dd3df 100644 --- a/Hardware/Widgets/IntervalWidget.hpp +++ b/Hardware/Widgets/IntervalWidget.hpp @@ -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; diff --git a/Hardware/Widgets/ScenarioWidget.cpp b/Hardware/Widgets/ScenarioWidget.cpp index 5ab431b..5a623b4 100644 --- a/Hardware/Widgets/ScenarioWidget.cpp +++ b/Hardware/Widgets/ScenarioWidget.cpp @@ -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(this, s)); + add_widget(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(this, interval)); + add_widget(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(w.get()); diff --git a/Hardware/Widgets/ScenarioWidget.hpp b/Hardware/Widgets/ScenarioWidget.hpp index 08abcec..c6a8f51 100644 --- a/Hardware/Widgets/ScenarioWidget.hpp +++ b/Hardware/Widgets/ScenarioWidget.hpp @@ -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; diff --git a/Hardware/Widgets/StateWidget.cpp b/Hardware/Widgets/StateWidget.cpp new file mode 100644 index 0000000..914b7ca --- /dev/null +++ b/Hardware/Widgets/StateWidget.cpp @@ -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(parent->height())); + + return true; +} + +const Scenario::StateModel& StateWidget::get_model() const +{ + return model; +} + +} diff --git a/Hardware/Widgets/StateWidget.hpp b/Hardware/Widgets/StateWidget.hpp new file mode 100644 index 0000000..b7a9b94 --- /dev/null +++ b/Hardware/Widgets/StateWidget.hpp @@ -0,0 +1,33 @@ +#pragma once + +#include +#include +#include + +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 +