Files
MuditaOS/module-gui/gui/SwitchData.hpp
rrandomsky 1ceaffb987 [MOS-925] Fix redirection on BACK from sending message from Contact view
Fix for inconsistent redirection to message threads list when pressing
BACK from sending message from Contact view. Also proveded mechanizm
to help switching back to previous App, when some App call window
from another App.
2023-03-09 14:41:21 +01:00

94 lines
3.4 KiB
C++

// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
#pragma once
#include <string>
#include <optional>
#include <log/log.hpp>
namespace gui
{
using NameOfApplication = std::optional<std::string>;
/// base class storing information sent along with switch message
/// for extended use with windows please inherit from this class to extend it
///
/// used combined with:
/// * Application->switchWindow(...) function changing window within current application
/// * Application::handleSwitchWindow(...) ApplicationManager call changing window between apps (and within current
/// if requested)
class SwitchData
{
bool popup = false;
protected:
std::string description = "";
public:
SwitchData() = default;
explicit SwitchData(std::string description) : description{std::move(description)} {};
virtual ~SwitchData() = default;
[[nodiscard]] virtual const std::string &getDescription() const
{
return description;
};
virtual void setDescription(const std::string desc)
{
description = desc;
};
/// informs ApplicationManager to not close caller application when switching from app to app
bool disableAppClose = false;
/// informs App window stack that requested window should be ignored on windows stack.
///
/// This affects window back mechanics. Having switchWindow calls like that:
/// `WinA = { ignoreCurrentWindowOnStack = true } => WinB => WinC`
/// requesting getting back in WinC will result in:
/// `WinC => WinA`
bool ignoreCurrentWindowOnStack = false;
/// This can store name of Application when message came from
/// This is helpful when going back to the previous Application (sender Application)
NameOfApplication nameOfSenderApplication = std::nullopt;
};
class SwitchSpecialChar : public SwitchData
{
public:
std::string requester = "";
enum class Type
{
Request,
Response,
} type = Type::Request;
SwitchSpecialChar(Type type, const std::string requester, const std::string &description = "")
: SwitchData(description), requester(requester), type(type)
{}
virtual ~SwitchSpecialChar() = default;
};
/// class storing information for Window type class to switch bask to proper Application
struct InfoAboutPreviousAppWhereWeComeFrom
{
NameOfApplication nameOfPreviousApplication = std::nullopt;
bool ignoreCurrentApplicationOnSwitchBack = false;
// save info about Application where we come from and if we should switch back to this Application
void saveInfoAboutPreviousAppForProperSwitchBack(const SwitchData *memo)
{
if (memo == nullptr) {
LOG_ERROR("Empty pointer to SwitchData");
return;
}
nameOfPreviousApplication = memo->nameOfSenderApplication;
ignoreCurrentApplicationOnSwitchBack = memo->ignoreCurrentWindowOnStack;
}
bool shouldCurrentAppBeIgnoredOnSwitchBack()
{
return ignoreCurrentApplicationOnSwitchBack && nameOfPreviousApplication.has_value();
}
};
} /* namespace gui */