diff --git a/Osmium.cpp b/Osmium.cpp index 479913b..f7d6639 100644 --- a/Osmium.cpp +++ b/Osmium.cpp @@ -50,56 +50,90 @@ int main(int argc, char **argv) { // program while (!glfwWindowShouldClose(window)) { + + ImGui_ImplOpenGL3_NewFrame(); + ImGui_ImplGlfw_NewFrame(); + ImGui::NewFrame(); + static bool dragging_window = false; - static double drag_start_mouse_x, drag_start_mouse_y; - static int drag_start_window_x,drag_start_window_y; + static double drag_start_global_x, drag_start_global_y; + static int drag_start_window_x, drag_start_window_y; glClearColor(1.0f, .5f, .2f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glfwPollEvents(); - ImGui_ImplOpenGL3_NewFrame(); - ImGui_ImplGlfw_NewFrame(); - ImGui::NewFrame(); - ImGui::BeginMainMenuBar(); - bool is_hovered = ImGui::IsWindowHovered(); - bool is_clicked = ImGui::IsMouseClicked(0); - bool is_held = ImGui::IsMouseDown(0); + if (ImGui::BeginMainMenuBar()) { + // --- DRAG LOGIC FIRST --- + bool is_hovered = ImGui::IsWindowHovered(); + bool is_clicked = ImGui::IsMouseClicked(0); + bool is_held = ImGui::IsMouseDown(0); - if (is_hovered && is_clicked) { - dragging_window = true; + // Get current window position + int window_x, window_y; + glfwGetWindowPos(window, &window_x, &window_y); - // Get initial mouse and window positions - glfwGetCursorPos(window, &drag_start_mouse_x, &drag_start_mouse_y); - glfwGetWindowPos(window, &drag_start_window_x, &drag_start_window_y); - } + // Get current mouse position relative to window + double local_mouse_x, local_mouse_y; + glfwGetCursorPos(window, &local_mouse_x, &local_mouse_y); - if (dragging_window) { - if (is_held) { - double current_mouse_x, current_mouse_y; - glfwGetCursorPos(window, ¤t_mouse_x, ¤t_mouse_y); + // Convert to global mouse position + double global_mouse_x = window_x + local_mouse_x; + double global_mouse_y = window_y + local_mouse_y; - double dx = current_mouse_x - drag_start_mouse_x; - double dy = current_mouse_y - drag_start_mouse_y; - - glfwSetWindowPos(window, - drag_start_window_x + static_cast(dx), - drag_start_window_y + static_cast(dy)); - } else { - dragging_window = false; + // ✅ Only start dragging if not over any ImGui menu item + if (is_hovered && is_clicked && !ImGui::IsAnyItemHovered()) { + dragging_window = true; + drag_start_global_x = global_mouse_x; + drag_start_global_y = global_mouse_y; + drag_start_window_x = window_x; + drag_start_window_y = window_y; } - } - // Menu items - if (ImGui::BeginMenu("File")) { - if (ImGui::MenuItem("Exit")) { + if (dragging_window) { + if (is_held) { + double dx = global_mouse_x - drag_start_global_x; + double dy = global_mouse_y - drag_start_global_y; + + glfwSetWindowPos(window, + drag_start_window_x + static_cast(dx), + drag_start_window_y + static_cast(dy)); + } else { + dragging_window = false; + } + } + + // --- MENU ITEMS ALWAYS RENDERED --- + if (ImGui::BeginMenu("File")) { + if (ImGui::MenuItem("Quit")) { + glfwSetWindowShouldClose(window, true); + } + ImGui::EndMenu(); + } + + float window_width = ImGui::GetWindowWidth(); + ImVec2 size = ImGui::CalcTextSize("x"); + float button_width = size.x + ImGui::GetStyle().FramePadding.x * 2; + ImGui::SameLine(window_width - button_width - ImGui::GetStyle().ItemSpacing.x); + + if (ImGui::Button("x")) { + // Button clicked logic + std::cout << "Exiting..." << std::endl; glfwSetWindowShouldClose(window, true); } - ImGui::EndMenu(); + + ImGui::EndMainMenuBar(); + + } - ImGui::EndMainMenuBar(); + + + + + + ImGui::Begin("Editor"); ImGui::Text("Hello from editor");