~aleteoryx/muditaos

a912db548997bf89d875be3494c8d130a5a48f12 — Pawel.Paprocki 4 years ago d6469e2
[BH-677] Add widget AlarmSetSpinner

Add widget for Bell alarm display and edit
A art/bell/bell_alarm_activated.png => art/bell/bell_alarm_activated.png +0 -0
A art/bell/bell_alarm_deactivated.png => art/bell/bell_alarm_deactivated.png +0 -0
A art/bell/bell_alarm_ringing.png => art/bell/bell_alarm_ringing.png +0 -0
A art/bell/bell_alarm_snooze.png => art/bell/bell_alarm_snooze.png +0 -0
A art/bell/bell_arrow_left.png => art/bell/bell_arrow_left.png +0 -0
A art/bell/bell_arrow_right.png => art/bell/bell_arrow_right.png +0 -0
A image/assets/images/bell_alarm_activated.vpi => image/assets/images/bell_alarm_activated.vpi +0 -0
A image/assets/images/bell_alarm_deactivated.vpi => image/assets/images/bell_alarm_deactivated.vpi +0 -0
A image/assets/images/bell_alarm_ringing.vpi => image/assets/images/bell_alarm_ringing.vpi +0 -0
A image/assets/images/bell_alarm_snooze.vpi => image/assets/images/bell_alarm_snooze.vpi +0 -0
A image/assets/images/bell_arrow_left.vpi => image/assets/images/bell_arrow_left.vpi +0 -0
A image/assets/images/bell_arrow_right.vpi => image/assets/images/bell_arrow_right.vpi +0 -0
A module-apps/application-bell-main/data/BellAlarmData.hpp => module-apps/application-bell-main/data/BellAlarmData.hpp +16 -0
@@ 0,0 1,16 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

namespace BellAlarm
{
    enum class Status
    {
        UNKNOWN,
        RINGING,
        ACTIVATED,
        DEACTIVATED,
        SNOOZE
    };
}

M module-apps/application-bell-main/data/BellMainStyle.hpp => module-apps/application-bell-main/data/BellMainStyle.hpp +6 -0
@@ 28,6 28,12 @@ namespace bellMainStyle
            inline constexpr auto degree = "\u00B0";
        } // namespace temperatureLabel

        namespace body
        {
            inline constexpr auto posX = 20U;
            inline constexpr auto posY = 45U;
        } // namespace body

    } // namespace mainWindow

    namespace mainMenuWindow

M module-apps/application-bell-main/windows/BellMainWindow.cpp => module-apps/application-bell-main/windows/BellMainWindow.cpp +61 -9
@@ 2,16 2,16 @@
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "BellMainWindow.hpp"

#include <application-bell-main/ApplicationBellMain.hpp>
#include <data/BellMainStyle.hpp>

#include <gui/input/InputEvent.hpp>
#include <i18n/i18n.hpp>
#include <log/log.hpp>
#include <service-appmgr/Controller.hpp>
#include <time/time_conversion.hpp>

static constexpr uint32_t mockHour   = 10;
static constexpr uint32_t mockMinute = 15;

namespace gui
{
    BellMainWindow::BellMainWindow(app::Application *app) : AppWindow(app, gui::name::window::main_window)


@@ 27,6 27,25 @@ namespace gui
        header->setTitleVisibility(false);
        bottomBar->setVisible(false);

        auto vBox = new gui::VBox(this,
                                  bellMainStyle::mainWindow::body::posX,
                                  bellMainStyle::mainWindow::body::posY,
                                  style::window::default_body_width,
                                  style::window::default_body_height);
        vBox->setEdges(gui::RectangleEdge::None);

        alarmSetSpinner = new AlarmSetSpinner(this, 0, 0, style::alarm_set_spinner::w, style::alarm_set_spinner::h);
        alarmSetSpinner->setMinimumSize(style::window::default_body_width, style::alarm_set_spinner::h);
        // for test purposes only
        alarmSetSpinner->setHour(mockHour);
        alarmSetSpinner->setMinute(mockMinute);

        alarmSetSpinner->setFont(style::window::font::largelight);
        alarmSetSpinner->setEditMode(EditMode::Browse);
        alarmStatus = BellAlarm::Status::DEACTIVATED;
        alarmSetSpinner->setAlarmStatus(alarmStatus);
        vBox->addWidget(alarmSetSpinner);

