#include #include #include #include #include #ifdef _WIN32 #include #endif #include #if defined(__APPLE__) #include #else #include #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& 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; }