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