// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "BarGraph.hpp" namespace gui { static inline auto rectAxisLengthFrom(uint32_t numberOfRectangles) -> uint32_t { return numberOfRectangles * (style::bargraph::spacing + style::bargraph::rect_axis_length_short_medium) - style::bargraph::spacing; } void BarGraph::setPercentageValue(unsigned int value) { const auto percent = static_cast(value) / 100.0f; const auto absoluteValue = numberOfRectangles * percent; setValue(absoluteValue); } auto BarGraph::createRectangle() const -> Rect * { auto rectangle = new Rect(nullptr, 0, 0, 0, 0); rectangle->setMinimumSize(barStyle.width, barStyle.height); rectangle->setFillColor(ColorFullBlack); rectangle->setBorderColor(ColorFullBlack); rectangle->setFilled(false); rectangle->setRadius(barStyle.radius); rectangle->setPenWidth(style::window::default_border_focus_w); return rectangle; } void BarGraph::createRectangles() { for (std::uint32_t i = 0; i < numberOfRectangles; i++) { auto rectangle = createRectangle(); if ((i + 1) != numberOfRectangles) { rectangle->setMargins(barStyle.margin); } rectangles.push_back(rectangle); } } bool BarGraph::setValue(unsigned int value) { if (value > numberOfRectangles) { LOG_ERROR("Provider value greater than graph scale"); return false; } currentLevel = value; for (std::uint32_t i = 0; i < currentLevel; i++) { barStyle.fillRender(rectangles[i]); } for (std::uint32_t i = currentLevel; i < numberOfRectangles; i++) { barStyle.emptyRender(rectangles[i]); } return true; } void BarGraph::setMaximum(unsigned int value) { numberOfRectangles = value; if (currentLevel > numberOfRectangles) { currentLevel = numberOfRectangles; } } int BarGraph::getMaximum() const noexcept { return numberOfRectangles; } void BarGraph::applyBarStyle(BarGraphStyle graphStyle) { switch (graphStyle) { case BarGraphStyle::Heavy: barStyle.radius = style::bargraph::radius_medium; barStyle.fillRender = [](gui::Rect *bar) { bar->setFillColor(ColorFullBlack); }; barStyle.emptyRender = [](gui::Rect *bar) { bar->setFillColor(ColorFullWhite); }; break; case BarGraphStyle::Light: barStyle.radius = style::bargraph::radius_small; barStyle.fillRender = [](gui::Rect *bar) { bar->setBorderColor(ColorFullBlack); }; barStyle.emptyRender = [](gui::Rect *bar) { bar->setBorderColor(ColorGrey); }; break; } } VBarGraph::VBarGraph(Item *parent, Position x, Position y, uint32_t numberOfRectangles, BarGraphStyle graphStyle) : VBox(parent, x, y, style::bargraph::rect_axis_length_long_medium, rectAxisLengthFrom(numberOfRectangles)) { applyBarStyle(graphStyle); setMinimumSize(style::bargraph::rect_axis_length_long_medium, rectAxisLengthFrom(numberOfRectangles)); setEdges(RectangleEdge::None); setMaximum(numberOfRectangles); createGraph(); std::reverse(std::begin(rectangles), std::end(rectangles)); } void VBarGraph::createGraph() { if (!rectangles.empty()) { erase(); rectangles.clear(); } setMinimumHeight(rectAxisLengthFrom(numberOfRectangles)); createRectangles(); for (auto rect : rectangles) { addWidget(rect); } resizeItems(); } void VBarGraph::applyBarStyle(BarGraphStyle graphStyle) { BarGraph::applyBarStyle(graphStyle); switch (graphStyle) { case BarGraphStyle::Heavy: barStyle.width = style::bargraph::rect_axis_length_long_medium; barStyle.height = style::bargraph::rect_axis_length_short_medium; barStyle.margin = Margins(0, 0, 0, style::bargraph::spacing); break; case BarGraphStyle::Light: barStyle.width = style::bargraph::rect_axis_length_long_small; barStyle.height = style::bargraph::rect_axis_length_short_small; barStyle.margin = Margins(0, 0, 0, style::bargraph::spacing); break; } } HBarGraph::HBarGraph(Item *parent, Position x, Position y, uint32_t numberOfRectangles, BarGraphStyle graphStyle) : HBox(parent, x, y, rectAxisLengthFrom(numberOfRectangles), style::bargraph::rect_axis_length_long_medium) { applyBarStyle(graphStyle); setMinimumSize(rectAxisLengthFrom(numberOfRectangles), style::bargraph::rect_axis_length_long_medium); setEdges(RectangleEdge::None); setMaximum(numberOfRectangles); createGraph(); } void HBarGraph::createGraph() { if (!rectangles.empty()) { erase(); rectangles.clear(); } setMinimumWidth(rectAxisLengthFrom(numberOfRectangles)); createRectangles(); for (auto rect : rectangles) { addWidget(rect); } resizeItems(); } void HBarGraph::applyBarStyle(BarGraphStyle graphStyle) { BarGraph::applyBarStyle(graphStyle); switch (graphStyle) { case BarGraphStyle::Heavy: barStyle.width = style::bargraph::rect_axis_length_short_medium; barStyle.height = style::bargraph::rect_axis_length_long_medium; barStyle.margin = Margins(0, 0, style::bargraph::spacing, 0); break; case BarGraphStyle::Light: barStyle.width = style::bargraph::rect_axis_length_short_small; barStyle.height = style::bargraph::rect_axis_length_long_small; barStyle.margin = Margins(0, 0, style::bargraph::spacing, 0); break; } } } /* namespace gui */