thememanager.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. #ifndef THEMEMANAGER_H
  2. #define THEMEMANAGER_H
  3. #include <QColor>
  4. #include <QFont>
  5. #include <QJsonObject>
  6. #include <QMap>
  7. #include <QObject>
  8. #include <QVector>
  9. class ThemeManager : public QObject
  10. {
  11. Q_OBJECT
  12. public:
  13. enum ThemeMode { Light, Dark };
  14. enum SizeMode { Small, Medium, Large };
  15. enum ColorToken {
  16. colorText = 1,
  17. colorTextSecondary,
  18. colorTextTertiary,
  19. colorTextQuaternary,
  20. colorFill,
  21. colorFillSecondary,
  22. colorFillTertiary,
  23. colorFillQuaternary,
  24. colorBgSolid,
  25. colorBgSolidHover,
  26. colorBgSolidActive,
  27. colorBgElevated,
  28. colorBgContainer,
  29. colorBgLayout,
  30. colorBgSpotlight,
  31. colorBgBlur,
  32. colorBorder,
  33. colorBorderSecondary,
  34. colorPrimaryBg,
  35. colorPrimaryBgHover,
  36. colorPrimaryBorder,
  37. colorPrimaryBorderHover,
  38. colorPrimaryHover,
  39. colorPrimary,
  40. colorPrimaryActive,
  41. colorPrimaryTextHover,
  42. colorPrimaryText,
  43. colorPrimaryTextActive,
  44. colorSuccessBg,
  45. colorSuccessBgHover,
  46. colorSuccessBorder,
  47. colorSuccessBorderHover,
  48. colorSuccessHover,
  49. colorSuccess,
  50. colorSuccessActive,
  51. colorSuccessTextHover,
  52. colorSuccessText,
  53. colorSuccessTextActive,
  54. colorErrorBg,
  55. colorErrorBgHover,
  56. colorErrorBgFilledHover,
  57. colorErrorBgActive,
  58. colorErrorBorder,
  59. colorErrorBorderHover,
  60. colorErrorHover,
  61. colorError,
  62. colorErrorActive,
  63. colorErrorTextHover,
  64. colorErrorText,
  65. colorErrorTextActive,
  66. colorWarningBg,
  67. colorWarningBgHover,
  68. colorWarningBorder,
  69. colorWarningBorderHover,
  70. colorWarningHover,
  71. colorWarning,
  72. colorWarningActive,
  73. colorWarningTextHover,
  74. colorWarningText,
  75. colorWarningTextActive,
  76. colorInfoBg,
  77. colorInfoBgHover,
  78. colorInfoBorder,
  79. colorInfoBorderHover,
  80. colorInfoHover,
  81. colorInfo,
  82. colorInfoActive,
  83. colorInfoTextHover,
  84. colorInfoText,
  85. colorInfoTextActive,
  86. colorLinkHover,
  87. colorLink,
  88. colorLinkActive,
  89. colorTextBase,
  90. colorBgBase,
  91. colorBgMask,
  92. colorWhite,
  93. };
  94. Q_ENUM(ColorToken);
  95. // 尺寸系统
  96. enum SizeToken {
  97. SizeXXL,
  98. SizeXL,
  99. SizeLG,
  100. SizeMD,
  101. SizeMS,
  102. size,
  103. SizeSM,
  104. SizeXS,
  105. SizeXXS,
  106. SizeTokenCount
  107. };
  108. Q_ENUM(SizeToken);
  109. enum ControlHeightToken {
  110. controlHeightSM,
  111. controlHeightXS,
  112. controlHeightLG,
  113. };
  114. Q_ENUM(ControlHeightToken);
  115. // 圆角
  116. enum BorderToken {
  117. BorderRadiusSM,
  118. BorderRadiusMD,
  119. BorderRadiusLG,
  120. BorderRadiusCircle,
  121. BorderTokenCount
  122. };
  123. Q_ENUM(BorderToken);
  124. static ThemeManager& instance();
  125. void loadConfig(const QJsonObject& object);
  126. void loadConfig(const QString& configPath);
  127. void applyTheme();
  128. QColor color(const QString& name) const;
  129. QColor color(ColorToken token) const;
  130. QHash<QString, QColor> colors() const { return m_colors; }
  131. void setPrimaryColor(const QColor& color);
  132. QColor primaryColor() const { return token.colorPrimary; }
  133. void toggleThemeMode();
  134. ThemeMode themeMode() const;
  135. void setThemeMode(ThemeMode themeMode);
  136. SizeMode sizeMode() const;
  137. void setSizeMode(SizeMode mode);
  138. signals:
  139. void themeChanged();
  140. private:
  141. struct SeedTokens
  142. {
  143. // Color
  144. QColor colorPrimary;
  145. QColor colorSuccess;
  146. QColor colorWarning;
  147. QColor colorError;
  148. QColor colorInfo;
  149. QColor colorLink;
  150. QColor colorTextBase;
  151. QColor colorBgBase;
  152. // Font
  153. QFont fontFamily;
  154. // Line
  155. int lineWidth;
  156. QString lineType;
  157. // Radius
  158. int borderRadius;
  159. // Size
  160. int sizeUnit;
  161. int sizeStep;
  162. int sizePopupArrow;
  163. int controlHeight;
  164. };
  165. ThemeManager(QObject* parent = nullptr);
  166. void generateDerivedColors();
  167. QString loadQssTemplate() const;
  168. QString processQss(const QString& qss) const;
  169. // 类似 Antd 的主题系统
  170. QVector<QColor> generateAntdPalette(const QColor& baseColor) const;
  171. QVector<QColor> applyDarkMap(const QVector<QColor>& palette,
  172. const QColor& backgroundColor = QColor()) const;
  173. void generateNeutralColorPalettes(const QColor& baseColor, const QColor& textBaseColor);
  174. QColor mixColor(const QColor& base, const QColor& target, int ratio) const;
  175. //
  176. QMap<SizeToken, int> genSizeMapToken(const SeedTokens& token);
  177. QMap<ControlHeightToken, int> genControlHeight(const SeedTokens& token);
  178. ThemeMode m_themeMode = Light;
  179. SizeMode m_sizeMode = Small;
  180. SeedTokens token;
  181. QJsonObject m_colorConfig;
  182. QJsonObject m_sizeConfig;
  183. QHash<QString, QColor> m_colors; // 作为字符串使用
  184. QMap<ColorToken, QColor> m_colorTokens;
  185. };
  186. #endif // THEMEMANAGER_H