mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-07-23 06:10:03 -06:00
integrate OSD into ScreenPanel and make it nicer
This commit is contained in:
@ -20,21 +20,20 @@
|
||||
#define SCREEN_H
|
||||
|
||||
#include <optional>
|
||||
#include <deque>
|
||||
#include <map>
|
||||
|
||||
#include <QWidget>
|
||||
#include <QImage>
|
||||
#include <QMutex>
|
||||
#include <QScreen>
|
||||
#include <QCloseEvent>
|
||||
#include <QTimer>
|
||||
|
||||
#include "glad/glad.h"
|
||||
#include "FrontendUtil.h"
|
||||
#include "duckstation/gl/context.h"
|
||||
|
||||
#include <QWidget>
|
||||
#include <QWindow>
|
||||
#include <QMainWindow>
|
||||
#include <QImage>
|
||||
#include <QActionGroup>
|
||||
#include <QTimer>
|
||||
#include <QMutex>
|
||||
#include <QScreen>
|
||||
#include <QCloseEvent>
|
||||
|
||||
|
||||
class EmuThread;
|
||||
|
||||
@ -50,27 +49,54 @@ const struct { int id; float ratio; const char* label; } aspectRatios[] =
|
||||
constexpr int AspectRatiosNum = sizeof(aspectRatios) / sizeof(aspectRatios[0]);
|
||||
|
||||
|
||||
class ScreenHandler
|
||||
class ScreenPanel : public QWidget
|
||||
{
|
||||
Q_GADGET
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
ScreenHandler(QWidget* widget);
|
||||
virtual ~ScreenHandler();
|
||||
explicit ScreenPanel(QWidget* parent);
|
||||
virtual ~ScreenPanel();
|
||||
|
||||
QTimer* setupMouseTimer();
|
||||
void updateMouseTimer();
|
||||
QTimer* mouseTimer;
|
||||
QSize screenGetMinSize(int factor);
|
||||
|
||||
void osdSetEnabled(bool enabled);
|
||||
void osdAddMessage(unsigned int color, const char* msg);
|
||||
|
||||
private slots:
|
||||
void onScreenLayoutChanged();
|
||||
|
||||
protected:
|
||||
void screenSetupLayout(int w, int h);
|
||||
struct OSDItem
|
||||
{
|
||||
unsigned int id;
|
||||
qint64 timestamp;
|
||||
|
||||
void screenOnMousePress(QMouseEvent* event);
|
||||
void screenOnMouseRelease(QMouseEvent* event);
|
||||
void screenOnMouseMove(QMouseEvent* event);
|
||||
char text[256];
|
||||
unsigned int color;
|
||||
|
||||
void screenHandleTablet(QTabletEvent* event);
|
||||
void screenHandleTouch(QTouchEvent* event);
|
||||
bool rendered;
|
||||
QImage bitmap;
|
||||
};
|
||||
|
||||
QMutex osdMutex;
|
||||
bool osdEnabled;
|
||||
unsigned int osdID;
|
||||
std::deque<OSDItem> osdItems;
|
||||
|
||||
virtual void setupScreenLayout();
|
||||
|
||||
void resizeEvent(QResizeEvent* event) override;
|
||||
|
||||
void mousePressEvent(QMouseEvent* event) override;
|
||||
void mouseReleaseEvent(QMouseEvent* event) override;
|
||||
void mouseMoveEvent(QMouseEvent* event) override;
|
||||
|
||||
void tabletEvent(QTabletEvent* event) override;
|
||||
void touchEvent(QTouchEvent* event);
|
||||
bool event(QEvent* event) override;
|
||||
|
||||
float screenMatrix[Frontend::MaxScreenTransforms][6];
|
||||
int screenKind[Frontend::MaxScreenTransforms];
|
||||
@ -79,10 +105,19 @@ protected:
|
||||
bool touching = false;
|
||||
|
||||
void showCursor();
|
||||
|
||||
int osdFindBreakPoint(const char* text, int i);
|
||||
void osdLayoutText(const char* text, int* width, int* height, int* breaks);
|
||||
unsigned int osdRainbowColor(int inc);
|
||||
|
||||
virtual void osdRenderItem(OSDItem* item);
|
||||
virtual void osdDeleteItem(OSDItem* item);
|
||||
|
||||
void osdUpdate();
|
||||
};
|
||||
|
||||
|
||||
class ScreenPanelNative : public QWidget, public ScreenHandler
|
||||
class ScreenPanelNative : public ScreenPanel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
@ -93,26 +128,15 @@ public:
|
||||
protected:
|
||||
void paintEvent(QPaintEvent* event) override;
|
||||
|
||||
void resizeEvent(QResizeEvent* event) override;
|
||||
|
||||
void mousePressEvent(QMouseEvent* event) override;
|
||||
void mouseReleaseEvent(QMouseEvent* event) override;
|
||||
void mouseMoveEvent(QMouseEvent* event) override;
|
||||
|
||||
void tabletEvent(QTabletEvent* event) override;
|
||||
bool event(QEvent* event) override;
|
||||
private slots:
|
||||
void onScreenLayoutChanged();
|
||||
|
||||
private:
|
||||
void setupScreenLayout();
|
||||
void setupScreenLayout() override;
|
||||
|
||||
QImage screen[2];
|
||||
QTransform screenTrans[Frontend::MaxScreenTransforms];
|
||||
};
|
||||
|
||||
|
||||
class ScreenPanelGL : public QWidget, public ScreenHandler
|
||||
class ScreenPanelGL : public ScreenPanel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
@ -141,20 +165,8 @@ protected:
|
||||
|
||||
QPaintEngine* paintEngine() const override;
|
||||
|
||||
void resizeEvent(QResizeEvent* event) override;
|
||||
|
||||
void mousePressEvent(QMouseEvent* event) override;
|
||||
void mouseReleaseEvent(QMouseEvent* event) override;
|
||||
void mouseMoveEvent(QMouseEvent* event) override;
|
||||
|
||||
void tabletEvent(QTabletEvent* event) override;
|
||||
bool event(QEvent* event) override;
|
||||
|
||||
private slots:
|
||||
void onScreenLayoutChanged();
|
||||
|
||||
private:
|
||||
void setupScreenLayout();
|
||||
void setupScreenLayout() override;
|
||||
|
||||
std::unique_ptr<GL::Context> glContext;
|
||||
|
||||
@ -168,6 +180,16 @@ private:
|
||||
bool filter;
|
||||
|
||||
int lastScreenWidth = -1, lastScreenHeight = -1;
|
||||
|
||||
GLuint osdShader[3];
|
||||
GLint osdScreenSizeULoc, osdPosULoc, osdSizeULoc;
|
||||
GLfloat osdScaleFactorULoc;
|
||||
GLuint osdVertexArray;
|
||||
GLuint osdVertexBuffer;
|
||||
std::map<unsigned int, GLuint> osdTextures;
|
||||
|
||||
void osdRenderItem(OSDItem* item) override;
|
||||
void osdDeleteItem(OSDItem* item) override;
|
||||
};
|
||||
|
||||
#endif // SCREEN_H
|
||||
|
Reference in New Issue
Block a user