pcsx-redux/third_party/ImFileDialog/example.cpp
2022-06-25 21:31:50 -07:00

169 lines
5 KiB
C++

#include <SDL2/SDL.h>
#include <imgui.h>
#include <backends/imgui_impl_sdl.h>
#include <backends/imgui_impl_opengl3.h>
#include <time.h>
#ifdef _WIN32
#include <windows.h>
#endif
#include <GL/glew.h>
#if defined(__APPLE__)
#include <OpenGL/gl.h>
#else
#include <GL/gl.h>
#endif
#pragma comment(lib, "opengl32.lib")
#include "ImFileDialog.h"
// SDL defines main
#undef main
int main(int argc, char* argv[])
{
bool run = true;
srand(time(NULL));
// init sdl2
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_AUDIO) < 0) {
printf("Failed to initialize SDL2\n");
return 0;
}
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
Uint32 windowFlags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI;
// create the window
int wndWidth = 1200, wndHeight = 800;
SDL_Window* wnd = SDL_CreateWindow("File Dialog", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, wndWidth, wndHeight, windowFlags);
// create the GL context
SDL_GLContext glContext = SDL_GL_CreateContext(wnd);
SDL_GL_MakeCurrent(wnd, glContext);
glEnable(GL_DEPTH_TEST);
glEnable(GL_STENCIL_TEST);
// init glew
glewExperimental = true;
if (glewInit() != GLEW_OK) {
printf("Failed to initialize GLEW\n");
return 0;
}
// imgui
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO(); (void)io;
ImGui::StyleColorsLight();
ImGui_ImplSDL2_InitForOpenGL(wnd, glContext);
ImGui_ImplOpenGL3_Init();
// ImFileDialog requires you to set the CreateTexture and DeleteTexture
ifd::FileDialog::Instance().CreateTexture = [](uint8_t* data, int w, int h, char fmt) -> void* {
GLuint tex;
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, (fmt == 0) ? GL_BGRA : GL_RGBA, GL_UNSIGNED_BYTE, data);
glGenerateMipmap(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, 0);
return (void*)tex;
};
ifd::FileDialog::Instance().DeleteTexture = [](void* tex) {
GLuint texID = (GLuint)((uintptr_t)tex);
glDeleteTextures(1, &texID);
};
SDL_Event event;
while (run) {
while (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT)
run = false;
else if (event.type == SDL_WINDOWEVENT) {
if (event.window.event == SDL_WINDOWEVENT_MOVED || event.window.event == SDL_WINDOWEVENT_MAXIMIZED || event.window.event == SDL_WINDOWEVENT_RESIZED) {
Uint32 wndFlags = SDL_GetWindowFlags(wnd);
SDL_GetWindowSize(wnd, &wndWidth, &wndHeight);
}
}
// let ImGui handle the events
ImGui_ImplSDL2_ProcessEvent(&event);
}
if (!run) break;
// Dear ImGui frame
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplSDL2_NewFrame(wnd);
ImGui::NewFrame();
// Simple window
ImGui::Begin("Control Panel");
if (ImGui::Button("Open file"))
ifd::FileDialog::Instance().Open("ShaderOpenDialog", "Open a shader", "Image file (*.png;*.jpg;*.jpeg;*.bmp;*.tga){.png,.jpg,.jpeg,.bmp,.tga},.*", true);
if (ImGui::Button("Open directory"))
ifd::FileDialog::Instance().Open("DirectoryOpenDialog", "Open a directory", "");
if (ImGui::Button("Save file"))
ifd::FileDialog::Instance().Save("ShaderSaveDialog", "Save a shader", "*.sprj {.sprj}");
ImGui::End();
// file dialogs
if (ifd::FileDialog::Instance().IsDone("ShaderOpenDialog")) {
if (ifd::FileDialog::Instance().HasResult()) {
const std::vector<std::filesystem::path>& res = ifd::FileDialog::Instance().GetResults();
for (const auto& r : res) // ShaderOpenDialog supports multiselection
printf("OPEN[%s]\n", r.u8string().c_str());
}
ifd::FileDialog::Instance().Close();
}
if (ifd::FileDialog::Instance().IsDone("DirectoryOpenDialog")) {
if (ifd::FileDialog::Instance().HasResult()) {
std::string res = ifd::FileDialog::Instance().GetResult().u8string();
printf("DIRECTORY[%s]\n", res.c_str());
}
ifd::FileDialog::Instance().Close();
}
if (ifd::FileDialog::Instance().IsDone("ShaderSaveDialog")) {
if (ifd::FileDialog::Instance().HasResult()) {
std::string res = ifd::FileDialog::Instance().GetResult().u8string();
printf("SAVE[%s]\n", res.c_str());
}
ifd::FileDialog::Instance().Close();
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
glViewport(0, 0, wndWidth, wndHeight);
// render Dear ImGui
ImGui::Render();
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
SDL_GL_SwapWindow(wnd);
}
// Dear ImGui cleanup
ImGui_ImplOpenGL3_Shutdown();
ImGui_ImplSDL2_Shutdown();
ImGui::DestroyContext();
// SDL2 cleanup
SDL_GL_DeleteContext(glContext);
SDL_DestroyWindow(wnd);
SDL_Quit();
return 0;
}