Browse Source

REPORT-99485 新图标管理器

newui
vito 11 months ago
parent
commit
3d010eb1eb
  1. 79
      designer-base/src/main/java/com/fine/theme/icon/AbstractIconSet.java
  2. 106
      designer-base/src/main/java/com/fine/theme/icon/AbstractIconSource.java
  3. 23
      designer-base/src/main/java/com/fine/theme/icon/DisabledIcon.java
  4. 29
      designer-base/src/main/java/com/fine/theme/icon/IconException.java
  5. 114
      designer-base/src/main/java/com/fine/theme/icon/IconManager.java
  6. 17
      designer-base/src/main/java/com/fine/theme/icon/IconResource.java
  7. 65
      designer-base/src/main/java/com/fine/theme/icon/IconSet.java
  8. 25
      designer-base/src/main/java/com/fine/theme/icon/IconSource.java
  9. 12
      designer-base/src/main/java/com/fine/theme/icon/Identifiable.java
  10. 71
      designer-base/src/main/java/com/fine/theme/icon/LazyIcon.java
  11. 39
      designer-base/src/main/java/com/fine/theme/icon/UrlIconResource.java
  12. 155
      designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java
  13. 74
      designer-base/src/main/java/com/fine/theme/icon/svg/SvgIconSource.java
  14. 65
      designer-base/src/main/java/com/fine/theme/icon/svg/SvgTranscoder.java
  15. 11
      designer-base/src/main/java/com/fine/theme/light/icon/IconManager.java
  16. 34
      designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java
  17. 7
      designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java
  18. 40
      designer-base/src/main/java/com/fine/theme/light/utils/FineUIUtils.java
  19. 86
      designer-base/src/main/java/com/fine/theme/utils/FineUIScale.java
  20. 83
      designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java
  21. 8
      designer-base/src/main/java/com/fr/design/actions/UpdateAction.java
  22. 3
      designer-base/src/main/java/com/fr/design/actions/edit/CopyAction.java
  23. 4
      designer-base/src/main/java/com/fr/design/actions/edit/CutAction.java
  24. 3
      designer-base/src/main/java/com/fr/design/actions/edit/PasteAction.java
  25. 4
      designer-base/src/main/java/com/fr/design/gui/ibutton/UIButton.java
  26. 2
      designer-base/src/main/java/com/fr/design/gui/ibutton/UIHeadGroup.java
  27. 46
      designer-base/src/main/java/com/fr/design/gui/ibutton/UIToggleButton.java
  28. 3
      designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java
  29. 4
      designer-base/src/main/java/com/fr/design/mainframe/check/CheckButton.java
  30. 8
      designer-base/src/main/resources/com/fine/theme/icon/copy.svg
  31. 8
      designer-base/src/main/resources/com/fine/theme/icon/copy_disable.svg
  32. 5
      designer-base/src/main/resources/com/fine/theme/icon/cut.svg
  33. 5
      designer-base/src/main/resources/com/fine/theme/icon/cut_disable.svg
  34. 15
      designer-base/src/main/resources/com/fine/theme/icon/font_miss_check.svg
  35. 15
      designer-base/src/main/resources/com/fine/theme/icon/font_miss_check_disable.svg
  36. 5
      designer-base/src/main/resources/com/fine/theme/icon/formatBrush.svg
  37. 5
      designer-base/src/main/resources/com/fine/theme/icon/formatBrush_disable.svg
  38. 16
      designer-base/src/main/resources/com/fine/theme/icon/paste.svg
  39. 16
      designer-base/src/main/resources/com/fine/theme/icon/paste_disable.svg
  40. 4
      designer-base/src/main/resources/com/fine/theme/icon/redo.svg
  41. 4
      designer-base/src/main/resources/com/fine/theme/icon/redo_disable.svg
  42. 8
      designer-base/src/main/resources/com/fine/theme/icon/save.svg
  43. 9
      designer-base/src/main/resources/com/fine/theme/icon/save_disable.svg
  44. 10
      designer-base/src/main/resources/com/fine/theme/icon/template_theme.svg
  45. 10
      designer-base/src/main/resources/com/fine/theme/icon/template_theme_disable.svg
  46. 4
      designer-base/src/main/resources/com/fine/theme/icon/undo.svg
  47. 4
      designer-base/src/main/resources/com/fine/theme/icon/undo_disable.svg
  48. 7
      designer-base/src/main/resources/com/fine/theme/icon/version_save.svg
  49. 7
      designer-base/src/main/resources/com/fine/theme/icon/version_save_disable.svg
  50. 15
      designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties
  51. 3
      designer-realize/src/main/java/com/fr/design/mainframe/FormatBrushAction.java
  52. 7
      designer-realize/src/main/java/com/fr/start/MainDesigner.java

79
designer-base/src/main/java/com/fine/theme/icon/AbstractIconSet.java

@ -0,0 +1,79 @@
package com.fine.theme.icon;
import com.fr.third.errorprone.annotations.Immutable;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.Icon;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 抽象图标集
*
* @author vito
* @since 11.0
* Created on 2023/11/15
*/
@Immutable
public abstract class AbstractIconSet implements IconSet {
private final String id;
private final Map<String, IconSource<? extends Icon>> map = new ConcurrentHashMap<>(64);
private final Map<String, Icon> cache = new ConcurrentHashMap<>(64);
private final Map<String, Icon> disableCache = new ConcurrentHashMap<>(64);
public AbstractIconSet(String id) {
this.id = id;
}
@Override
public @NotNull String getId() {
return id;
}
@Override
public @NotNull Collection<String> getIds() {
return map.keySet();
}
@Override
public void addIcon(@NotNull IconSource<? extends Icon> icon) {
map.put(icon.getId(), icon);
}
@Override
public void addIcon(@NotNull IconSource<? extends Icon>... icons) {
for (IconSource<? extends Icon> icon: icons){
map.put(icon.getId(), icon);
}
}
@Override
public @Nullable Icon findIcon(@NotNull String id) {
Icon icon = cache.get(id);
if (icon == null) {
IconSource<? extends Icon> iconSource = map.get(id);
if (iconSource != null) {
icon = iconSource.loadIcon();
cache.put(id, icon);
}
}
return icon;
}
@Override
public @Nullable Icon findDisableIcon(@NotNull String id) {
Icon icon = disableCache.get(id);
if (icon == null) {
IconSource<? extends Icon> iconSource = map.get(id);
if (iconSource != null) {
icon = iconSource.disabled();
disableCache.put(id, icon);
}
}
return icon;
}
}

106
designer-base/src/main/java/com/fine/theme/icon/AbstractIconSource.java

@ -0,0 +1,106 @@
package com.fine.theme.icon;
import com.fr.third.errorprone.annotations.Immutable;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.Icon;
/**
* 抽象图标源
* 能够根据图标源寻找灰化图标资源
*
* @author vito
* @since 11.0
* Created on 2023/11/14
*/
@Immutable
public abstract class AbstractIconSource<I extends Icon> implements IconSource<I> {
public static final String ICON_DISABLE = "_disable";
protected String id;
protected final IconResource resource;
@Nullable
protected IconResource grayResource;
protected boolean autoFindDisable = false;
public AbstractIconSource(@NotNull final String id, @NotNull final IconResource resource) {
this.id = id;
this.resource = resource;
}
public AbstractIconSource(@NotNull final String id,
@NotNull final IconResource resource,
final boolean autoFindDisable) {
this.id = id;
this.resource = resource;
this.autoFindDisable = autoFindDisable;
}
public AbstractIconSource(@NotNull final String id,
@NotNull final IconResource resource,
@Nullable final IconResource grayResource) {
this.id = id;
this.resource = resource;
this.grayResource = grayResource;
}
@NotNull
@Override
public String getId() {
return id;
}
@NotNull
@Override
public IconResource getResource() {
return resource;
}
@NotNull
@Override
public I loadIcon() {
try {
return loadIcon(resource);
} catch (final Exception e) {
throw new IconException("Unable to load Icon: " + getId(), e);
}
}
@NotNull
protected abstract I loadIcon(@NotNull IconResource resource);
/**
* 先找提供明确URL的灰化图
* 再找指定自动寻找路径的灰化图
* 最后再由具体图标提供默认灰化图
*
* @return 灰化图
*/
@Override
public @NotNull I disabled() {
if (grayResource != null) {
return loadIcon(grayResource);
}
if (autoFindDisable && resource instanceof UrlIconResource) {
String disablePath = findDisablePath(((UrlIconResource) resource).getPath());
grayResource = new UrlIconResource(disablePath);
return loadIcon(grayResource);
}
return loadDisableIcon();
}
private static String findDisablePath(String path) {
int i = path.lastIndexOf('.');
return path.substring(0, i) + ICON_DISABLE + path.substring(i);
}
@NotNull
protected abstract I loadDisableIcon();
}

23
designer-base/src/main/java/com/fine/theme/icon/DisabledIcon.java

@ -0,0 +1,23 @@
package com.fine.theme.icon;
import org.jetbrains.annotations.NotNull;
import javax.swing.Icon;
/**
* 创建一个灰化 Icon
*
* @author vito
* @since 11.0
* Created on 2023/11/16
*/
public interface DisabledIcon {
/**
* 创建一份灰化图标
*
* @return 灰化图标
*/
@NotNull
Icon disabled();
}

29
designer-base/src/main/java/com/fine/theme/icon/IconException.java

@ -0,0 +1,29 @@
package com.fine.theme.icon;
/**
* 图标异常
*
* @author vito
* @since 11.0
* Created on 2023/11/6
*/
public class IconException extends RuntimeException {
public IconException() {
}
public IconException(String message) {
super(message);
}
public IconException(String message, Throwable cause) {
super(message, cause);
}
public IconException(Throwable cause) {
super(cause);
}
public IconException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}

114
designer-base/src/main/java/com/fine/theme/icon/IconManager.java

@ -0,0 +1,114 @@
package com.fine.theme.icon;
import com.fr.third.errorprone.annotations.Immutable;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.Icon;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.HashMap;
/**
* 图标管理器
* 1. 提供注册管理图标集方便整体替换
* 2. 提供图标缓存
* 3. 查找图标
* 4. 配合 {@link LazyIcon} 实现图标懒加载
*
* @author vito
* @since 11.0
* Created on 2023/9/12
*/
@Immutable
public class IconManager {
public static boolean initialized = false;
public static ArrayList<IconSet> iconSets = new ArrayList<>(2);;
public static HashMap<String, WeakReference<Icon>> cache = new HashMap<>(60);;
public static HashMap<String, WeakReference<Icon>> disableCache = new HashMap<>(60);
public static IconSet getSet(String id) {
for (IconSet set : iconSets) {
if (set.getId().equals(id)) {
return set;
}
}
throw new IconException("[IconManager] Can not find icon set by id: " + id);
}
public static void addSet(@NotNull IconSet set) {
if (!iconSets.contains(set)) {
iconSets.add(set);
// 清理可能来自其他图集相同名称图标
clearIconSetCache(set);
} else {
throw new IconException("[IconManager] IconSet by id:" + set.getId() + "is added!");
}
}
@NotNull
public static <I extends Icon> I getIcon(String id) {
Icon icon = findIcon(id);
if (icon == null) {
throw new IconException("[IconManager] Can not find icon by id: " + id);
}
return (I) icon;
}
@NotNull
public static <I extends Icon> I getDisableIcon(String id) {
Icon icon = findDisableIcon(id);
if (icon == null) {
throw new IconException("[IconManager] Can not find icon by id: " + id);
}
return (I) icon;
}
@Nullable
public static <I extends Icon> I findDisableIcon(String id) {
final WeakReference<Icon> reference = disableCache.get(id);
I icon = reference != null ? (I) reference.get() : null;
if (icon == null) {
for (IconSet set : iconSets) {
Icon f = set.findDisableIcon(id);
if (f != null) {
icon = (I) f;
disableCache.put(id, new WeakReference<>(icon));
}
}
}
return icon;
}
@Nullable
public static <I extends Icon> I findIcon(String id) {
final WeakReference<Icon> reference = cache.get(id);
I icon = reference != null ? (I) reference.get() : null;
if (icon == null) {
for (IconSet set : iconSets) {
Icon f = set.findIcon(id);
if (f != null) {
icon = (I) f;
cache.put(id, new WeakReference<>(icon));
}
}
}
return icon;
}
public static void clearCache() {
cache.clear();
}
public static void clearIconCache(String id) {
cache.remove(id);
}
public static void clearIconSetCache(@NotNull IconSet set) {
for (String id : set.getIds()) {
cache.remove(id);
}
}
}