        namespace timeLabel = bellMainStyle::mainWindow::timeLabel;
        time = new gui::Label(this, timeLabel::posX, timeLabel::posY, timeLabel::width, timeLabel::height);
        time->setFilled(false);


@@ 43,6 62,8 @@ namespace gui
        temperature->setAlignment(Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center));
        std::string degree_sign(temperatureLabel::degree);
        temperature->setText("12 " + degree_sign + "C");

        setFocusItem(time);
    }

    bool BellMainWindow::onInput(const InputEvent &inputEvent)


@@ 51,20 72,51 @@ namespace gui
        if (inputEvent.isShortRelease()) {
            switch (inputEvent.getKeyCode()) {
            case KeyCode::KEY_ENTER:
                LOG_INFO("Open MainMenu");
                application->switchWindow(gui::window::name::bell_main_menu, nullptr);
                return true;
            case KeyCode::KEY_RF:
                return true;
                return handleEnterKey(inputEvent);
            case KeyCode::KEY_UP:
            case KeyCode::KEY_DOWN:
                handleEditModeEntry();
                break;

            default:
                break;
            }
        }

        // check if any of the lower inheritance onInput methods catch the event
        return AppWindow::onInput(inputEvent);
    }

    bool BellMainWindow::handleEnterKey(const InputEvent &inputEvent)
    {
        if (alarmEditMode) {
            auto ret = AppWindow::onInput(inputEvent);
            if (ret == false) {
                // alarm setting finished
                alarmEditMode = false;
                setFocusItem(nullptr);
                alarmSetSpinner->setEditMode(EditMode::Browse);
                alarmStatus = BellAlarm::Status::ACTIVATED;
                alarmSetSpinner->setAlarmStatus(alarmStatus);
                return true;
            }
            return ret;
        }
        else {
            LOG_INFO("Open MainMenu");
            application->switchWindow(gui::window::name::bell_main_menu, nullptr);
            return true;
        }
    }

    void BellMainWindow::handleEditModeEntry()
    {
        if (!alarmEditMode) {
            alarmEditMode = true;
            setFocusItem(alarmSetSpinner);
            alarmSetSpinner->setEditMode(EditMode::Edit);
        }
    }

    bool BellMainWindow::updateTime()
    {
        if (time != nullptr) {

M module-apps/application-bell-main/windows/BellMainWindow.hpp => module-apps/application-bell-main/windows/BellMainWindow.hpp +10 -0
@@ 3,8 3,11 @@

#pragma once

#include <data/BellAlarmData.hpp>
#include <AppWindow.hpp>
#include <gui/widgets/Spinner.hpp>
#include <widgets/TimeSetSpinner.hpp>
#include <widgets/AlarmSetSpinner.hpp>
#include <BoxLayout.hpp>

namespace gui


@@ 20,5 23,12 @@ namespace gui

        gui::Label *time        = nullptr;
        gui::Label *temperature = nullptr;
        AlarmSetSpinner *alarmSetSpinner = nullptr;

      private:
        auto handleEnterKey(const InputEvent &inputEvent) -> bool;
        auto handleEditModeEntry() -> void;
        bool alarmEditMode            = false;
        BellAlarm::Status alarmStatus = BellAlarm::Status::DEACTIVATED;
    };
} // namespace gui

