Files
Custom-Operating-System/userland/system/applist/AppListView.cpp

100 lines
4.2 KiB
C++

#include "AppListView.h"
#include "IconView.h"
#include <algorithm>
#include <cstdlib>
#include <libfoundation/EventLoop.h>
#include <libfoundation/KeyboardMapping.h>
#include <libg/Color.h>
#include <libg/ImageLoaders/PNGLoader.h>
#include <libui/App.h>
#include <libui/CollectionView.h>
#include <libui/Context.h>
#include <libui/StackView.h>
#include <libui/TextField.h>
#include <unistd.h>
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<UI::StackView>(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<UI::View>(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<UI::TextField>(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<UI::CollectionView>(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<UI::StackView>(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<IconView>();
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());
}