mirror of
https://github.com/eried/portapack-mayhem.git
synced 2025-06-25 23:30:40 -04:00
Freqman UI (#1255)
* FreqmanDB direct file * Clear UI for short lists * Final touches on freqlist UI. * Support vertical alignment in NewButton * New buttons in FreqMan * Wiring up UI to filewrapper actions * Work around empty file
This commit is contained in:
parent
0c599f7d3a
commit
29e495a17f
23 changed files with 979 additions and 660 deletions
|
@ -1112,11 +1112,13 @@ NewButton::NewButton(
|
|||
Rect parent_rect,
|
||||
std::string text,
|
||||
const Bitmap* bitmap,
|
||||
Color color)
|
||||
Color color,
|
||||
bool vertical_center)
|
||||
: Widget{parent_rect},
|
||||
text_{text},
|
||||
bitmap_{bitmap},
|
||||
color_{color} {
|
||||
color_{color},
|
||||
vertical_center_{vertical_center} {
|
||||
set_focusable(true);
|
||||
}
|
||||
|
||||
|
@ -1143,6 +1145,11 @@ void NewButton::set_color(Color color) {
|
|||
set_dirty();
|
||||
}
|
||||
|
||||
void NewButton::set_vertical_center(bool value) {
|
||||
vertical_center_ = value;
|
||||
set_dirty();
|
||||
}
|
||||
|
||||
ui::Color NewButton::color() {
|
||||
return color_;
|
||||
}
|
||||
|
@ -1164,28 +1171,34 @@ void NewButton::paint(Painter& painter) {
|
|||
|
||||
const Style paint_style = {style().font, bg, fg};
|
||||
|
||||
painter.draw_rectangle({r.location(), {r.size().width(), 1}}, Color::light_grey());
|
||||
painter.draw_rectangle({r.location().x(), r.location().y() + r.size().height() - 1, r.size().width(), 1}, Color::dark_grey());
|
||||
painter.draw_rectangle({r.location().x() + r.size().width() - 1, r.location().y(), 1, r.size().height()}, Color::dark_grey());
|
||||
painter.draw_rectangle({r.location(), {r.width(), 1}}, Color::light_grey());
|
||||
painter.draw_rectangle({r.left(), r.top() + r.height() - 1, r.width(), 1}, Color::dark_grey());
|
||||
painter.draw_rectangle({r.left() + r.width() - 1, r.top(), 1, r.height()}, Color::dark_grey());
|
||||
|
||||
painter.fill_rectangle(
|
||||
{r.location().x(), r.location().y() + 1, r.size().width() - 1, r.size().height() - 2},
|
||||
{r.left(), r.top() + 1, r.width() - 1, r.height() - 2},
|
||||
paint_style.background);
|
||||
|
||||
int y = r.location().y();
|
||||
int y = r.top();
|
||||
if (bitmap_) {
|
||||
int offset_y = vertical_center_ ? (r.height() / 2) - (bitmap_->size.height() / 2) : 6;
|
||||
Point bmp_pos = {r.left() + (r.width() / 2) - (bitmap_->size.width() / 2), r.top() + offset_y};
|
||||
y += bitmap_->size.height() - offset_y;
|
||||
|
||||
painter.draw_bitmap(
|
||||
{r.location().x() + (r.size().width() / 2) - 8, r.location().y() + 6},
|
||||
bmp_pos,
|
||||
*bitmap_,
|
||||
color_, // Color::green(), //fg,
|
||||
bg);
|
||||
y += 10;
|
||||
}
|
||||
const auto label_r = paint_style.font.size_of(text_);
|
||||
painter.draw_string(
|
||||
{r.location().x() + (r.size().width() - label_r.width()) / 2, y + (r.size().height() - label_r.height()) / 2},
|
||||
paint_style,
|
||||
text_);
|
||||
|
||||
if (!text_.empty()) {
|
||||
const auto label_r = paint_style.font.size_of(text_);
|
||||
painter.draw_string(
|
||||
{r.left() + (r.width() - label_r.width()) / 2, y + (r.height() - label_r.height()) / 2},
|
||||
paint_style,
|
||||
text_);
|
||||
}
|
||||
}
|
||||
|
||||
void NewButton::on_focus() {
|
||||
|
@ -1482,11 +1495,11 @@ bool ImageOptionsField::on_touch(const TouchEvent event) {
|
|||
|
||||
OptionsField::OptionsField(
|
||||
Point parent_pos,
|
||||
int length,
|
||||
size_t length,
|
||||
options_t options)
|
||||
: Widget{{parent_pos, {8 * length, 16}}},
|
||||
: Widget{{parent_pos, {8 * (int)length, 16}}},
|
||||
length_{length},
|
||||
options{std::move(options)} {
|
||||
options_{std::move(options)} {
|
||||
set_focusable(true);
|
||||
}
|
||||
|
||||
|
@ -1494,16 +1507,20 @@ size_t OptionsField::selected_index() const {
|
|||
return selected_index_;
|
||||
}
|
||||
|
||||
size_t OptionsField::selected_index_value() const {
|
||||
return options[selected_index_].second;
|
||||
const OptionsField::name_t& OptionsField::selected_index_name() const {
|
||||
return options_[selected_index_].first;
|
||||
}
|
||||
|
||||
const OptionsField::value_t& OptionsField::selected_index_value() const {
|
||||
return options_[selected_index_].second;
|
||||
}
|
||||
|
||||
void OptionsField::set_selected_index(const size_t new_index, bool trigger_change) {
|
||||
if (new_index < options.size()) {
|
||||
if (new_index < options_.size()) {
|
||||
if (new_index != selected_index() || trigger_change) {
|
||||
selected_index_ = new_index;
|
||||
if (on_change) {
|
||||
on_change(selected_index(), options[selected_index()].second);
|
||||
on_change(selected_index(), options_[selected_index()].second);
|
||||
}
|
||||
set_dirty();
|
||||
}
|
||||
|
@ -1512,7 +1529,7 @@ void OptionsField::set_selected_index(const size_t new_index, bool trigger_chang
|
|||
|
||||
void OptionsField::set_by_value(value_t v) {
|
||||
size_t new_index = 0;
|
||||
for (const auto& option : options) {
|
||||
for (const auto& option : options_) {
|
||||
if (option.second == v) {
|
||||
set_selected_index(new_index);
|
||||
return;
|
||||
|
@ -1529,7 +1546,7 @@ void OptionsField::set_by_nearest_value(value_t v) {
|
|||
size_t curr_index = 0;
|
||||
int32_t min_diff = INT32_MAX;
|
||||
|
||||
for (const auto& option : options) {
|
||||
for (const auto& option : options_) {
|
||||
auto diff = abs(v - option.second);
|
||||
if (diff < min_diff) {
|
||||
min_diff = diff;
|
||||
|
@ -1543,7 +1560,7 @@ void OptionsField::set_by_nearest_value(value_t v) {
|
|||
}
|
||||
|
||||
void OptionsField::set_options(options_t new_options) {
|
||||
options = std::move(new_options);
|
||||
options_ = std::move(new_options);
|
||||
|
||||
// Set an invalid index to force on_change.
|
||||
selected_index_ = (size_t)-1;
|
||||
|
@ -1556,12 +1573,14 @@ void OptionsField::paint(Painter& painter) {
|
|||
|
||||
painter.fill_rectangle({screen_rect().location(), {(int)length_ * 8, 16}}, ui::Color::black());
|
||||
|
||||
if (selected_index() < options.size()) {
|
||||
const auto text = options[selected_index()].first;
|
||||
if (selected_index() < options_.size()) {
|
||||
std::string_view temp = selected_index_name();
|
||||
if (temp.length() > length_)
|
||||
temp = temp.substr(0, length_);
|
||||
painter.draw_string(
|
||||
screen_pos(),
|
||||
paint_style,
|
||||
text);
|
||||
temp);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1574,8 +1593,8 @@ void OptionsField::on_focus() {
|
|||
bool OptionsField::on_encoder(const EncoderEvent delta) {
|
||||
int32_t new_value = selected_index() + delta;
|
||||
if (new_value < 0)
|
||||
new_value = options.size() - 1;
|
||||
else if ((size_t)new_value >= options.size())
|
||||
new_value = options_.size() - 1;
|
||||
else if ((size_t)new_value >= options_.size())
|
||||
new_value = 0;
|
||||
|
||||
set_selected_index(new_value);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue