133 lines
4.0 KiB
C++
133 lines
4.0 KiB
C++
/*
|
|
Copyright 2019 flyinghead
|
|
|
|
This file is part of Flycast.
|
|
|
|
Flycast is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
Flycast is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with Flycast. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
#pragma once
|
|
|
|
#include <string>
|
|
|
|
#include "types.h"
|
|
#include "imgui/imgui.h"
|
|
#include "imgui/imgui_internal.h"
|
|
#include "gui.h"
|
|
#include "emulator.h"
|
|
#include "stdclass.h"
|
|
|
|
typedef bool (*StringCallback)(bool cancelled, std::string selection);
|
|
|
|
void select_file_popup(const char *prompt, StringCallback callback,
|
|
bool selectFile = false, const std::string& extension = "");
|
|
|
|
void scrollWhenDraggingOnVoid(ImGuiMouseButton mouse_button = ImGuiMouseButton_Left);
|
|
|
|
IMGUI_API const ImWchar* GetGlyphRangesChineseSimplifiedOfficial();// Default + Half-Width + Japanese Hiragana/Katakana + set of 7800 CJK Unified Ideographs from General Standard Chinese Characters
|
|
IMGUI_API const ImWchar* GetGlyphRangesChineseTraditionalOfficial();// Default + Half-Width + Japanese Hiragana/Katakana + set of 4700 CJK Unified Ideographs from Hong Kong's List of Graphemes of Commonly-Used Chinese Characters
|
|
|
|
// Helper to display a little (?) mark which shows a tooltip when hovered.
|
|
void ShowHelpMarker(const char* desc);
|
|
template<bool PerGameOption>
|
|
bool OptionCheckbox(const char *name, config::Option<bool, PerGameOption>& option, const char *help = nullptr);
|
|
bool OptionSlider(const char *name, config::Option<int>& option, int min, int max, const char *help = nullptr);
|
|
template<typename T>
|
|
bool OptionRadioButton(const char *name, config::Option<T>& option, T value, const char *help = nullptr);
|
|
void OptionComboBox(const char *name, config::Option<int>& option, const char *values[], int count,
|
|
const char *help = nullptr);
|
|
bool OptionArrowButtons(const char *name, config::Option<int>& option, int min, int max, const char *help = nullptr);
|
|
|
|
static inline void centerNextWindow()
|
|
{
|
|
ImGui::SetNextWindowPos(ImVec2(ImGui::GetIO().DisplaySize.x / 2.f, ImGui::GetIO().DisplaySize.y / 2.f),
|
|
ImGuiCond_Always, ImVec2(0.5f, 0.5f));
|
|
}
|
|
|
|
static inline bool operator==(const ImVec2& l, const ImVec2& r)
|
|
{
|
|
return l.x == r.x && l.y == r.y;
|
|
}
|
|
|
|
static inline bool operator!=(const ImVec2& l, const ImVec2& r)
|
|
{
|
|
return !(l == r);
|
|
}
|
|
|
|
void fullScreenWindow(bool modal);
|
|
void windowDragScroll();
|
|
|
|
class BackgroundGameLoader
|
|
{
|
|
public:
|
|
void load(const std::string& path)
|
|
{
|
|
progress.reset();
|
|
future = std::async(std::launch::async, [this, path] {
|
|
emu.loadGame(path.c_str(), &progress);
|
|
});
|
|
}
|
|
|
|
void cancel()
|
|
{
|
|
if (progress.cancelled)
|
|
return;
|
|
progress.cancelled = true;
|
|
if (future.valid())
|
|
try {
|
|
future.get();
|
|
} catch (const FlycastException&) {
|
|
}
|
|
emu.unloadGame();
|
|
gui_state = GuiState::Main;
|
|
}
|
|
|
|
bool ready()
|
|
{
|
|
if (!future.valid())
|
|
return true;
|
|
if (future.wait_for(std::chrono::seconds(0)) == std::future_status::ready)
|
|
{
|
|
future.get();
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const LoadProgress& getProgress() const {
|
|
return progress;
|
|
}
|
|
|
|
private:
|
|
LoadProgress progress;
|
|
std::future<void> future;
|
|
};
|
|
|
|
struct ScaledVec2 : public ImVec2
|
|
{
|
|
ScaledVec2()
|
|
: ImVec2() {}
|
|
ScaledVec2(float x, float y)
|
|
: ImVec2(x * settings.display.uiScale, y * settings.display.uiScale) {}
|
|
};
|
|
|
|
inline static ImVec2 min(const ImVec2& l, const ImVec2& r) {
|
|
return ImVec2(std::min(l.x, r.x), std::min(l.y, r.y));
|
|
}
|
|
inline static ImVec2 operator+(const ImVec2& l, const ImVec2& r) {
|
|
return ImVec2(l.x + r.x, l.y + r.y);
|
|
}
|
|
inline static ImVec2 operator-(const ImVec2& l, const ImVec2& r) {
|
|
return ImVec2(l.x - r.x, l.y - r.y);
|
|
}
|