class ContextPopup;
class ContextPopupItem;
class Window;
- class PopupManager;
#define CTXPOPUP_ITEM_PRESSED_CB(ClassName, method) [](ContextPopupItem &item, void *userData) \
{ \
{
public:
ContextPopup(Evas_Object *parent);
- ContextPopup(PopupManager &parent);
virtual ~ContextPopup();
ContextPopupItem *appendItem(const std::string &text, Evas_Object *icon = nullptr,
static void on_dismissed_cb(void *data, Evas_Object *obj, void *event_info);
static void on_item_pressed_cb(void *data, Evas_Object * obj, void *event_info);
-
- private:
- PopupManager *m_pManager;
};
}
/**
* @brief Destroys all popups (context and regular) created before.
* If no popup was created nothing happens.
+ * @param[in] popupOwner if popupOwner pointer not nullptr only popup owner can destroy current popup.
*/
- void reset();
+ void reset(void *popupOwner = nullptr);
/**
* @brief Destroys previous popup and register new in manager
* @param[in] popup a new popup for register.
+ * @param[in] new popup owner
*/
- void reset(Popup &popup);
+ void reset(Popup &popup, void *newOwner = nullptr);
/**
* @brief Creates popup-list.
- * @param[in] type Type of list popup. Refer to PopupListType
+ * @param[in] new popup owner
* @return created popup-list.
*/
- PopupList &getPopupList(PopupList::PopupListType type = PopupList::ListPopup);
+ PopupList &getPopupList(void *newOwner = nullptr);
/**
- * @brief Creates popup.
+ * @brief Creates more-popup.
+ * @param[in] new popup owner
+ * @return created more-popup
+ */
+ PopupList &getMorePopup(void *newOwner = nullptr);
+
+ /**
+ * @brief Creates base-popup.
+ * @param[in] new popup owner
* @return popup created.
*/
- Popup &getPopup();
+ Popup &getPopup(void *newOwner = nullptr );
/**
* @brief Creates specific popup.
* @return popup created.
*/
template<typename ClassName, typename... Args>
- ClassName &getPopup(Args&&... args);
+ ClassName &getPopup(Args&&... args, void *newOwner = nullptr);
/**
* @brief Checks whether popup exists and it's visible.
*/
bool isPopupVisible() const;
- /**
- * @brief Destroys popup. If no popup exists nothing happens.
- */
- void resetPopup();
-
- /**
- * @brief Creates context popup.
- * @return context popup created.
- */
- ContextPopup &getCtxPopup();
-
- /**
- * @brief Checks whether context popup exists and it's visible.
- * @return true if context popup exists and it's visible, false otherwise.
- */
- bool isCtxPopupVisible() const;
-
- /**
- * @brief Destroys context popup. If no context popup exists nothing happens.
- */
- void resetCtxPopup();
-
/**
* @brief Process pause event
*/
private:
void onHwBackButtonPopupClicked(Evas_Object *obj, void *eventInfo);
- void onHwBackButtonCtxPopupClicked(Evas_Object *obj, void *eventInfo);
void onHwMoreButtonPopupListClicked(Evas_Object *obj, void *eventInfo);
private:
Popup *m_pPopup;
- ContextPopup *m_pCtxPopup;
Window &m_Window;
+ void *m_pPopupOwner;
};
template<typename ClassName, typename... Args>
- ClassName &PopupManager::getPopup(Args&&... args)
+ ClassName &PopupManager::getPopup(Args&&... args, void *newOwner)
{
reset();
m_pPopup = new ClassName(*this, std::forward<Args>(args)...);
+ m_pPopupOwner = newOwner;
eext_object_event_callback_add(*m_pPopup, EEXT_CALLBACK_BACK, SMART_CALLBACK(PopupManager, onHwBackButtonPopupClicked), this);
return static_cast<ClassName&>(*m_pPopup);
}
#include "ContextPopup.h"
#include "Window.h"
#include "Logger.h"
-#include "PopupManager.h"
using namespace Msg;
}
// ContextPopup:
-ContextPopup::ContextPopup(Evas_Object *parent)
- : m_pManager(nullptr)
-{
- createContextPopup(parent);
-}
-
-ContextPopup::ContextPopup(PopupManager &parent)
- : m_pManager(&parent)
-{
- createContextPopup(parent.getWindow());
-}
-
ContextPopup::~ContextPopup()
{
MSG_LOG("Destructor");
void ContextPopup::destroy()
{
- if(m_pManager)
- m_pManager->resetCtxPopup();
- else
- View::destroy();
+ View::destroy();
}
void ContextPopup::setDirectionPriority(Elm_Ctxpopup_Direction first, Elm_Ctxpopup_Direction second,
void ContextPopup::on_dismissed_cb(void *data, Evas_Object *obj, void *event_info)
{
ContextPopup *self = static_cast<ContextPopup*>(data);
- if(self->m_pManager)
- self->m_pManager->resetCtxPopup();
+ self->destroy();
}
void ContextPopup::on_item_pressed_cb(void *data, Evas_Object *obj, void *event_info)
void Popup::destroy()
{
if(m_pManager)
- m_pManager->resetPopup();
+ m_pManager->reset();
else
View::destroy();
}
PopupManager::PopupManager(Window &window)
: m_pPopup(nullptr)
- , m_pCtxPopup(nullptr)
, m_Window(window)
+ , m_pPopupOwner(nullptr)
{
}
{
}
-bool PopupManager::isVisible() const
+void PopupManager::reset(void *popupOwner)
{
- return isPopupVisible() || isCtxPopupVisible();
-}
-
-void PopupManager::reset()
-{
- resetCtxPopup();
- resetPopup();
+ if(!popupOwner || (popupOwner == m_pPopupOwner))
+ {
+ if(m_pPopup)
+ {
+ m_pPopup->View::destroy();
+ m_pPopup = nullptr;
+ }
+ m_pPopupOwner = nullptr;
+ }
}
-void PopupManager::reset(Popup &popup)
+void PopupManager::reset(Popup &popup, void *newOwner)
{
+ m_pPopupOwner = newOwner;
if(&popup != m_pPopup)
{
reset();
}
}
-Popup &PopupManager::getPopup()
-{
- reset();
- m_pPopup = new Popup(*this);
- eext_object_event_callback_add(*m_pPopup, EEXT_CALLBACK_BACK, SMART_CALLBACK(PopupManager, onHwBackButtonPopupClicked), this);
- return *m_pPopup;
-}
-
-PopupList &PopupManager::getPopupList(PopupList::PopupListType type)
+Popup &PopupManager::getPopup(void *newOwner)
{
- reset();
- m_pPopup = new PopupList(*this, type);
- eext_object_event_callback_add(*m_pPopup, EEXT_CALLBACK_BACK, SMART_CALLBACK(PopupManager, onHwBackButtonPopupClicked), this);
- eext_object_event_callback_add(*m_pPopup, EEXT_CALLBACK_MORE, SMART_CALLBACK(PopupManager, onHwMoreButtonPopupListClicked), this);
- return *static_cast<PopupList*>(m_pPopup);
+ auto &popup = getPopup<Popup>(newOwner);
+ return popup;
}
-bool PopupManager::isPopupVisible() const
+PopupList &PopupManager::getPopupList(void *newOwner)
{
- return m_pPopup ? m_pPopup->isVisible() : false;
+ PopupList &popup = getPopup<PopupList, PopupList::PopupListType>(PopupList::ListPopup, newOwner);
+ eext_object_event_callback_add(popup, EEXT_CALLBACK_MORE, SMART_CALLBACK(PopupManager, onHwMoreButtonPopupListClicked), this);
+ return popup;
}
-void PopupManager::resetPopup()
+PopupList &PopupManager::getMorePopup(void *newOwner)
{
- if(m_pPopup)
- {
- m_pPopup->View::destroy();
- m_pPopup = nullptr;
- }
+ PopupList &popup = getPopup<PopupList, PopupList::PopupListType>(PopupList::MoreMenuPopup, newOwner);
+ eext_object_event_callback_add(popup, EEXT_CALLBACK_MORE, SMART_CALLBACK(PopupManager, onHwMoreButtonPopupListClicked), this);
+ return popup;
}
-ContextPopup &PopupManager::getCtxPopup()
-{
- reset();
- m_pCtxPopup = new ContextPopup(*this);
- eext_object_event_callback_add(*m_pCtxPopup, EEXT_CALLBACK_BACK, SMART_CALLBACK(PopupManager, onHwBackButtonCtxPopupClicked), this);
- return *m_pCtxPopup;
-}
-
-bool PopupManager::isCtxPopupVisible() const
-{
- return m_pCtxPopup ? m_pCtxPopup->isVisible() : false;
-}
-
-void PopupManager::resetCtxPopup()
+bool PopupManager::isPopupVisible() const
{
- if(m_pCtxPopup)
- {
- m_pCtxPopup->View::destroy();
- m_pCtxPopup = nullptr;
- }
+ return m_pPopup ? m_pPopup->isVisible() : false;
}
void PopupManager::onHwBackButtonPopupClicked(Evas_Object *obj, void *eventInfo)
{
- resetPopup();
+ reset();
}
void PopupManager::onHwMoreButtonPopupListClicked(Evas_Object *obj, void *eventInfo)
{
if (m_pPopup->getDismissByMoreMenuKeyFlag())
- resetPopup();
-}
-
-void PopupManager::onHwBackButtonCtxPopupClicked(Evas_Object *obj, void *eventInfo)
-{
- resetCtxPopup();
+ reset();
}
void PopupManager::onPause()
{
if (m_pPopup && m_pPopup->getDismissByPauseAppFlag())
- resetPopup();
- resetCtxPopup();
+ reset();
}
ConvListItem::~ConvListItem()
{
+ m_App.getPopupManager().reset(this);
for(auto *entity : m_BubbleEntityList)
{
delete entity;
void ConvListItem::showMainListPopup()
{
- auto &listPopup = m_App.getPopupManager().getPopupList();
+ auto &listPopup = m_App.getPopupManager().getPopupList(this);
listPopup.setTitle(msg("IDS_MSGF_BODY_MESSAGE_OPTIONS"));
std::string msgText = getAllMsgText();
void ConvListItem::showDraftListPopup()
{
- auto &listPopup = m_App.getPopupManager().getPopupList();
+ auto &listPopup = m_App.getPopupManager().getPopupList(this);
listPopup.setTitle(msg("IDS_MSGF_BODY_MESSAGE_OPTIONS"));
listPopup.appendItem(msg("IDS_MSGF_OPT_EDIT_MESSAGE"), POPUPLIST_ITEM_PRESSED_CB(ConvListItem, onEditItemPressed), this);
listPopup.appendItem(msg("IDS_MSG_OPT_DELETE"), POPUPLIST_ITEM_PRESSED_CB(ConvListItem, onDeleteItemPressed), this);
void ConvListItem::showFailedToSendPopup()
{
- Popup &popup = m_App.getPopupManager().getPopup();
+ Popup &popup = m_App.getPopupManager().getPopup(this);
popup.addButton(msgt("IDS_MSG_BUTTON_CANCEL_ABB"), Popup::CancelButtonId, POPUP_BUTTON_CB(ConvListItem, onCancelButtonClicked), this);
popup.addButton(msgt("IDS_MSG_BUTTON_RESEND_ABB"), Popup::OkButtonId, POPUP_BUTTON_CB(ConvListItem, onFailedResendButtonClicked), this);
popup.setTitle(msgt("IDS_MSG_HEADER_COULDNT_SEND_MESSAGE_ABB"));
void ConvListItem::onDeleteItemPressed(PopupListItem &item)
{
item.getParent().destroy();
- Popup &popup = m_App.getPopupManager().getPopup();
+ Popup &popup = m_App.getPopupManager().getPopup(this);
popup.addButton(msgt("IDS_MSG_BUTTON_CANCEL_ABB"), Popup::CancelButtonId, POPUP_BUTTON_CB(ConvListItem, onCancelButtonClicked), this);
popup.addButton(msgt("IDS_MSG_BUTTON_DELETE_ABB4"), Popup::OkButtonId, POPUP_BUTTON_CB(ConvListItem, onDeleteButtonClicked), this);
popup.setTitle(msgt("IDS_MSG_HEADER_DELETE"));
void ConvListItem::onViewDetailsItemPressed(PopupListItem &item)
{
MSG_LOG("");
- m_App.getPopupManager().getPopup<MsgDetailsPopup>(m_App, m_MsgId).show();
+ m_App.getPopupManager().getPopup<MsgDetailsPopup, App&, MsgId&>(m_App, m_MsgId, this).show();
}
void ConvListItem::onEditButtonClicked(Evas_Object *obj, void *event_info)
void Conversation::showMainPopup()
{
- PopupList &popup = getApp().getPopupManager().getPopupList(PopupList::MoreMenuPopup);
+ PopupList &popup = getApp().getPopupManager().getMorePopup();
popup.appendItem(msg("IDS_MSG_OPT_DELETE"), POPUPLIST_ITEM_PRESSED_CB(Conversation, onDeleteItemPressed), this);
if(m_AddressList && m_AddressList->getLength() == 1)
{
void MsgThread::showMainPopup()
{
- PopupList &popup = getApp().getPopupManager().getPopupList(PopupList::MoreMenuPopup);
+ PopupList &popup = getApp().getPopupManager().getMorePopup();
if (!m_pThreadList->isEmpty())
{
popup.appendItem(msg("IDS_MSG_OPT_DELETE"), POPUPLIST_ITEM_PRESSED_CB(MsgThread, onDeleteItemPressed), this);
{
if(!m_pList->isEmpty())
{
- PopupList &listPopup = getApp().getPopupManager().getPopupList(PopupList::MoreMenuPopup);
+ PopupList &listPopup = getApp().getPopupManager().getMorePopup();
listPopup.appendItem(msg("IDS_MSG_OPT_COPY_TO_DEVICE_ABB"), POPUPLIST_ITEM_PRESSED_CB(MsgOnSimCard, onCopyToDeviceItemPressed), this);
listPopup.appendItem(msg("IDS_MSG_OPT_DELETE"), POPUPLIST_ITEM_PRESSED_CB(MsgOnSimCard, onDeleteItemPressed), this);
listPopup.show();
{
m_pSmilPlayer->stop();
- PopupList &popup = getApp().getPopupManager().getPopupList(PopupList::MoreMenuPopup);
+ PopupList &popup = getApp().getPopupManager().getMorePopup();
popup.appendItem(msg("IDS_MSG_OPT_DELETE"), POPUPLIST_ITEM_PRESSED_CB(Viewer, onDeleteItemPressed), this);
if(!m_Msg->getText().empty())