// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "SpecialInputTableWidget.hpp" #include "ApplicationSpecialInput.hpp" #include "SpecialCharactersTableStyle.hpp" #include #include #include #include #include #include namespace gui { using namespace specialInputStyle; SpecialInputTableWidget::SpecialInputTableWidget(app::ApplicationCommon *app, std::list &&carriers) : application(app) { setMinimumSize(specialCharacterTableWidget::window_grid_w, specialCharacterTableWidget::window_grid_h); setEdges(RectangleEdge::None); box = new GridLayout(0, 0, specialCharacterTableWidget::window_grid_w, specialCharacterTableWidget::window_grid_h, {specialCharacterTableWidget::char_grid_w, specialCharacterTableWidget::char_grid_h}); for (auto &carrier : carriers) { box->addWidget(carrier.item); decorateActionActivated(carrier.item, carrier.val); } addWidget(box); inputCallback = [&](gui::Item &item, const gui::InputEvent &event) { if (!event.isShortRelease()) { return false; } return box->onInput(event); }; auto defaultBorderCallback = box->borderCallback; box->borderCallback = [defaultBorderCallback](const InputEvent &inputEvent) -> bool { if (!inputEvent.isShortRelease()) { return false; } if (inputEvent.is(KeyCode::KEY_UP) || inputEvent.is(KeyCode::KEY_DOWN)) { return false; } else { return defaultBorderCallback(inputEvent); } }; focusChangedCallback = [&](Item &item) { if (getFocusItem() == nullptr) { setFocusItem(box); } return true; }; dimensionChangedCallback = [&](gui::Item &, const BoundingBox &newDim) -> bool { box->setArea( {0, 0, specialCharacterTableWidget::window_grid_w, specialCharacterTableWidget::window_grid_h}); return true; }; } void SpecialInputTableWidget::decorateActionActivated(Item *it, const std::string &str) { assert(application); const auto app = dynamic_cast(application); assert(app); it->activatedCallback = [=](Item &it) { setFocusItem(nullptr); LOG_INFO("Handled special char for %s", application->getCurrentWindow()->getName().c_str()); auto switchData = std::make_unique(gui::SwitchSpecialChar::Type::Response, app->requester, str); return app::manager::Controller::switchBack( application, std::make_unique(app->requester, std::move(switchData))); }; } auto generateNewLineSign() -> Carrier { auto rect = new Rect( nullptr, 0, 0, specialCharacterTableWidget::char_label_w, specialCharacterTableWidget::char_label_h); rect->setEdges(gui::RectangleEdge::Top | gui::RectangleEdge::Bottom); rect->setPenWidth(0); new gui::Image(rect, specialCharacterTableWidget::char_newline_x, specialCharacterTableWidget::char_newline_y, specialCharacterTableWidget::char_label_w, specialCharacterTableWidget::char_label_h, "enter_icon_alpha_W_M"); return {rect, std::string(&text::newline, 1)}; } auto generateCharSign(std::uint32_t val) -> Carrier { std::wstring_convert, char32_t> convert; const auto scharString = convert.to_bytes(std::u32string(1, val)); const auto charLabel = new gui::Label( nullptr, 0, 0, specialCharacterTableWidget::char_label_w, specialCharacterTableWidget::char_label_h); style::window::decorate(charLabel); charLabel->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); charLabel->setFont(style::window::font::medium); charLabel->setText(scharString); return {charLabel, scharString}; } } /* namespace gui */