From 8e03e8e79b14692bf63791579db5b4fe632e2def Mon Sep 17 00:00:00 2001 From: dijunkun Date: Mon, 5 Aug 2024 17:28:39 +0800 Subject: [PATCH] [feat] make control bar stick to left/right border --- src/single_window/control_bar.cpp | 16 +-- src/single_window/control_window.cpp | 173 +++++++++++++++++++++++---- src/single_window/render.h | 8 +- 3 files changed, 162 insertions(+), 35 deletions(-) diff --git a/src/single_window/control_bar.cpp b/src/single_window/control_bar.cpp index 518b1c0..acb3f24 100644 --- a/src/single_window/control_bar.cpp +++ b/src/single_window/control_bar.cpp @@ -10,7 +10,7 @@ int Render::ControlBar() { ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); if (control_bar_button_pressed_) { - ImGui::SetCursorPosX(control_winodw_pos_.x + 22); + ImGui::SetCursorPosX(control_window_width_ + 2); // Mouse control std::string mouse = ICON_FA_COMPUTER_MOUSE; if (ImGui::Button(mouse.c_str(), ImVec2(25, 25))) { @@ -43,16 +43,16 @@ int Render::ControlBar() { } ImGui::SameLine(); - ImGui::SetCursorPosX(control_winodw_pos_.x + control_window_max_width_ - - 35); } - ImGui::SetCursorPosX(control_winodw_pos_.x + - (control_bar_button_pressed_ - ? (control_window_max_width_ - 18) - : (control_window_min_width_))); + ImGui::SetCursorPosX(is_control_bar_in_left_ ? control_window_width_ * 2 - 18 + : 2); + std::string control_bar = - control_bar_button_pressed_ ? ICON_FA_ANGLE_LEFT : ICON_FA_ANGLE_RIGHT; + control_bar_button_pressed_ + ? (is_control_bar_in_left_ ? ICON_FA_ANGLE_LEFT : ICON_FA_ANGLE_RIGHT) + : (is_control_bar_in_left_ ? ICON_FA_ANGLE_RIGHT + : ICON_FA_ANGLE_LEFT); if (ImGui::Button(control_bar.c_str(), ImVec2(15, 25))) { control_bar_button_pressed_ = !control_bar_button_pressed_; control_bar_button_pressed_time_ = ImGui::GetTime(); diff --git a/src/single_window/control_window.cpp b/src/single_window/control_window.cpp index 233549c..a8c058a 100644 --- a/src/single_window/control_window.cpp +++ b/src/single_window/control_window.cpp @@ -1,29 +1,151 @@ +#include "rd_log.h" #include "render.h" int Render::ControlWindow() { auto time_duration = ImGui::GetTime() - control_bar_button_pressed_time_; - auto control_window_width = - !control_bar_button_pressed_ - ? time_duration < 0.25f - ? control_window_max_width_ - - (control_window_max_width_ - control_window_min_width_) * - 4 * time_duration - : control_window_min_width_ - : time_duration < 0.25f - ? control_window_min_width_ + - (control_window_max_width_ - control_window_min_width_) * 4 * - time_duration - : control_window_max_width_; + // if (time_duration <= 0.25f) { + // control_window_width_is_changing_ = true; + // } else { + // control_window_width_is_changing_ = false; + // } + + // control_window_width_ = + // !control_bar_button_pressed_ + // ? (time_duration < 0.25f + // ? control_window_max_width_ - + // (control_window_max_width_ - + // control_window_min_width_) * + // 4 * time_duration + // : control_window_min_width_) + // : (time_duration < 0.25f + // ? control_window_min_width_ + + // (control_window_max_width_ - + // control_window_min_width_) * + // 4 * time_duration + // : control_window_max_width_); + + if (control_window_width_is_changing_) { + if (control_bar_button_pressed_) { + // control_window_width_ = + // control_window_width_is_changing_ + // ? control_window_min_width_ + + // (control_window_max_width_ - control_window_min_width_) * + // 4 + // * + // time_duration + // : control_window_max_width_; + + control_window_width_ = + control_window_min_width_ + + (control_window_max_width_ - control_window_min_width_) * 4 * + time_duration; + + } else { + // control_window_width_ = + // control_window_width_is_changing_ + // ? control_window_max_width_ - + // (control_window_max_width_ - control_window_min_width_) * + // 4 + // * + // time_duration + // : control_window_min_width_; + + control_window_width_ = + control_window_max_width_ - + (control_window_max_width_ - control_window_min_width_) * 4 * + time_duration; + } + } ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(1, 1, 1, 1)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowMinSize, ImVec2(0, 0)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 10.0f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0); ImGui::PushStyleVar(ImGuiStyleVar_ChildRounding, 10.0f); ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); - ImGui::SetNextWindowPos( - ImVec2(-control_window_min_width_ / 2, title_bar_height_), - ImGuiCond_Once); - ImGui::SetNextWindowSize(ImVec2(control_window_width, control_window_height_), - ImGuiCond_Always); + ImGui::SetNextWindowSize( + ImVec2(control_window_width_, control_window_height_), ImGuiCond_Always); + ImGui::SetNextWindowPos(ImVec2(0, title_bar_height_), ImGuiCond_Once); + if (ImGui::IsMouseReleased(ImGuiPopupFlags_MouseButtonLeft) || + control_window_width_is_changing_) { + if (control_winodw_pos_.x <= main_window_width_ / 2 || + (control_winodw_pos_.y < title_bar_height_ || + control_winodw_pos_.y > + main_window_height_ - control_window_height_)) { + ImGui::SetNextWindowPos( + ImVec2(0, + (control_winodw_pos_.y >= title_bar_height_ && + control_winodw_pos_.y <= + main_window_height_ - control_window_height_) + ? control_winodw_pos_.y + : (control_winodw_pos_.y < title_bar_height_ + ? title_bar_height_ + : (main_window_height_ - control_window_height_))), + ImGuiCond_Always); + is_control_bar_in_left_ = true; + } else if (control_winodw_pos_.x > main_window_width_ / 2 || + (control_winodw_pos_.y < title_bar_height_ || + control_winodw_pos_.y > + main_window_height_ - control_window_height_)) { + int pos_x = 0; + int pos_y = (control_winodw_pos_.y >= title_bar_height_ && + control_winodw_pos_.y <= + main_window_height_ - control_window_height_) + ? control_winodw_pos_.y + : (control_winodw_pos_.y < title_bar_height_ + ? title_bar_height_ + : (main_window_height_ - control_window_height_)); + + if (control_bar_button_pressed_) { + if (control_window_width_ > control_window_max_width_) { + control_window_width_ = control_window_max_width_; + control_window_width_is_changing_ = false; + pos_x = main_window_width_ - control_window_max_width_; + } else { + control_window_width_is_changing_ = true; + pos_x = main_window_width_ - control_window_width_; + } + } else { + if (control_window_width_ < control_window_min_width_) { + control_window_width_ = control_window_min_width_; + control_window_width_is_changing_ = false; + pos_x = main_window_width_ - control_window_min_width_; + } else { + control_window_width_is_changing_ = true; + pos_x = main_window_width_ - control_window_width_; + } + } + + // int pos_x = + // control_bar_button_pressed_ + // ? (control_window_width_is_changing_ + // ? (main_window_width_ - control_window_width_) + // : (main_window_width_ - control_window_max_width_)) + // : (control_window_width_is_changing_ + // ? (main_window_width_ - control_window_width_) + // : (main_window_width_ - control_window_min_width_)); + + // int pos_y = (control_winodw_pos_.y >= title_bar_height_ && + // control_winodw_pos_.y <= + // main_window_height_ - control_window_height_) + // ? control_winodw_pos_.y + // : (control_winodw_pos_.y < title_bar_height_ + // ? title_bar_height_ + // : (main_window_height_ - + // control_window_height_)); + + ImGui::SetNextWindowPos(ImVec2(pos_x, pos_y), ImGuiCond_Always); + is_control_bar_in_left_ = false; + LOG_ERROR("x [{}], y[{}], [{}] | [{}]", pos_x, pos_y, main_window_width_, + control_window_width_); + } + } + + // LOG_ERROR("x[{}], y[{}], w[{}]", control_winodw_pos_.x, + // control_winodw_pos_.y, + // control_window_width_); + ImGui::Begin("ControlWindow", nullptr, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoScrollbar | @@ -31,19 +153,18 @@ int Render::ControlWindow() { ImGui::PopStyleVar(); control_winodw_pos_ = ImGui::GetWindowPos(); - if (control_winodw_pos_.x != -control_window_min_width_ / 2) { - ImGui::SetWindowPos( - ImVec2(-control_window_min_width_ / 2, control_winodw_pos_.y), - ImGuiCond_Always); - } - ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); static bool a, b, c, d, e; - ImGui::SetNextWindowPos(ImVec2(0, title_bar_height_), ImGuiCond_Once); + ImGui::SetNextWindowPos( + ImVec2(is_control_bar_in_left_ + ? control_winodw_pos_.x - control_window_width_ + : control_winodw_pos_.x, + control_winodw_pos_.y), + ImGuiCond_Always); ImGui::SetWindowFontScale(0.5f); ImGui::BeginChild("ControlBar", - ImVec2(control_window_width, control_window_height_), + ImVec2(control_window_width_ * 2, control_window_height_), ImGuiChildFlags_Border, ImGuiWindowFlags_NoDecoration); ImGui::SetWindowFontScale(1.0f); ImGui::PopStyleColor(); @@ -52,7 +173,7 @@ int Render::ControlWindow() { ImGui::EndChild(); ImGui::End(); - ImGui::PopStyleVar(); + ImGui::PopStyleVar(4); ImGui::PopStyleColor(); return 0; diff --git a/src/single_window/render.h b/src/single_window/render.h index eb518a2..5c6eb6d 100644 --- a/src/single_window/render.h +++ b/src/single_window/render.h @@ -141,8 +141,9 @@ class Render { int stream_window_height_last_ = 720; int main_window_width_before_maximized_ = 960; int main_window_height_before_maximized_ = 570; - int control_window_min_width_ = 40; + int control_window_min_width_ = 20; int control_window_max_width_ = 150; + int control_window_width_ = 0; int control_window_height_ = 40; int local_window_width_ = 350; int status_bar_height_ = 20; @@ -153,6 +154,9 @@ class Render { int about_window_width_ = 200; int about_window_height_ = 150; + int control_bar_pos_x_ = 0; + int control_bar_pos_y_ = 30; + int main_window_width_real_ = 960; int main_window_height_real_ = 540; float dpi_scaling_w_ = 1.0f; @@ -196,6 +200,8 @@ class Render { bool window_maximized_ = false; bool streaming_ = true; bool is_client_mode_ = true; + bool is_control_bar_in_left_ = true; + bool control_window_width_is_changing_ = false; double copy_start_time_ = 0; double regenerate_password_start_time_ = 0;