M module-apps/apps-common/CMakeLists.txt => module-apps/apps-common/CMakeLists.txt +1 -0
@@ 37,6 37,7 @@ target_sources(apps-common
        widgets/SpinBox.cpp
        widgets/TextWithIconsWidget.cpp
        widgets/TimeSetSpinner.cpp
        widgets/AlarmSetSpinner.cpp
        widgets/TimeWidget.cpp
        widgets/WidgetsUtils.cpp
        windows/AppWindow.cpp

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

#include "AlarmSetSpinner.hpp"
#include <FontManager.hpp>
#include <RawFont.hpp>
#include <gui/widgets/Label.hpp>

namespace gui
{
    AlarmSetSpinner::AlarmSetSpinner(Item *parent, Length x, Length y, Length w, Length h) : HBox(parent, x, y, w, h)
    {
        setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Center));
        setEdges(RectangleEdge::None);

        leftArrow = new ImageBox(this, 0, 0, 0, 0, new Image("bell_arrow_left"));
        leftArrow->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Center));
        leftArrow->setMargins(Margins(0, 0, 0, 0));
        leftArrow->setMinimumSize(style::alarm_set_spinner::arrow::w, style::alarm_set_spinner::arrow::h);

        alarmImg = new ImageBox(this, 0, 0, 0, 0, new Image("bell_alarm_deactivated"));
        alarmImg->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Center));
        alarmImg->setMargins(Margins(0, 0, 0, 0));
        alarmImg->setMinimumSize(style::alarm_set_spinner::arrow::w, style::alarm_set_spinner::arrow::h);

        timeSpinner = new TimeSetSpinner(this, 0, 0, 0, 0);
        timeSpinner->setFont(style::window::font::largelight);
        timeSpinner->setEditMode(EditMode::Scroll);
        timeSpinner->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Center));
        timeSpinner->setMargins(Margins(0, 0, 0, 0));
        timeSpinner->setMinimumHeight(style::alarm_set_spinner::h);

        rightArrow = new ImageBox(this, 0, 0, 0, 0, new Image("bell_arrow_right"));
        rightArrow->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Center));
        rightArrow->setMargins(Margins(0, 0, 0, 0));
        rightArrow->setMinimumSize(style::alarm_set_spinner::arrow::w, style::alarm_set_spinner::arrow::h);

        resizeItems();

        if (editMode == EditMode::Edit) {
            setFocusItem(timeSpinner);
        }
    }

    auto AlarmSetSpinner::onInput(const InputEvent &inputEvent) -> bool
    {
        LOG_INFO("Bell AlarmSetSpinner Input");
        return this->focusItem->onInput(inputEvent);
    }

    auto AlarmSetSpinner::setHour(int value) noexcept -> void
    {
        timeSpinner->setHour(value);
    }

    auto AlarmSetSpinner::setMinute(int value) noexcept -> void
    {
        timeSpinner->setMinute(value);
    }

    auto AlarmSetSpinner::setFont(std::string newFontName) noexcept -> void
    {
        fontName = std::move(newFontName);
        timeSpinner->setFont(fontName);
    }

    auto AlarmSetSpinner::setEditMode(EditMode mode) noexcept -> void
    {
        editMode = mode;
        if (editMode == EditMode::Edit) {
            setFocusItem(timeSpinner);
            leftArrow->setVisible(true);
            rightArrow->setVisible(true);
        }
        else {
            setFocusItem(nullptr);
            leftArrow->setVisible(false);
            rightArrow->setVisible(false);
        }

        timeSpinner->setEditMode(editMode);
    }

    auto AlarmSetSpinner::getHour() const noexcept -> int
    {
        return timeSpinner->getHour();
    }

    auto AlarmSetSpinner::getMinute() const noexcept -> int
    {
        return timeSpinner->getMinute();
    }

    auto AlarmSetSpinner::setAlarmStatus(BellAlarm::Status status) noexcept -> void
    {
        alarmStatus = status;

        switch (alarmStatus) {
        case BellAlarm::Status::ACTIVATED:
            alarmImg->setImage("bell_alarm_activated");
            break;
        case BellAlarm::Status::DEACTIVATED:
            alarmImg->setImage("bell_alarm_deactivated");
            break;
        case BellAlarm::Status::RINGING:
            alarmImg->setImage("bell_alarm_ringing");
            break;
        case BellAlarm::Status::SNOOZE:
            alarmImg->setImage("bell_alarm_snooze");
            break;
        case BellAlarm::Status::UNKNOWN:
            alarmImg->setImage("bell_alarm_deactivated");
            break;
        default:
            alarmImg->setImage("bell_alarm_deactivated");
            break;
        }
    }

    auto AlarmSetSpinner::getAlarmStatus() noexcept -> BellAlarm::Status
    {
        return alarmStatus;
    }

} /* namespace gui */

A module-apps/apps-common/widgets/AlarmSetSpinner.hpp => module-apps/apps-common/widgets/AlarmSetSpinner.hpp +54 -0
@@ 0,0 1,54 @@
// 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 "Rect.hpp"
#include <application-bell-main/data/BellAlarmData.hpp>
#include "TimeSetSpinner.hpp"
#include <gui/widgets/Spinner.hpp>
#include <gui/widgets/Style.hpp>
#include <gui/widgets/TextConstants.hpp>
#include <gui/widgets/ImageBox.hpp>
#include <string>

namespace style::alarm_set_spinner
{
    namespace arrow
    {
        inline constexpr auto w = 64U;
        inline constexpr auto h = 64U;
    } // namespace arrow
    inline constexpr auto w = 440U;
    inline constexpr auto h = 64U;

} // namespace style::alarm_set_spinner

