Files
86Box/src/qt/qt_rendererstack.hpp

120 lines
3.1 KiB
C++
Raw Normal View History

#ifndef QT_RENDERERCONTAINER_HPP
#define QT_RENDERERCONTAINER_HPP
#include <QDialog>
#include <QEvent>
#include <QKeyEvent>
#include <QStackedWidget>
#include <QWidget>
2023-01-03 15:42:57 +06:00
#include <QCursor>
#include <atomic>
#include <memory>
#include <tuple>
#include <vector>
#include "qt_renderercommon.hpp"
namespace Ui {
class RendererStack;
}
class RendererCommon;
class RendererStack : public QStackedWidget {
Q_OBJECT
public:
2022-07-04 01:50:42 +06:00
explicit RendererStack(QWidget *parent = nullptr, int monitor_index = 0);
~RendererStack();
void mousePressEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
void wheelEvent(QWheelEvent *event) override;
2023-01-03 15:42:57 +06:00
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
void enterEvent(QEnterEvent *event) override;
#else
void enterEvent(QEvent *event) override;
#endif
void leaveEvent(QEvent *event) override;
void closeEvent(QCloseEvent *event) override;
2022-11-19 08:49:04 -05:00
void changeEvent(QEvent *event) override;
void resizeEvent(QResizeEvent *event) override
{
onResize(event->size().width(), event->size().height());
}
void keyPressEvent(QKeyEvent *event) override
{
event->ignore();
}
void keyReleaseEvent(QKeyEvent *event) override
{
event->ignore();
}
2023-01-03 15:42:57 +06:00
bool event(QEvent* event) override;
enum class Renderer {
Software,
OpenGL,
OpenGLES,
2022-04-21 16:32:46 +06:00
OpenGL3,
2022-06-22 16:36:38 +06:00
Vulkan,
Direct3D9,
None = -1
};
void switchRenderer(Renderer renderer);
/* Does current renderer implement options dialog */
bool hasOptions() const { return rendererWindow ? rendererWindow->hasOptions() : false; }
2022-07-07 14:34:59 +06:00
/* Reloads options of current renderer */
void reloadOptions() const { return rendererWindow->reloadOptions(); }
/* Returns options dialog for current renderer */
QDialog *getOptions(QWidget *parent) { return rendererWindow ? rendererWindow->getOptions(parent) : nullptr; }
void setFocusRenderer();
void onResize(int width, int height);
2022-04-21 13:56:39 -03:00
void (*mouse_capture_func)(QWindow *window) = nullptr;
2022-11-19 08:49:04 -05:00
void (*mouse_uncapture_func)() = nullptr;
2022-11-19 08:49:04 -05:00
void (*mouse_exit_func)() = nullptr;
2022-04-20 20:51:39 -03:00
signals:
void blitToRenderer(int buf_idx, int x, int y, int w, int h);
2022-06-22 16:36:38 +06:00
void blit(int x, int y, int w, int h);
void rendererChanged();
public slots:
2022-06-22 16:36:38 +06:00
void blitCommon(int x, int y, int w, int h);
void blitRenderer(int x, int y, int w, int h);
void blitDummy(int x, int y, int w, int h);
private:
void createRenderer(Renderer renderer);
Ui::RendererStack *ui;
2023-05-29 01:30:51 -04:00
int x;
int y;
int w;
int h;
int sx;
int sy;
int sw;
int sh;
2022-11-19 08:49:04 -05:00
int currentBuf = 0;
int isMouseDown = 0;
2022-07-04 01:50:42 +06:00
int m_monitor_index = 0;
Renderer current_vid_api = Renderer::None;
std::vector<std::tuple<uint8_t *, std::atomic_flag *>> imagebufs;
RendererCommon *rendererWindow { nullptr };
std::unique_ptr<QWidget> current;
2022-11-19 08:49:04 -05:00
std::atomic<bool> directBlitting { false };
};
#endif // QT_RENDERERCONTAINER_HPP