Skip to content

Commit 2f78e78

Browse files
committed
GROOVY-11932: Allow theme switching light/dark/system in groovyConsole (minor color tweaks)
1 parent a9ac285 commit 2f78e78

4 files changed

Lines changed: 60 additions & 49 deletions

File tree

subprojects/groovy-console/src/main/groovy/groovy/console/ui/ConsoleActions.groovy

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ cutAction = action(
139139
closure: controller.&cut,
140140
mnemonic: 'T',
141141
accelerator: shortcut('X'),
142-
smallIcon: Icons.menu('content_cut'),
142+
smallIcon: Icons.menuSubtleBlue('content_cut'),
143143
shortDescription: 'Cut'
144144
)
145145

@@ -148,7 +148,7 @@ copyAction = action(
148148
closure: controller.&copy,
149149
mnemonic: 'C',
150150
accelerator: shortcut('C'),
151-
smallIcon: Icons.menu('content_copy'),
151+
smallIcon: Icons.menuSubtleBlue('content_copy'),
152152
shortDescription: 'Copy'
153153
)
154154

@@ -157,15 +157,15 @@ pasteAction = action(
157157
closure: controller.&paste,
158158
mnemonic: 'P',
159159
accelerator: shortcut('V'),
160-
smallIcon: Icons.menu('content_paste'),
160+
smallIcon: Icons.menuSubtleBlue('content_paste'),
161161
shortDescription: 'Paste'
162162
)
163163

164164
selectAllAction = action(
165165
name: 'Select All',
166166
closure: controller.&selectAll,
167167
mnemonic: 'A',
168-
smallIcon: Icons.menu('select_all'),
168+
smallIcon: Icons.menuSubtleBlue('select_all'),
169169
accelerator: shortcut('A')
170170
)
171171

@@ -213,7 +213,7 @@ runJavaAction = action(
213213
closure: controller.&runJava,
214214
mnemonic: 'J',
215215
accelerator: shortcut('alt R'),
216-
smallIcon: Icons.menu('coffee'),
216+
smallIcon: Icons.menuJavaBlue('coffee'),
217217
shortDescription: 'Execute Java Code'
218218
)
219219

