Skip to content

Commit

Permalink
ListView: honor theme padding
Browse files Browse the repository at this point in the history
1) Position of scrollbar is fixed now
2) Itme sizes is honored - by using theme sizes.
  • Loading branch information
diegoiast committed Mar 3, 2024
1 parent e51fe1f commit fcd7e51
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 27 deletions.
43 changes: 20 additions & 23 deletions src/listview.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,14 @@
#include "scrollbar.h"
#include "theme.h"

auto ListItemAdapter::get_widget(size_t /*position*/, Theme &theme) -> PWidget {
auto font_size = theme.font.text_size("X") + 10;
auto ListItemAdapter::get_widget(size_t /*position*/, std::shared_ptr<Theme> theme) -> PWidget {
auto font_size = theme->font.text_size("X") + theme->defaultPadding.get_vertical();
auto position = Position{0, 0};
auto size = font_size;
auto p = std::make_shared<ListItemWidget>(position, size, "");
p->can_focus = true;
p->draw_background = false;
p->theme = theme;
return p;
}

Expand All @@ -39,23 +40,21 @@ ListView::ListView(Position position, Size size) : Widget(position, size, 0) {
}

auto ListView::draw() -> void {
auto &theme = *get_theme();
theme.draw_listview_background(content, has_focus, true);
auto t = get_theme();
t->draw_listview_background(content, has_focus, true);
if (reserved_widgets.empty()) {
did_adapter_update();
}

auto first_widget = adapter->get_widget(0, theme);
// TODO - get padding from frame - from, theme
auto padding = 1;
auto first_widget = adapter->get_widget(0, t);
auto item_height = (first_widget->content.size.height);
auto widget_count = this->content.size.height / item_height + 1;
auto first_item = scrollbar->value / item_height;
auto offset = -(scrollbar->value % item_height);

for (auto i = 0; i < widget_count; i++) {
auto position = Position{padding, padding + offset};
auto size = Size{this->content.size.width - this->scrollbar->content.size.width - padding,
auto position = Position{0, offset};
auto size = Size{this->content.size.width - this->scrollbar->content.size.width,
first_widget->content.size.height};
auto status = ItemStatus{false, false};
auto w = reserved_widgets[i];
Expand Down Expand Up @@ -87,7 +86,7 @@ auto ListView::draw() -> void {
Widget::draw();

auto frame_proxy = this->frame;
if (can_focus && theme.modify_frame_on_hover()) {
if (can_focus && t->modify_frame_on_hover()) {
// Setting hover frame works only on selectable widgets
if (frame_proxy.style == FrameStyles::Normal ||
frame_proxy.style == FrameStyles::Reversed) {
Expand All @@ -100,7 +99,7 @@ auto ListView::draw() -> void {
}
}
if (frame_proxy.style != FrameStyles::NoFrame) {
theme.draw_frame(content, {0, 0}, content.size, frame_proxy.style, frame_proxy.size);
t->draw_frame(content, {0, 0}, content.size, frame_proxy.style, frame_proxy.size);
}
}

Expand All @@ -114,13 +113,12 @@ EventPropagation ListView::on_mouse_click(const EventMouse &event) {
return p;
}

auto first_widget = adapter->get_widget(0, *get_theme());
auto padding = 2;
auto first_widget = adapter->get_widget(0, get_theme());
auto item_height = (first_widget->content.size.height);
auto first_item = scrollbar->value / item_height;
auto offset = -(scrollbar->value % item_height);

auto clicked_item_offset = (event.y - offset - padding) / item_height;
auto clicked_item_offset = (event.y - offset) / item_height;
this->current_item = clicked_item_offset + first_item;
invalidate();
if (this->on_item_selected) {
Expand All @@ -129,7 +127,7 @@ EventPropagation ListView::on_mouse_click(const EventMouse &event) {
return EventPropagation::handled;
}

auto static ensure_item_in_viewport(ListView &l, Theme &theme) {
auto static ensure_item_in_viewport(ListView &l, std::shared_ptr<Theme> theme) {
auto first_widget = l.adapter->get_widget(0, theme);
auto item_height = (first_widget->content.size.height);
auto widget_count = l.content.size.height / item_height;
Expand Down Expand Up @@ -188,7 +186,7 @@ auto ListView::on_keyboard(const EventKeyboard &event) -> EventPropagation {
}

if (old_item != this->current_item) {
ensure_item_in_viewport(*this, *get_theme());
ensure_item_in_viewport(*this, get_theme());
invalidate();
if (this->on_item_selected) {
this->on_item_selected(*this, current_item, SelectionReason::KeyboardMove);
Expand All @@ -202,23 +200,22 @@ auto ListView::on_keyboard(const EventKeyboard &event) -> EventPropagation {
}

auto ListView::on_resize() -> void {
// TODO - read size from theme
auto width = 24;
auto position = Position{content.size.width - width, 0};
auto default_buttons_size = this->scrollbar->get_padding().get_horizontal();
auto position = Position{content.size.width - default_buttons_size, 0};

for (auto &w : reserved_widgets) {
w->hide();
}
this->reserved_widgets.clear();
this->scrollbar->position = position;
this->scrollbar->content.resize(width, content.size.height);
this->scrollbar->content.resize(default_buttons_size, content.size.height);
this->scrollbar->on_resize();
}

auto ListView::did_adapter_update() -> void {
reserved_widgets.clear();
auto &theme = *get_theme();
auto first_widget = adapter->get_widget(0, theme);
auto t = get_theme();
auto first_widget = adapter->get_widget(0, t);
auto item_height = first_widget->content.size.height;
auto widget_count = (this->content.size.height - 2) / item_height + 1;

Expand All @@ -238,7 +235,7 @@ auto ListView::did_adapter_update() -> void {
// different actions in a single line, and will become undebuggable
// reserved_widgets.push_back(add(adapter->get_widget(widget_count)));

auto b = adapter->get_widget(widget_count, theme);
auto b = adapter->get_widget(widget_count, t);
b->hide();
this->add(b);
this->reserved_widgets.push_back(b);
Expand Down
4 changes: 2 additions & 2 deletions src/listview.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ struct ItemAdapter {
using PWidget = std::shared_ptr<Widget>;

virtual auto get_count() -> size_t const = 0;
virtual auto get_widget(size_t position, Theme &theme) -> PWidget = 0;
virtual auto get_widget(size_t position, std::shared_ptr<Theme> theme) -> PWidget = 0;
virtual auto set_content(PWidget widget, size_t position, ItemStatus status) -> void = 0;
};

Expand All @@ -30,7 +30,7 @@ struct ListItemAdapter : ItemAdapter {

explicit ListItemAdapter(const std::vector<std::string_view> &s) { this->strings = s; };
virtual auto get_count() -> size_t const override { return strings.size(); }
virtual auto get_widget(size_t position, Theme &theme) -> PWidget override;
virtual auto get_widget(size_t position, std::shared_ptr<Theme> theme) -> PWidget override;
virtual auto set_content(PWidget widget, size_t position, ItemStatus status) -> void override;
};

Expand Down
3 changes: 1 addition & 2 deletions src/theme.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -398,8 +398,7 @@ auto ThemeRedmond::draw_listview_background(Bitmap &content, const bool has_focu

void ThemeRedmond::draw_listview_item(Bitmap &content, const std::string_view text,
const ItemStatus status, const bool is_hover) {
auto padding = Position{5, 5};

auto padding = Position{defaultPadding.start, defaultPadding.top};
auto text_color = status.is_active ? colors.text_selection_color : colors.text_color;
auto background_color =
status.is_active ? colors.text_selection_background : colors.input_background_normal;
Expand Down

0 comments on commit fcd7e51

Please sign in to comment.