Add XCUI command routing and widget state models

This commit is contained in:
2026-04-05 12:10:55 +08:00
parent 511e94fd30
commit 68c4c80b06
18 changed files with 1329 additions and 9 deletions

View File

@@ -0,0 +1,95 @@
#include <XCEngine/UI/Widgets/UIPropertyEditModel.h>
#include <utility>
namespace XCEngine {
namespace UI {
namespace Widgets {
bool UIPropertyEditModel::HasActiveEdit() const {
return !m_activeFieldId.empty();
}
const std::string& UIPropertyEditModel::GetActiveFieldId() const {
return m_activeFieldId;
}
const std::string& UIPropertyEditModel::GetStagedValue() const {
return m_stagedValue;
}
bool UIPropertyEditModel::IsDirty() const {
return m_dirty;
}
bool UIPropertyEditModel::BeginEdit(std::string fieldId, std::string initialValue) {
if (fieldId.empty()) {
return false;
}
const bool stateChanged =
m_activeFieldId != fieldId ||
m_baselineValue != initialValue ||
m_stagedValue != initialValue ||
m_dirty;
if (!stateChanged) {
return false;
}
m_activeFieldId = std::move(fieldId);
m_baselineValue = std::move(initialValue);
m_stagedValue = m_baselineValue;
m_dirty = false;
return true;
}
bool UIPropertyEditModel::UpdateStagedValue(std::string stagedValue) {
if (!HasActiveEdit()) {
return false;
}
if (m_stagedValue == stagedValue) {
return false;
}
m_stagedValue = std::move(stagedValue);
m_dirty = (m_stagedValue != m_baselineValue);
return true;
}
bool UIPropertyEditModel::CommitEdit(
std::string* outFieldId,
std::string* outCommittedValue) {
if (!HasActiveEdit()) {
return false;
}
if (outFieldId != nullptr) {
*outFieldId = m_activeFieldId;
}
if (outCommittedValue != nullptr) {
*outCommittedValue = m_stagedValue;
}
m_activeFieldId.clear();
m_baselineValue.clear();
m_stagedValue.clear();
m_dirty = false;
return true;
}
bool UIPropertyEditModel::CancelEdit() {
if (!HasActiveEdit()) {
return false;
}
m_activeFieldId.clear();
m_baselineValue.clear();
m_stagedValue.clear();
m_dirty = false;
return true;
}
} // namespace Widgets
} // namespace UI
} // namespace XCEngine