17
designer-base/src/main/java/com/fine/theme/icon/IconResource.java

@ -0,0 +1,17 @@
package com.fine.theme.icon;
import org.jetbrains.annotations.Nullable;
import java.io.InputStream;
/**
* 资源接口
*
* @author vito
* @since 11.0
* Created on 2023/11/6
*/
public interface IconResource {
@Nullable
InputStream getInputStream();
}

65
designer-base/src/main/java/com/fine/theme/icon/IconSet.java

@ -0,0 +1,65 @@
package com.fine.theme.icon;
import com.fr.third.errorprone.annotations.Immutable;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.Icon;
import java.util.Collection;
/**
* 图标集
*
* @author vito
* @since 11.0
* Created on 2023/11/6
*/
@Immutable
public interface IconSet extends Identifiable {
@NotNull
@Override
String getId();
/**
* 返回集合中所有 Icons id
*
* @return 集合中所有 Icons id
*/
@NotNull
Collection<String> getIds();
/**
* 将指定 IconSource 引用的新 Icon 添加到集合中
*
* @param icon icon
*/
void addIcon(@NotNull IconSource<? extends Icon> icon);
/**
* 将指定 IconSource 引用的新 Icon 添加到集合中
*
* @param icon icon
*/
void addIcon(@NotNull IconSource<? extends Icon>... icon);
/**
* 返回指定 id Icon
*
* @param id id
* @return Icon
* todo 实现 iconset实现 iconsource
*/
@Nullable
Icon findIcon(@NotNull String id);
/**
* 返回指定 id Icon
*
* @param id id
* @return Icon
* todo 实现 iconset实现 iconsource
*/
@Nullable
Icon findDisableIcon(@NotNull String id);
}

25
designer-base/src/main/java/com/fine/theme/icon/IconSource.java

@ -0,0 +1,25 @@
package com.fine.theme.icon;
import com.fr.third.errorprone.annotations.Immutable;
import org.jetbrains.annotations.NotNull;
import javax.swing.Icon;
import java.io.Serializable;
/**
* 图标源在进行图标管理的时候代替真实图标对象
* 使用时加载节省内存
*
* @author vito
* @since 11.0
* Created on 2023/11/6
*/
@Immutable
public interface IconSource<I extends Icon> extends Identifiable, DisabledIcon, Cloneable, Serializable {
@NotNull
IconResource getResource();
@NotNull
I loadIcon();
}

12
designer-base/src/main/java/com/fine/theme/icon/Identifiable.java

@ -0,0 +1,12 @@
package com.fine.theme.icon;
/**
* id 接口
*
* @author vito
* @since 11.0
* Created on 2023/11/6
*/
public interface Identifiable {
String getId();
}

71
designer-base/src/main/java/com/fine/theme/icon/LazyIcon.java

@ -0,0 +1,71 @@
package com.fine.theme.icon;
import com.fr.third.errorprone.annotations.Immutable;
import org.jetbrains.annotations.NotNull;
import javax.swing.Icon;
import java.awt.Component;
import java.awt.Graphics;
/**
* 懒加载图标
*
* @author vito
* @since 11.0
* Created on 2023/11/6
*/
@Immutable
public class LazyIcon implements Identifiable, DisabledIcon, Icon {
@NotNull
private String id;
public LazyIcon(@NotNull final String id) {
this.id = id;
}
@NotNull
@Override
public String getId() {
return id;
}
@Override
public void paintIcon(@NotNull final Component c, @NotNull final Graphics g, final int x, final int y) {
getIcon().paintIcon(c, g, x, y);
}
@Override
public int getIconWidth() {
return getIcon().getIconWidth();
}
@Override
public int getIconHeight() {
return getIcon().getIconHeight();
}
@NotNull
public <I extends Icon> I getIcon() {
return IconManager.getIcon(getId());
}
/**
* 创建一份灰化图标
*
* @return 灰化图标
*/
@NotNull
@Override
public Icon disabled() {
return IconManager.getDisableIcon(getId());
}
@NotNull
@Override
public String toString() {
return getClass().getCanonicalName() + "[id=" + getId() + "]";
}
}

39
designer-base/src/main/java/com/fine/theme/icon/UrlIconResource.java

@ -0,0 +1,39 @@
package com.fine.theme.icon;
import com.fr.general.IOUtils;
import com.fr.io.utils.ResourceIOUtils;
import com.fr.third.errorprone.annotations.Immutable;
import java.io.InputStream;
/**
* url图标资源
*
* @author vito
* @since 11.0
* Created on 2023/11/15
*/
@Immutable
public class UrlIconResource implements IconResource {
private final String path;
public UrlIconResource(String path) {
this.path = path;
}
public String getPath() {
return path;
}
@Override
public InputStream getInputStream() {
return getInputStream(path);
}
private InputStream getInputStream(String path) {
InputStream inputStream = IOUtils.getInputStream(path);
return inputStream != null ? inputStream : ResourceIOUtils.read(path);
}
}

155
designer-base/src/main/java/com/fine/theme/icon/svg/SvgIcon.java

@ -0,0 +1,155 @@
package com.fine.theme.icon.svg;
import com.fine.theme.icon.DisabledIcon;
import com.fine.theme.icon.IconResource;
import com.fr.clone.cloning.Immutable;
import org.apache.batik.transcoder.TranscoderException;
import org.apache.batik.transcoder.TranscoderInput;
import org.jetbrains.annotations.NotNull;
import javax.swing.Icon;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import static com.fine.theme.utils.FineUIScale.scale;
import static com.fine.theme.utils.FineUIScale.unscale;
import static com.fine.theme.utils.FineUIUtils.RETINA_SCALE_FACTOR;
import static com.fine.theme.utils.FineUIUtils.isRetina;
/**
* svg图标
* 1.绘制长度会跟随DPI比率变化
* 2.如果设备支持 Retina 则支持Retina绘制HIDPI图
* 1跟2的缩放原因不同因此不能混淆宽高测量等依旧
* 使用DPI缩放进行只有绘制内容时使用Retina绘制如果有
* Retina绘制不影响最终尺寸注意区分
*
* @author vito
* @since 11.0
* Created on 2023/11/15
*/
@Immutable
public class SvgIcon implements DisabledIcon, Icon {
protected transient BufferedImage cache;
private final Dimension size;
private final IconResource resource;
private final boolean disable;
public SvgIcon(IconResource resource, Dimension size) {
this(resource, size, false);
}
public SvgIcon(IconResource resource, Dimension size, boolean disable) {
this.resource = resource;
// 根据dpi进行缩放
this.size = scale(size);
this.disable = disable;
}
public SvgIcon(IconResource resource, int side) {
this(resource, new Dimension(side, side), false);
}
/**
* 如果支持绘制Retina绘制则进行Retina绘制
* 绘制结束不影响任何外部尺寸
*/
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
if (cache == null
|| cache.getWidth() != scaleRetina(size.width)
|| cache.getHeight() != scaleRetina(size.height)) {
if (cache != null) {
cache.flush();
}
Dimension scale = scaleRetina(size);
if (disable && c != null) {
cache = toGrayImage(scale, c.getBackground());
} else {
cache = toImage(scale);
}
}
if (isRetina()) {
// 高清绘制的原理:scale(1/2,1/2)的原理是坐标减半,底层是矩阵进行坐标变换,意思是坐标减半进行绘制,
// 这样就可以将两倍图绘制到一倍的大小,如果这时候设备支持Retina绘制(四个像素模拟一个像素),
// 正好就可以将4个像素利用起来,每个像素点都有不同的颜色,而不像之前只能是四个共用一个颜色。因此图像
// 可以更加细腻当然,绘图之后,需要将这个坐标变换给恢复。
((Graphics2D) g).scale(1.0 / RETINA_SCALE_FACTOR, 1.0 / RETINA_SCALE_FACTOR);
g.drawImage(cache, x * RETINA_SCALE_FACTOR, y * RETINA_SCALE_FACTOR, null);
((Graphics2D) g).scale(RETINA_SCALE_FACTOR, RETINA_SCALE_FACTOR);
} else {
g.drawImage(cache, x, y, null);
}
}
private static int scaleRetina(int size) {
return isRetina()
? size * RETINA_SCALE_FACTOR
: size;
}
private static Dimension scaleRetina(Dimension dimension) {
return isRetina()
? new Dimension(dimension.width * RETINA_SCALE_FACTOR, dimension.height * RETINA_SCALE_FACTOR)
: dimension;
}
@Override
public int getIconWidth() {
// 根据dpi解除缩放
return unscale(size.width);
}
@Override
public int getIconHeight() {
// 根据dpi解除缩放
return unscale(size.height);
}
/**
* 根据指定尺寸绘制图片这里尺寸为结算后的尺寸
* 因此不必进行缩放
*
* @param size 图像尺寸
* @return 图像
*/
private BufferedImage toImage(Dimension size) {
SvgTranscoder transcoder = new SvgTranscoder(size);
TranscoderInput transcoderInput = new TranscoderInput(resource.getInputStream());
try {
transcoder.transcode(transcoderInput, null);
return transcoder.getImage();
} catch (TranscoderException e) {
throw new RuntimeException(e);
}
}
/**
* 简单的灰化处理不能有透明度因此需要传入背景
* 暂时用作灰度后面再处理
*/
private BufferedImage toGrayImage(Dimension size, Color background) {
SvgTranscoder transcoder = new SvgTranscoder(size, background, true);
TranscoderInput transcoderInput = new TranscoderInput(resource.getInputStream());
try {
transcoder.transcode(transcoderInput, null);
return transcoder.getImage();
} catch (TranscoderException e) {
throw new RuntimeException(e);
}
}
/**
* 默认提供一个简单的灰化处理
*/
@Override
public @NotNull SvgIcon disabled() {
return new SvgIcon(resource, size, true);
}
}

74
designer-base/src/main/java/com/fine/theme/icon/svg/SvgIconSource.java

@ -0,0 +1,74 @@
package com.fine.theme.icon.svg;
import com.fine.theme.icon.AbstractIconSource;
import com.fine.theme.icon.IconResource;
import com.fine.theme.icon.UrlIconResource;
import com.fr.clone.cloning.Immutable;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.awt.Dimension;
/**
* svg图标源
*
* @author vito
* @since 11.0
* Created on 2023/11/14
*/
@Immutable
public class SvgIconSource extends AbstractIconSource<SvgIcon> {
private static final int ICON_SIDE_LENGTH = 16;
private final Dimension size;
public SvgIconSource(@NotNull String id, @NotNull String resource) {
this(id, new UrlIconResource(resource), null, new Dimension(ICON_SIDE_LENGTH, ICON_SIDE_LENGTH));
}
public SvgIconSource(@NotNull String id, @NotNull String resource, boolean autoFindDisable) {
this(id, new UrlIconResource(resource), autoFindDisable, new Dimension(ICON_SIDE_LENGTH, ICON_SIDE_LENGTH));
}
public SvgIconSource(@NotNull String id, @NotNull String resource, int side) {
this(id, new UrlIconResource(resource), null, side);
}
public SvgIconSource(@NotNull String id, @NotNull String resource, boolean autoFindDisable, int side) {
this(id, new UrlIconResource(resource), autoFindDisable, new Dimension(side, side));
}
public SvgIconSource(@NotNull String id, @NotNull String resource, @Nullable String grayResource, int side) {
this(id, new UrlIconResource(resource), new UrlIconResource(grayResource), side);
}
public SvgIconSource(@NotNull String id, @NotNull IconResource resource,
@Nullable IconResource grayResource, int side) {
this(id, resource, grayResource, new Dimension(side, side));
}
public SvgIconSource(@NotNull String id, @NotNull IconResource resource,
boolean autoFindDisable, Dimension size) {
super(id, resource, autoFindDisable);
this.size = size;
}
public SvgIconSource(@NotNull String id, @NotNull IconResource resource,
@Nullable IconResource grayResource, Dimension size) {
super(id, resource, grayResource);
this.size = size;
}
@NotNull
@Override
protected SvgIcon loadIcon(@NotNull IconResource resource) {
return new SvgIcon(resource, size);
}
@Override
public @NotNull SvgIcon loadDisableIcon() {
return new SvgIcon(resource, size).disabled();
}
}

