theme.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. define(function(require, exports, module) {
  2. var kity = require('./kity');
  3. var utils = require('./utils');
  4. var Minder = require('./minder');
  5. var MinderNode = require('./node');
  6. var Module = require('./module');
  7. var Command = require('./command');
  8. var cssLikeValueMatcher = {
  9. left: function(value) {
  10. return 3 in value && value[3] ||
  11. 1 in value && value[1] ||
  12. value[0];
  13. },
  14. right: function(value) {
  15. return 1 in value && value[1] || value[0];
  16. },
  17. top: function(value) {
  18. return value[0];
  19. },
  20. bottom: function(value) {
  21. return 2 in value && value[2] || value[0];
  22. }
  23. };
  24. var _themes = {};
  25. /**
  26. * 注册一个主题
  27. *
  28. * @param {String} name 主题的名称
  29. * @param {Plain} theme 主题的样式描述
  30. *
  31. * @example
  32. * Minder.registerTheme('default', {
  33. * 'root-color': 'red',
  34. * 'root-stroke': 'none',
  35. * 'root-padding': [10, 20]
  36. * });
  37. */
  38. function register(name, theme) {
  39. _themes[name] = theme;
  40. }
  41. exports.register = register;
  42. utils.extend(Minder, {
  43. getThemeList: function() {
  44. return _themes;
  45. }
  46. });
  47. kity.extendClass(Minder, {
  48. /**
  49. * 切换脑图实例上的主题
  50. * @param {String} name 要使用的主题的名称
  51. */
  52. useTheme: function(name) {
  53. this.setTheme(name);
  54. this.refresh(800);
  55. return true;
  56. },
  57. setTheme: function(name) {
  58. if (name && !_themes[name]) throw new Error('Theme ' + name + ' not exists!');
  59. var lastTheme = this._theme;
  60. this._theme = name || null;
  61. var container = this.getRenderTarget();
  62. if (container) {
  63. container.classList.remove('km-theme-' + lastTheme);
  64. if (name) {
  65. container.classList.add('km-theme-' + name);
  66. }
  67. container.style.background = this.getStyle('background');
  68. }
  69. this.fire('themechange', {
  70. theme: name
  71. });
  72. return this;
  73. },
  74. /**
  75. * 获取脑图实例上的当前主题
  76. * @return {[type]} [description]
  77. */
  78. getTheme: function(node) {
  79. return this._theme || this.getOption('defaultTheme') || 'fresh-blue';
  80. },
  81. getThemeItems: function(node) {
  82. var theme = this.getTheme(node);
  83. return _themes[this.getTheme(node)];
  84. },
  85. /**
  86. * 获得脑图实例上的样式
  87. * @param {String} item 样式名称
  88. */
  89. getStyle: function(item, node) {
  90. var items = this.getThemeItems(node);
  91. var segment, dir, selector, value, matcher;
  92. if (item in items) return items[item];
  93. // 尝试匹配 CSS 数组形式的值
  94. // 比如 item 为 'pading-left'
  95. // theme 里有 {'padding': [10, 20]} 的定义,则可以返回 20
  96. segment = item.split('-');
  97. if (segment.length < 2) return null;
  98. dir = segment.pop();
  99. item = segment.join('-');
  100. if (item in items) {
  101. value = items[item];
  102. if (utils.isArray(value) && (matcher = cssLikeValueMatcher[dir])) {
  103. return matcher(value);
  104. }
  105. if (!isNaN(value)) return value;
  106. }
  107. return null;
  108. },
  109. /**
  110. * 获取指定节点的样式
  111. * @param {String} name 样式名称,可以不加节点类型的前缀
  112. */
  113. getNodeStyle: function(node, name) {
  114. var value = this.getStyle(node.getType() + '-' + name, node);
  115. return value !== null ? value : this.getStyle(name, node);
  116. }
  117. });
  118. kity.extendClass(MinderNode, {
  119. getStyle: function(name) {
  120. return this.getMinder().getNodeStyle(this, name);
  121. }
  122. });
  123. Module.register('Theme', {
  124. defaultOptions: {
  125. defaultTheme: 'fresh-blue'
  126. },
  127. commands: {
  128. /**
  129. * @command Theme
  130. * @description 设置当前脑图的主题
  131. * @param {string} name 主题名称
  132. * 允许使用的主题可以使用 `kityminder.Minder.getThemeList()` 查询
  133. * @state
  134. * 0: 始终可用
  135. * @return 返回当前的主题名称
  136. */
  137. 'theme': kity.createClass('ThemeCommand', {
  138. base: Command,
  139. execute: function(km, name) {
  140. return km.useTheme(name);
  141. },
  142. queryValue: function(km) {
  143. return km.getTheme() || 'default';
  144. }
  145. })
  146. }
  147. });
  148. Minder.registerInitHook(function() {
  149. this.setTheme();
  150. });
  151. });