跳转至

example/gui/theme/ColorSchemePage.h

Color Scheme page for the Material Gallery. More...

Namespaces

Name
cf
cf::ui
cf::ui::core
cf::ui::gallery

Classes

Name
class cf::ui::gallery::ColorCardWidget
Color card widget displaying a single color token.
class cf::ui::gallery::ColorSchemePage
Color Scheme page - displays all 26 Material Design 3 color tokens.

Detailed Description

Color Scheme page for the Material Gallery.

Author: CFDesktop Team

Version: 0.1

Date: 2026-02-28

Source code

#pragma once

#include "ThemePageWidget.h"
#include "ToastWidget.h"
#include "ui/core/material/cfmaterial_scheme.h"
#include <QGridLayout>
#include <QLabel>
#include <QScrollArea>
#include <QVBoxLayout>

namespace cf::ui::core {
struct ICFTheme;
}

namespace cf::ui::gallery {

class ColorCardWidget : public QWidget {
    Q_OBJECT
  public:
    explicit ColorCardWidget(const QString& tokenName, const QColor& color,
                             const QString& contrastInfo, QWidget* parent = nullptr);

    void updateColor(const QColor& color, const QString& contrastInfo);

  signals:
    void clicked(const QString& hexValue);

  protected:
    void paintEvent(QPaintEvent* event) override;
    void enterEvent(QEnterEvent* event) override;
    void leaveEvent(QEvent* event) override;
    void mousePressEvent(QMouseEvent* event) override;

  private:
    QString tokenName_;
    QColor color_;
    QString hexValue_;
    QString contrastInfo_;
    bool isHovered_ = false;
};

class ColorSchemePage : public ThemePageWidget {
    Q_OBJECT

  public:
    explicit ColorSchemePage(QWidget* parent = nullptr);
    ~ColorSchemePage() override = default;

    QString pageTitle() const override { return "色彩方案"; }
    void applyTheme(const cf::ui::core::ICFTheme& theme) override;

  private:
    void setupUI();
    void createColorGroups();
    void updateAllColors();
    void updateWindowTheme();

    // Color group creation helpers
    void createColorGroup(const QString& title, QGridLayout* layout, int& row,
                          const QStringList& tokens);

    // Calculate WCAG contrast ratio
    float calculateContrastRatio(const QColor& fg, const QColor& bg) const;

    // Get contrast pair for a token
    QString getContrastPair(const QString& token) const;

    // Show toast notification
    void showToast(const QString& message);

  private slots:
    void onColorCardClicked(const QString& hexValue);

  private:
    // Theme pointer for accessing color scheme
    const cf::ui::core::ICFTheme* theme_ = nullptr;

    // UI components
    QScrollArea* scrollArea_;
    QWidget* scrollContent_;
    QVBoxLayout* scrollLayout_;
    QGridLayout* colorGridLayout_;

    // Toast
    ToastWidget* toast_;

    // Color cards storage for theme updates
    struct ColorCardInfo {
        ColorCardWidget* widget;
        QString token;
    };
    QList<ColorCardInfo> colorCards_;

    // Theme colors for card background
    QColor cardBgColor_;
    QColor cardBorderColor_;

    // All 26 color tokens
    static const QStringList PRIMARY_TOKENS;
    static const QStringList SECONDARY_TOKENS;
    static const QStringList TERTIARY_TOKENS;
    static const QStringList ERROR_TOKENS;
    static const QStringList SURFACE_TOKENS;
    static const QStringList UTILITY_TOKENS;
};

} // namespace cf::ui::gallery

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