65
designer-base/src/main/java/com/fine/theme/icon/svg/SvgTranscoder.java

@ -0,0 +1,65 @@
package com.fine.theme.icon.svg;
import org.apache.batik.transcoder.SVGAbstractTranscoder;
import org.apache.batik.transcoder.TranscoderException;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.batik.transcoder.image.ImageTranscoder;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.image.BufferedImage;
/**
* Svg图标转码器
*
* @author vito
* @since 11.0
* Created on 2023/11/15
*/
public class SvgTranscoder extends ImageTranscoder {
private BufferedImage bufferedImage;
private boolean gray = false;
public SvgTranscoder(Dimension size) {
addTranscodingHint(SVGAbstractTranscoder.KEY_WIDTH, (float) size.getWidth());
addTranscodingHint(SVGAbstractTranscoder.KEY_HEIGHT, (float) size.getHeight());
}
public SvgTranscoder(Dimension size, Color background, boolean gray) {
this.gray = gray;
addTranscodingHint(SVGAbstractTranscoder.KEY_WIDTH, (float) size.getWidth());
addTranscodingHint(SVGAbstractTranscoder.KEY_HEIGHT, (float) size.getHeight());
addTranscodingHint(ImageTranscoder.KEY_BACKGROUND_COLOR, background);
}
public SvgTranscoder(float width, float height) {
addTranscodingHint(SVGAbstractTranscoder.KEY_WIDTH, width);
addTranscodingHint(SVGAbstractTranscoder.KEY_HEIGHT, height);
}
@Override
public BufferedImage createImage(int width, int height) {
return gray ?
createGrayImage(width, height) :
new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
}
/**
* 灰度控件底图
*/
private BufferedImage createGrayImage(int width, int height) {
return new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
}
@Override
public void writeImage(BufferedImage bufferedImage, TranscoderOutput transcoderOutput) throws TranscoderException {
this.bufferedImage = bufferedImage;
}
public BufferedImage getImage() {
return bufferedImage;
}
}

11
designer-base/src/main/java/com/fine/theme/light/icon/IconManager.java

@ -1,11 +0,0 @@
package com.fine.theme.light.icon;
/**
* 图标管理器
*
* @author vito
* @since 11.0
* Created on 2023/9/12
*/
public class IconManager {
}

34
designer-base/src/main/java/com/fine/theme/light/ui/FineLightIconSet.java

@ -0,0 +1,34 @@
package com.fine.theme.light.ui;
import com.fine.theme.icon.AbstractIconSet;
import com.fine.theme.icon.svg.SvgIconSource;
/**
* Fine 亮主题图标集
*
* @author vito
* @since 11.0
* Created on 2023/11/17
*/
public class FineLightIconSet extends AbstractIconSet {
public FineLightIconSet(String id) {
super(id);
load();
}
private void load() {
addIcon(
new SvgIconSource("cut", "com/fine/theme/icon/cut.svg", true),
new SvgIconSource("save", "com/fine/theme/icon/save.svg", true),
new SvgIconSource("copy", "com/fine/theme/icon/copy.svg", true),
new SvgIconSource("formatBrush", "com/fine/theme/icon/formatBrush.svg", true),
new SvgIconSource("paste", "com/fine/theme/icon/paste.svg", true),
new SvgIconSource("undo", "com/fine/theme/icon/undo.svg", true),
new SvgIconSource("redo", "com/fine/theme/icon/redo.svg", true),
new SvgIconSource("version_save", "com/fine/theme/icon/version_save.svg", true),
new SvgIconSource("font_miss_check", "com/fine/theme/icon/font_miss_check.svg", true),
new SvgIconSource("template_theme", "com/fine/theme/icon/template_theme.svg", true)
);
}
}

7
designer-base/src/main/java/com/fine/theme/light/ui/laf/FineLightLaf.java

@ -1,5 +1,7 @@
package com.fine.theme.light.ui.laf;
import com.fine.theme.light.ui.FineLightIconSet;
import com.fine.theme.icon.IconManager;
import com.formdev.flatlaf.FlatLightLaf;
/**
@ -11,7 +13,8 @@ import com.formdev.flatlaf.FlatLightLaf;
*/
public class FineLightLaf extends FlatLightLaf {
public static boolean setup() {
return setup( new FineLightLaf() );
IconManager.addSet(new FineLightIconSet("fine-light"));
return setup(new FineLightLaf());
}
@Override
@ -19,6 +22,4 @@ public class FineLightLaf extends FlatLightLaf {
return "FineLightLaf";
}
}

40
designer-base/src/main/java/com/fine/theme/light/utils/FineUIUtils.java

@ -1,40 +0,0 @@
package com.fine.theme.light.utils;
import javax.swing.UIManager;
import java.awt.Color;
/**
* UI绘制的一些常用方法
*
* @author vito
* @since 11.0
* Created on 2023/11/3
*/
public class FineUIUtils {
/**
* 通过key获取UI的颜色如果没有则使用后备key获取
*
* @param key 颜色key
* @param defaultKey 颜色后备key
* @return 颜色
*/
public static Color getUIColor(String key, String defaultKey) {
Color color = UIManager.getColor(key);
return (color != null) ? color : UIManager.getColor(defaultKey);
}
/**
* 获取key指定的int值如果没有则使用后备key获取
*
* @param key int所在的key
* @param defaultKey 后备key
* @return 长度
*/
public static int getUIInt(String key, String defaultKey) {
Object value = UIManager.get(key);
return (value instanceof Integer) ? (Integer) value : UIManager.getInt(defaultKey);
}
}

86
designer-base/src/main/java/com/fine/theme/utils/FineUIScale.java

@ -0,0 +1,86 @@
package com.fine.theme.utils;
import com.formdev.flatlaf.util.UIScale;
import javax.swing.plaf.DimensionUIResource;
import javax.swing.plaf.InsetsUIResource;
import javax.swing.plaf.UIResource;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Insets;
/**
* UI缩放工具
*
* @author vito
* @since 11.0
* Created on 2023/11/15
*/
public class FineUIScale {
/**
* Multiplies the given value by the user scale factor.
*/
public static float scale(float value) {
return UIScale.scale(value);
}
/**
* Multiplies the given value by the user scale factor and rounds the result.
*/
public static int scale(int value) {
return UIScale.scale(value);
}
/**
* Similar as {@link #scale(int)} but always "rounds down".
* <p>
* For use in special cases. {@link #scale(int)} is the preferred method.
*/
public static int scale2(int value) {
return UIScale.scale2(value);
}
/**
* Divides the given value by the user scale factor.
*/
public static float unscale(float value) {
return UIScale.unscale(value);
}
/**
* Divides the given value by the user scale factor and rounds the result.
*/
public static int unscale(int value) {
return UIScale.unscale(value);
}
/**
* If user scale factor is not 1, scale the given graphics context by invoking
* {@link Graphics2D#scale(double, double)} with user scale factor.
*/
public static void scaleGraphics(Graphics2D g) {
UIScale.scaleGraphics(g);
}
/**
* Scales the given dimension with the user scale factor.
* <p>
* If user scale factor is 1, then the given dimension is simply returned.
* Otherwise, a new instance of {@link Dimension} or {@link DimensionUIResource}
* is returned, depending on whether the passed dimension implements {@link UIResource}.
*/
public static Dimension scale(Dimension dimension) {
return UIScale.scale(dimension);
}
/**
* Scales the given insets with the user scale factor.
* <p>
* If user scale factor is 1, then the given insets is simply returned.
* Otherwise, a new instance of {@link Insets} or {@link InsetsUIResource}
* is returned, depending on whether the passed dimension implements {@link UIResource}.
*/
public static Insets scale(Insets insets) {
return UIScale.scale(insets);
}
}

83
designer-base/src/main/java/com/fine/theme/utils/FineUIUtils.java

@ -0,0 +1,83 @@
package com.fine.theme.utils;
import com.fr.stable.os.OperatingSystem;
import com.fr.value.AtomicClearableLazyValue;
import javax.swing.UIManager;
import java.awt.Color;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.lang.reflect.Field;
/**
* UI绘制的一些常用方法
*
* @author vito
* @since 11.0
* Created on 2023/11/3
*/
public class FineUIUtils {
public static final int RETINA_SCALE_FACTOR = 2;
/**
* 判断是否支持retina制作一些特殊效果如HIDPI图片绘制
* retina 是一种特殊的效果使用4个像素点模拟一个像素点
* 因此在其他操作系统上即使是高分屏也不具备retina的效果
*
* @since 2023.11.16
*/
private static final AtomicClearableLazyValue<Boolean> retina = AtomicClearableLazyValue.create(() -> {
// 经过测试win11,ubuntu等,没有retina效果
if (!OperatingSystem.isMacos()) {
return false;
}
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice device = env.getDefaultScreenDevice();
try {
Field field = device.getClass().getDeclaredField("scale");
field.setAccessible(true);
Object scale = field.get(device);
if (scale instanceof Integer && (Integer) scale == 2) {
return true;
}
} catch (Exception ignored) {
}
return false;
});
public static boolean isRetina() {
return retina.getValue();
}
public static void clearRetina() {
retina.drop();
}
/**
* 通过key获取UI的颜色如果没有则使用后备key获取
*
* @param key 颜色key
* @param defaultKey 颜色后备key
* @return 颜色
*/
public static Color getUIColor(String key, String defaultKey) {
Color color = UIManager.getColor(key);
return (color != null) ? color : UIManager.getColor(defaultKey);
}
/**
* 获取key指定的int值如果没有则使用后备key获取
*
* @param key int所在的key
* @param defaultKey 后备key
* @return 长度
*/
public static int getUIInt(String key, String defaultKey) {
Object value = UIManager.get(key);
return (value instanceof Integer) ? (Integer) value : UIManager.getInt(defaultKey);
}
}

8
designer-base/src/main/java/com/fr/design/actions/UpdateAction.java

@ -3,6 +3,7 @@
*/
package com.fr.design.actions;
import com.fine.theme.icon.LazyIcon;
import com.fr.base.NameStyle;
import com.fr.base.ScreenResolution;
import com.fr.base.Style;
@ -171,6 +172,11 @@ public abstract class UpdateAction extends ShortCut implements Action {
* @param smallIcon The small icon for the action.
*/
public void setSmallIcon(Icon smallIcon) {
if(smallIcon instanceof LazyIcon){
this.putValue(Action.SMALL_ICON, smallIcon);
this.putValue(UpdateAction.DISABLED_ICON,((LazyIcon) smallIcon).disabled());
return;
}
this.putValue(Action.SMALL_ICON, smallIcon);
}
@ -677,7 +683,7 @@ public abstract class UpdateAction extends ShortCut implements Action {
protected void setDisabledIcon4Button(AbstractButton button) {
Icon disabledIcon = (Icon) this.getValue(UpdateAction.DISABLED_ICON);
if (disabledIcon != null && disabledIcon instanceof SVGIcon) {
if (disabledIcon != null) {
button.setDisabledIcon(disabledIcon);
}
}

3
designer-base/src/main/java/com/fr/design/actions/edit/CopyAction.java

@ -3,6 +3,7 @@
*/
package com.fr.design.actions.edit;
import com.fine.theme.icon.LazyIcon;
import com.fr.design.actions.TemplateComponentAction;
import com.fr.design.base.mode.DesignModeContext;
import com.fr.design.designer.TargetComponent;
@ -21,7 +22,7 @@ public class CopyAction extends TemplateComponentAction {
this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_M_Edit_Copy"));
this.setMnemonic('C');
this.setSmallIcon("/com/fr/design/standard/copy/copy");
this.setSmallIcon(new LazyIcon("copy"));
this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, DEFAULT_MODIFIER));
this.setEnabled(!DesignModeContext.isBanCopyAndCut());
}

4
designer-base/src/main/java/com/fr/design/actions/edit/CutAction.java

@ -3,10 +3,10 @@
*/
package com.fr.design.actions.edit;
import com.fine.theme.icon.LazyIcon;
import com.fr.design.actions.TemplateComponentAction;
import com.fr.design.base.mode.DesignModeContext;
import com.fr.design.designer.TargetComponent;
import com.fr.general.IOUtils;
import javax.swing.KeyStroke;
import java.awt.event.KeyEvent;
@ -25,7 +25,7 @@ public class CutAction extends TemplateComponentAction {
this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_M_Edit_Cut"));
this.setMnemonic('T');
this.setSmallIcon("/com/fr/design/standard/cut/cut");
this.setSmallIcon(new LazyIcon("cut"));
this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, DEFAULT_MODIFIER));
this.setEnabled(!DesignModeContext.isBanCopyAndCut());
}

