@@ -1820,7 +1820,6 @@ void EditorApp::render() {
18201820
18211821 ImGui::End ();
18221822
1823- render_command_line ();
18241823 render_terminal ();
18251824}
18261825
@@ -2030,8 +2029,8 @@ ImGui::EndMenu();
20302029// Editor Area
20312030// ============================================================================
20322031void EditorApp::render_editor_area () {
2033- // Editor window - can float, dock, and resize
2034- ImGui::Begin (" Editor" , nullptr , ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize );
2032+ // Editor window - dockable
2033+ ImGui::Begin (" Editor" , nullptr , ImGuiWindowFlags_NoSavedSettings );
20352034
20362035 if (ImGui::IsWindowFocused (ImGuiFocusedFlags_RootWindow)) {
20372036 editor_focused_ = true ;
@@ -2659,22 +2658,53 @@ void EditorApp::render_symbol_outline() {
26592658void EditorApp::render_status_bar () {
26602659 if (!settings_.show_status_bar ) return ;
26612660
2662- float status_height = 24 ;
2663- float cmd_height = vim_mode_ == VimMode::Command ? 24 : 0 ;
2661+ float status_height = 22 ;
2662+ float cmd_height = vim_mode_ == VimMode::Command ? 22 : 0 ;
26642663
2665- // Get editor window dimensions - use current window
2664+ // Get editor window dimensions
26662665 ImVec2 editor_pos = ImGui::GetWindowPos ();
26672666 float editor_width = ImGui::GetWindowWidth ();
26682667 float editor_height = ImGui::GetWindowHeight ();
26692668
2670- // Position at bottom of current editor window
2671- ImGui::SetCursorPosY (editor_height - status_height - cmd_height);
2669+ // Command bar - inside editor, one line high, positioned at very bottom of editor
2670+ if (vim_mode_ == VimMode::Command) {
2671+ float cmd_y = editor_height - cmd_height;
2672+ ImGui::SetCursorPosY (cmd_y);
2673+
2674+ ImDrawList* draw_list = ImGui::GetWindowDrawList ();
2675+ ImU32 cmd_bg = ImColor (0 .1f , 0 .1f , 0 .2f );
2676+ draw_list->AddRectFilled (
2677+ ImVec2 (editor_pos.x , editor_pos.y + cmd_y),
2678+ ImVec2 (editor_pos.x + editor_width, editor_pos.y + editor_height),
2679+ cmd_bg);
2680+
2681+ ImGui::SetCursorPosY (cmd_y);
2682+ ImGui::PushStyleVar (ImGuiStyleVar_FramePadding, ImVec2 (4 , 2 ));
2683+ ImGui::PushStyleColor (ImGuiCol_Text, ImVec4 (0 .9f , 0 .9f , 0 .9f , 1 .0f ));
2684+
2685+ ImGui::Text (" :" );
2686+ ImGui::SameLine ();
2687+ ImGui::SetNextItemWidth (editor_width - 30 );
2688+ if (ImGui::InputText (" ##cmd" , vim_command_input_, sizeof (vim_command_input_), ImGuiInputTextFlags_EnterReturnsTrue)) {
2689+ execute_vim_command (vim_command_input_);
2690+ vim_command_input_[0 ] = ' \0 ' ;
2691+ vim_mode_ = VimMode::Normal;
2692+ }
2693+
2694+ ImGui::PopStyleColor ();
2695+ ImGui::PopStyleVar ();
2696+
2697+ // Move status bar above command bar
2698+ editor_height -= cmd_height;
2699+ }
2700+
2701+ // Status bar at bottom of editor
2702+ ImGui::SetCursorPosY (editor_height - status_height);
26722703
2673- // Status bar background - spans full width
26742704 ImDrawList* draw_list = ImGui::GetWindowDrawList ();
26752705 ImU32 status_bg = ImColor (0 .2f , 0 .2f , 0 .25f );
26762706 draw_list->AddRectFilled (
2677- ImVec2 (editor_pos.x , editor_pos.y + editor_height - status_height - cmd_height ),
2707+ ImVec2 (editor_pos.x , editor_pos.y + editor_height - status_height),
26782708 ImVec2 (editor_pos.x + editor_width, editor_pos.y + editor_height),
26792709 status_bg);
26802710
@@ -2687,6 +2717,7 @@ void EditorApp::render_status_bar() {
26872717 auto pos = editor ? editor->GetCursorPosition () : TextEditor::Coordinates ();
26882718
26892719 const char * mode_str = get_vim_mode_str ();
2720+ const char * sep = " |" ;
26902721
26912722 // Get directory info
26922723 std::string dir_info = " ." ;
@@ -2702,56 +2733,47 @@ void EditorApp::render_status_bar() {
27022733 }
27032734 }
27042735
2705- // Status bar sections
2706- const char * sep = " | " ;
2707-
2708- // Mode: NORMAL/INSERT
2736+ // Exact format: | MODE | filename | * | Ln,Col | Git:branch | encoding | CRLF | Tab:n | v0.2.28 |
27092737 ImGui::Text (" %s" , mode_str);
27102738 ImGui::SameLine ();
27112739 ImGui::Text (" %s" , sep);
27122740 ImGui::SameLine ();
27132741
2714- // Filename with dirty indicator
27152742 std::string display = tab.display_name + (tab.dirty ? " *" : " " );
27162743 ImGui::Text (" %s" , display.c_str ());
27172744 ImGui::SameLine ();
27182745 ImGui::Text (" %s" , sep);
27192746 ImGui::SameLine ();
27202747
2721- // Line and column
27222748 ImGui::Text (" Ln %d, Col %d" , pos.mLine + 1 , pos.mColumn + 1 );
27232749 ImGui::SameLine ();
27242750 ImGui::Text (" %s" , sep);
27252751 ImGui::SameLine ();
27262752
2727- // Git branch or directory
27282753 ImGui::Text (" Git: %s" , dir_info.c_str ());
27292754 ImGui::SameLine ();
27302755 ImGui::Text (" %s" , sep);
27312756 ImGui::SameLine ();
27322757
2733- // Encoding (read-only display)
27342758 ImGui::Text (" %s" , tab.file_encoding .c_str ());
27352759 ImGui::SameLine ();
27362760 ImGui::Text (" %s" , sep);
27372761 ImGui::SameLine ();
27382762
2739- // Line ending - clickable popup
2740- std::string le_id = tab.line_ending ;
2741- if (ImGui::Selectable (le_id.c_str (), false )) {
2763+ // Line ending - clickable
2764+ if (ImGui::Selectable (tab.line_ending .c_str (), false )) {
27422765 ImGui::OpenPopup (" LineEndingPopup" );
27432766 }
27442767 if (ImGui::BeginPopup (" LineEndingPopup" )) {
27452768 if (ImGui::MenuItem (" LF" , nullptr , tab.line_ending == " LF" )) { tab.line_ending = " LF" ; }
27462769 if (ImGui::MenuItem (" CRLF" , nullptr , tab.line_ending == " CRLF" )) { tab.line_ending = " CRLF" ; }
2747- if (ImGui::MenuItem (" CR" , nullptr , tab.line_ending == " CR" )) { tab.line_ending = " CR" ; }
27482770 ImGui::EndPopup ();
27492771 }
27502772 ImGui::SameLine ();
27512773 ImGui::Text (" %s" , sep);
27522774 ImGui::SameLine ();
27532775
2754- // Tab size - clickable popup
2776+ // Tab size - clickable
27552777 std::string tab_id = " Tab: " + std::to_string (settings_.tab_size );
27562778 if (ImGui::Selectable (tab_id.c_str (), false )) {
27572779 ImGui::OpenPopup (" TabSizePopup" );
@@ -2769,11 +2791,11 @@ void EditorApp::render_status_bar() {
27692791 ImGui::Text (" %s" , sep);
27702792 ImGui::SameLine ();
27712793
2772- // Version
2794+ // Version with git hash
27732795 ImGui::Text (" v0.2.28" );
27742796 }
27752797
2776- ImGui::PopStyleColor ();
2798+ ImGui::PopStyleColor ();
27772799 ImGui::PopStyleVar ();
27782800}
27792801
@@ -2952,33 +2974,7 @@ if (history_index_ > 0) {
29522974}
29532975
29542976void EditorApp::render_command_line () {
2955- if (vim_mode_ != VimMode::Command) return ;
2956-
2957- float cmd_height = 28 ;
2958- ImVec2 editor_pos = ImGui::GetWindowPos ();
2959- float editor_width = ImGui::GetWindowWidth ();
2960- float editor_height = ImGui::GetWindowHeight ();
2961-
2962- ImGui::SetCursorPosY (editor_height - 24 - cmd_height);
2963-
2964- ImDrawList* draw_list = ImGui::GetWindowDrawList ();
2965- ImU32 cmd_bg = ImColor (0 .1f , 0 .1f , 0 .2f );
2966- draw_list->AddRectFilled (
2967- ImVec2 (editor_pos.x , editor_pos.y + editor_height - cmd_height),
2968- ImVec2 (editor_pos.x + editor_width, editor_pos.y + editor_height),
2969- cmd_bg);
2970-
2971- ImGui::SetCursorPosY (editor_height - cmd_height);
2972- ImGui::PushStyleVar (ImGuiStyleVar_FramePadding, ImVec2 (4 , 4 ));
2973- ImGui::PushStyleColor (ImGuiCol_Text, ImVec4 (0 .9f , 0 .9f , 0 .9f , 1 .0f ));
2974-
2975- ImGui::Text (" :" );
2976- ImGui::SameLine ();
2977- ImGui::SetNextItemWidth (editor_width - 40 );
2978- ImGui::InputText (" ##cmd" , vim_command_input_, sizeof (vim_command_input_), ImGuiInputTextFlags_EnterReturnsTrue, nullptr , this );
2979-
2980- ImGui::PopStyleColor ();
2981- ImGui::PopStyleVar ();
2977+ // Command line is now rendered inside render_status_bar
29822978}
29832979
29842980#ifdef _WIN32
0 commit comments