#include "Value.hpp" #include #include #include #include #include #include constexpr BaseValue::KindInfo kEmptyInfo{ .PinIcon = ImGui::IconType::Circle, .PinColor = RgbaColor(), }; constexpr BaseValue::KindInfo kNumericInfo{ .PinIcon = ImGui::IconType::Circle, .PinColor = RgbaColor(147, 226, 74), }; constexpr BaseValue::KindInfo kTextInfo{ .PinIcon = ImGui::IconType::Circle, .PinColor = RgbaColor(124, 21, 153), }; constexpr BaseValue::KindInfo kDateTimeInfo{ .PinIcon = ImGui::IconType::Circle, .PinColor = RgbaColor(147, 226, 74), }; constexpr BaseValue::KindInfo kDatabaseRowIdInfo{ .PinIcon = ImGui::IconType::Circle, .PinColor = RgbaColor(216, 42, 221), }; constexpr BaseValue::KindInfo kListInfo{ .PinIcon = ImGui::IconType::Diamond, .PinColor = RgbaColor(58, 154, 214), }; constexpr BaseValue::KindInfo kDictionaryInfo{ .PinIcon = ImGui::IconType::Diamond, .PinColor = RgbaColor(240, 240, 34), }; constexpr BaseValue::KindInfo kDatabaseRowInfo{ .PinIcon = ImGui::IconType::Square, .PinColor = RgbaColor(15, 124, 196), }; constexpr BaseValue::KindInfo kObjectInfo{ .PinIcon = ImGui::IconType::Square, .PinColor = RgbaColor(161, 161, 161), }; const BaseValue::KindInfo& BaseValue::QueryInfo(BaseValue::Kind kind) { switch (kind) { case KD_Numeric: return kNumericInfo; case KD_Text: return kTextInfo; case KD_DateTime: return kDateTimeInfo; case KD_DatabaseRowId: return kDatabaseRowIdInfo; case KD_List: return kListInfo; case KD_Dictionary: return kDictionaryInfo; case KD_BaseObject: return kObjectInfo; case KD_SaleDatabaseRow: case KD_PurchaseDatabaseRow: return kDatabaseRowInfo; case InvalidKind: break; } return kEmptyInfo; } const char* BaseValue::Format(Kind kind) { switch (kind) { case KD_Numeric: return I18N_TEXT("Numeric", L10N_VALUE_NUMERIC); case KD_Text: return I18N_TEXT("Text", L10N_VALUE_TEXT); case KD_DateTime: return I18N_TEXT("Date/time", L10N_VALUE_DATE_TIME); case KD_DatabaseRowId: return I18N_TEXT("Row id", L10N_VALUE_ROW_ID); case KD_List: return I18N_TEXT("List", L10N_VALUE_LIST); case KD_Dictionary: return I18N_TEXT("Dictionary", L10N_VALUE_DICT); case KD_BaseObject: return I18N_TEXT("Object", L10N_VALUE_OBJECT); case KD_SaleDatabaseRow: return I18N_TEXT("Sale record", L10N_VALUE_SALE_RECORD); case KD_PurchaseDatabaseRow: return I18N_TEXT("Purchase record", L10N_VALUE_PURCHASE_RECORD); case InvalidKind: break; } return ""; } std::unique_ptr BaseValue::CreateByKind(BaseValue::Kind kind) { switch (kind) { case KD_Numeric: return std::make_unique(); case KD_Text: return std::make_unique(); case KD_DateTime: return std::make_unique(); case KD_DatabaseRowId: return std::make_unique(); case KD_List: return std::make_unique(); case KD_Dictionary: return std::make_unique(); case KD_BaseObject: return nullptr; case KD_SaleDatabaseRow: return std::make_unique(); case KD_PurchaseDatabaseRow: return std::make_unique(); case InvalidKind: break; } return nullptr; } bool BaseValue::IsInstance(const BaseValue* value) { return true; } const BaseObjectDescription kEmptyObjectInfo{ .Properties = {}, }; const BaseObjectDescription kSaleDbRowObject{ .Properties = { { .Name = I18N_TEXT("Customer", L10N_VALUE_PROPERTY_CUSTOMER), .Kind = BaseValue::KD_Text, .Mutatable = false, }, { .Name = I18N_TEXT("Deadline", L10N_VALUE_PROPERTY_DEADLINE), .Kind = BaseValue::KD_DateTime, }, { .Name = I18N_TEXT("Delivery time", L10N_VALUE_PROPERTY_DELIVERY_TIME), .Kind = BaseValue::KD_DateTime, }, }, }; const BaseObjectDescription kPurchaseDbRowObject{ .Properties = { { .Name = I18N_TEXT("Factory", L10N_VALUE_PROPERTY_FACTORY), .Kind = BaseValue::KD_Text, .Mutatable = false, }, { .Name = I18N_TEXT("Order time", L10N_VALUE_PROPERTY_ORDER_TIME), .Kind = BaseValue::KD_DateTime, }, { .Name = I18N_TEXT("Delivery time", L10N_VALUE_PROPERTY_DELIVERY_TIME), .Kind = BaseValue::KD_DateTime, }, }, }; const BaseObjectDescription& BaseObjectValue::QueryObjectInfo(Kind kind) { switch (kind) { case KD_BaseObject: return kEmptyObjectInfo; case KD_SaleDatabaseRow: return kSaleDbRowObject; case KD_PurchaseDatabaseRow: return kPurchaseDbRowObject; default: break; } return kEmptyObjectInfo; } bool BaseObjectValue::IsInstance(const BaseValue* value) { return value->GetKind() >= KD_BaseObject && value->GetKind() <= KD_BaseObjectLast; }