aboutsummaryrefslogtreecommitdiff
path: root/src/frontend/qt_sdl/main.h
diff options
context:
space:
mode:
authorNadia Holmquist Pedersen <nadia@nhp.sh>2020-06-03 13:54:28 +0200
committerNadia Holmquist Pedersen <nadia@nhp.sh>2020-06-03 13:54:28 +0200
commitf9f366e296a68be0aa2eb7bfd0552da31896a18c (patch)
treef52760d5505b84074a9c1b50b4fe16e40035ba06 /src/frontend/qt_sdl/main.h
parentb746c0b7279d1f5b4bcfd02c115b09d583e9df4f (diff)
parentd6332f96f162849ad0dde2738cacd3fae6e76e5d (diff)
Merge remote-tracking branch 'remotes/upstream/master' into feature/qt-platform
# Conflicts: # src/frontend/qt_sdl/CMakeLists.txt # src/frontend/qt_sdl/Platform.cpp # src/frontend/qt_sdl/main.cpp
Diffstat (limited to 'src/frontend/qt_sdl/main.h')
-rw-r--r--src/frontend/qt_sdl/main.h166
1 files changed, 157 insertions, 9 deletions
diff --git a/src/frontend/qt_sdl/main.h b/src/frontend/qt_sdl/main.h
index 30cef1f..279aed8 100644
--- a/src/frontend/qt_sdl/main.h
+++ b/src/frontend/qt_sdl/main.h
@@ -21,8 +21,17 @@
#include <QThread>
#include <QWidget>
+#include <QWindow>
#include <QMainWindow>
#include <QImage>
+#include <QActionGroup>
+
+#include <QOffscreenSurface>
+#include <QOpenGLWidget>
+#include <QOpenGLContext>
+#include <QOpenGLFunctions>
+#include <QOpenGLFunctions_3_2_Core>
+#include <QOpenGLShaderProgram>
class EmuThread : public QThread
@@ -33,43 +42,124 @@ class EmuThread : public QThread
public:
explicit EmuThread(QObject* parent = nullptr);
+ void initOpenGL();
+ void deinitOpenGL();
+
+ void* oglGetProcAddress(const char* proc);
+
void changeWindowTitle(char* title);
// to be called from the UI thread
void emuRun();
- void emuPause(bool refresh);
+ void emuPause();
void emuUnpause();
void emuStop();
bool emuIsRunning();
signals:
+ void windowUpdate();
void windowTitleChange(QString title);
void windowEmuStart();
void windowEmuStop();
- void windowPauseToggle();
+ void windowEmuPause();
+ void windowEmuReset();
+
+ void windowLimitFPSChange();
+
+ void screenLayoutChange();
private:
volatile int EmuStatus;
int PrevEmuStatus;
int EmuRunning;
+
+ QOffscreenSurface* oglSurface;
+ QOpenGLContext* oglContext;
+};
+
+
+class ScreenHandler
+{
+ Q_GADGET
+
+public:
+ virtual ~ScreenHandler() {}
+
+protected:
+ void screenSetupLayout(int w, int h);
+
+ QSize screenGetMinSize();
+
+ void screenOnMousePress(QMouseEvent* event);
+ void screenOnMouseRelease(QMouseEvent* event);
+ void screenOnMouseMove(QMouseEvent* event);
+
+ float screenMatrix[2][6];
+
+ bool touching;
};
-class MainWindowPanel : public QWidget
+class ScreenPanelNative : public QWidget, public ScreenHandler
{
Q_OBJECT
public:
- explicit MainWindowPanel(QWidget* parent);
- ~MainWindowPanel();
+ explicit ScreenPanelNative(QWidget* parent);
+ ~ScreenPanelNative();
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;
+
+private slots:
+ void onScreenLayoutChanged();
+
private:
- QImage* screen[2];
+ void setupScreenLayout();
+
+ QImage screen[2];
+ QTransform screenTrans[2];
+};
+
+
+class ScreenPanelGL : public QOpenGLWidget, public ScreenHandler, protected QOpenGLFunctions_3_2_Core
+{
+ Q_OBJECT
+
+public:
+ explicit ScreenPanelGL(QWidget* parent);
+ ~ScreenPanelGL();
+
+protected:
+ void initializeGL() override;
+
+ void paintGL() override;
+
+ void resizeEvent(QResizeEvent* event) override;
+ void resizeGL(int w, int h) override;
+
+ void mousePressEvent(QMouseEvent* event) override;
+ void mouseReleaseEvent(QMouseEvent* event) override;
+ void mouseMoveEvent(QMouseEvent* event) override;
+
+private slots:
+ void onScreenLayoutChanged();
+
+private:
+ void setupScreenLayout();
+
+ QOpenGLShaderProgram* screenShader;
+ GLuint screenVertexBuffer;
+ GLuint screenVertexArray;
+ GLuint screenTexture;
};
@@ -81,8 +171,20 @@ public:
explicit MainWindow(QWidget* parent = nullptr);
~MainWindow();
+ bool hasOGL;
+ QOpenGLContext* getOGLContext();
+
protected:
+ void resizeEvent(QResizeEvent* event) override;
+
void keyPressEvent(QKeyEvent* event) override;
+ void keyReleaseEvent(QKeyEvent* event) override;
+
+ void dragEnterEvent(QDragEnterEvent* event) override;
+ void dropEvent(QDropEvent* event) override;
+
+signals:
+ void screenLayoutChange();
private slots:
void onOpenFile();
@@ -96,15 +198,40 @@ private slots:
void onReset();
void onStop();
+ void onOpenEmuSettings();
+ void onOpenInputConfig();
+ void onInputConfigFinished(int res);
+ void onOpenVideoSettings();
+ void onOpenAudioSettings();
+ void onAudioSettingsFinished(int res);
+ void onOpenWifiSettings();
+ void onWifiSettingsFinished(int res);
+ void onChangeSavestateSRAMReloc(bool checked);
+ void onChangeScreenSize();
+ void onChangeScreenRotation(QAction* act);
+ void onChangeScreenGap(QAction* act);
+ void onChangeScreenLayout(QAction* act);
+ void onChangeScreenSizing(QAction* act);
+ void onChangeIntegerScaling(bool checked);
+ void onChangeScreenFiltering(bool checked);
+ void onChangeShowOSD(bool checked);
+ void onChangeLimitFramerate(bool checked);
+ void onChangeAudioSync(bool checked);
+
void onTitleUpdate(QString title);
void onEmuStart();
void onEmuStop();
- void onEmuPause();
- void onEmuUnpause();
+
+ void onUpdateVideoSettings(bool glchange);
private:
- MainWindowPanel* panel;
+ void createScreenPanel();
+
+ QString loadErrorStr(int error);
+
+public:
+ QWidget* panel;
QAction* actOpenROM;
QAction* actBootFirmware;
@@ -116,6 +243,27 @@ private:
QAction* actPause;
QAction* actReset;
QAction* actStop;
+
+ QAction* actEmuSettings;
+ QAction* actInputConfig;
+ QAction* actVideoSettings;
+ QAction* actAudioSettings;
+ QAction* actWifiSettings;
+ QAction* actSavestateSRAMReloc;
+ QAction* actScreenSize[4];
+ QActionGroup* grpScreenRotation;
+ QAction* actScreenRotation[4];
+ QActionGroup* grpScreenGap;
+ QAction* actScreenGap[6];
+ QActionGroup* grpScreenLayout;
+ QAction* actScreenLayout[3];
+ QActionGroup* grpScreenSizing;
+ QAction* actScreenSizing[4];
+ QAction* actIntegerScaling;
+ QAction* actScreenFiltering;
+ QAction* actShowOSD;
+ QAction* actLimitFramerate;
+ QAction* actAudioSync;
};
#endif // MAIN_H