#pragma once #include "ColorPicker.hpp" #include "Containers.hpp" #include "Dialog.hpp" #include "Label.hpp" #include "Menus.hpp" #include "SearchField.hpp" #include "StatusChip.hpp" #include "TaskBoard.hpp" #include "TaskStore.hpp" #include "TextField.hpp" #include #include #include #include #include namespace tp::taskboard { using EditingCallback = std::function>)>; class TaskTitleField : public ui::TextField { public: TaskTitleField(); void showTitle(const std::string& title); }; class TaskHeader : public ui::Widget { public: explicit TaskHeader(TaskBoard& board); void showTask(std::optional id); [[nodiscard]] std::optional shownTask() const { return mShown; } void showConflicts(const std::vector& summaries); void showParentPicker(); void askDelete(); [[nodiscard]] ui::Widget& badgeRow() { return mBadgeRow; } void setOnBack(std::function callback); ui::Button back{ "\u2190 Back" }; ui::Label idLabel; TaskTitleField title; ui::Dropdown status; ui::ColorPickerButton color; ui::StatusChip badge; ui::PopupButton actionsButton; ui::Menu actionsMenu; ui::SearchField parentPicker; ui::ConfirmDialog deleteConfirm; ui::Label conflictText; ui::Button keepMine{ "Keep mine" }; ui::Button useTheirs{ "Use theirs" }; void setOnChanged(std::function callback) { mOnChanged = std::move(callback); } void setOnEditingChanged(EditingCallback callback) { mOnEditingChanged = std::move(callback); } void setOnConflictChoice(std::function callback) { mOnConflictChoice = std::move(callback); } void setOnDeleteRequested(std::function callback) { mOnDeleteRequested = std::move(callback); } void setOnParentChanged(std::function callback) { mOnParentChanged = std::move(callback); } private: void buildBadgeRow(); void buildConflictBanner(); void bindControls(); void bindActions(); [[nodiscard]] std::vector parentResults(const std::string& query); void parentPicked(std::optional parent); void change(const std::function& edit); void refresh(const Task& task); TaskBoard& mBoard; std::optional mShown; bool mLoading = false; std::vector> mParentChoices; ui::Widget mBadgeRow; ui::Spacer mBadgeSpacer; ui::Panel mConflictBanner{ ui::Panel::Surface::Raised }; ui::Widget mConflictActions; std::function mOnChanged; EditingCallback mOnEditingChanged; std::function mOnDeleteRequested; std::function mOnParentChanged; std::function mOnConflictChoice; std::function mOnBack; }; }