~aleteoryx/muditaos

ded0ff6c8c8609cb37c6c5018490b4af187b890b — lblach 4 years ago 0fa3c71
[EGD-5933] Display Category Selection Window

This window is needed to assist the user selecting the quotes
categories to display.
M image/assets/lang/English.json => image/assets/lang/English.json +1 -2
@@ 529,7 529,6 @@
  "app_desktop_update_muditaos": "MuditaOS update",
  "app_desktop_update_in_progress": "Update in progress...",
  "app_desktop_update_ready_for_reset": "Ready for reset...",
  "app_desktop_update_success": "MuditaOS has been updated to ver.... succesfully.",
  "app_desktop_update_success": "MuditaOS has been updated succesfully.",
  "app_desktop_update_success": "MuditaOS has been updated to $VERSION succesfully.",
  "app_call_private_number": "Private number"
}

M module-apps/application-settings-new/ApplicationSettings.cpp => module-apps/application-settings-new/ApplicationSettings.cpp +9 -0
@@ 26,6 26,7 @@
#include "windows/QuotesMainWindow.hpp"
#include "windows/QuotesAddWindow.hpp"
#include "windows/EditQuotesWindow.hpp"
#include "windows/QuoteCategoriesWindow.hpp"
#include "windows/SecurityMainWindow.hpp"
#include "windows/QuotesOptionsWindow.hpp"
#include "windows/ChangePasscodeWindow.hpp"


@@ 84,6 85,11 @@ namespace app
            auto repo = std::make_unique<QuotesJsonRepository>(settings::quotesPath);
            return std::make_unique<QuotesModel>(app, std::move(repo));
        }

        auto getCategoriesModel(Application *app) -> std::unique_ptr<CategoriesModel>
        {
            return std::make_unique<CategoriesModel>(app);
        }
    } // namespace settings

    ApplicationSettingsNew::ApplicationSettingsNew(std::string name,


@@ 462,6 468,9 @@ namespace app
        windowsFactory.attach(gui::window::name::edit_quotes, [](Application *app, const std::string &name) {
            return std::make_unique<gui::EditQuotesWindow>(app);
        });
        windowsFactory.attach(gui::window::name::quote_categories, [](Application *app, const std::string &name) {
            return std::make_unique<gui::QuoteCategoriesWindow>(app, std::move(settings::getCategoriesModel(app)));
        });

        attachPopups({gui::popup::ID::Volume});
    }

M module-apps/application-settings-new/ApplicationSettings.hpp => module-apps/application-settings-new/ApplicationSettings.hpp +1 -0
@@ 44,6 44,7 @@ namespace gui::window::name
    inline constexpr auto options_quote        = "OptionsQuote";
    inline constexpr auto delete_quote         = "DeleteQuote";
    inline constexpr auto quotes_dialog_yes_no = "DialogYesNo";
    inline constexpr auto quote_categories     = "QuoteCategories";

    inline constexpr auto display_and_keypad = "DisplayAndKeypad";
    inline constexpr auto change_settings    = "ChangeSettings";

