combine with desktop project
Signed-off-by: Peter Siegmund <developer@mars3142.org>
This commit is contained in:
161
components/justus/src/common/PSMenu.cpp
Normal file
161
components/justus/src/common/PSMenu.cpp
Normal file
@@ -0,0 +1,161 @@
|
||||
#include "common/PSMenu.h"
|
||||
|
||||
#include "u8g2.h"
|
||||
#include "common/ScrollBar.h"
|
||||
#include "PushButton.h"
|
||||
|
||||
PSMenu::PSMenu(menu_options_t* options)
|
||||
: Widget(options->u8g2)
|
||||
, m_options(options) {
|
||||
m_options->onButtonClicked = [this](const uint8_t button) { onButtonClicked(button); };
|
||||
}
|
||||
|
||||
PSMenu::~PSMenu() {
|
||||
m_options->onButtonClicked = nullptr;
|
||||
}
|
||||
|
||||
void PSMenu::render() {
|
||||
if(m_selected_item < 0) {
|
||||
onPressedDown();
|
||||
}
|
||||
|
||||
u8g2_SetDrawColor(u8g2, 0);
|
||||
u8g2_DrawBox(u8g2, 0, 0, u8g2->width, u8g2->height);
|
||||
|
||||
u8g2_SetDrawColor(u8g2, 1);
|
||||
|
||||
drawScrollBar();
|
||||
drawSelectionBox();
|
||||
|
||||
int x = 8; // sure?
|
||||
auto widget = m_items.at(m_selected_item);
|
||||
renderWidget(
|
||||
widget.getType(), u8g2_font_helvB08_tr, x, u8g2->height / 2 + 3, widget.getText().c_str());
|
||||
|
||||
if(m_selected_item > 0) {
|
||||
auto item = m_items.at(m_selected_item - 1);
|
||||
renderWidget(item.getType(), u8g2_font_haxrcorp4089_tr, x, 14, item.getText().c_str());
|
||||
}
|
||||
if(m_selected_item < m_items.size() - 1) {
|
||||
auto item = m_items.at(m_selected_item + 1);
|
||||
renderWidget(
|
||||
item.getType(),
|
||||
u8g2_font_haxrcorp4089_tr,
|
||||
x,
|
||||
u8g2->height - 10,
|
||||
item.getText().c_str());
|
||||
}
|
||||
}
|
||||
|
||||
void PSMenu::renderWidget(
|
||||
const uint8_t type,
|
||||
const uint8_t* font,
|
||||
const int x,
|
||||
const int y,
|
||||
const char* text) const {
|
||||
switch(type) {
|
||||
case 0: // text
|
||||
u8g2_SetFont(u8g2, font);
|
||||
u8g2_DrawStr(u8g2, x, y, text);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void PSMenu::onButtonClicked(uint8_t button) {
|
||||
switch(button) {
|
||||
case BUTTON_UP:
|
||||
onPressedUp();
|
||||
break;
|
||||
|
||||
case BUTTON_DOWN:
|
||||
onPressedDown();
|
||||
break;
|
||||
|
||||
case BUTTON_LEFT:
|
||||
onPressedLeft();
|
||||
break;
|
||||
|
||||
case BUTTON_RIGHT:
|
||||
onPressedRight();
|
||||
break;
|
||||
|
||||
case BUTTON_SELECT:
|
||||
onPressedSelect();
|
||||
break;
|
||||
|
||||
case BUTTON_BACK:
|
||||
onPressedBack();
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void PSMenu::onPressedDown() {
|
||||
if(m_selected_item == m_items.size() - 1) {
|
||||
m_selected_item = 0;
|
||||
} else {
|
||||
m_selected_item++;
|
||||
}
|
||||
}
|
||||
|
||||
void PSMenu::onPressedUp() {
|
||||
if(m_selected_item == 0) {
|
||||
m_selected_item = m_items.size() - 1;
|
||||
} else {
|
||||
m_selected_item--;
|
||||
}
|
||||
}
|
||||
|
||||
void PSMenu::onPressedLeft() {
|
||||
//
|
||||
}
|
||||
|
||||
void PSMenu::onPressedRight() {
|
||||
///
|
||||
}
|
||||
|
||||
void PSMenu::onPressedSelect() const {
|
||||
m_items.at(m_selected_item).callback(m_selected_item);
|
||||
}
|
||||
|
||||
void PSMenu::onPressedBack() const {
|
||||
if(m_options && m_options->popScreen) {
|
||||
m_options->popScreen();
|
||||
}
|
||||
}
|
||||
|
||||
void PSMenu::addText(const std::string& text, const MenuCallback& callback) {
|
||||
m_items.emplace_back(0, text, callback);
|
||||
}
|
||||
|
||||
void PSMenu::addSwitch(const std::string& text, std::string& value, const MenuCallback& callback) {
|
||||
m_items.emplace_back(1, text, value, callback);
|
||||
}
|
||||
|
||||
void PSMenu::addNumber(const std::string& text, std::string& value, const MenuCallback& callback) {
|
||||
m_items.emplace_back(2, text, value, callback);
|
||||
}
|
||||
|
||||
void PSMenu::drawScrollBar() const {
|
||||
ScrollBar scrollBar(m_options, u8g2->width - 3, 3, 1, u8g2->height - 6);
|
||||
scrollBar.refresh(m_selected_item, m_items.size());
|
||||
scrollBar.render();
|
||||
}
|
||||
|
||||
void PSMenu::drawSelectionBox() const {
|
||||
const auto displayHeight = u8g2->height;
|
||||
const auto displayWidth = u8g2->width;
|
||||
constexpr auto rightPadding = 8;
|
||||
const auto boxHeight = displayHeight / 3;
|
||||
const auto y = boxHeight * 2 - 2;
|
||||
const auto x = displayWidth - rightPadding;
|
||||
|
||||
u8g2_DrawRFrame(u8g2, 2, boxHeight, displayWidth - rightPadding, boxHeight, 3);
|
||||
u8g2_DrawLine(u8g2, 4, y, displayWidth - rightPadding, y);
|
||||
u8g2_DrawLine(u8g2, x, y - boxHeight + 3, x, y - 1);
|
||||
}
|
Reference in New Issue
Block a user