//
// xemu User Interface
//
// Copyright (C) 2020-2022 Matt Borgerson
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
//
#pragma once
#include "common.hh"
#include "scene.hh"
#include "scene-components.hh"
#include "animation.hh"
#include "widgets.hh"
class PopupMenu;
class PopupMenuItemDelegate
{
public:
PopupMenuItemDelegate() = default;
virtual ~PopupMenuItemDelegate();
virtual void PushMenu(PopupMenu &menu);
virtual void PopMenu();
virtual void ClearMenuStack();
virtual void LostFocus();
virtual void PushFocus();
virtual void PopFocus();
virtual bool DidPop();
};
class PopupMenu
{
protected:
EasingAnimation m_animation;
ImVec2 m_ease_direction;
bool m_focus;
bool m_pop_focus;
public:
PopupMenu();
void InitFocus();
virtual ~PopupMenu();
void Show(const ImVec2 &direction);
void Hide(const ImVec2 &direction);
bool IsAnimating();
void Draw(PopupMenuItemDelegate &nav);
virtual bool DrawItems(PopupMenuItemDelegate &nav);
};
class PopupMenuScene : virtual public PopupMenuItemDelegate, public Scene {
protected:
std::vector m_view_stack;
std::vector m_menus_in_transition;
std::vector> m_focus_stack;
BackgroundGradient m_background;
NavControlAnnotation m_nav_control_view;
// BigStateIcon m_big_state_icon;
// TitleInfo m_title_info;
public:
void PushMenu(PopupMenu &menu) override;
void PopMenu() override;
void PushFocus() override;
void PopFocus() override;
void ClearMenuStack() override;
void HandleInput();
void Show() override;
void Hide() override;
bool IsAnimating() override;
bool Draw() override;
void LostFocus() override;
};
extern PopupMenuScene g_popup_menu;