rpcsx/rpcs3/rpcs3qt/gui_application.h

150 lines
3.5 KiB
C
Raw Normal View History

2020-12-05 13:08:24 +01:00
#pragma once
2019-06-18 04:02:06 +02:00
#include "util/types.hpp"
#include "util/atomic.hpp"
2019-06-18 04:02:06 +02:00
2019-06-21 13:33:32 +02:00
#include <QApplication>
2024-02-05 23:49:00 +01:00
#include <QAbstractNativeEventFilter>
2020-02-22 20:42:49 +01:00
#include <QElapsedTimer>
2020-04-28 19:12:36 +02:00
#include <QTimer>
2020-02-22 20:42:49 +01:00
#include <QTranslator>
2021-05-22 10:42:05 +02:00
#include <QSoundEffect>
2019-06-21 13:33:32 +02:00
#include "main_application.h"
2020-02-22 20:42:49 +01:00
#include "Emu/System.h"
#include "Input/raw_mouse_handler.h"
#include <memory>
#include <functional>
#include <deque>
2025-01-23 23:49:24 +01:00
#ifdef _WIN32
#include "Windows.h"
#endif
2020-02-22 20:42:49 +01:00
class gs_frame;
class main_window;
class gui_settings;
class emu_settings;
class persistent_settings;
2019-06-18 04:02:06 +02:00
extern std::unique_ptr<raw_mouse_handler> g_raw_mouse_handler; // Only used for GUI
2019-07-11 23:11:52 +02:00
/** RPCS3 GUI Application Class
* The main point of this class is to do application initialization, to hold the main and game windows and to initialize callbacks.
*/
2019-06-18 04:02:06 +02:00
class gui_application : public QApplication, public main_application
{
Q_OBJECT
public:
gui_application(int& argc, char** argv);
2019-08-25 11:51:13 +02:00
~gui_application();
2019-06-18 04:02:06 +02:00
void SetShowGui(bool show_gui = true)
{
m_show_gui = show_gui;
}
void SetUseCliStyle(bool use_cli_style = false)
{
m_use_cli_style = use_cli_style;
}
void SetWithCliBoot(bool with_cli_boot = false)
{
m_with_cli_boot = with_cli_boot;
}
void SetStartGamesFullscreen(bool start_games_fullscreen = false)
{
m_start_games_fullscreen = start_games_fullscreen;
}
void SetGameScreenIndex(int screen_index = -1)
{
m_game_screen_index = screen_index;
}
2019-06-18 04:02:06 +02:00
/** Call this method before calling app.exec */
bool Init() override;
2019-06-18 04:02:06 +02:00
std::unique_ptr<gs_frame> get_gs_frame();
main_window* m_main_window = nullptr;
private:
QThread* get_thread() override
{
return thread();
}
2020-02-05 11:07:34 +01:00
void SwitchTranslator(QTranslator& translator, const QString& filename, const QString& language_code);
void LoadLanguage(const QString& language_code);
2021-04-07 23:05:18 +02:00
static QStringList GetAvailableLanguageCodes();
2019-06-18 04:02:06 +02:00
void InitializeCallbacks();
void InitializeConnects();
void StartPlaytime(bool start_playtime);
2020-04-28 19:12:36 +02:00
void UpdatePlaytime();
void StopPlaytime();
2024-02-05 23:49:00 +01:00
class native_event_filter : public QAbstractNativeEventFilter
{
public:
bool nativeEventFilter(const QByteArray& eventType, void* message, qintptr* result) override;
} m_native_event_filter;
QTranslator m_translator;
2020-02-05 11:07:34 +01:00
QString m_language_code;
2020-04-28 19:12:36 +02:00
QTimer m_timer;
QElapsedTimer m_timer_playtime;
std::deque<std::unique_ptr<QSoundEffect>> m_sound_effects{};
2021-05-22 10:42:05 +02:00
2019-06-18 04:02:06 +02:00
std::shared_ptr<emu_settings> m_emu_settings;
std::shared_ptr<gui_settings> m_gui_settings;
std::shared_ptr<persistent_settings> m_persistent_settings;
2019-06-18 04:02:06 +02:00
2023-12-22 00:33:36 +01:00
QString m_default_style;
2019-08-25 11:51:13 +02:00
bool m_show_gui = true;
bool m_use_cli_style = false;
bool m_with_cli_boot = false;
bool m_start_games_fullscreen = false;
int m_game_screen_index = -1;
2019-08-25 11:51:13 +02:00
u64 m_pause_amend_time_on_focus_loss = umax;
u64 m_pause_delayed_tag = 0;
typename Emulator::stop_counter_t m_emu_focus_out_emulation_id{};
bool m_is_pause_on_focus_loss_active = false;
2025-01-23 23:49:24 +01:00
#ifdef _WIN32
void register_device_notification(WId window_id);
void unregister_device_notification();
2025-01-23 23:49:24 +01:00
HDEVNOTIFY m_device_notification_handle {};
#endif
2019-06-18 04:02:06 +02:00
private Q_SLOTS:
2021-02-07 13:14:36 +01:00
void OnChangeStyleSheetRequest();
2023-11-25 01:33:53 +01:00
void OnShortcutChange();
void OnAppStateChanged(Qt::ApplicationState state);
2019-06-18 04:02:06 +02:00
Q_SIGNALS:
void OnEmulatorRun(bool start_playtime);
2019-06-18 04:02:06 +02:00
void OnEmulatorPause();
void OnEmulatorResume(bool start_playtime);
2019-06-18 04:02:06 +02:00
void OnEmulatorStop();
void OnEmulatorReady();
void OnEnableDiscEject(bool enabled);
void OnEnableDiscInsert(bool enabled);
2019-06-18 04:02:06 +02:00
void RequestCallFromMainThread(std::function<void()> func, atomic_t<u32>* wake_up);
2019-06-18 04:02:06 +02:00
private Q_SLOTS:
static void CallFromMainThread(const std::function<void()>& func, atomic_t<u32>* wake_up);
2019-06-18 04:02:06 +02:00
};