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 */