跳转至

ui/core/material/cfmaterial_scheme.h

Material Design 3 Color Scheme with EmbeddedTokenRegistry. More...

Namespaces

Name
cf
cf::ui
cf::ui::core
cf::ui::core::tokens

Classes

Name
struct cf::ui::core::PrimaryColors
Primary color group.
struct cf::ui::core::SecondaryColors
Secondary color group.
struct cf::ui::core::TertiaryColors
Tertiary color group.
struct cf::ui::core::ErrorColors
Error color group.
struct cf::ui::core::SurfaceColors
Background and Surface color group.
struct cf::ui::core::UtilityColors
Utility color group.
class cf::ui::core::MaterialColorScheme
Material Design 3 Color Scheme with EmbeddedTokenRegistry.

Detailed Description

Material Design 3 Color Scheme with EmbeddedTokenRegistry.

Author: Charliechen114514 (chengh1922@mails.jlu.edu.cn)

Version: 0.1

Date: 2026-02-25

Copyright: Copyright © 2026

Source code

#pragma once
#include <QByteArray>
#include <QColor>
#include <string>
#include <unordered_map>

#include "../../export.h"
#include "base/color.h"
#include "base/hash/constexpr_fnv1a.hpp"
#include "color_scheme.h"
#include "token.hpp"
#include "token/material_scheme/cfmaterial_token_literals.h"