M module-apps/application-settings-new/CMakeLists.txt => module-apps/application-settings-new/CMakeLists.txt +5 -0
@@ 22,8 22,10 @@ target_sources( ${PROJECT_NAME}
        models/FromTimeToTimeModel.cpp
        models/QuotesModel.cpp
        models/QuotesRepository.cpp
        models/CategoriesModel.cpp
        widgets/ChangePasscodeLockHandler.cpp
        widgets/QuoteWidget.cpp
        widgets/CategoryWidget.cpp
        widgets/ApnInputWidget.cpp
        widgets/SettingsDateItem.cpp
        widgets/SettingsTimeItem.cpp


@@ 63,11 65,13 @@ target_sources( ${PROJECT_NAME}
        windows/ChangeDateAndTimeWindow.cpp
        windows/BluetoothCheckPasskeyWindow.cpp
        windows/EditQuotesWindow.cpp
        windows/QuoteCategoriesWindow.cpp

    PUBLIC
        ApplicationSettings.hpp
        widgets/ChangePasscodeLockHandler.hpp
        widgets/ApnInputWidget.hpp
        widgets/CategoryWidget.hpp
        windows/NewApnWindow.hpp
        windows/SettingsMainWindow.hpp
        windows/BaseSettingsWindow.hpp


@@ 88,6 92,7 @@ target_sources( ${PROJECT_NAME}
        windows/DateAndTimeMainWindow.hpp
        windows/ChangeDateAndTimeWindow.hpp
        windows/EditQuotesWindow.hpp
        windows/QuoteCategoriesWindow.hpp
)

add_dependencies(${PROJECT_NAME} version)

A module-apps/application-settings-new/models/CategoriesModel.cpp => module-apps/application-settings-new/models/CategoriesModel.cpp +71 -0
@@ 0,0 1,71 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "application-settings-new/windows/QuoteCategoriesWindow.hpp"
#include "QuotesRepository.hpp"
#include "CategoriesModel.hpp"

namespace style::quotes::list
{
    constexpr auto item_height = 63;
    constexpr auto max_quotes  = 100;
} // namespace style::quotes::list

namespace app
{
    CategoriesModel::CategoriesModel(app::Application *app) : application(app)
    {}

    auto CategoriesModel::requestRecordsCount() -> unsigned int
    {
        return internalData.size();
    }

    auto CategoriesModel::getMinimalItemHeight() const -> unsigned int
    {
        return style::quotes::list::item_height;
    }

    void CategoriesModel::requestRecords(const uint32_t offset, const uint32_t limit)
    {
        setupModel(offset, limit);
        list->onProviderDataUpdate();
    }

    auto CategoriesModel::getItem(gui::Order order) -> gui::ListItem *
    {
        return getRecord(order);
    }

    void CategoriesModel::createData()
    {
        // fake categories for testing
        // matter to be changed with the final connection of the appropriate agent
        std::vector<app::QuoteCategory> categories{{0, "Category 1"},
                                                   {1, "Category 2"},
                                                   {2, "Category 3"},
                                                   {3, "Category 4"},
                                                   {4, "Category 5"},
                                                   {5, "Category 6"}};
        for (const auto &category : categories) {
            auto app  = application;
            auto item = new gui::CategoryWidget(
                category,
                [app](const UTF8 &text) {
                    app->getCurrentWindow()->bottomBarTemporaryMode(text, gui::BottomBar::Side::CENTER, false);
                },
                [app]() { app->getCurrentWindow()->bottomBarRestoreFromTemporaryMode(); });

            item->deleteByList = false;
            internalData.push_back(item);
        }
    }

    void CategoriesModel::rebuild()
    {
        list->clear();
        eraseInternalData();
        createData();
        list->rebuildList();
    }
} // namespace app

A module-apps/application-settings-new/models/CategoriesModel.hpp => module-apps/application-settings-new/models/CategoriesModel.hpp +34 -0
@@ 0,0 1,34 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

#include "QuotesRepository.hpp"

#include <module-gui/gui/widgets/ListView.hpp>
#include <module-apps/InternalModel.hpp>

namespace gui
{
    class CategoryWidget;
}

namespace app
{

    class CategoriesModel : public app::InternalModel<gui::CategoryWidget *>, public gui::ListItemProvider
    {
      private:
        app::Application *application = nullptr;

      public:
        CategoriesModel(app::Application *app);
        [[nodiscard]] auto requestRecordsCount() -> unsigned int final;
        [[nodiscard]] auto getMinimalItemHeight() const -> unsigned int final;
        auto getItem(gui::Order order) -> gui::ListItem * final;
        void requestRecords(const uint32_t offset, const uint32_t limit) final;
        void createData();
        void rebuild();
    };

} // namespace app

M module-apps/application-settings-new/models/QuotesRepository.hpp => module-apps/application-settings-new/models/QuotesRepository.hpp +6 -0
@@ 27,6 27,12 @@ namespace app
        }
    };

    struct QuoteCategory
    {
        int id = 0;
        std::string categoryDescription;
    };

    class QuotesRepository
    {
      public:

A module-apps/application-settings-new/widgets/CategoryWidget.cpp => module-apps/application-settings-new/widgets/CategoryWidget.cpp +113 -0
@@ 0,0 1,113 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "CategoryWidget.hpp"

#include <BottomBar.hpp>
#include <InputEvent.hpp>
#include <utility>
#include <i18n/i18n.hpp>

namespace style::quotes
{
    namespace widget
    {
        inline constexpr uint32_t w = style::window::default_body_width;
        inline constexpr uint32_t h = 50;

        inline constexpr uint32_t input_box_w           = 55;
        inline constexpr uint32_t input_box_h           = h;
        inline constexpr int32_t input_box_right_margin = 20;

        inline constexpr uint32_t description_label_w           = 280;
        inline constexpr uint32_t description_label_h           = 33;
        inline constexpr int32_t description_label_right_margin = 40;

        inline constexpr int32_t tick_image_left_margin  = -64;
        inline constexpr int32_t tick_image_right_margin = 32;

    } // namespace widget

} // namespace style::quotes

namespace gui
{

    CategoryWidget::CategoryWidget(const app::QuoteCategory &category,
                                   std::function<void(const UTF8 &)> bottomBarTemporaryMode,
                                   std::function<void()> bottomBarRestoreFromTemporaryMode)
        : bottomBarTemporaryMode(std::move(bottomBarTemporaryMode)),
          bottomBarRestoreFromTemporaryMode(std::move(bottomBarRestoreFromTemporaryMode)), category(category)
    {

        setMinimumSize(style::quotes::widget::w, style::quotes::widget::h);

        setMargins(gui::Margins(0, style::margins::big, 0, 0));

        hBox = new gui::HBox(this, 0, 0, this->getWidth(), 80);
        hBox->setEdges(gui::RectangleEdge::None);
        hBox->setPenFocusWidth(style::window::default_border_focus_w);
        hBox->setPenWidth(style::window::default_border_rect_no_focus);

        inputBoxLabel = new gui::Label(hBox, 0, 0, 0, 0);
        inputBoxLabel->setMinimumSize(style::quotes::widget::input_box_w, style::quotes::widget::input_box_h);

        inputBoxLabel->setMargins(gui::Margins(0, 0, style::quotes::widget::input_box_right_margin, 0));
        inputBoxLabel->setEdges(gui::RectangleEdge::Bottom);
        inputBoxLabel->setAlignment(Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center));
        inputBoxLabel->setFont(style::window::font::medium);
        inputBoxLabel->activeItem = false;

        tickImage = new gui::Image(hBox, 0, 0, 0, 0);
        tickImage->setAlignment(Alignment(gui::Alignment::Vertical::Center));
        // Not ideal -> best solution would be to create separate widget with image inside box.
        tickImage->setMargins(gui::Margins(
            style::quotes::widget::tick_image_left_margin, 0, style::quotes::widget::tick_image_right_margin, 0));
        tickImage->set("small_tick_W_M");
        tickImage->setVisible(true);
        tickImage->activeItem = false;

        descriptionLabel = new gui::Label(hBox, 0, 0, 0, 0);
        descriptionLabel->setMinimumSize(style::quotes::widget::description_label_w,
                                         style::quotes::widget::description_label_h);
        descriptionLabel->setMargins(gui::Margins(0, 0, style::quotes::widget::description_label_right_margin, 0));
        descriptionLabel->setEdges(gui::RectangleEdge::None);
        descriptionLabel->setAlignment(Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center));
        descriptionLabel->setFont(style::window::font::medium);
        descriptionLabel->activeItem = false;

        descriptionLabel->setText(category.categoryDescription);

        focusChangedCallback = [&](gui::Item &item) {
            if (item.focus) {
                descriptionLabel->setFont(style::footer::font::bold);
                setFocusItem(inputBoxLabel);
                auto bottorBarText =
                    tickImage->visible ? utils::localize.get("common_uncheck") : utils::localize.get("common_check");
                this->bottomBarTemporaryMode(bottorBarText);
            }
            else {
                descriptionLabel->setFont(style::footer::font::medium);
                setFocusItem(nullptr);
                this->bottomBarRestoreFromTemporaryMode();
            }
            return true;
        };

        activatedCallback = [&](gui::Item &item) {
            tickImage->setVisible(!tickImage->visible);
            auto bottorBarText =
                tickImage->visible ? utils::localize.get("common_uncheck") : utils::localize.get("common_check");
            this->bottomBarTemporaryMode(bottorBarText);
            hBox->resizeItems();
            return true;
        };

        dimensionChangedCallback = [&](gui::Item &, const BoundingBox &newDim) -> bool {
            hBox->setArea({0, 0, newDim.w, newDim.h});
            return true;
        };

        setEdges(gui::RectangleEdge::None);
    }
} /* namespace gui */

