M image/assets/lang/English.json => image/assets/lang/English.json +1 -0
@@ 563,6 563,7 @@
"app_bellmain_main_window_title": "Bell Hybrid+",
"app_bell_settings_advanced": "Advanced",
"app_bell_settings_advanced_time_units": "Time & units",
+ "app_bell_settings_advanced_temp_scale": "Temperature scale",
"app_bellmain_home_screen_bottom_desc": "Next alarm will ring in",
"app_bellmain_home_screen_bottom_desc_dp": "Deep press to activate"
}
M module-apps/application-bell-settings/CMakeLists.txt => module-apps/application-bell-settings/CMakeLists.txt +2 -0
@@ 26,6 26,7 @@ target_sources(application-bell-settings
presenter/TimeUnitsPresenter.cpp
widgets/TimeSetListItem.cpp
widgets/TimeFormatSetListItem.cpp
+ widgets/TemperatureUnitListItem.cpp
windows/BellSettingsWindow.cpp
windows/BellSettingsAdvancedWindow.cpp
windows/BellSettingsTimeUnitsWindow.cpp
@@ 36,6 37,7 @@ target_sources(application-bell-settings
presenter/TimeUnitsPresenter.hpp
widgets/TimeSetListItem.hpp
widgets/TimeFormatSetListItem.hpp
+ widgets/TemperatureUnitListItem.hpp
windows/BellSettingsWindow.hpp
windows/BellSettingsAdvancedWindow.hpp
windows/BellSettingsTimeUnitsWindow.hpp
M module-apps/application-bell-settings/models/TemperatureUnitModel.cpp => module-apps/application-bell-settings/models/TemperatureUnitModel.cpp +5 -3
@@ 5,10 5,11 @@
#include <apps-common/Application.hpp>
#include <service-db/Settings.hpp>
+#include <service-db/agents/settings/SystemSettings.hpp>
namespace
{
- constexpr auto temperatureUnit = "placeholder";
+ constexpr auto temperatureUnit = settings::Temperature::unit;
} // namespace
namespace app::bell_settings
@@ 21,9 22,10 @@ namespace app::bell_settings
gui::temperature::Temperature::Unit TemperatureUnitModel::get() const
{
const auto value = settings.getValue(temperatureUnit, settings::SettingsScope::Global);
- return value == gui::temperature::celsiusDegreeSymbol ? gui::temperature::Temperature::Unit::Celsius
- : gui::temperature::Temperature::Unit::Fahrenheit;
+ return value == gui::temperature::celsiusSymbol ? gui::temperature::Temperature::Unit::Celsius
+ : gui::temperature::Temperature::Unit::Fahrenheit;
}
+
void TemperatureUnitModel::set(gui::temperature::Temperature::Unit unit)
{
settings.setValue(gui::temperature::toStr(unit), temperatureUnit, settings::SettingsScope::Global);
M module-apps/application-bell-settings/models/TemperatureUnitModel.hpp => module-apps/application-bell-settings/models/TemperatureUnitModel.hpp +6 -2
@@ 18,8 18,10 @@ namespace app::bell_settings
class AbstractTemperatureUnitModel
{
public:
- virtual ~AbstractTemperatureUnitModel() = default;
- virtual gui::temperature::Temperature::Unit get() const = 0;
+ virtual ~AbstractTemperatureUnitModel() = default;
+
+ virtual gui::temperature::Temperature::Unit get() const = 0;
+
virtual void set(gui::temperature::Temperature::Unit unit) = 0;
};
@@ 27,7 29,9 @@ namespace app::bell_settings
{
public:
explicit TemperatureUnitModel(Application *app);
+
gui::temperature::Temperature::Unit get() const override;
+
void set(gui::temperature::Temperature::Unit unit) override;
private:
M module-apps/application-bell-settings/models/TimeUnitsModel.cpp => module-apps/application-bell-settings/models/TimeUnitsModel.cpp +12 -2
@@ 2,8 2,9 @@
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
#include "TimeUnitsModel.hpp"
-#include "TimeFormatSetListItem.hpp"
-#include "TimeSetListItem.hpp"
+#include "widgets/TimeFormatSetListItem.hpp"
+#include "widgets/TimeSetListItem.hpp"
+#include "widgets/TemperatureUnitListItem.hpp"
#include <gui/widgets/ListViewEngine.hpp>
#include <gui/widgets/Style.hpp>
@@ 60,6 61,10 @@ namespace app::bell_settings
timeSetListItem->timeSetFmtSpinner->setTimeFormat(timeFmtSetListItem->getTimeFmt());
};
+ temperatureUnitListItem =
+ new gui::TemperatureUnitListItem(utils::translate("app_bell_settings_advanced_temp_scale"));
+ internalData.push_back(temperatureUnitListItem);
+
for (auto item : internalData) {
item->deleteByList = false;
}
@@ 107,10 112,15 @@ namespace app::bell_settings
auto msg = std::make_shared<stm::message::TimeChangeRequestMessage>(newTime);
application->bus.sendUnicast(std::move(msg), service::name::service_time);
}
+
void TimeUnitsModel::sendTimeFmtUpdateMessage(utils::time::Locale::TimeFormat newFmt)
{
auto msg = std::make_shared<stm::message::SetTimeFormatRequest>(newFmt);
application->bus.sendUnicast(std::move(msg), service::name::service_time);
}
+ auto TimeUnitsModel::getTemperatureUnit() -> gui::temperature::Temperature::Unit
+ {
+ return *gui::temperature::strToUnit(temperatureUnitListItem->getUnitAsStr());
+ }
} // namespace app::bell_settings
M module-apps/application-bell-settings/models/TimeUnitsModel.hpp => module-apps/application-bell-settings/models/TimeUnitsModel.hpp +18 -3
@@ 5,12 5,16 @@
#include <apps-common/Application.hpp>
#include <apps-common/InternalModel.hpp>
+#include <apps-common/Temperature.hpp>
#include <time/time_locale.hpp>
namespace gui
{
class TimeSetListItem;
+
class TimeFormatSetListItem;
+
+ class TemperatureUnitListItem;
} // namespace gui
namespace app::bell_settings
@@ 19,24 23,35 @@ namespace app::bell_settings
{
public:
explicit TimeUnitsModel(app::Application *app);
+
~TimeUnitsModel();
auto clearData() -> void;
+
auto saveData() -> void;
+
auto loadData() -> void;
+
auto createData() -> void;
+
auto requestRecords(uint32_t offset, uint32_t limit) -> void;
[[nodiscard]] auto getItem(gui::Order order) -> gui::ListItem * override;
+
[[nodiscard]] auto requestRecordsCount() -> unsigned int override;
+
[[nodiscard]] auto getMinimalItemSpaceRequired() const -> unsigned int override;
+ [[nodiscard]] auto getTemperatureUnit() -> gui::temperature::Temperature::Unit;
+
private:
- app::Application *application = nullptr;
- gui::TimeSetListItem *timeSetListItem = nullptr;
- gui::TimeFormatSetListItem *timeFmtSetListItem = nullptr;
+ app::Application *application{};
+ gui::TimeSetListItem *timeSetListItem{};
+ gui::TimeFormatSetListItem *timeFmtSetListItem{};
+ gui::TemperatureUnitListItem *temperatureUnitListItem{};
void sendRtcUpdateTimeMessage(time_t newTime);
+
void sendTimeFmtUpdateMessage(utils::time::Locale::TimeFormat newFmt);
};
} // namespace app::bell_settings
M module-apps/application-bell-settings/presenter/TimeUnitsPresenter.cpp => module-apps/application-bell-settings/presenter/TimeUnitsPresenter.cpp +1 -0
@@ 25,6 25,7 @@ namespace app::bell_settings
auto TimeUnitsWindowPresenter::saveData() -> void
{
pagesProvider->saveData();
+ temperatureUnitModel->set(pagesProvider->getTemperatureUnit());
}
auto TimeUnitsWindowPresenter::loadData() -> void
A module-apps/application-bell-settings/widgets/TemperatureUnitListItem.cpp => module-apps/application-bell-settings/widgets/TemperatureUnitListItem.cpp +43 -0
@@ 0,0 1,43 @@
+// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
+// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
+
+#include "BellSettingsStyle.hpp"
+#include "TemperatureUnitListItem.hpp"
+
+#include <apps-common/Temperature.hpp>
+#include <gui/widgets/TextSpinner.hpp>
+
+namespace gui
+{
+ TemperatureUnitListItem::TemperatureUnitListItem(const UTF8 &topDesc, Length x, Length y, Length w, Length h)
+ : BellSideListItem(topDesc)
+ {
+ setMinimumSize(style::sidelistview::list_item::w, style::sidelistview::list_item::h);
+ setEdges(RectangleEdge::None);
+ setFocusItem(body);
+
+ temperatureUnit = new TextSpinner({temperature::celsiusDegreeSymbol, temperature::fahrenheitDegreeSymbol},
+ Boundaries::Continuous);
+ temperatureUnit->setMaximumSize(style::bell_base_layout::w, style::bell_base_layout::h);
+ temperatureUnit->setFont(bell_settings_style::time_fmt_set_list_item::font);
+ temperatureUnit->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Center));
+ temperatureUnit->setFocusEdges(RectangleEdge::None);
+ body->centerBox->addWidget(temperatureUnit);
+
+ dimensionChangedCallback = [&](Item &, const BoundingBox &newDim) -> bool {
+ body->setArea({0, 0, newDim.w, newDim.h});
+ return true;
+ };
+ focusChangedCallback = [&](Item &) {
+ setFocusItem(focus ? body : nullptr);
+ return true;
+ };
+
+ inputCallback = [&](Item &, const InputEvent &inputEvent) -> bool { return body->onInput(inputEvent); };
+ }
+
+ auto TemperatureUnitListItem::getUnitAsStr() const noexcept -> UTF8
+ {
+ return temperatureUnit->getCurrentText();
+ }
+} // namespace gui
A module-apps/application-bell-settings/widgets/TemperatureUnitListItem.hpp => module-apps/application-bell-settings/widgets/TemperatureUnitListItem.hpp +25 -0
@@ 0,0 1,25 @@
+// 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 <widgets/BellSideListItem.hpp>
+#include <utf8/UTF8.hpp>
+
+namespace gui
+{
+ class TextSpinner;
+
+ class TemperatureUnitListItem : public BellSideListItem
+ {
+ public:
+ explicit TemperatureUnitListItem(
+ const UTF8 &topDesc = "", Length x = 0, Length y = 0, Length w = 0, Length h = 0);
+
+ auto getUnitAsStr() const noexcept -> UTF8;
+
+ private:
+ TextSpinner *temperatureUnit{};
+ };
+
+} // namespace gui
M module-apps/apps-common/Temperature.hpp => module-apps/apps-common/Temperature.hpp +18 -3
@@ 4,13 4,16 @@
#pragma once
#include <cstdint>
+#include <optional>
#include <string>
namespace gui::temperature
{
- inline constexpr auto celsiusDegreeSymbol = "C";
- inline constexpr auto fahrenheitDegreeSymbol = "F";
+ inline constexpr auto celsiusSymbol = "C";
+ inline constexpr auto fahrenheitSymbol = "F";
inline constexpr auto degree = "\u00B0";
+ inline constexpr auto celsiusDegreeSymbol = "\u00B0C";
+ inline constexpr auto fahrenheitDegreeSymbol = "\u00B0F";
struct Temperature
{
@@ 25,6 28,18 @@ namespace gui::temperature
inline std::string toStr(Temperature::Unit unit)
{
- return unit == Temperature::Unit::Celsius ? celsiusDegreeSymbol : fahrenheitDegreeSymbol;
+ return unit == Temperature::Unit::Celsius ? celsiusSymbol : fahrenheitSymbol;
+ }
+
+ inline std::optional<Temperature::Unit> strToUnit(std::string_view str)
+ {
+ if (str == gui::temperature::celsiusDegreeSymbol) {
+ return gui::temperature::Temperature::Unit::Celsius;
+ }
+ else if (str == gui::temperature::fahrenheitDegreeSymbol) {
+ return gui::temperature::Temperature::Unit::Fahrenheit;
+ }
+
+ return {};
}
} // namespace gui::temperature
M module-gui/gui/widgets/TextSpinner.cpp => module-gui/gui/widgets/TextSpinner.cpp +6 -2
@@ 25,7 25,7 @@ namespace gui
update();
}
- std::string TextSpinner::getCurrentText() const noexcept
+ UTF8 TextSpinner::getCurrentText() const noexcept
{
return textRange[currentPosition];
}
@@ 83,7 83,7 @@ namespace gui
bool TextSpinner::onFocus(bool state)
{
if (focus) {
- setEdges(RectangleEdge::Bottom);
+ setEdges(focusEdges);
}
else {
setEdges(RectangleEdge::None);
@@ 103,5 103,9 @@ namespace gui
{
return Range{getRangeDownLimit(), getRangeUpLimit()};
}
+ void TextSpinner::setFocusEdges(RectangleEdge edges)
+ {
+ focusEdges = edges;
+ }
} // namespace gui
M module-gui/gui/widgets/TextSpinner.hpp => module-gui/gui/widgets/TextSpinner.hpp +3 -1
@@ 24,8 24,9 @@ namespace gui
void setTextRange(const TextRange &range);
/// Sets current position. Must be within valid @ref Range that can be checked by @ref getValidRange
void setCurrentPosition(Position pos);
+ void setFocusEdges(RectangleEdge edges);
- [[nodiscard]] std::string getCurrentText() const noexcept;
+ [[nodiscard]] UTF8 getCurrentText() const noexcept;
[[nodiscard]] Range getValidRange() const noexcept;
void stepUp();
@@ 39,6 40,7 @@ namespace gui
TextRange textRange;
Position currentPosition = 0;
Boundaries boundaries = Boundaries::Continuous;
+ RectangleEdge focusEdges = RectangleEdge::Bottom;
void update();
Position getRangeUpLimit() const;
M module-services/service-db/agents/settings/SystemSettings.hpp => module-services/service-db/agents/settings/SystemSettings.hpp +6 -1
@@ 63,4 63,9 @@ namespace settings
{
constexpr inline auto state = "keypad_light_state";
} // namespace KeypadLight
-}; // namespace settings
+
+ namespace Temperature
+ {
+ constexpr inline auto unit = "temperature_unit";
+ } // namespace Temperature
+}; // namespace settings