scrollbar optimization
Signed-off-by: Peter Siegmund <developer@mars3142.org>
This commit is contained in:
@@ -67,6 +67,7 @@ void Menu::setItemSize(const size_t size)
|
|||||||
m_items.erase(m_items.begin() + static_cast<int>(size + 1), m_items.end());
|
m_items.erase(m_items.begin() + static_cast<int>(size + 1), m_items.end());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Menu::toggle(const MenuItem &menuItem)
|
void Menu::toggle(const MenuItem &menuItem)
|
||||||
{
|
{
|
||||||
const auto item =
|
const auto item =
|
||||||
@@ -312,7 +313,7 @@ void Menu::addSelection(uint8_t id, const std::string &text, const std::vector<s
|
|||||||
m_items.emplace_back(id, MenuItemTypes::SELECTION, text, values, index, callback);
|
m_items.emplace_back(id, MenuItemTypes::SELECTION, text, values, index, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Menu::addToggle(uint8_t id, const std::string &text, bool selected)
|
void Menu::addToggle(uint8_t id, const std::string &text, const bool selected)
|
||||||
{
|
{
|
||||||
auto callback = [this](const MenuItem &menuItem, const ButtonType button) -> void {
|
auto callback = [this](const MenuItem &menuItem, const ButtonType button) -> void {
|
||||||
onButtonPressed(menuItem, button);
|
onButtonPressed(menuItem, button);
|
||||||
|
@@ -9,17 +9,16 @@ ScrollBar::ScrollBar(const menu_options_t *options, const size_t x, const size_t
|
|||||||
|
|
||||||
void ScrollBar::render()
|
void ScrollBar::render()
|
||||||
{
|
{
|
||||||
// Early return if scrollbar is not needed (only one item)
|
if (m_max <= 1)
|
||||||
if (m_max <= 1) {
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw dotted track line for visual reference
|
for (size_t y = m_y; y < m_y + m_height; y += 2)
|
||||||
for (size_t y = m_y; y < m_y + m_height; y += 2) {
|
{
|
||||||
u8g2_DrawPixel(u8g2, m_x, y);
|
u8g2_DrawPixel(u8g2, m_x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw scroll thumb to indicate current position
|
|
||||||
u8g2_DrawBox(u8g2, u8g2->width - 4, m_thumbY, 3, m_thumbHeight);
|
u8g2_DrawBox(u8g2, u8g2->width - 4, m_thumbY, 3, m_thumbHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -29,6 +28,14 @@ void ScrollBar::refresh(const size_t value, const size_t max, const size_t min)
|
|||||||
m_max = max;
|
m_max = max;
|
||||||
m_min = min;
|
m_min = min;
|
||||||
|
|
||||||
m_thumbHeight = m_height / m_max;
|
if (m_max <= 1)
|
||||||
m_thumbY = m_y + (m_value - m_min) * m_thumbHeight;
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_thumbHeight = std::max(m_height / 4, static_cast<size_t>(3));
|
||||||
|
|
||||||
|
const size_t trackLength = m_height - m_thumbHeight;
|
||||||
|
|
||||||
|
m_thumbY = m_y + (m_value * trackLength) / (m_max - 1);
|
||||||
}
|
}
|
@@ -19,10 +19,9 @@ LightSettingsMenu::LightSettingsMenu(menu_options_t *options) : Menu(options), m
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Add section counter selection (allows choosing number of sections)
|
// Add section counter selection (allows choosing number of sections)
|
||||||
addSelection(LightSettingsMenuItem::SECTION_COUNTER, "Sektionen", values, 0);
|
addSelection(LightSettingsMenuItem::SECTION_COUNTER, "Sektionen", values, 7);
|
||||||
|
|
||||||
// Add first section configuration item
|
setItemSize(std::stoull(getItem(0).getValue()));
|
||||||
addSelection(1, "Sektion 1", values, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void LightSettingsMenu::onButtonPressed(const MenuItem &menuItem, const ButtonType button)
|
void LightSettingsMenu::onButtonPressed(const MenuItem &menuItem, const ButtonType button)
|
||||||
|
@@ -4,31 +4,41 @@
|
|||||||
#include "ui/LightMenu.h"
|
#include "ui/LightMenu.h"
|
||||||
#include "ui/SettingsMenu.h"
|
#include "ui/SettingsMenu.h"
|
||||||
|
|
||||||
|
namespace MainMenuItem
|
||||||
|
{
|
||||||
|
constexpr uint8_t LIGHT = 0;
|
||||||
|
constexpr uint8_t EXTERNAL_DEVICES = 1;
|
||||||
|
constexpr uint8_t SETTINGS = 2;
|
||||||
|
}
|
||||||
|
|
||||||
MainMenu::MainMenu(menu_options_t *options) : Menu(options), m_options(options)
|
MainMenu::MainMenu(menu_options_t *options) : Menu(options), m_options(options)
|
||||||
{
|
{
|
||||||
addText(1, "Lichtsteuerung");
|
addText(MainMenuItem::LIGHT, "Lichtsteuerung");
|
||||||
addText(2, "externe Geraete");
|
addText(MainMenuItem::EXTERNAL_DEVICES, "externe Geraete");
|
||||||
addText(3, "Einstellungen");
|
addText(MainMenuItem::SETTINGS, "Einstellungen");
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainMenu::onButtonPressed(const MenuItem &menuItem, const ButtonType button)
|
void MainMenu::onButtonPressed(const MenuItem &menuItem, const ButtonType button)
|
||||||
{
|
{
|
||||||
std::shared_ptr<Widget> widget;
|
if (button == ButtonType::SELECT)
|
||||||
switch (menuItem.getId())
|
|
||||||
{
|
{
|
||||||
case 1:
|
std::shared_ptr<Widget> widget;
|
||||||
widget = std::make_shared<LightMenu>(m_options);
|
switch (menuItem.getId())
|
||||||
break;
|
{
|
||||||
|
case MainMenuItem::LIGHT:
|
||||||
|
widget = std::make_shared<LightMenu>(m_options);
|
||||||
|
break;
|
||||||
|
|
||||||
case 3:
|
case MainMenuItem::SETTINGS:
|
||||||
widget = std::make_shared<SettingsMenu>(m_options);
|
widget = std::make_shared<SettingsMenu>(m_options);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_options && m_options->pushScreen)
|
if (m_options && m_options->pushScreen)
|
||||||
{
|
{
|
||||||
m_options->pushScreen(widget);
|
m_options->pushScreen(widget);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user