A module-apps/application-settings-new/widgets/CategoryWidget.hpp => module-apps/application-settings-new/widgets/CategoryWidget.hpp +34 -0
@@ 0,0 1,34 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

#include "application-settings-new/data/QuoteSwitchData.hpp"

#include <BoxLayout.hpp>
#include <Image.hpp>
#include <Label.hpp>
#include <ListItem.hpp>

namespace gui
{
    class CategoryWidget : public ListItem
    {
      public:
        CategoryWidget(const app::QuoteCategory &category,
                       std::function<void(const UTF8 &text)> bottomBarTemporaryMode = nullptr,
                       std::function<void()> bottomBarRestoreFromTemporaryMode      = nullptr);

      private:
        gui::HBox *hBox              = nullptr;
        gui::Label *inputBoxLabel    = nullptr;
        gui::Label *descriptionLabel = nullptr;
        gui::Image *tickImage        = nullptr;

        std::function<void(const UTF8 &text)> bottomBarTemporaryMode = nullptr;
        std::function<void()> bottomBarRestoreFromTemporaryMode      = nullptr;

        app::QuoteCategory category;
    };

} /* namespace gui */

M module-apps/application-settings-new/widgets/SettingsStyle.hpp => module-apps/application-settings-new/widgets/SettingsStyle.hpp +17 -1
@@ 1,4 1,4 @@
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once


