Files
MuditaOS/module-apps/application-desktop/windows/PowerOffWindow.cpp
jimmorrisson 14918dc4f9 [EGD-4925] Change new filesystem handling implementation in module-gui. (#1193)
Due to vfs deprecation there is need to remove all vfs calls from code. This PR covers module gui. There are some modifications in other modules included which are necessary because of build system issues.
2020-12-16 15:23:11 +01:00

210 lines
7.7 KiB
C++

// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
#include "InputEvent.hpp"
#include "gui/widgets/BottomBar.hpp"
#include "gui/widgets/TopBar.hpp"
#include "log/log.hpp"
// module-utils
#include <i18n/i18n.hpp>
#include "PowerOffWindow.hpp"
#include "../ApplicationDesktop.hpp"
// services
#include <service-appmgr/model/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 */