ppsspp/Common/UI/UIScreen.h

153 lines
3.6 KiB
C
Raw Normal View History

#pragma once
#include <mutex>
#include <string>
#include <deque>
#include "Common/Math/lin/vec3.h"
#include "Common/UI/Screen.h"
#include "Common/UI/ViewGroup.h"
using namespace Lin;
2013-09-07 11:38:12 +00:00
class I18NCategory;
2016-12-25 17:18:19 +00:00
namespace Draw {
2016-12-25 20:01:57 +00:00
class DrawContext;
2016-12-25 17:18:19 +00:00
}
2013-09-07 11:38:12 +00:00
enum class QueuedEventType : u8 {
KEY,
AXIS,
TOUCH,
};
struct QueuedEvent {
QueuedEventType type;
union {
TouchInput touch;
KeyInput key;
AxisInput axis;
};
};
class UIScreen : public Screen {
public:
UIScreen();
2013-11-26 12:56:56 +00:00
~UIScreen();
void update() override;
ScreenRenderFlags render(ScreenRenderMode mode) override;
void deviceLost() override;
void deviceRestored() override;
virtual void touch(const TouchInput &touch);
virtual bool key(const KeyInput &key);
virtual void axis(const AxisInput &axis);
2023-09-04 08:58:11 +00:00
bool UnsyncTouch(const TouchInput &touch) override;
bool UnsyncKey(const KeyInput &key) override;
void UnsyncAxis(const AxisInput *axes, size_t count) override;
TouchInput transformTouch(const TouchInput &touch) override;
virtual void TriggerFinish(DialogResult result);
// Some useful default event handlers
2013-12-05 13:15:18 +00:00
UI::EventReturn OnOK(UI::EventParams &e);
UI::EventReturn OnCancel(UI::EventParams &e);
UI::EventReturn OnBack(UI::EventParams &e);
protected:
virtual void CreateViews() = 0;
void RecreateViews() override { recreateViews_ = true; }
bool UseVerticalLayout() const;
UI::ViewGroup *root_ = nullptr;
Vec3 translation_ = Vec3(0.0f);
Vec3 scale_ = Vec3(1.0f);
float alpha_ = 1.0f;
bool ignoreInsets_ = false;
bool ignoreInput_ = false;
protected:
virtual void DrawBackground(UIContext &ui) {}
virtual void DrawForeground(UIContext &ui) {}
void SetupViewport();
void DoRecreateViews();
2014-08-17 10:17:59 +00:00
bool recreateViews_ = true;
bool lastVertical_;
private:
std::mutex eventQueueLock_;
std::deque<QueuedEvent> eventQueue_;
};
2013-07-15 22:25:08 +00:00
2013-08-17 10:06:08 +00:00
class UIDialogScreen : public UIScreen {
2013-08-12 22:06:23 +00:00
public:
2013-10-28 15:05:21 +00:00
UIDialogScreen() : UIScreen(), finished_(false) {}
bool key(const KeyInput &key) override;
void sendMessage(UIMessage message, const char *value) override;
2013-10-28 15:05:21 +00:00
private:
bool finished_;
2013-08-12 22:06:23 +00:00
};
2013-08-17 10:06:08 +00:00
class PopupScreen : public UIDialogScreen {
2013-07-15 22:25:08 +00:00
public:
PopupScreen(std::string_view title, std::string_view button1 = "", std::string_view button2 = "");
2013-07-15 22:25:08 +00:00
virtual void CreatePopupContents(UI::ViewGroup *parent) = 0;
void CreateViews() override;
bool isTransparent() const override { return true; }
void touch(const TouchInput &touch) override;
bool key(const KeyInput &key) override;
2013-07-15 22:25:08 +00:00
void TriggerFinish(DialogResult result) override;
2017-03-20 00:45:39 +00:00
void SetPopupOrigin(const UI::View *view);
void SetPopupOffset(float y) { offsetY_ = y; }
void SetAlignTop(bool alignTop) { alignTop_ = alignTop; }
void SetHasDropShadow(bool has) { hasDropShadow_ = has; }
// For the postproc param sliders on DisplayLayoutScreen
2023-12-11 01:10:08 +00:00
bool wantBrightBackground() const override { return !hasDropShadow_; }
2013-07-15 22:25:08 +00:00
protected:
2013-09-04 08:50:00 +00:00
virtual bool FillVertical() const { return false; }
virtual UI::Size PopupWidth() const { return 550; }
2013-09-04 08:50:00 +00:00
virtual bool ShowButtons() const { return true; }
virtual bool CanComplete(DialogResult result) { return true; }
2013-08-16 10:51:57 +00:00
virtual void OnCompleted(DialogResult result) {}
virtual bool HasTitleBar() const { return true; }
const std::string &Title() { return title_; }
2013-07-15 22:25:08 +00:00
void update() override;
2013-07-15 22:25:08 +00:00
private:
2023-01-31 19:38:09 +00:00
UI::LinearLayout *box_ = nullptr;
UI::Button *defaultButton_ = nullptr;
2013-07-15 22:25:08 +00:00
std::string title_;
2013-08-16 10:51:57 +00:00
std::string button1_;
std::string button2_;
enum {
FRAMES_LEAD_IN = 6,
FRAMES_LEAD_OUT = 4,
};
int frames_ = 0;
int finishFrame_ = -1;
DialogResult finishResult_ = DR_CANCEL;
bool hasPopupOrigin_ = false;
Point2D popupOrigin_;
float offsetY_ = 0.0f;
bool alignTop_ = false;
bool hasDropShadow_ = true;
2013-07-15 22:25:08 +00:00
};