~aleteoryx/muditaos

3f5b66b3be78fac645ecd2a159c6f9ea2c3995f6 — Mateusz Piesta 4 years ago 0f33517
[BH-792] Temp format list item

Added temperature unit/scale ListItem to
the Time&Units application and integrated it
with temperature unit model.
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