3
designer-base/src/main/java/com/fr/design/actions/edit/PasteAction.java

@ -3,6 +3,7 @@
*/
package com.fr.design.actions.edit;
import com.fine.theme.icon.LazyIcon;
import com.fr.design.actions.TemplateComponentAction;
import com.fr.design.base.mode.DesignModeContext;
import com.fr.design.designer.TargetComponent;
@ -24,7 +25,7 @@ public class PasteAction extends TemplateComponentAction {
this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_M_Edit_Paste"));
this.setMnemonic('P');
this.setSmallIcon("/com/fr/design/standard/paste/paste");
this.setSmallIcon(new LazyIcon("paste"));
this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, DEFAULT_MODIFIER));
}

4
designer-base/src/main/java/com/fr/design/gui/ibutton/UIButton.java

@ -1,6 +1,7 @@
package com.fr.design.gui.ibutton;
import com.fanruan.gui.UiInspector;
import com.fine.theme.icon.LazyIcon;
import com.fine.theme.light.ui.laf.FineLightLaf;
import com.fr.base.BaseUtils;
import com.fr.base.CellBorderStyle;
@ -74,6 +75,9 @@ public class UIButton extends JButton implements UIObserver, UITextComponent {
public UIButton(Icon icon) {
super(icon);
if (icon instanceof LazyIcon) {
this.setDisabledIcon(((LazyIcon) icon).disabled());
}
init();
}

2
designer-base/src/main/java/com/fr/design/gui/ibutton/UIHeadGroup.java

@ -2,7 +2,7 @@ package com.fr.design.gui.ibutton;
import com.fine.swing.ui.layout.Layouts;
import com.fine.swing.ui.layout.Row;
import com.fine.theme.light.utils.FineUIUtils;
import com.fine.theme.utils.FineUIUtils;
import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable;
import com.formdev.flatlaf.ui.FlatUIUtils;
import com.formdev.flatlaf.util.ScaledEmptyBorder;

46
designer-base/src/main/java/com/fr/design/gui/ibutton/UIToggleButton.java

@ -1,5 +1,15 @@
package com.fr.design.gui.ibutton;
import com.fr.design.constants.UIConstants;
import com.fr.design.event.GlobalNameListener;
import com.fr.design.event.GlobalNameObserver;
import com.fr.stable.StringUtils;
import javax.swing.AbstractAction;
import javax.swing.Icon;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
@ -9,14 +19,6 @@ import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.RoundRectangle2D;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import com.fr.design.constants.UIConstants;
import com.fr.design.event.GlobalNameListener;
import com.fr.design.event.GlobalNameObserver;
import com.fr.stable.StringUtils;
/**
* SelectedAble button label
@ -125,22 +127,22 @@ public class UIToggleButton extends UIButton implements GlobalNameObserver{
}
@Override
protected void initListener(){
if(shouldResponseChangeListener()){
this.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
if (uiObserverListener == null) {
return;
}
protected void initListener(){
if(shouldResponseChangeListener()){
this.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
if (uiObserverListener == null) {
return;
}
if(globalNameListener!=null && shouldResponseNameListener()){
globalNameListener.setGlobalName(toggleButtonName);
}
uiObserverListener.doChange();
}
});
}
}
uiObserverListener.doChange();
}
});
}
}
public void setSelected(boolean isSelected, boolean fireChanged) {
if (this.isSelected != isSelected) {
@ -243,7 +245,7 @@ public class UIToggleButton extends UIButton implements GlobalNameObserver{
*/
@Override
public void registerNameListener(GlobalNameListener listener) {
globalNameListener = listener;
globalNameListener = listener;
}
/**

3
designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java

@ -1,5 +1,6 @@
package com.fr.design.mainframe;
import com.fine.theme.icon.LazyIcon;
import com.fr.base.Parameter;
import com.fr.base.TRL;
import com.fr.base.extension.FileExtension;
@ -1593,7 +1594,7 @@ public abstract class JTemplate<T extends BaseBook, U extends BaseUndoState<?>>
}
protected UIButton createTemplateThemeButton() {
UIButton button = new UIButton(IconUtils.readIcon("/com/fr/design/standard/template_theme")) {
UIButton button = new UIButton(new LazyIcon("template_theme")) {
@Override
public Dimension getPreferredSize() {
FontMetrics metrics = getFontMetrics(getFont());

4
designer-base/src/main/java/com/fr/design/mainframe/check/CheckButton.java

@ -1,7 +1,7 @@
package com.fr.design.mainframe.check;
import com.fine.theme.icon.LazyIcon;
import com.fr.base.BaseUtils;
import com.fr.base.svg.IconUtils;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.ilable.UILabel;
@ -45,7 +45,7 @@ public class CheckButton extends UIButton {
private UILabel imageLabel;
public CheckButton() {
this.setIcon(IconUtils.readIcon("/com/fr/design/standard/font_miss_check"));
this.setIcon(new LazyIcon("font_miss_check"));
this.setToolTipText(Toolkit.i18nText("Fine_Designer_Check_Font"));
this.set4ToolbarButton();
this.addActionListener(checkListener);

8
designer-base/src/main/resources/com/fine/theme/icon/copy.svg

@ -0,0 +1,8 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13 12C13 11.4477 13.4477 11 14 11H23.8739C24.133 11 24.382 11.1006 24.5684 11.2805L29.6945 16.2289C29.8897 16.4174 30 16.6771 30 16.9484V29C30 29.5523 29.5523 30 29 30H14C13.4477 30 13 29.5523 13 29V12Z" fill="#FFE398"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M29.5 17.1607L24.6719 12.5H14.5V29.5H29.5V17.1607ZM14 11C13.4477 11 13 11.4477 13 12V30C13 30.5523 13.4477 31 14 31H30C30.5523 31 31 30.5523 31 30V16.9484C31 16.6771 30.8897 16.4174 30.6945 16.2289L25.5684 11.2805C25.382 11.1006 25.133 11 24.8739 11H14Z" fill="#E2900B"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M24.25 12H25.75V16.25H30V17.75H25.25C24.6977 17.75 24.25 17.3023 24.25 16.75V12Z" fill="#E2900B"/>
<path d="M2 3C2 2.44771 2.44772 2 3 2H12.8739C13.133 2 13.382 2.10057 13.5684 2.28053L18.6945 7.22892C18.8897 7.41737 19 7.67706 19 7.9484V20C19 20.5523 18.5523 21 18 21H3C2.44772 21 2 20.5523 2 20V3Z" fill="#FFD46C"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M18.5 8.16069L13.6719 3.5H3.5V20.5H18.5V8.16069ZM3 2C2.44772 2 2 2.44771 2 3V21C2 21.5523 2.44772 22 3 22H19C19.5523 22 20 21.5523 20 21V7.9484C20 7.67706 19.8897 7.41737 19.6945 7.22892L14.5684 2.28053C14.382 2.10057 14.133 2 13.8739 2H3Z" fill="#E2900B"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M13.25 3H14.75V7.25H19V8.75H14.25C13.6977 8.75 13.25 8.30228 13.25 7.75V3Z" fill="#E2900B"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

8
designer-base/src/main/resources/com/fine/theme/icon/copy_disable.svg

@ -0,0 +1,8 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13 12C13 11.4477 13.4477 11 14 11H23.8739C24.133 11 24.382 11.1006 24.5684 11.2805L29.6945 16.2289C29.8897 16.4174 30 16.6771 30 16.9484V29C30 29.5523 29.5523 30 29 30H14C13.4477 30 13 29.5523 13 29V12Z" fill="#E7EAEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M29.5 17.1607L24.6719 12.5H14.5V29.5H29.5V17.1607ZM14 11C13.4477 11 13 11.4477 13 12V30C13 30.5523 13.4477 31 14 31H30C30.5523 31 31 30.5523 31 30V16.9484C31 16.6771 30.8897 16.4174 30.6945 16.2289L25.5684 11.2805C25.382 11.1006 25.133 11 24.8739 11H14Z" fill="#B8BFCB"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M24.25 12H25.75V16.25H30V17.75H25.25C24.6977 17.75 24.25 17.3023 24.25 16.75V12Z" fill="#B8BFCB"/>
<path d="M2 3C2 2.44771 2.44772 2 3 2H12.8739C13.133 2 13.382 2.10057 13.5684 2.28053L18.6945 7.22892C18.8897 7.41737 19 7.67706 19 7.9484V20C19 20.5523 18.5523 21 18 21H3C2.44772 21 2 20.5523 2 20V3Z" fill="#DADEE7"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M18.5 8.16069L13.6719 3.5H3.5V20.5H18.5V8.16069ZM3 2C2.44772 2 2 2.44771 2 3V21C2 21.5523 2.44772 22 3 22H19C19.5523 22 20 21.5523 20 21V7.9484C20 7.67706 19.8897 7.41737 19.6945 7.22892L14.5684 2.28053C14.382 2.10057 14.133 2 13.8739 2H3Z" fill="#B8BFCB"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M13.25 3H14.75V7.25H19V8.75H14.25C13.6977 8.75 13.25 8.30228 13.25 7.75V3Z" fill="#B8BFCB"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

5
designer-base/src/main/resources/com/fine/theme/icon/cut.svg

@ -0,0 +1,5 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M18.0363 15.1722L22.1066 20.5509L19.8833 22.2184L19.6885 20.9119L15.9925 17.2159L12.1017 21.1067H10.99L9.87839 20.5509L13.9488 15.1722L9.17949 10.4029C7.49167 8.71509 6.54346 6.4259 6.54346 4.03895V0.581005C6.54346 0.389238 6.78722 0.3074 6.90294 0.460316L15.9925 12.4715L25.0821 0.460316C25.1978 0.3074 25.4416 0.389239 25.4416 0.581005V4.03896C25.4416 6.4259 24.4934 8.71509 22.8055 10.4029L18.0363 15.1722Z" fill="#0B172A" fill-opacity="0.9"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.09934 27.1098C8.87979 27.1098 10.3231 25.6664 10.3231 23.886C10.3231 22.1055 8.87979 20.6622 7.09934 20.6622C5.31888 20.6622 3.87553 22.1055 3.87553 23.886C3.87553 25.6664 5.31888 27.1098 7.09934 27.1098ZM7.09934 30.0001C10.4761 30.0001 13.2134 27.2627 13.2134 23.886C13.2134 20.5092 10.4761 17.7719 7.09934 17.7719C3.72261 17.7719 0.985229 20.5092 0.985229 23.886C0.985229 27.2627 3.72261 30.0001 7.09934 30.0001Z" fill="#2576EF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M24.8858 27.1098C26.6663 27.1098 28.1096 25.6664 28.1096 23.886C28.1096 22.1055 26.6663 20.6622 24.8858 20.6622C23.1054 20.6622 21.662 22.1055 21.662 23.886C21.662 25.6664 23.1054 27.1098 24.8858 27.1098ZM24.8858 30.0001C28.2626 30.0001 30.9999 27.2627 30.9999 23.886C30.9999 20.5092 28.2626 17.7719 24.8858 17.7719C21.5091 17.7719 18.7717 20.5092 18.7717 23.886C18.7717 27.2627 21.5091 30.0001 24.8858 30.0001Z" fill="#2576EF"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

5
designer-base/src/main/resources/com/fine/theme/icon/cut_disable.svg

@ -0,0 +1,5 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M18.0363 15.1722L22.1066 20.5509L19.8833 22.2184L19.6885 20.9119L15.9925 17.2159L12.1017 21.1067H10.99L9.87839 20.5509L13.9488 15.1722L9.17949 10.4029C7.49167 8.71509 6.54346 6.4259 6.54346 4.03895V0.581005C6.54346 0.389238 6.78722 0.3074 6.90294 0.460316L15.9925 12.4715L25.0821 0.460316C25.1978 0.3074 25.4416 0.389239 25.4416 0.581005V4.03896C25.4416 6.4259 24.4934 8.71509 22.8055 10.4029L18.0363 15.1722Z" fill="#B8BFCB"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.09934 27.1098C8.87979 27.1098 10.3231 25.6664 10.3231 23.886C10.3231 22.1055 8.87979 20.6622 7.09934 20.6622C5.31888 20.6622 3.87553 22.1055 3.87553 23.886C3.87553 25.6664 5.31888 27.1098 7.09934 27.1098ZM7.09934 30.0001C10.4761 30.0001 13.2134 27.2627 13.2134 23.886C13.2134 20.5092 10.4761 17.7719 7.09934 17.7719C3.72261 17.7719 0.985229 20.5092 0.985229 23.886C0.985229 27.2627 3.72261 30.0001 7.09934 30.0001Z" fill="#A3ADBD"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M24.8858 27.1098C26.6663 27.1098 28.1096 25.6664 28.1096 23.886C28.1096 22.1055 26.6663 20.6622 24.8858 20.6622C23.1054 20.6622 21.662 22.1055 21.662 23.886C21.662 25.6664 23.1054 27.1098 24.8858 27.1098ZM24.8858 30.0001C28.2626 30.0001 30.9999 27.2627 30.9999 23.886C30.9999 20.5092 28.2626 17.7719 24.8858 17.7719C21.5091 17.7719 18.7717 20.5092 18.7717 23.886C18.7717 27.2627 21.5091 30.0001 24.8858 30.0001Z" fill="#A3ADBD"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

15
designer-base/src/main/resources/com/fine/theme/icon/font_miss_check.svg

@ -0,0 +1,15 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_4811_12065)">
<path d="M3 3.4C3 2.6268 3.6268 2 4.4 2H25.6C26.3732 2 27 2.6268 27 3.4L28 9.425L27 26.6C27 27.3732 26.3732 28 25.6 28H4.4C3.6268 28 3 27.3732 3 26.6V3.4Z" fill="#4A93F2"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M26 3.5H4C3.72386 3.5 3.5 3.72386 3.5 4V27C3.5 27.2761 3.72386 27.5 4 27.5H24.3057C24.5502 27.5 24.7588 27.3233 24.7989 27.0822L26.4932 16.9167C26.4977 16.8895 26.5 16.862 26.5 16.8345V4C26.5 3.72386 26.2761 3.5 26 3.5ZM4 2C2.89543 2 2 2.89543 2 4V27C2 28.1046 2.89543 29 4 29H24.3057C25.2834 29 26.1178 28.2932 26.2785 27.3288L27.9728 17.1633C27.9909 17.0546 28 16.9446 28 16.8345V4C28 2.89543 27.1046 2 26 2H4Z" fill="#1E65CD"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M7 7.5C7 7.22386 7.22386 7 7.5 7H21.5C21.7761 7 22 7.22386 22 7.5V9V10V11H21L20.7764 10.5528C20.607 10.214 20.2607 10 19.882 10H9.11803C8.73926 10 8.393 10.214 8.22361 10.5528L8 11H7V10V9V7.5Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M14.5 21C13.6716 21 13 20.3284 13 19.5V7H16V19.5C16 20.3284 15.3284 21 14.5 21Z" fill="white"/>
<path d="M27.5249 16.175C30.6591 19.3092 30.6591 24.3907 27.5249 27.5249C24.3907 30.6591 19.3092 30.6591 16.175 27.5249C13.0408 24.3907 13.0408 19.3092 16.175 16.175C19.3092 13.0408 24.3907 13.0408 27.5249 16.175Z" fill="#E7F3FF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M26.3005 17.3994C28.7586 19.8574 28.7586 23.8427 26.3005 26.3008C23.8425 28.7589 19.8572 28.7589 17.3991 26.3008C14.9411 23.8427 14.9411 19.8574 17.3991 17.3994C19.8572 14.9413 23.8425 14.9413 26.3005 17.3994ZM28.1882 26.7745C30.6407 23.6259 30.4196 19.0699 27.5248 16.1751C24.3906 13.0409 19.3091 13.0409 16.1749 16.1751C13.0407 19.3093 13.0407 24.3909 16.1749 27.525C19.0696 30.4197 23.6254 30.6409 26.7739 28.1886L28.2634 29.6781C28.6539 30.0686 29.2871 30.0686 29.6776 29.6781C30.0681 29.2876 30.0681 28.6544 29.6776 28.2639L28.1882 26.7745Z" fill="#0B172A" fill-opacity="0.9"/>
</g>
<defs>
<clipPath id="clip0_4811_12065">
<rect width="32" height="32" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

15
designer-base/src/main/resources/com/fine/theme/icon/font_miss_check_disable.svg

@ -0,0 +1,15 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_5595_51821)">
<path d="M3 3.4C3 2.6268 3.6268 2 4.4 2H25.6C26.3732 2 27 2.6268 27 3.4L28 9.425L27 26.6C27 27.3732 26.3732 28 25.6 28H4.4C3.6268 28 3 27.3732 3 26.6V3.4Z" fill="#CFD4DC"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M26 3.5H4C3.72386 3.5 3.5 3.72386 3.5 4V27C3.5 27.2761 3.72386 27.5 4 27.5H24.3057C24.5502 27.5 24.7588 27.3233 24.7989 27.0822L26.4932 16.9167C26.4977 16.8895 26.5 16.862 26.5 16.8345V4C26.5 3.72386 26.2761 3.5 26 3.5ZM4 2C2.89543 2 2 2.89543 2 4V27C2 28.1046 2.89543 29 4 29H24.3057C25.2834 29 26.1178 28.2932 26.2785 27.3288L27.9728 17.1633C27.9909 17.0546 28 16.9446 28 16.8345V4C28 2.89543 27.1046 2 26 2H4Z" fill="#B8BFCB"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M7 7.5C7 7.22386 7.22386 7 7.5 7H21.5C21.7761 7 22 7.22386 22 7.5V9V10V11H21L20.7764 10.5528C20.607 10.214 20.2607 10 19.882 10H9.11803C8.73926 10 8.393 10.214 8.22361 10.5528L8 11H7V10V9V7.5Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M14.5 21C13.6716 21 13 20.3284 13 19.5V7H16V19.5C16 20.3284 15.3284 21 14.5 21Z" fill="white"/>
<path d="M27.5249 16.175C30.6591 19.3092 30.6591 24.3907 27.5249 27.5249C24.3907 30.6591 19.3092 30.6591 16.175 27.5249C13.0408 24.3907 13.0408 19.3092 16.175 16.175C19.3092 13.0408 24.3907 13.0408 27.5249 16.175Z" fill="#E7EAEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M26.3005 17.3994C28.7586 19.8574 28.7586 23.8427 26.3005 26.3008C23.8425 28.7589 19.8572 28.7589 17.3991 26.3008C14.9411 23.8427 14.9411 19.8574 17.3991 17.3994C19.8572 14.9413 23.8425 14.9413 26.3005 17.3994ZM28.1882 26.7745C30.6407 23.6259 30.4196 19.0699 27.5248 16.1751C24.3906 13.0409 19.3091 13.0409 16.1749 16.1751C13.0407 19.3093 13.0407 24.3909 16.1749 27.525C19.0696 30.4197 23.6254 30.6409 26.7739 28.1886L28.2634 29.6781C28.6539 30.0686 29.2871 30.0686 29.6776 29.6781C30.0681 29.2876 30.0681 28.6544 29.6776 28.2639L28.1882 26.7745Z" fill="#B8BFCB"/>
</g>
<defs>
<clipPath id="clip0_5595_51821">
<rect width="32" height="32" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

5
designer-base/src/main/resources/com/fine/theme/icon/formatBrush.svg

@ -0,0 +1,5 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.60099 29.3873C3.89892 29.3873 3.45183 28.4928 3.3157 27.804C3.21881 27.3138 3.00724 26.8915 3.25183 26.3534C3.94254 24.8315 4.2948 24.5737 4.60102 22.2621C4.80824 20.7195 4.91875 17.9106 4.94177 13.8262H29.0062V28.9981C29.0062 29.5504 28.5585 29.9981 28.0062 29.9981H24.4682C23.3907 28.9989 22.6632 28.1101 22.281 27.3296C21.9034 26.5491 21.5557 25.2206 21.2357 23.3442C20.6969 25.2322 20.1835 26.5606 19.6977 27.3296C19.2096 28.0986 18.3209 28.9873 17.027 30.0004L4.60099 29.3873Z" fill="#FEC148"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M6.42691 13.8262H4.94161C4.91859 17.9106 4.80807 20.7195 4.60086 22.2621C4.35963 24.0831 4.08983 24.6296 3.64851 25.5235C3.52961 25.7644 3.39826 26.0304 3.25166 26.3534C2.96265 26.9893 2.55935 27.7049 2.0429 28.5004C1.63 29.1364 2.07084 30.0004 2.8291 30.0004H17.0268C18.3207 28.9873 19.2095 28.0986 19.6976 27.3296C19.8908 27.0237 20.0885 26.6292 20.2903 26.1462C20.5959 25.415 20.9111 24.4811 21.2355 23.3442C21.4365 24.5222 21.6483 25.4843 21.8715 26.2304C22.0039 26.6727 22.1403 27.0391 22.2808 27.3296C22.663 28.1101 23.3906 28.9989 24.4681 29.9981H28.0061C28.5584 29.9981 29.0061 29.5504 29.0061 28.9981V13.8262H27.4882V15.3262H27.5061V28.4981H25.0704C24.3077 27.7412 23.8558 27.1338 23.6295 26.6731C23.4903 26.3843 23.2864 25.9524 23.0777 25.359C22.8114 24.6015 22.5987 23.8263 22.3861 23.051C22.1859 22.3212 21.9857 21.5914 21.7407 20.8763L21.2119 19.3331L19.9999 23.092C19.4995 24.8454 18.8762 25.8257 18.5011 26.4155C18.4764 26.4543 18.4528 26.4915 18.4303 26.5271C18.1186 27.0177 17.5084 27.6744 16.5005 28.5004H3.80954C4.12855 27.9635 4.39929 27.4535 4.61757 26.9733C4.75333 26.6742 4.87323 26.4313 4.99187 26.1909L4.99188 26.1909L5.05676 26.0593C5.19394 25.7804 5.33638 25.4852 5.46736 25.1504C5.73951 24.4547 5.9256 23.6836 6.08772 22.4602C6.2785 21.0388 6.38602 18.6923 6.42691 15.4679V13.8262Z" fill="#E2900B"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M14.0185 6.12797C13.3455 4.09544 14.8589 2 17 2C19.141 2 20.6545 4.09544 19.9814 6.12797L19.3614 8H19.9954H26H27.5C28.3284 8 29 8.67157 29 9.5V11.8215H5V9.5C5 8.67157 5.67157 8 6.5 8H12H14.2233H14.6385L14.0185 6.12797ZM17.9999 5C17.9999 5.55228 17.5522 6 16.9999 6C16.4476 6 15.9999 5.55228 15.9999 5C15.9999 4.44772 16.4476 4 16.9999 4C17.5522 4 17.9999 4.44772 17.9999 5Z" fill="#0B172A" fill-opacity="0.9"/>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

5
designer-base/src/main/resources/com/fine/theme/icon/formatBrush_disable.svg

@ -0,0 +1,5 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.60099 29.3873C3.89892 29.3873 3.45183 28.4928 3.3157 27.804C3.21881 27.3138 3.00724 26.8915 3.25183 26.3534C3.94254 24.8315 4.2948 24.5737 4.60102 22.2621C4.80824 20.7195 4.91875 17.9106 4.94177 13.8262H29.0062V28.9981C29.0062 29.5504 28.5585 29.9981 28.0062 29.9981H24.4682C23.3907 28.9989 22.6632 28.1101 22.281 27.3296C21.9034 26.5491 21.5557 25.2206 21.2357 23.3442C20.6969 25.2322 20.1835 26.5606 19.6977 27.3296C19.2096 28.0986 18.3209 28.9873 17.027 30.0004L4.60099 29.3873Z" fill="#DADEE7"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M6.42691 13.8262H4.94161C4.91859 17.9106 4.80807 20.7195 4.60086 22.2621C4.35963 24.0831 4.08983 24.6296 3.64851 25.5235C3.52961 25.7644 3.39826 26.0304 3.25166 26.3534C2.96265 26.9893 2.55935 27.7049 2.0429 28.5004C1.63 29.1364 2.07084 30.0004 2.8291 30.0004H17.0268C18.3207 28.9873 19.2095 28.0986 19.6976 27.3296C19.8908 27.0237 20.0885 26.6292 20.2903 26.1462C20.5959 25.415 20.9111 24.4811 21.2355 23.3442C21.4365 24.5222 21.6483 25.4843 21.8715 26.2304C22.0039 26.6727 22.1403 27.0391 22.2808 27.3296C22.663 28.1101 23.3906 28.9989 24.4681 29.9981H28.0061C28.5584 29.9981 29.0061 29.5504 29.0061 28.9981V13.8262H27.4882V15.3262H27.5061V28.4981H25.0704C24.3077 27.7412 23.8558 27.1338 23.6295 26.6731C23.4903 26.3843 23.2864 25.9524 23.0777 25.359C22.8114 24.6015 22.5987 23.8263 22.3861 23.051C22.1859 22.3212 21.9857 21.5914 21.7407 20.8763L21.2119 19.3331L19.9999 23.092C19.4995 24.8454 18.8762 25.8257 18.5011 26.4155C18.4764 26.4543 18.4528 26.4915 18.4303 26.5271C18.1186 27.0177 17.5084 27.6744 16.5005 28.5004H3.80954C4.12855 27.9635 4.39929 27.4535 4.61757 26.9733C4.75333 26.6742 4.87323 26.4313 4.99187 26.1909L4.99188 26.1909L5.05676 26.0593C5.19394 25.7804 5.33638 25.4852 5.46736 25.1504C5.73951 24.4547 5.9256 23.6836 6.08772 22.4602C6.2785 21.0388 6.38602 18.6923 6.42691 15.4679V13.8262Z" fill="#B8BFCB"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M14.0185 6.12797C13.3455 4.09544 14.8589 2 17 2C19.141 2 20.6545 4.09544 19.9814 6.12797L19.3614 8H19.9954H26H27.5C28.3284 8 29 8.67157 29 9.5V11.8215H5V9.5C5 8.67157 5.67157 8 6.5 8H12H14.2233H14.6385L14.0185 6.12797ZM17.9999 5C17.9999 5.55228 17.5522 6 16.9999 6C16.4476 6 15.9999 5.55228 15.9999 5C15.9999 4.44772 16.4476 4 16.9999 4C17.5522 4 17.9999 4.44772 17.9999 5Z" fill="#A3ADBD"/>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

16
designer-base/src/main/resources/com/fine/theme/icon/paste.svg

@ -0,0 +1,16 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_4992_3618)">
<path d="M2 6C2 4.89543 2.89543 4 4 4H23C24.1046 4 25 4.89543 25 6V27C25 28.1046 24.1046 29 23 29H4C2.89543 29 2 28.1046 2 27V6Z" fill="#FEC148"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M23 5.5H4C3.72386 5.5 3.5 5.72386 3.5 6V27C3.5 27.2761 3.72386 27.5 4 27.5H23C23.2761 27.5 23.5 27.2761 23.5 27V6C23.5 5.72386 23.2761 5.5 23 5.5ZM4 4C2.89543 4 2 4.89543 2 6V27C2 28.1046 2.89543 29 4 29H23C24.1046 29 25 28.1046 25 27V6C25 4.89543 24.1046 4 23 4H4Z" fill="#E2900B"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M16.9646 4H19.5V6C19.5 6.55228 19.0523 7 18.5 7H8C7.44772 7 7 6.55228 7 6V4H10.0354C10.2781 2.30385 11.7368 1 13.5 1C15.2632 1 16.7219 2.30385 16.9646 4Z" fill="#0B172A" fill-opacity="0.9"/>
<path d="M14.5 4C14.5 4.55228 14.0523 5 13.5 5C12.9477 5 12.5 4.55228 12.5 4C12.5 3.44772 12.9477 3 13.5 3C14.0523 3 14.5 3.44772 14.5 4Z" fill="white"/>
<path d="M13 12C13 11.4477 13.4477 11 14 11H23.8739C24.133 11 24.382 11.1006 24.5684 11.2805L29.6945 16.2289C29.8897 16.4174 30 16.6771 30 16.9484V29C30 29.5523 29.5523 30 29 30H14C13.4477 30 13 29.5523 13 29V12Z" fill="#FFE398"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M29.5 17.1607L24.6719 12.5H14.5V29.5H29.5V17.1607ZM14 11C13.4477 11 13 11.4477 13 12V30C13 30.5523 13.4477 31 14 31H30C30.5523 31 31 30.5523 31 30V16.9484C31 16.6771 30.8897 16.4174 30.6945 16.2289L25.5684 11.2805C25.382 11.1006 25.133 11 24.8739 11H14Z" fill="#E2900B"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M24.25 12H25.75V16.25H30V17.75H25.25C24.6977 17.75 24.25 17.3023 24.25 16.75V12Z" fill="#E2900B"/>
</g>
<defs>
<clipPath id="clip0_4992_3618">
<rect width="32" height="32" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

16
designer-base/src/main/resources/com/fine/theme/icon/paste_disable.svg

@ -0,0 +1,16 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_5595_51856)">
<path d="M2 6C2 4.89543 2.89543 4 4 4H23C24.1046 4 25 4.89543 25 6V27C25 28.1046 24.1046 29 23 29H4C2.89543 29 2 28.1046 2 27V6Z" fill="#DADEE7"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M23 5.5H4C3.72386 5.5 3.5 5.72386 3.5 6V27C3.5 27.2761 3.72386 27.5 4 27.5H23C23.2761 27.5 23.5 27.2761 23.5 27V6C23.5 5.72386 23.2761 5.5 23 5.5ZM4 4C2.89543 4 2 4.89543 2 6V27C2 28.1046 2.89543 29 4 29H23C24.1046 29 25 28.1046 25 27V6C25 4.89543 24.1046 4 23 4H4Z" fill="#B8BFCB"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M16.9646 4H19.5V6C19.5 6.55228 19.0523 7 18.5 7H8C7.44772 7 7 6.55228 7 6V4H10.0354C10.2781 2.30385 11.7368 1 13.5 1C15.2632 1 16.7219 2.30385 16.9646 4Z" fill="#A3ADBD"/>
<path d="M14.5 4C14.5 4.55228 14.0523 5 13.5 5C12.9477 5 12.5 4.55228 12.5 4C12.5 3.44772 12.9477 3 13.5 3C14.0523 3 14.5 3.44772 14.5 4Z" fill="white"/>
<path d="M13 12C13 11.4477 13.4477 11 14 11H23.8739C24.133 11 24.382 11.1006 24.5684 11.2805L29.6945 16.2289C29.8897 16.4174 30 16.6771 30 16.9484V29C30 29.5523 29.5523 30 29 30H14C13.4477 30 13 29.5523 13 29V12Z" fill="#E7EAEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M29.5 17.1607L24.6719 12.5H14.5V29.5H29.5V17.1607ZM14 11C13.4477 11 13 11.4477 13 12V30C13 30.5523 13.4477 31 14 31H30C30.5523 31 31 30.5523 31 30V16.9484C31 16.6771 30.8897 16.4174 30.6945 16.2289L25.5684 11.2805C25.382 11.1006 25.133 11 24.8739 11H14Z" fill="#B8BFCB"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M24.25 12H25.75V16.25H30V17.75H25.25C24.6977 17.75 24.25 17.3023 24.25 16.75V12Z" fill="#B8BFCB"/>
</g>
<defs>
<clipPath id="clip0_5595_51856">
<rect width="32" height="32" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

4
designer-base/src/main/resources/com/fine/theme/icon/redo.svg

@ -0,0 +1,4 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M31 12.2046L18.8574 1.11242C18.5814 0.860355 18.1426 1.05973 18.1426 1.43715V7.63499C8.49994 8.7895 1 17.6413 1 28.3897C1 29.2737 1.05073 30.1449 1.14921 31C2.24815 23.5784 9.29299 17.7118 18.1426 16.8876V22.9742C18.1426 23.3516 18.5815 23.551 18.8574 23.2989L31 12.2046Z" fill="#4A93F2"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M18.1426 7.63499V1.43715C18.1426 1.05973 18.5814 0.860355 18.8574 1.11242L31 12.2046L18.8574 23.2989C18.5815 23.551 18.1426 23.3516 18.1426 22.9742V16.8876C17.6364 16.9348 17.1362 16.9984 16.6426 17.0779C10.3068 18.0981 5.07146 21.7289 2.5756 26.5901C2.27628 27.173 2.01636 27.7737 1.79866 28.3897C1.5006 29.2331 1.28169 30.1053 1.14921 31C1.05073 30.1449 1 29.2737 1 28.3897C1 27.6315 1.03732 26.8827 1.11008 26.1454C2.06877 16.4307 9.18014 8.70806 18.1426 7.63499ZM3.2389 22.8459C5.25693 15.4808 11.19 10.005 18.3178 9.15156L19.6426 8.99294V3.88136L28.7542 12.2047L19.6426 20.5296V15.2146L18.0059 15.367C11.9857 15.9276 6.62246 18.7166 3.2389 22.8459Z" fill="#1E65CD"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

4
designer-base/src/main/resources/com/fine/theme/icon/redo_disable.svg

@ -0,0 +1,4 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M31 12.2046L18.8574 1.11242C18.5814 0.860355 18.1426 1.05973 18.1426 1.43715V7.63499C8.49994 8.7895 1 17.6413 1 28.3897C1 29.2737 1.05073 30.1449 1.14921 31C2.24815 23.5784 9.29299 17.7118 18.1426 16.8876V22.9742C18.1426 23.3516 18.5815 23.551 18.8574 23.2989L31 12.2046Z" fill="#CFD4DC"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M18.1426 7.63499V1.43715C18.1426 1.05973 18.5814 0.860355 18.8574 1.11242L31 12.2046L18.8574 23.2989C18.5815 23.551 18.1426 23.3516 18.1426 22.9742V16.8876C17.6364 16.9348 17.1362 16.9984 16.6426 17.0779C10.3068 18.0981 5.07146 21.7289 2.5756 26.5901C2.27628 27.173 2.01636 27.7737 1.79866 28.3897C1.5006 29.2331 1.28169 30.1053 1.14921 31C1.05073 30.1449 1 29.2737 1 28.3897C1 27.6315 1.03732 26.8827 1.11008 26.1454C2.06877 16.4307 9.18014 8.70806 18.1426 7.63499ZM3.2389 22.8459C5.25693 15.4808 11.19 10.005 18.3178 9.15156L19.6426 8.99294V3.88136L28.7542 12.2047L19.6426 20.5296V15.2146L18.0059 15.367C11.9857 15.9276 6.62246 18.7166 3.2389 22.8459Z" fill="#B8BFCB"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

8
designer-base/src/main/resources/com/fine/theme/icon/save.svg

@ -0,0 +1,8 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2 4C2 2.89543 2.89543 2 4 2H23.2414C23.82 2 24.3702 2.2506 24.7501 2.68709L29.5087 8.15546C29.8255 8.51949 30 8.9858 30 9.46837V28C30 29.1046 29.1046 30 28 30H4C2.89543 30 2 29.1046 2 28V4Z" fill="#A088E2"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M28.5 28V9.46837C28.5 9.34773 28.4564 9.23115 28.3772 9.14014L23.6185 3.67177C23.5236 3.56265 23.386 3.5 23.2414 3.5H4C3.72386 3.5 3.5 3.72386 3.5 4V28C3.5 28.2761 3.72386 28.5 4 28.5H28C28.2761 28.5 28.5 28.2761 28.5 28ZM4 2C2.89543 2 2 2.89543 2 4V28C2 29.1046 2.89543 30 4 30H28C29.1046 30 30 29.1046 30 28V9.46837C30 8.9858 29.8255 8.51949 29.5087 8.15546L24.7501 2.68709C24.3702 2.2506 23.82 2 23.2414 2H4Z" fill="#5A45B8"/>
<path d="M24 19.4C24 18.6268 23.3732 18 22.6 18H9.4C8.6268 18 8 18.6268 8 19.4V30H24V19.4Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M22.5 19.5V28.5H9.5V19.5H22.5ZM22.6 18C23.3732 18 24 18.6268 24 19.4V30H8V19.4C8 18.6268 8.6268 18 9.4 18H22.6Z" fill="#5A45B8"/>
<path d="M8 10.6C8 11.3732 8.6268 12 9.4 12H18.6C19.3732 12 20 11.3732 20 10.6V2H8V10.6Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M9.5 10.5V3.5H18.5V10.5H9.5ZM9.4 12C8.6268 12 8 11.3732 8 10.6V2H20V10.6C20 11.3732 19.3732 12 18.6 12H9.4Z" fill="#5A45B8"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

9
designer-base/src/main/resources/com/fine/theme/icon/save_disable.svg

@ -0,0 +1,9 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2 4C2 2.89543 2.89543 2 4 2H23.2414C23.82 2 24.3702 2.2506 24.7501 2.68709L29.5087 8.15546C29.8255 8.51949 30 8.9858 30 9.46837V28C30 29.1046 29.1046 30 28 30H4C2.89543 30 2 29.1046 2 28V4Z" fill="#CFD4DC"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M28.5 28V9.46837C28.5 9.34773 28.4564 9.23115 28.3772 9.14014L23.6185 3.67177C23.5236 3.56265 23.386 3.5 23.2414 3.5H4C3.72386 3.5 3.5 3.72386 3.5 4V28C3.5 28.2761 3.72386 28.5 4 28.5H28C28.2761 28.5 28.5 28.2761 28.5 28ZM4 2C2.89543 2 2 2.89543 2 4V28C2 29.1046 2.89543 30 4 30H28C29.1046 30 30 29.1046 30 28V9.46837C30 8.9858 29.8255 8.51949 29.5087 8.15546L24.7501 2.68709C24.3702 2.2506 23.82 2 23.2414 2H4Z" fill="#0B172A" fill-opacity="0.24"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M28.5 28V9.46837C28.5 9.34773 28.4564 9.23115 28.3772 9.14014L23.6185 3.67177C23.5236 3.56265 23.386 3.5 23.2414 3.5H4C3.72386 3.5 3.5 3.72386 3.5 4V28C3.5 28.2761 3.72386 28.5 4 28.5H28C28.2761 28.5 28.5 28.2761 28.5 28ZM4 2C2.89543 2 2 2.89543 2 4V28C2 29.1046 2.89543 30 4 30H28C29.1046 30 30 29.1046 30 28V9.46837C30 8.9858 29.8255 8.51949 29.5087 8.15546L24.7501 2.68709C24.3702 2.2506 23.82 2 23.2414 2H4Z" fill="#B8BFCB"/>
<path d="M24 19.4C24 18.6268 23.3732 18 22.6 18H9.4C8.6268 18 8 18.6268 8 19.4V30H24V19.4Z" fill="#E7EAEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M22.5 19.5V28.5H9.5V19.5H22.5ZM22.6 18C23.3732 18 24 18.6268 24 19.4V30H8V19.4C8 18.6268 8.6268 18 9.4 18H22.6Z" fill="#B8BFCB"/>
<path d="M8 10.6C8 11.3732 8.6268 12 9.4 12H18.6C19.3732 12 20 11.3732 20 10.6V2H8V10.6Z" fill="#E7EAEF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M9.5 10.5V3.5H18.5V10.5H9.5ZM9.4 12C8.6268 12 8 11.3732 8 10.6V2H20V10.6C20 11.3732 19.3732 12 18.6 12H9.4Z" fill="#B8BFCB"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

10
designer-base/src/main/resources/com/fine/theme/icon/template_theme.svg

@ -0,0 +1,10 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.171 3.99387C11.0619 3.45251 10.6246 3.00033 10.0723 3.00033H9.16988H3.42045C2.63454 2.98885 1.99319 3.62645 2.00005 4.41241V11.2896C2.00677 12.058 2.63157 12.6773 3.4 12.6773H6.0722V27.0843C6.0722 28.1889 6.96763 29.0843 8.0722 29.0843H24.2508C25.3553 29.0843 26.2508 28.1889 26.2508 27.0843V12.6876L28.6003 12.687C29.3734 12.6868 30 12.0601 30 11.287V4.4C30 3.6188 29.3607 2.98874 28.5795 3.00015L22.9745 3.00033H22.0722C21.5199 3.00033 21.0827 3.45251 20.9735 3.99387C20.5126 6.27915 18.4934 7.99997 16.0723 7.99997C13.6512 7.99997 11.632 6.27915 11.171 3.99387ZM12.1911 11.8615L11.798 10.7738L11.405 11.8615C11.1709 12.4594 10.701 12.9327 10.1075 13.1685L9.11095 13.5644L10.1075 13.9602C10.701 14.196 11.1709 14.6693 11.405 15.2672L11.798 16.271L12.1911 15.2672C12.4252 14.6693 12.895 14.196 13.4886 13.9602L14.4851 13.5644L13.4886 13.1685C12.895 12.9327 12.4252 12.4594 12.1911 11.8615Z" fill="#2576EF"/>
<mask id="mask0_5103_50296" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="2" y="3" width="28" height="27">
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.171 3.99387C11.0619 3.45251 10.6246 3.00033 10.0723 3.00033H9.16988H3.42045C2.63454 2.98885 1.99319 3.62645 2.00005 4.41241V11.2896C2.00677 12.058 2.63157 12.6773 3.4 12.6773H6.0722V27.0843C6.0722 28.1889 6.96763 29.0843 8.0722 29.0843H24.2508C25.3553 29.0843 26.2508 28.1889 26.2508 27.0843V12.6876L28.6003 12.687C29.3734 12.6868 30 12.0601 30 11.287V4.4C30 3.6188 29.3607 2.98874 28.5795 3.00015L22.9745 3.00033H22.0722C21.5199 3.00033 21.0827 3.45251 20.9735 3.99387C20.5126 6.27915 18.4934 7.99997 16.0723 7.99997C13.6512 7.99997 11.632 6.27915 11.171 3.99387ZM12.1911 11.8615L11.798 10.7738L11.405 11.8615C11.1709 12.4594 10.701 12.9327 10.1075 13.1685L9.11095 13.5644L10.1075 13.9602C10.701 14.196 11.1709 14.6693 11.405 15.2672L11.798 16.271L12.1911 15.2672C12.4252 14.6693 12.895 14.196 13.4886 13.9602L14.4851 13.5644L13.4886 13.1685C12.895 12.9327 12.4252 12.4594 12.1911 11.8615Z" fill="#2576EF"/>
</mask>
<g mask="url(#mask0_5103_50296)">
<circle cx="22" cy="33" r="11" fill="white" fill-opacity="0.1"/>
<circle cx="31" cy="25" r="11" fill="white" fill-opacity="0.1"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

10
designer-base/src/main/resources/com/fine/theme/icon/template_theme_disable.svg

@ -0,0 +1,10 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.171 3.99387C11.0619 3.45251 10.6246 3.00033 10.0723 3.00033H9.16988H3.42045C2.63454 2.98885 1.99319 3.62645 2.00005 4.41241V11.2896C2.00677 12.058 2.63157 12.6773 3.4 12.6773H6.0722V27.0843C6.0722 28.1889 6.96763 29.0843 8.0722 29.0843H24.2508C25.3553 29.0843 26.2508 28.1889 26.2508 27.0843V12.6876L28.6003 12.687C29.3734 12.6868 30 12.0601 30 11.287V4.4C30 3.6188 29.3607 2.98874 28.5795 3.00015L22.9745 3.00033H22.0722C21.5199 3.00033 21.0827 3.45251 20.9735 3.99387C20.5126 6.27915 18.4934 7.99997 16.0723 7.99997C13.6512 7.99997 11.632 6.27915 11.171 3.99387ZM12.1911 11.8615L11.798 10.7738L11.405 11.8615C11.1709 12.4594 10.701 12.9327 10.1075 13.1685L9.11095 13.5644L10.1075 13.9602C10.701 14.196 11.1709 14.6693 11.405 15.2672L11.798 16.271L12.1911 15.2672C12.4252 14.6693 12.895 14.196 13.4886 13.9602L14.4851 13.5644L13.4886 13.1685C12.895 12.9327 12.4252 12.4594 12.1911 11.8615Z" fill="#B8BFCB"/>
<mask id="mask0_5595_51893" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="2" y="3" width="28" height="27">
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.171 3.99387C11.0619 3.45251 10.6246 3.00033 10.0723 3.00033H9.16988H3.42045C2.63454 2.98885 1.99319 3.62645 2.00005 4.41241V11.2896C2.00677 12.058 2.63157 12.6773 3.4 12.6773H6.0722V27.0843C6.0722 28.1889 6.96763 29.0843 8.0722 29.0843H24.2508C25.3553 29.0843 26.2508 28.1889 26.2508 27.0843V12.6876L28.6003 12.687C29.3734 12.6868 30 12.0601 30 11.287V4.4C30 3.6188 29.3607 2.98874 28.5795 3.00015L22.9745 3.00033H22.0722C21.5199 3.00033 21.0827 3.45251 20.9735 3.99387C20.5126 6.27915 18.4934 7.99997 16.0723 7.99997C13.6512 7.99997 11.632 6.27915 11.171 3.99387ZM12.1911 11.8615L11.798 10.7738L11.405 11.8615C11.1709 12.4594 10.701 12.9327 10.1075 13.1685L9.11095 13.5644L10.1075 13.9602C10.701 14.196 11.1709 14.6693 11.405 15.2672L11.798 16.271L12.1911 15.2672C12.4252 14.6693 12.895 14.196 13.4886 13.9602L14.4851 13.5644L13.4886 13.1685C12.895 12.9327 12.4252 12.4594 12.1911 11.8615Z" fill="#B8BFCB"/>
</mask>
<g mask="url(#mask0_5595_51893)">
<circle cx="22" cy="33" r="11" fill="white" fill-opacity="0.1"/>
<circle cx="31" cy="25" r="11" fill="white" fill-opacity="0.1"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

4
designer-base/src/main/resources/com/fine/theme/icon/undo.svg

@ -0,0 +1,4 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M1 12.2046L13.1426 1.11242C13.4186 0.860355 13.8574 1.05973 13.8574 1.43715V7.63499C23.5001 8.7895 31 17.6413 31 28.3897C31 29.2737 30.9493 30.1449 30.8508 31C29.7519 23.5784 22.707 17.7118 13.8574 16.8876V22.9742C13.8574 23.3516 13.4185 23.551 13.1426 23.2989L1 12.2046Z" fill="#4A93F2"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M13.8574 7.63499V1.43715C13.8574 1.05973 13.4186 0.860355 13.1426 1.11242L1 12.2046L13.1426 23.2989C13.4185 23.551 13.8574 23.3516 13.8574 22.9742V16.8876C14.3636 16.9348 14.8638 16.9984 15.3574 17.0779C21.6932 18.0981 26.9285 21.7289 29.4244 26.5901C29.7237 27.173 29.9836 27.7737 30.2013 28.3897C30.4994 29.2331 30.7183 30.1053 30.8508 31C30.9493 30.1449 31 29.2737 31 28.3897C31 27.6315 30.9627 26.8827 30.8899 26.1454C29.9312 16.4307 22.8199 8.70806 13.8574 7.63499ZM28.7611 22.8459C26.7431 15.4808 20.81 10.005 13.6822 9.15156L12.3574 8.99294V3.88136L3.24585 12.2047L12.3574 20.5296V15.2146L13.9941 15.367C20.0143 15.9276 25.3775 18.7166 28.7611 22.8459Z" fill="#1E65CD"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

4
designer-base/src/main/resources/com/fine/theme/icon/undo_disable.svg

@ -0,0 +1,4 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M1 12.2046L13.1426 1.11242C13.4186 0.860355 13.8574 1.05973 13.8574 1.43715V7.63499C23.5001 8.7895 31 17.6413 31 28.3897C31 29.2737 30.9493 30.1449 30.8508 31C29.7519 23.5784 22.707 17.7118 13.8574 16.8876V22.9742C13.8574 23.3516 13.4185 23.551 13.1426 23.2989L1 12.2046Z" fill="#CFD4DC"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M13.8574 7.63499V1.43715C13.8574 1.05973 13.4186 0.860355 13.1426 1.11242L1 12.2046L13.1426 23.2989C13.4185 23.551 13.8574 23.3516 13.8574 22.9742V16.8876C14.3636 16.9348 14.8638 16.9984 15.3574 17.0779C21.6932 18.0981 26.9285 21.7289 29.4244 26.5901C29.7237 27.173 29.9836 27.7737 30.2013 28.3897C30.4994 29.2331 30.7183 30.1053 30.8508 31C30.9493 30.1449 31 29.2737 31 28.3897C31 27.6315 30.9627 26.8827 30.8899 26.1454C29.9312 16.4307 22.8199 8.70806 13.8574 7.63499ZM28.7611 22.8459C26.7431 15.4808 20.81 10.005 13.6822 9.15156L12.3574 8.99294V3.88136L3.24585 12.2047L12.3574 20.5296V15.2146L13.9941 15.367C20.0143 15.9276 25.3775 18.7166 28.7611 22.8459Z" fill="#B8BFCB"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

7
designer-base/src/main/resources/com/fine/theme/icon/version_save.svg

@ -0,0 +1,7 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2 4C2 2.89543 2.89543 2 4 2H23.2414C23.82 2 24.3702 2.2506 24.7501 2.68709L29.5087 8.15546C29.8255 8.51949 30 8.9858 30 9.46837V28C30 29.1046 29.1046 30 28 30H4C2.89543 30 2 29.1046 2 28V4Z" fill="#4A93F2"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M28.5 28V9.46837C28.5 9.34773 28.4564 9.23115 28.3772 9.14014L23.6185 3.67177C23.5236 3.56265 23.386 3.5 23.2414 3.5H4C3.72386 3.5 3.5 3.72386 3.5 4V28C3.5 28.2761 3.72386 28.5 4 28.5H28C28.2761 28.5 28.5 28.2761 28.5 28ZM4 2C2.89543 2 2 2.89543 2 4V28C2 29.1046 2.89543 30 4 30H28C29.1046 30 30 29.1046 30 28V9.46837C30 8.9858 29.8255 8.51949 29.5087 8.15546L24.7501 2.68709C24.3702 2.2506 23.82 2 23.2414 2H4Z" fill="#1E65CD"/>
<path d="M6 6.5C6 5.94772 6.44772 5.5 7 5.5H19C19.5523 5.5 20 5.94772 20 6.5V10C20 10.5523 19.5523 11 19 11H7C6.44772 11 6 10.5523 6 10L6 6.5Z" fill="white"/>
<path d="M14 7C14 6.72386 14.2239 6.5 14.5 6.5H18.5C18.7761 6.5 19 6.72386 19 7V9.5C19 9.77614 18.7761 10 18.5 10H14.5C14.2239 10 14 9.77614 14 9.5V7Z" fill="#3D95F2"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M17.6016 25C17.825 25 18.0292 24.8823 18.1291 24.696L23.4376 14.796C23.5833 14.5243 23.4652 14.1939 23.1738 14.0581C23.0919 14.0199 23.0016 14 22.91 14H20.2967C20.0733 14 19.8691 14.1177 19.7692 14.304L16 21.3333L12.2308 14.304C12.1509 14.155 12.0042 14.0498 11.8343 14.0137L11.7033 14H9.08996C8.99839 14 8.90808 14.0199 8.82618 14.0581C8.53482 14.1939 8.41672 14.5243 8.5624 14.796L13.8709 24.696C13.9708 24.8823 14.175 25 14.3984 25H17.6016Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

7
designer-base/src/main/resources/com/fine/theme/icon/version_save_disable.svg

@ -0,0 +1,7 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2 4C2 2.89543 2.89543 2 4 2H23.2414C23.82 2 24.3702 2.2506 24.7501 2.68709L29.5087 8.15546C29.8255 8.51949 30 8.9858 30 9.46837V28C30 29.1046 29.1046 30 28 30H4C2.89543 30 2 29.1046 2 28V4Z" fill="#CFD4DC"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M28.5 28V9.46837C28.5 9.34773 28.4564 9.23115 28.3772 9.14014L23.6185 3.67177C23.5236 3.56265 23.386 3.5 23.2414 3.5H4C3.72386 3.5 3.5 3.72386 3.5 4V28C3.5 28.2761 3.72386 28.5 4 28.5H28C28.2761 28.5 28.5 28.2761 28.5 28ZM4 2C2.89543 2 2 2.89543 2 4V28C2 29.1046 2.89543 30 4 30H28C29.1046 30 30 29.1046 30 28V9.46837C30 8.9858 29.8255 8.51949 29.5087 8.15546L24.7501 2.68709C24.3702 2.2506 23.82 2 23.2414 2H4Z" fill="#B8BFCB"/>
<path d="M6 6.5C6 5.94772 6.44772 5.5 7 5.5H19C19.5523 5.5 20 5.94772 20 6.5V10C20 10.5523 19.5523 11 19 11H7C6.44772 11 6 10.5523 6 10L6 6.5Z" fill="white"/>
<path d="M14 7C14 6.72386 14.2239 6.5 14.5 6.5H18.5C18.7761 6.5 19 6.72386 19 7V9.5C19 9.77614 18.7761 10 18.5 10H14.5C14.2239 10 14 9.77614 14 9.5V7Z" fill="#B8BFCB"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M17.6016 25C17.825 25 18.0292 24.8823 18.1291 24.696L23.4376 14.796C23.5833 14.5243 23.4652 14.1939 23.1738 14.0581C23.0919 14.0199 23.0016 14 22.91 14H20.2967C20.0733 14 19.8691 14.1177 19.7692 14.304L16 21.3333L12.2308 14.304C12.1509 14.155 12.0042 14.0498 11.8343 14.0137L11.7033 14H9.08996C8.99839 14 8.90808 14.0199 8.82618 14.0581C8.53482 14.1939 8.41672 14.5243 8.5624 14.796L13.8709 24.696C13.9708 24.8823 14.175 25 14.3984 25H17.6016Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

15
designer-base/src/main/resources/com/fine/theme/light/ui/laf/FineLightLaf.properties

@ -30,6 +30,17 @@
# which is licensed under the Apache 2.0 license. Copyright 2000-2019 JetBrains s.r.o.
# See: https://github.com/JetBrains/intellij-community/
# font weights
# Windows
[win]light.font = "Microsoft YaHei", "Microsoft JhengHei", "MingLiU", "Arial"
[win]semibold.font = "Microsoft YaHei", "Microsoft JhengHei", "MingLiU", "Arial"
# macOS
[mac]light.font = "PingFang SC", "Apple LiGothic", "Apple LiSun", "Arial"
[mac]semibold.font = "PingFang SC", "Apple LiGothic", "Apple LiSun", "Arial"
# Linux
[linux]light.font = "Noto SansCJK", "SimHei", "Arial", "Ubuntu"
[linux]semibold.font = "Noto SansCJK", "SimHei", "Arial", "Ubuntu"
#---- UI delegates ----
ButtonUI = com.formdev.flatlaf.ui.FlatButtonUI
@ -107,6 +118,8 @@ ViewportUI = com.formdev.flatlaf.ui.FlatViewportUI
@cellFocusColor = darken(@selectionBackground,20%)
@icon = shade(@background,27%)
# accent colors (blueish)
# set @accentColor to use single accent color or
# modify @accentBaseColor to use variations of accent base color
@ -783,7 +796,7 @@ TabbedPane.closeCrossLineWidth = 1
TabbedPane.underlineColor = @accentUnderlineColor
TabbedPane.inactiveUnderlineColor = mix(@accentUnderlineColor,$TabbedPane.background,50%)
TabbedPane.disabledUnderlineColor = darken(@background,28%)
TabbedPane.hoverColor = darken($TabbedPane.background,7%,derived)
TabbedPane.hoverColor = #DADEE7
TabbedPane.focusColor = mix(@selectionBackground,$TabbedPane.background,10%)
TabbedPane.contentAreaColor = $Component.borderColor

3
designer-realize/src/main/java/com/fr/design/mainframe/FormatBrushAction.java

@ -1,5 +1,6 @@
package com.fr.design.mainframe;
import com.fine.theme.icon.LazyIcon;
import com.fr.base.Style;
import com.fr.design.actions.ElementCaseAction;
@ -34,7 +35,7 @@ public class FormatBrushAction extends ElementCaseAction {
super(t);
this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_M_Edit_FormatBrush"));
this.setMnemonic('B');
this.setSmallIcon("/com/fr/design/standard/formatbrush/formatBrush", false);
this.setSmallIcon(new LazyIcon("formatBrush"));
this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B, DEFAULT_MODIFIER));
}

7
designer-realize/src/main/java/com/fr/start/MainDesigner.java

@ -2,6 +2,7 @@ package com.fr.start;
import com.fanruan.gui.UiInspector;
import com.fine.theme.icon.LazyIcon;
import com.fr.base.function.UITerminator;
import com.fr.base.vcs.DesignerMode;
import com.fr.design.DesignerEnvManager;
@ -312,7 +313,7 @@ public class MainDesigner extends BaseDesigner {
private void createSaveButton() {
saveButton = new UIButton("/com/fr/design/standard/save/save", true);
saveButton = new UIButton(new LazyIcon("save"), true);
saveButton.setToolTipText(KeySetUtils.SAVE_TEMPLATE.getMenuKeySetName());
saveButton.set4ToolbarButton();
saveButton.addActionListener(new ActionListener() {
@ -329,7 +330,7 @@ public class MainDesigner extends BaseDesigner {
private void createUndoButton() {
undo = new UIButton("/com/fr/design/standard/undo/undo", true);
undo = new UIButton(new LazyIcon("undo"), true);
undo.setToolTipText(KeySetUtils.UNDO.getMenuKeySetName());
undo.set4ToolbarButton();
undo.addActionListener(new ActionListener() {
@ -344,7 +345,7 @@ public class MainDesigner extends BaseDesigner {
}
private void createRedoButton() {
redo = new UIButton("/com/fr/design/standard/redo/redo", true);
redo = new UIButton(new LazyIcon("redo"), true);
redo.setToolTipText(KeySetUtils.REDO.getMenuKeySetName());
redo.set4ToolbarButton();
redo.addActionListener(new ActionListener() {

Loading…
Cancel
Save