@@ 118,4 118,20 @@ namespace style
            }         // namespace bluetooth
        }     // namespace window
    };        // namespace settings
    namespace quotes::categories
    {
        namespace list
        {
            inline constexpr auto X      = style::window::default_left_margin;
            inline constexpr auto Y      = style::header::height;
            inline constexpr auto Width  = style::listview::body_width_with_scroll;
            inline constexpr auto Height = style::window_height - Y - style::footer::height;
        } // namespace list

        inline constexpr auto cross_x = 48;
        inline constexpr auto cross_y = 55;
        inline constexpr auto arrow_x = 30;
        inline constexpr auto arrow_y = 62;

    } // namespace quotes::categories
} // namespace style

M module-apps/application-settings-new/windows/EditQuotesWindow.cpp => module-apps/application-settings-new/windows/EditQuotesWindow.cpp +1 -1
@@ 44,7 44,7 @@ namespace gui
            optionsList.emplace_back(std::make_unique<gui::option::OptionSettings>(
                utils::translateI18("app_settings_display_wallpaper_quotes_categories"),
                [=](gui::Item &item) {
                    application->switchWindow(gui::window::name::quotes, nullptr);
                    application->switchWindow(gui::window::name::quote_categories, nullptr);
                    return true;
                },
                [=](gui::Item &item) {

A module-apps/application-settings-new/windows/QuoteCategoriesWindow.cpp => module-apps/application-settings-new/windows/QuoteCategoriesWindow.cpp +40 -0
@@ 0,0 1,40 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "QuoteCategoriesWindow.hpp"
#include <application-settings-new/models/CategoriesModel.hpp>
#include <application-settings-new/ApplicationSettings.hpp>
#include <application-settings-new/widgets/SettingsStyle.hpp>

namespace gui
{
    QuoteCategoriesWindow::QuoteCategoriesWindow(app::Application *app, std::shared_ptr<app::CategoriesModel> model)
        : AppWindow(app, gui::window::name::quote_categories), categoriesModel(std::move(model))
    {
        buildInterface();
    }

    void QuoteCategoriesWindow::buildInterface()
    {
        AppWindow::buildInterface();

        setTitle(utils::localize.get("app_settings_display_wallpaper_quotes_categories"));

        bottomBar->setText(BottomBar::Side::CENTER, utils::localize.get(style::strings::common::check));
        bottomBar->setText(BottomBar::Side::RIGHT, utils::localize.get(style::strings::common::back));

        list = new gui::ListView(this,
                                 style::quotes::categories::list::X,
                                 style::quotes::categories::list::Y,
                                 style::quotes::categories::list::Width,
                                 style::quotes::categories::list::Height,
                                 categoriesModel);

        setFocusItem(list);
    }

    void QuoteCategoriesWindow::onBeforeShow(ShowMode mode, SwitchData *data)
    {
        categoriesModel->rebuild();
    }
} // namespace gui

A module-apps/application-settings-new/windows/QuoteCategoriesWindow.hpp => module-apps/application-settings-new/windows/QuoteCategoriesWindow.hpp +27 -0
@@ 0,0 1,27 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

#include "BaseSettingsWindow.hpp"
#include <application-settings-new/widgets/CategoryWidget.hpp>
#include <application-settings-new/models/CategoriesModel.hpp>
#include <module-gui/gui/widgets/ListView.hpp>
#include <module-apps/InternalModel.hpp>

namespace gui
{
    class QuoteCategoriesWindow : public AppWindow
    {
      public:
        QuoteCategoriesWindow(app::Application *app, std::shared_ptr<app::CategoriesModel> model);

      private:
        void buildInterface() override;
        void onBeforeShow(ShowMode mode, SwitchData *data) override;

        std::shared_ptr<app::CategoriesModel> categoriesModel = nullptr;
        gui::ListView *list                                   = nullptr;
    };

} // namespace gui