namespace cf::ui::core {

using CFColor = cf::ui::base::CFColor;

// =============================================================================
// Color Token Type Aliases - Material Color System
// =============================================================================
namespace tokens {
using namespace cf::ui::core::token::literals;

// Primary color tokens
using PrimaryToken = StaticToken<CFColor, cf::hash::fnv1a64(PRIMARY)>;
using OnPrimaryToken = StaticToken<CFColor, cf::hash::fnv1a64(ON_PRIMARY)>;
using PrimaryContainerToken = StaticToken<CFColor, cf::hash::fnv1a64(PRIMARY_CONTAINER)>;
using OnPrimaryContainerToken = StaticToken<CFColor, cf::hash::fnv1a64(ON_PRIMARY_CONTAINER)>;

// Secondary color tokens
using SecondaryToken = StaticToken<CFColor, cf::hash::fnv1a64(SECONDARY)>;
using OnSecondaryToken = StaticToken<CFColor, cf::hash::fnv1a64(ON_SECONDARY)>;
using SecondaryContainerToken = StaticToken<CFColor, cf::hash::fnv1a64(SECONDARY_CONTAINER)>;
using OnSecondaryContainerToken = StaticToken<CFColor, cf::hash::fnv1a64(ON_SECONDARY_CONTAINER)>;

// Tertiary color tokens
using TertiaryToken = StaticToken<CFColor, cf::hash::fnv1a64(TERTIARY)>;
using OnTertiaryToken = StaticToken<CFColor, cf::hash::fnv1a64(ON_TERTIARY)>;
using TertiaryContainerToken = StaticToken<CFColor, cf::hash::fnv1a64(TERTIARY_CONTAINER)>;
using OnTertiaryContainerToken = StaticToken<CFColor, cf::hash::fnv1a64(ON_TERTIARY_CONTAINER)>;

// Error color tokens
using ErrorToken = StaticToken<CFColor, cf::hash::fnv1a64(ERROR)>;
using OnErrorToken = StaticToken<CFColor, cf::hash::fnv1a64(ON_ERROR)>;
using ErrorContainerToken = StaticToken<CFColor, cf::hash::fnv1a64(ERROR_CONTAINER)>;
using OnErrorContainerToken = StaticToken<CFColor, cf::hash::fnv1a64(ON_ERROR_CONTAINER)>;

// Surface color tokens
using BackgroundToken = StaticToken<CFColor, cf::hash::fnv1a64(BACKGROUND)>;
using OnBackgroundToken = StaticToken<CFColor, cf::hash::fnv1a64(ON_BACKGROUND)>;
using SurfaceToken = StaticToken<CFColor, cf::hash::fnv1a64(SURFACE)>;
using OnSurfaceToken = StaticToken<CFColor, cf::hash::fnv1a64(ON_SURFACE)>;
using SurfaceVariantToken = StaticToken<CFColor, cf::hash::fnv1a64(SURFACE_VARIANT)>;
using OnSurfaceVariantToken = StaticToken<CFColor, cf::hash::fnv1a64(ON_SURFACE_VARIANT)>;
using OutlineToken = StaticToken<CFColor, cf::hash::fnv1a64(OUTLINE)>;
using OutlineVariantToken = StaticToken<CFColor, cf::hash::fnv1a64(OUTLINE_VARIANT)>;

// Utility color tokens
using ShadowToken = StaticToken<CFColor, cf::hash::fnv1a64(SHADOW)>;
using ScrimToken = StaticToken<CFColor, cf::hash::fnv1a64(SCRIM)>;
using InverseSurfaceToken = StaticToken<CFColor, cf::hash::fnv1a64(INVERSE_SURFACE)>;
using InverseOnSurfaceToken = StaticToken<CFColor, cf::hash::fnv1a64(INVERSE_ON_SURFACE)>;
using InversePrimaryToken = StaticToken<CFColor, cf::hash::fnv1a64(INVERSE_PRIMARY)>;

} // namespace tokens

// =============================================================================
// Color Group Structs - Material Color System
// =============================================================================

struct PrimaryColors {
    tokens::PrimaryToken primary;
    tokens::OnPrimaryToken onPrimary;
    tokens::PrimaryContainerToken primaryContainer;
    tokens::OnPrimaryContainerToken onPrimaryContainer;
};

struct SecondaryColors {
    tokens::SecondaryToken secondary;
    tokens::OnSecondaryToken onSecondary;
    tokens::SecondaryContainerToken secondaryContainer;
    tokens::OnSecondaryContainerToken onSecondaryContainer;
};

struct TertiaryColors {
    tokens::TertiaryToken tertiary;
    tokens::OnTertiaryToken onTertiary;
    tokens::TertiaryContainerToken tertiaryContainer;
    tokens::OnTertiaryContainerToken onTertiaryContainer;
};

struct ErrorColors {
    tokens::ErrorToken error;
    tokens::OnErrorToken onError;
    tokens::ErrorContainerToken errorContainer;
    tokens::OnErrorContainerToken onErrorContainer;
};

struct SurfaceColors {
    tokens::BackgroundToken background;
    tokens::OnBackgroundToken onBackground;
    tokens::SurfaceToken surface;
    tokens::OnSurfaceToken onSurface;
    tokens::SurfaceVariantToken surfaceVariant;
    tokens::OnSurfaceVariantToken onSurfaceVariant;
    tokens::OutlineToken outline;
    tokens::OutlineVariantToken outlineVariant;
};

struct UtilityColors {
    tokens::ShadowToken shadow;
    tokens::ScrimToken scrim;
    tokens::InverseSurfaceToken inverseSurface;
    tokens::InverseOnSurfaceToken inverseOnSurface;
    tokens::InversePrimaryToken inversePrimary;
};

// =============================================================================
// Material Color Scheme
// =============================================================================

class CF_UI_EXPORT MaterialColorScheme : public ICFColorScheme {
  public:
    MaterialColorScheme();
    ~MaterialColorScheme() override = default;

    // Non-copyable, movable
    MaterialColorScheme(const MaterialColorScheme&) = delete;
    MaterialColorScheme& operator=(const MaterialColorScheme&) = delete;
    MaterialColorScheme(MaterialColorScheme&&) noexcept = default;
    MaterialColorScheme& operator=(MaterialColorScheme&&) noexcept = default;

    QColor& queryExpectedColor(const char* name) override;

    QColor queryColor(const char* name) const;

    EmbeddedTokenRegistry& registry() { return registry_; }

    const EmbeddedTokenRegistry& registry() const { return registry_; }

    // Color group accessors - return structs with token types
    [[nodiscard]] PrimaryColors primary() const { return {}; }
    [[nodiscard]] SecondaryColors secondary() const { return {}; }
    [[nodiscard]] TertiaryColors tertiary() const { return {}; }
    [[nodiscard]] ErrorColors error() const { return {}; }
    [[nodiscard]] SurfaceColors surface() const { return {}; }
    [[nodiscard]] UtilityColors utility() const { return {}; }

  private:
    EmbeddedTokenRegistry registry_;
    mutable std::unordered_map<std::string, QColor> color_cache_;
};

} // namespace cf::ui::core

Updated on 2026-03-09 at 10:14:01 +0000