diff options
| author | Aldrik Ramaekers <aldrik@mailbox.org> | 2026-01-12 16:21:23 +0100 |
|---|---|---|
| committer | Aldrik Ramaekers <aldrik@mailbox.org> | 2026-01-12 16:21:23 +0100 |
| commit | 6d1c29533ab455dabe7e7b4f0dd31d5a11f02048 (patch) | |
| tree | 808791dcf137ca9bfbf24a18fce8138c7ffa5729 /src/ui/ui_projects.cpp | |
| parent | 4a2500299e8fd58f40b545d62dae0282ff20bb01 (diff) | |
refactor project view
Diffstat (limited to 'src/ui/ui_projects.cpp')
| -rw-r--r-- | src/ui/ui_projects.cpp | 175 |
1 files changed, 96 insertions, 79 deletions
diff --git a/src/ui/ui_projects.cpp b/src/ui/ui_projects.cpp index a43cd9b..55125de 100644 --- a/src/ui/ui_projects.cpp +++ b/src/ui/ui_projects.cpp @@ -38,51 +38,93 @@ void ui::setup_projects() _reset_to_default_view(); } -static void draw_project_form() +static void draw_project_create() { - float widthAvailable = ImGui::GetContentRegionAvail().x; - bool viewing_only = (current_view_state == ui::view_state::VIEW_EXISTING); - if (ImGui::Button(locale::get("form.back"), true, false)) { _reset_to_default_view(); - return; } - ImGui::Spacing(); - ImGui::BeginDisabled(); - - a_err last_err = administration::project_is_valid(active_project); - - ImGui::SetNextItemWidth(widthAvailable*0.2f); - ImGui::InputText(locale::get("project.form.identifier"), active_project.id, IM_ARRAYSIZE(active_project.id)); - if (!viewing_only) ImGui::EndDisabled(); + + ImGui::SameLine(); - ImGui::InputTextWithErrorHint(locale::get("project.form.description"), active_project.description, IM_ARRAYSIZE(active_project.description), last_err & A_ERR_MISSING_DESCRIPTION); + bool can_save = administration::project_is_valid(active_project) == A_ERR_SUCCESS; + if (!can_save) ImGui::BeginDisabled(); + if (ImGui::Button(locale::get("form.save"), true)) { + administration_writer::set_write_completed_event_callback(0); + administration::project_add(active_project); + current_view_state = ui::view_state::EDIT_EXISTING; + } + if (!can_save) ImGui::EndDisabled(); - if (viewing_only) ImGui::EndDisabled(); + ImGui::Spacing(); + ImGui::Separator(1.0f); + ImGui::Spacing(); - if (!viewing_only) { - bool can_save = administration::project_is_valid(active_project) == A_ERR_SUCCESS; + ImGui::ProjectForm(&active_project, false); +} - if (!can_save) ImGui::BeginDisabled(); - // Save button - ImGui::Spacing(); - if (ImGui::Button(locale::get("form.save"), true)) { +static void draw_project_update() +{ + if (ImGui::Button(locale::get("form.back"), true, false)) { + current_view_state = ui::view_state::VIEW_EXISTING; + } - administration_writer::set_write_completed_event_callback(_reset_to_default_view); + ImGui::SameLine(); + + bool can_save = administration::project_is_valid(active_project) == A_ERR_SUCCESS; + if (!can_save) ImGui::BeginDisabled(); + if (ImGui::Button(locale::get("form.save"), true)) { + administration_writer::set_write_completed_event_callback(0); + administration::project_update(active_project); + } + if (!can_save) ImGui::EndDisabled(); - if (current_view_state == ui::view_state::CREATE) { - administration::project_add(active_project); - } + if (active_project.state == project_state::PROJECT_RUNNING) + { + ImGui::SameLine(); + if (ImGui::Button(locale::get("form.cancel"))) { + selected_for_cancellation = active_project; + ImGui::OpenPopup("ConfirmCancelProject"); + } + } - else if (current_view_state == ui::view_state::EDIT_EXISTING) { - administration::project_update(active_project); - } + if (ImGui::BeginPopupModal("ConfirmCancelProject", nullptr, ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoTitleBar)) { + ImGui::Text(locale::get("form.confirmCancelProject")); + ImGui::Separator(); + + if (ImGui::Button(locale::get("form.yes"), ImVec2(120, 0))) { + administration::project_cancel(selected_for_cancellation); + ImGui::CloseCurrentPopup(); + _reset_to_default_view(); } - if (!can_save) ImGui::EndDisabled(); + ImGui::SameLine(); + if (ImGui::Button(locale::get("form.no"), ImVec2(120, 0))) { + ImGui::CloseCurrentPopup(); + } + ImGui::EndPopup(); + } + + ImGui::Spacing(); + ImGui::Separator(1.0f); + ImGui::Spacing(); + + ImGui::ProjectForm(&active_project, false); +} + +static void draw_project_view() +{ + if (ImGui::Button(locale::get("form.back"), true, false)) { + _reset_to_default_view(); } - else { - // TODO list invoices connected to project. + ImGui::SameLine(); + if (ImGui::Button(locale::get("form.change"))) { + current_view_state = ui::view_state::EDIT_EXISTING; } + + ImGui::Spacing(); + ImGui::Separator(1.0f); + ImGui::Spacing(); + + ImGui::ProjectForm(&active_project, true); } static void draw_project_list() @@ -120,22 +162,38 @@ static void draw_project_list() ImGui::Spacing(); - if (ImGui::BeginTable("TableProjects", 4, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { + if (ImGui::BeginTable("TableProjects", 3, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { ImGui::TableSetupColumn(locale::get("project.table.identifier"), ImGuiTableColumnFlags_WidthFixed, 80); ImGui::TableSetupColumn(locale::get("project.table.status"), ImGuiTableColumnFlags_WidthFixed, 140); ImGui::TableSetupColumn(locale::get("project.table.description"), ImGuiTableColumnFlags_WidthStretch); - ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, 175); + ImGui::PushFont(ui::fontBold); ImGui::TableHeadersRow(); + ImGui::PopFont(); project project_list[items_per_page]; u32 project_count = administration::project_get_partial_list(current_page, items_per_page, project_list); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); for (u32 i = 0; i < project_count; i++) { project c = project_list[i]; ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); ImGui::Text(c.id); + ImGui::TableSetColumnIndex(0); + + ImGui::PushID(i); + ImGuiSelectableFlags selectable_flags = ImGuiSelectableFlags_SpanAllColumns | ImGuiSelectableFlags_AllowOverlap; + bool selected = false; + if (ImGui::Selectable("##invisible_selectable", selected, selectable_flags, ImVec2(0, ImGui::GetFrameHeight()+2.0f))) + { + active_project = c; + current_view_state = ui::view_state::VIEW_EXISTING; + } + ImGui::SetItemAllowOverlap(); + ImGui::SameLine(); + ImGui::PopID(); + + ImGui::Text(c.id); if (administration::project_is_valid(c) != A_ERR_SUCCESS) { @@ -146,49 +204,8 @@ static void draw_project_list() ImGui::TableSetColumnIndex(1); ImGui::Text(locale::get(administration::project_get_status_string(c))); ImGui::TableSetColumnIndex(2); ImGui::Text(c.description); - - ImGui::TableSetColumnIndex(3); - - char btn_name[20]; - strops::format(btn_name, sizeof(btn_name), "%s##%d", locale::get("form.view"), i); - if (ImGui::Button(btn_name)) { - active_project = c; - current_view_state = ui::view_state::VIEW_EXISTING; - } - - if (c.state == project_state::PROJECT_RUNNING) - { - ImGui::SameLine(); - strops::format(btn_name, sizeof(btn_name), "%s##%d", locale::get("form.change"), i); - if (ImGui::Button(btn_name)) { - active_project = c; - current_view_state = ui::view_state::EDIT_EXISTING; - } - - ImGui::SameLine(); - strops::format(btn_name, sizeof(btn_name), "%s##%d", locale::get("form.cancel"), i); - if (ImGui::Button(btn_name)) { - selected_for_cancellation = c; - ImGui::OpenPopup("ConfirmCancelProject"); - } - } } - - if (ImGui::BeginPopupModal("ConfirmCancelProject", nullptr, ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoTitleBar)) { - ImGui::Text(locale::get("form.confirmCancelProject")); - ImGui::Separator(); - - if (ImGui::Button(locale::get("form.yes"), ImVec2(120, 0))) { - administration::project_cancel(selected_for_cancellation); - ImGui::CloseCurrentPopup(); - } - ImGui::SameLine(); - if (ImGui::Button(locale::get("form.no"), ImVec2(120, 0))) { - ImGui::CloseCurrentPopup(); - } - ImGui::EndPopup(); - } - + ImGui::PopStyleVar(); ImGui::EndTable(); } } @@ -198,9 +215,9 @@ void ui::draw_projects() switch(current_view_state) { case ui::view_state::LIST_ALL: draw_project_list(); break; - case ui::view_state::CREATE: draw_project_form(); break; - case ui::view_state::EDIT_EXISTING: draw_project_form(); break; - case ui::view_state::VIEW_EXISTING: draw_project_form(); break; + case ui::view_state::CREATE: draw_project_create(); break; + case ui::view_state::EDIT_EXISTING: draw_project_update(); break; + case ui::view_state::VIEW_EXISTING: draw_project_view(); break; default: break; } |