namespace gui
{
    class AlarmSetSpinner : public HBox
    {
      public:
        AlarmSetSpinner(Item *parent, Length x, Length y, Length w, Length h);

        auto setHour(int value) noexcept -> void;
        auto setMinute(int value) noexcept -> void;
        auto setFont(std::string newFontName) noexcept -> void;
        auto setEditMode(EditMode mode) noexcept -> void;
        auto setAlarmStatus(BellAlarm::Status status) noexcept -> void;
        auto getAlarmStatus() noexcept -> BellAlarm::Status;
        [[nodiscard]] auto getHour() const noexcept -> int;
        [[nodiscard]] auto getMinute() const noexcept -> int;

      private:
        TimeSetSpinner *timeSpinner = nullptr;
        ImageBox *leftArrow         = nullptr;
        ImageBox *rightArrow        = nullptr;
        ImageBox *alarmImg          = nullptr;

        EditMode editMode             = EditMode::Edit;
        BellAlarm::Status alarmStatus = BellAlarm::Status::DEACTIVATED;
        std::string fontName          = style::window::font::largelight;
        auto onInput(const InputEvent &inputEvent) -> bool override;
    };
} /* namespace gui */

M module-apps/apps-common/widgets/TimeSetSpinner.cpp => module-apps/apps-common/widgets/TimeSetSpinner.cpp +11 -6
@@ 29,7 29,8 @@ namespace gui
        hour = new Spinner(hourMin, hourMax, hourStep, Boundaries::Continuous);
        hour->setMinimumSize(doubleCharWidth, fontHeight);
        hour->setFont(fontName);
        hour->setAlignment(Alignment(Alignment::Horizontal::Right, Alignment::Vertical::Center));

        hour->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Center));
        hour->setFixedFieldWidth(noOfDigits);
        hour->setEdges(RectangleEdge::None);
        hour->setCurrentValue(0);


@@ 38,7 39,7 @@ namespace gui

        colon = new Label(this);
        colon->setFont(fontName);
        colon->setMinimumSize(getColonDigitWidth(), fontHeight);
        colon->setMinimumSize(getColonWidth(), fontHeight);
        colon->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Center));
        colon->setEdges(RectangleEdge::None);
        colon->activeItem = false;


@@ 47,7 48,8 @@ namespace gui
        minute = new Spinner(minuteMin, minuteMax, minuteStep, Boundaries::Continuous);
        minute->setMinimumSize(doubleCharWidth, fontHeight);
        minute->setFont(fontName);
        minute->setAlignment(Alignment(Alignment::Horizontal::Left, Alignment::Vertical::Center));

        minute->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Center));
        minute->setFixedFieldWidth(noOfDigits);
        minute->setEdges(RectangleEdge::None);
        minute->setCurrentValue(0);


@@ 102,7 104,7 @@ namespace gui
        return maxWidth;
    }

    uint32_t TimeSetSpinner::getColonDigitWidth() const noexcept
    uint32_t TimeSetSpinner::getColonWidth() const noexcept
    {
        const RawFont *font = FontManager::getInstance().getFont(fontName);
        return font->getCharPixelWidth(':');


@@ 146,13 148,16 @@ namespace gui
        hour->setFont(fontName);
        hour->setMinimumSize(doubleCharWidth, fontHeight);
        hour->setText(hour->getText());

        colon->setFont(fontName);
        colon->setMinimumSize(getColonDigitWidth(), fontHeight);
        colon->setMinimumSize(getColonWidth(), fontHeight);
        colon->setText(":");

        minute->setFont(fontName);
        minute->setMinimumSize(doubleCharWidth, fontHeight);
        minute->setText(minute->getText());
        setMinimumSize(doubleCharWidth * 2 + getColonDigitWidth(), fontHeight);

        setMinimumSize(2 * doubleCharWidth + getColonWidth(), fontHeight);
        resizeItems();
    }


M module-apps/apps-common/widgets/TimeSetSpinner.hpp => module-apps/apps-common/widgets/TimeSetSpinner.hpp +1 -1
@@ 36,6 36,6 @@ namespace gui
        auto onInput(const InputEvent &inputEvent) -> bool override;
        [[nodiscard]] auto getFontHeight() const noexcept -> uint16_t;
        [[nodiscard]] auto getWidestDigitWidth() const noexcept -> uint32_t;
        [[nodiscard]] auto getColonDigitWidth() const noexcept -> uint32_t;
        [[nodiscard]] auto getColonWidth() const noexcept -> uint32_t;
    };
} /* namespace gui */