diff --git a/src/listview.cpp b/src/listview.cpp index 605330d..121a726 100644 --- a/src/listview.cpp +++ b/src/listview.cpp @@ -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) -> 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(position, size, ""); p->can_focus = true; p->draw_background = false; + p->theme = theme; return p; } @@ -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]; @@ -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) { @@ -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); } } @@ -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) { @@ -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) { 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; @@ -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); @@ -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; @@ -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); diff --git a/src/listview.h b/src/listview.h index d038602..cf08843 100644 --- a/src/listview.h +++ b/src/listview.h @@ -21,7 +21,7 @@ struct ItemAdapter { using PWidget = std::shared_ptr; 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) -> PWidget = 0; virtual auto set_content(PWidget widget, size_t position, ItemStatus status) -> void = 0; }; @@ -30,7 +30,7 @@ struct ListItemAdapter : ItemAdapter { explicit ListItemAdapter(const std::vector &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) -> PWidget override; virtual auto set_content(PWidget widget, size_t position, ItemStatus status) -> void override; }; diff --git a/src/theme.cpp b/src/theme.cpp index b01d160..12f7066 100644 --- a/src/theme.cpp +++ b/src/theme.cpp @@ -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;