Files
MuditaOS/module-apps/application-desktop/windows/PowerOffWindow.cpp
2020-10-14 12:24:41 +02:00

207 lines
7.5 KiB
C++

#include "InputEvent.hpp"
#include "gui/widgets/BottomBar.hpp"
#include "gui/widgets/TopBar.hpp"
#include "log/log.hpp"
// module-utils
#include "i18/i18.hpp"
#include "PowerOffWindow.hpp"
#include "../ApplicationDesktop.hpp"
// services
#include "service-appmgr/ApplicationManager.hpp"
#include "service-cellular/ServiceCellular.hpp"
#include <Style.hpp>
namespace gui
{
PowerOffWindow::PowerOffWindow(app::Application *app) : AppWindow(app, app::window::name::desktop_poweroff)
{
buildInterface();
}
void PowerOffWindow::rebuild()
{
// find which widget has focus
uint32_t index = 0;
for (uint32_t i = 0; i < selectionLabels.size(); i++)
if (selectionLabels[i] == getFocusItem()) {
index = i;
break;
}
destroyInterface();
buildInterface();
setFocusItem(selectionLabels[index]);
}
void PowerOffWindow::buildInterface()
{
AppWindow::buildInterface();
bottomBar->setActive(BottomBar::Side::CENTER, true);
bottomBar->setActive(BottomBar::Side::RIGHT, true);
bottomBar->setText(BottomBar::Side::CENTER, utils::localize.get(style::strings::common::confirm));
bottomBar->setText(BottomBar::Side::RIGHT, utils::localize.get(style::strings::common::back));
powerImage = new gui::Image(this, 177, 132, 0, 0, "pin_lock_info");
powerDownImage = new gui::Image(this, 0, 0, 0, 0, "logo");
powerDownImage->setVisible(false);
// title label
titleLabel = new gui::Label(this, 0, 60, 480, 40);
titleLabel->setFilled(false);
titleLabel->setBorderColor(gui::ColorFullBlack);
titleLabel->setFont(style::header::font::title);
titleLabel->setText(utils::localize.get("app_desktop_poweroff_title"));
titleLabel->setEdges(RectangleEdge::None);
titleLabel->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Bottom));
// label with question for powering down
infoLabel = new gui::Label(this, 0, 294, 480, 30);
infoLabel->setFilled(false);
infoLabel->setBorderColor(gui::ColorNoColor);
infoLabel->setFont(style::window::font::medium);
infoLabel->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Bottom));
infoLabel->setText(utils::localize.get("app_desktop_poweroff_question"));
uint32_t pinLabelX = 46;
uint32_t pinLabelY = 350;
for (uint32_t i = 0; i < 4; i++) {
gui::Label *label = new gui::Label(this, pinLabelX, pinLabelY, 193, 75);
label->setFilled(false);
label->setBorderColor(gui::ColorFullBlack);
label->setPenWidth(0);
label->setPenFocusWidth(2);
label->setRadius(5);
label->setFont(style::window::font::medium);
label->setEdges(RectangleEdge::All);
label->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center));
selectionLabels.push_back(label);
pinLabelX += 193;
}
selectionLabels[0]->setText(utils::localize.get(style::strings::common::no));
selectionLabels[1]->setText(utils::localize.get(style::strings::common::yes));
pinLabelX = 46;
pinLabelY += 75;
eventMgrLabel = new gui::Label(this, pinLabelX, pinLabelY, 193 * 2, 75);
eventMgrLabel->setFilled(false);
eventMgrLabel->setBorderColor(gui::ColorFullBlack);
eventMgrLabel->setPenWidth(0);
eventMgrLabel->setPenFocusWidth(2);
eventMgrLabel->setRadius(5);
eventMgrLabel->setFont(style::window::font::bigbold);
eventMgrLabel->setText("TURN PWR MGR OFF");
eventMgrLabel->setEdges(RectangleEdge::All);
eventMgrLabel->setAlignment(
gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center));
// define navigation between labels
selectionLabels[0]->setNavigationItem(NavigationDirection::LEFT, selectionLabels[1]);
selectionLabels[0]->setNavigationItem(NavigationDirection::RIGHT, selectionLabels[1]);
selectionLabels[0]->setNavigationItem(NavigationDirection::DOWN, eventMgrLabel);
selectionLabels[1]->setNavigationItem(NavigationDirection::LEFT, selectionLabels[0]);
selectionLabels[1]->setNavigationItem(NavigationDirection::RIGHT, selectionLabels[0]);
selectionLabels[1]->setNavigationItem(NavigationDirection::DOWN, eventMgrLabel);
eventMgrLabel->setNavigationItem(NavigationDirection::UP, selectionLabels[0]);
// callbacks for getting focus
selectionLabels[0]->focusChangedCallback = [=](gui::Item &item) {
if (item.focus)
this->state = State::Return;
return true;
};
selectionLabels[1]->focusChangedCallback = [=](gui::Item &item) {
if (item.focus)
this->state = State::PowerDown;
return true;
};
selectionLabels[1]->activatedCallback = [=](gui::Item &item) {
LOG_INFO("Closing system");
application->setShutdownFlag();
bottomBar->setVisible(false);
topBar->setVisible(false);
selectionLabels[0]->setVisible(false);
selectionLabels[1]->setVisible(false);
eventMgrLabel->setVisible(false);
powerImage->setVisible(false);
powerDownImage->setVisible(true);
titleLabel->setVisible(false);
infoLabel->setVisible(false);
application->refreshWindow(RefreshModes::GUI_REFRESH_DEEP);
return true;
};
eventMgrLabel->activatedCallback = [=](gui::Item &item) {
static bool state = false;
if (state == false) {
// sys::SystemManager::DestroyService(ServiceCellular::serviceName,application);
sys::SystemManager::SuspendSystem(application);
LOG_INFO("SUSPEND SYSTEM");
state = true;
}
else {
sys::SystemManager::ResumeSystem(application);
LOG_INFO("RESUME SYSTEM");
state = false;
}
return true;
};
}
void PowerOffWindow::destroyInterface()
{
erase();
invalidate();
}
void PowerOffWindow::invalidate() noexcept
{
titleLabel = nullptr;
infoLabel = nullptr;
eventMgrLabel = nullptr;
powerImage = nullptr;
powerDownImage = nullptr;
selectionLabels.clear();
}
void PowerOffWindow::onBeforeShow(ShowMode mode, SwitchData *data)
{
// on entering screen always set default result as returning to home screen and set focus to "No" label
state = State::Return;
setFocusItem(selectionLabels[0]);
}
bool PowerOffWindow::onInput(const InputEvent &inputEvent)
{
// check if any of the lower inheritance onInput methods catch the event
if (AppWindow::onInput(inputEvent)) {
return true;
}
// process only short press, consume rest
if (inputEvent.state != gui::InputEvent::State::keyReleasedShort)
return true;
// if enter was pressed check state and power down or return to main desktop's window
if (inputEvent.keyCode == KeyCode::KEY_ENTER) {
if (state != State::PowerDown) {
application->switchWindow("MainWindow");
}
}
return false;
}
} /* namespace gui */