#include "AppListView.h" #include "IconView.h" #include #include #include #include #include #include #include #include #include #include #include #include static AppListView* this_view; AppListView::AppListView(UI::View* superview, const LG::Rect& frame) : UI::View(superview, frame) { // Not used any more, reinit // auto& dock_stack_view = add_subview(bounds()); // dock_stack_view.set_spacing(padding()); // dock_stack_view.set_background_color(LG::Color::Opaque); // dock_stack_view.set_axis(UI::LayoutConstraints::Axis::Horizontal); // dock_stack_view.set_distribution(UI::StackView::Distribution::EqualCentering); // m_dock_stackview = &dock_stack_view; } AppListView::AppListView(UI::View* superview, UI::Window* window, const LG::Rect& frame) : UI::View(superview, window, frame) { // Use manual layouting since layout is really simple here. auto& header = add_subview(LG::Rect(0, 0, bounds().width(), 30 + 2 * padding())); header.set_background_color(LG::Color::White); header.layer().set_corner_mask(LG::CornerMask(8, LG::CornerMask::Masked, LG::CornerMask::NonMasked)); auto& searchbar = add_subview(LG::Rect(padding(), padding(), bounds().width() - padding() * 2, 30)); searchbar.layer().set_corner_mask(LG::CornerMask(8)); searchbar.set_background_color(LG::Color(0xE7F0FA)); searchbar.set_placeholder_text("SEARCH"); auto& applist_grid_view = add_subview(LG::Rect(0, 2 * padding() + 30, bounds().width(), bounds().height() - (2 * padding() + 30))); applist_grid_view.set_data_source([this](int id) -> View* { return this->view_streamer(id); }); m_applist_grid_view = &applist_grid_view; } void AppListView::display(const LG::Rect& rect) { LG::Context ctx = UI::graphics_current_context(); ctx.add_clip(rect); ctx.set_fill_color(background_color()); ctx.fill_rounded(bounds(), layer().corner_mask()); ctx.set_fill_color(LG::Color(120, 120, 120, 50)); ctx.draw_shading(LG::Rect(0, 30 + 2 * padding(), bounds().width(), 4), LG::Shading(LG::Shading::Type::TopToBottom)); } UI::View* AppListView::view_streamer(int id) { if (id * items_per_row() >= m_app_entities.size()) { return nullptr; } size_t calc_padding = (m_applist_grid_view->bounds().width() - 2 * padding() - (icon_view_size() * items_per_row())) / (items_per_row() - 1); UI::StackView& dock_stack_view = m_applist_grid_view->add_subview(LG::Rect(padding(), 0, m_applist_grid_view->bounds().width() - 2 * padding(), icon_view_size() + calc_padding)); dock_stack_view.set_spacing(calc_padding); dock_stack_view.set_background_color(LG::Color::Opaque); dock_stack_view.set_axis(UI::LayoutConstraints::Axis::Horizontal); dock_stack_view.set_distribution(UI::StackView::Distribution::Standard); size_t rem = std::min(items_per_row(), (int)m_app_entities.size() - id * items_per_row()); for (int i = 0; i < rem; i++) { auto& icon_view = dock_stack_view.add_arranged_subview(); icon_view.set_title(m_app_entities[id * items_per_row() + i].title()); icon_view.entity() = m_app_entities[id * items_per_row() + i]; icon_view.add_constraint(UI::Constraint(icon_view, UI::Constraint::Attribute::Height, UI::Constraint::Relation::Equal, icon_view_size())); icon_view.add_constraint(UI::Constraint(icon_view, UI::Constraint::Attribute::Width, UI::Constraint::Relation::Equal, icon_view_size())); } return &dock_stack_view; } void AppListView::register_entity(const AppEntity& ent) { m_app_entities.push_back(ent); m_applist_grid_view->reload_data(); m_applist_grid_view->invalidate_row((m_app_entities.size() - 1) / items_per_row()); } void AppListView::register_entity(AppEntity&& ent) { m_app_entities.push_back(std::move(ent)); m_applist_grid_view->reload_data(); m_applist_grid_view->invalidate_row((m_app_entities.size() - 1) / items_per_row()); }