@@ -265,7 +265,7 @@ listClasspath = action(
265265
clearClassloader = action(
266266
name: 'Clear Script Context',
267267
closure: controller.&clearContext,
268-
smallIcon: Icons.menu('bolt'),
268+
smallIcon: Icons.menuAmber('bolt'),
269269
mnemonic: 'C',
270270
)
271271

@@ -413,7 +413,7 @@ smartHighlighterAction = action(
413413
aboutAction = action(
414414
name: 'About',
415415
closure: controller.&showAbout,
416-
smallIcon: Icons.menu('info'),
416+
smallIcon: Icons.menuBlue('info'),
417417
mnemonic: 'A'
418418
)
419419

subprojects/groovy-console/src/main/groovy/groovy/console/ui/ConsoleView.groovy

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,10 @@ container(consoleFrame) {
7676
// — override each action's smallIcon (which is OS-themed for the screen
7777
// menu bar) with an app-themed instance here.
7878
inputEditor.textEditor.componentPopupMenu = popupMenu {
79-
menuItem(cutAction, icon: Icons.load('content_cut'))
80-
menuItem(copyAction, icon: Icons.load('content_copy'))
81-
menuItem(pasteAction, icon: Icons.load('content_paste'))
82-
menuItem(selectAllAction, icon: Icons.load('select_all'))
79+
menuItem(cutAction, icon: Icons.subtleBlue('content_cut'))
80+
menuItem(copyAction, icon: Icons.subtleBlue('content_copy'))
81+
menuItem(pasteAction, icon: Icons.subtleBlue('content_paste'))
82+
menuItem(selectAllAction, icon: Icons.subtleBlue('select_all'))
8383
separator()
8484
menuItem(undoAction, icon: Icons.load('undo'))
8585
menuItem(redoAction, icon: Icons.load('redo'))
@@ -89,8 +89,8 @@ inputEditor.textEditor.componentPopupMenu = popupMenu {
8989
}
9090

9191
outputArea.componentPopupMenu = popupMenu {
92-
menuItem(copyAction, icon: Icons.load('content_copy'))
93-
menuItem(selectAllAction, icon: Icons.load('select_all'))
92+
menuItem(copyAction, icon: Icons.subtleBlue('content_copy'))
93+
menuItem(selectAllAction, icon: Icons.subtleBlue('select_all'))
9494
menuItem(clearOutputAction, icon: Icons.load('delete_sweep'))
9595
}
9696

subprojects/groovy-console/src/main/groovy/groovy/console/ui/Icons.groovy

Lines changed: 43 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -61,52 +61,63 @@ class Icons {
6161
menuIcon(name, { Color c -> UIManager.getColor('Label.foreground') ?: c })
6262
}
6363

64-
static DynamicSVGIcon green(String name) {
65-
menuIcon(name, greenMapper({ ThemeManager.isDark() }))
66-
}
67-
68-
static DynamicSVGIcon red(String name) {
69-
menuIcon(name, redMapper({ ThemeManager.isDark() }))
70-
}
64+
static DynamicSVGIcon green(String name) { menuIcon(name, greenMapper({ ThemeManager.isDark() })) }
65+
static DynamicSVGIcon red(String name) { menuIcon(name, redMapper({ ThemeManager.isDark() })) }
66+
static DynamicSVGIcon blue(String name) { menuIcon(name, blueMapper({ ThemeManager.isDark() })) }
67+
static DynamicSVGIcon amber(String name) { menuIcon(name, amberMapper({ ThemeManager.isDark() })) }
68+
static DynamicSVGIcon violet(String name) { menuIcon(name, violetMapper({ ThemeManager.isDark() })) }
69+
static DynamicSVGIcon teal(String name) { menuIcon(name, tealMapper({ ThemeManager.isDark() })) }
70+
static DynamicSVGIcon javaBlue(String name) { menuIcon(name, javaBlueMapper({ ThemeManager.isDark() })) }
71+
static DynamicSVGIcon subtleBlue(String name) { menuIcon(name, subtleBlueMapper({ ThemeManager.isDark() })) }
7172

7273
// ---- main menu-bar icons (tint follows the menu-bar background, which is OS-drawn on macOS) ----
7374

7475
static DynamicSVGIcon menu(String name) {
7576
menuIcon(name, { Color c -> ThemeManager.menuIconForeground ?: c })
7677
}
7778

78-
static DynamicSVGIcon menuGreen(String name) {
79-
menuIcon(name, greenMapper({ ThemeManager.isMenuDark() }))
80-
}
81-
82-
static DynamicSVGIcon menuRed(String name) {
83-
menuIcon(name, redMapper({ ThemeManager.isMenuDark() }))
84-
}
79+
static DynamicSVGIcon menuGreen(String name) { menuIcon(name, greenMapper({ ThemeManager.isMenuDark() })) }
80+
static DynamicSVGIcon menuRed(String name) { menuIcon(name, redMapper({ ThemeManager.isMenuDark() })) }
81+
static DynamicSVGIcon menuBlue(String name) { menuIcon(name, blueMapper({ ThemeManager.isMenuDark() })) }
82+
static DynamicSVGIcon menuAmber(String name) { menuIcon(name, amberMapper({ ThemeManager.isMenuDark() })) }
83+
static DynamicSVGIcon menuViolet(String name) { menuIcon(name, violetMapper({ ThemeManager.isMenuDark() })) }
84+
static DynamicSVGIcon menuTeal(String name) { menuIcon(name, tealMapper({ ThemeManager.isMenuDark() })) }
85+
static DynamicSVGIcon menuJavaBlue(String name) { menuIcon(name, javaBlueMapper({ ThemeManager.isMenuDark() })) }
86+
static DynamicSVGIcon menuSubtleBlue(String name) { menuIcon(name, subtleBlueMapper({ ThemeManager.isMenuDark() })) }
8587

8688
// ---- toolbar / resizable ----
8789

8890
static DynamicSVGIcon toolbar(String name) {
8991
toolbarIcon(name, { Color c -> UIManager.getColor('Label.foreground') ?: c })
9092
}
9193

92-
static DynamicSVGIcon toolbarGreen(String name) {
93-
toolbarIcon(name, greenMapper({ ThemeManager.isDark() }))
94-
}
95-
96-
static DynamicSVGIcon toolbarRed(String name) {
97-
toolbarIcon(name, redMapper({ ThemeManager.isDark() }))
98-
}
99-
100-
private static Closure<Color> greenMapper(Closure<Boolean> darkCheck) {
101-
Color light = new Color(0x2E7D32)
102-
Color dark = new Color(0x81C784)
103-
return { Color c -> darkCheck() ? dark : light }
104-
}
105-
106-
private static Closure<Color> redMapper(Closure<Boolean> darkCheck) {
107-
Color light = new Color(0xC62828)
108-
Color dark = new Color(0xEF5350)
109-
return { Color c -> darkCheck() ? dark : light }
94+
static DynamicSVGIcon toolbarGreen(String name) { toolbarIcon(name, greenMapper({ ThemeManager.isDark() })) }
95+
static DynamicSVGIcon toolbarRed(String name) { toolbarIcon(name, redMapper({ ThemeManager.isDark() })) }
96+
static DynamicSVGIcon toolbarBlue(String name) { toolbarIcon(name, blueMapper({ ThemeManager.isDark() })) }
97+
static DynamicSVGIcon toolbarAmber(String name) { toolbarIcon(name, amberMapper({ ThemeManager.isDark() })) }
98+
static DynamicSVGIcon toolbarViolet(String name) { toolbarIcon(name, violetMapper({ ThemeManager.isDark() })) }
99+
static DynamicSVGIcon toolbarTeal(String name) { toolbarIcon(name, tealMapper({ ThemeManager.isDark() })) }
100+
static DynamicSVGIcon toolbarJavaBlue(String name) { toolbarIcon(name, javaBlueMapper({ ThemeManager.isDark() })) }
101+
static DynamicSVGIcon toolbarSubtleBlue(String name) { toolbarIcon(name, subtleBlueMapper({ ThemeManager.isDark() })) }
102+
103+
// Material "700" for light theme / "400" for dark — muted enough not to
104+
// shout next to grayscale neighbours, lifted in value for dark readability
105+
private static Closure<Color> greenMapper (Closure<Boolean> darkCheck) { hueMapper(darkCheck, 0x2E7D32, 0x81C784) }
106+
private static Closure<Color> redMapper (Closure<Boolean> darkCheck) { hueMapper(darkCheck, 0xC62828, 0xEF5350) }
107+
private static Closure<Color> blueMapper (Closure<Boolean> darkCheck) { hueMapper(darkCheck, 0x1565C0, 0x64B5F6) }
108+
private static Closure<Color> amberMapper (Closure<Boolean> darkCheck) { hueMapper(darkCheck, 0xEF6C00, 0xFFB74D) }
109+
private static Closure<Color> violetMapper(Closure<Boolean> darkCheck) { hueMapper(darkCheck, 0x7E57C2, 0xB39DDB) }
110+
private static Closure<Color> tealMapper (Closure<Boolean> darkCheck) { hueMapper(darkCheck, 0x00838F, 0x4DD0E1) }
111+
// Official Java brand blue (#007396) for light; a lifted variant for dark
112+
private static Closure<Color> javaBlueMapper(Closure<Boolean> darkCheck) { hueMapper(darkCheck, 0x007396, 0x4DB6E3) }
113+
// Blue-leaning slate — reads as "almost the text colour" but with enough
114+
// blue to group related but unremarkable actions (cut/copy/paste).
115+
private static Closure<Color> subtleBlueMapper(Closure<Boolean> darkCheck) { hueMapper(darkCheck, 0x4A6A8A, 0xA0B5CC) }
116+
117+
private static Closure<Color> hueMapper(Closure<Boolean> darkCheck, int light, int dark) {
118+
Color lightColor = new Color(light)
119+
Color darkColor = new Color(dark)
120+
return { Color c -> darkCheck() ? darkColor : lightColor }
110121
}
111122

112123
private static DynamicSVGIcon menuIcon(String name, Closure<Color> mapper) {

subprojects/groovy-console/src/main/groovy/groovy/console/ui/view/BasicToolBar.groovy

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ toolbar = toolBar(rollover: true, visible: controller.showToolbar, constraints:
3434
button(undoAction, text: null, icon: Icons.toolbar('undo'))
3535
button(redoAction, text: null, icon: Icons.toolbar('redo'))
3636
separator(orientation: SwingConstants.VERTICAL)
37-
button(cutAction, text: null, icon: Icons.toolbar('content_cut'))
38-
button(copyAction, text: null, icon: Icons.toolbar('content_copy'))
39-
button(pasteAction, text: null, icon: Icons.toolbar('content_paste'))
37+
button(cutAction, text: null, icon: Icons.toolbarSubtleBlue('content_cut'))
38+
button(copyAction, text: null, icon: Icons.toolbarSubtleBlue('content_copy'))
39+
button(pasteAction, text: null, icon: Icons.toolbarSubtleBlue('content_paste'))
4040
separator(orientation: SwingConstants.VERTICAL)
4141
button(findAction, text: null, icon: Icons.toolbar('search'))
4242
button(replaceAction, text: null, icon: Icons.toolbar('find_replace'))
@@ -52,5 +52,5 @@ toolbar = toolBar(rollover: true, visible: controller.showToolbar, constraints:
5252
button(smallerFontAction, text: null, icon: Icons.toolbar('text_decrease'))
5353
button(largerFontAction, text: null, icon: Icons.toolbar('text_increase'))
5454
separator(orientation: SwingConstants.VERTICAL)
55-
button(cycleThemeAction, text: null, icon: Icons.toolbar('refresh'))
55+
button(cycleThemeAction, text: null, icon: Icons.toolbarViolet('refresh'))
5656
}

0 commit comments

Comments
 (0)