Skip to content

Commit 41928a3

Browse files
authored
Merge pull request #597 from devoxx/issue-589
Issue 589
2 parents 33d6aad + c894d3d commit 41928a3

File tree

9 files changed

+134
-16
lines changed

9 files changed

+134
-16
lines changed

src/main/java/com/devoxx/genie/ui/component/StyleSheetsFactory.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.intellij.util.ui.JBUI;
66
import com.intellij.util.ui.StyleSheetUtil;
77
import com.intellij.util.ui.UIUtil;
8+
import com.intellij.openapi.editor.colors.EditorColorsManager;
89
import org.jetbrains.annotations.Contract;
910
import org.jetbrains.annotations.NotNull;
1011

@@ -17,10 +18,14 @@ public class StyleSheetsFactory {
1718

1819
@Contract(" -> new")
1920
public static @NotNull StyleSheet createCodeStyleSheet() {
21+
// Use editor font size instead of hardcoded value and account for IDE scale factor
22+
int editorFontSize = EditorColorsManager.getInstance().getGlobalScheme().getEditorFontSize();
23+
// Use JBUI.scale to account for IDE zoom/scaling settings
24+
int scaledFontSize = com.intellij.util.ui.JBUI.scale(editorFontSize);
2025
return StyleSheetUtil.loadStyleSheet(
2126
"code, pre, .pre { " +
2227
" font-family: '" + SOURCE_CODE_PRO_FONT + "'; " +
23-
" font-size: 14pt;" +
28+
" font-size: " + scaledFontSize + "px;" +
2429
"}"
2530
);
2631
}
@@ -41,7 +46,7 @@ public class StyleSheetsFactory {
4146
"li { padding: " + JBUIScale.scale(1) + "px 0 " + JBUIScale.scale(2) + "px 0; }" +
4247
"code, pre, .pre { " +
4348
" font-family: '" + SOURCE_CODE_PRO_FONT + "'; " +
44-
" font-size: 14pt;" +
49+
" font-size: " + com.intellij.util.ui.JBUI.scale(EditorColorsManager.getInstance().getGlobalScheme().getEditorFontSize()) + "px;" +
4550
" color: orange" +
4651
"}" +
4752
"hr {" +

src/main/java/com/devoxx/genie/ui/component/button/ButtonFactory.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,10 @@ public class ButtonFactory {
5454
button.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
5555

5656
if (label == null || label.isEmpty()) {
57-
int fontSize = (int) JBUIScale.scale(14f) + 6;
58-
button.setPreferredSize(new Dimension(fontSize, 30));
57+
// For icon-only buttons, ensure they have enough space at all zoom levels
58+
int buttonSize = (int) JBUIScale.scale(28);
59+
button.setPreferredSize(new Dimension(buttonSize, buttonSize));
60+
button.setMinimumSize(new Dimension(buttonSize, buttonSize));
5961
}
6062

6163
return button;

src/main/java/com/devoxx/genie/ui/panel/ConversationPanel.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import com.intellij.ui.JBColor;
1919
import com.intellij.ui.awt.RelativePoint;
2020
import com.intellij.ui.scale.JBUIScale;
21+
import com.intellij.util.ui.JBUI;
2122
import lombok.Getter;
2223
import org.jetbrains.annotations.NotNull;
2324

@@ -75,12 +76,16 @@ public ConversationPanel(@NotNull DevoxxGenieToolWindowContent toolWindowContent
7576

7677
public void updateFontSize() {
7778
int fontSize = (int) JBUIScale.scale(14f) + 6;
78-
79-
setMaximumSize(new Dimension(fontSize * 3, 30));
80-
81-
conversationButtonPanel.setPreferredSize(new Dimension(fontSize * 3, 30));
82-
conversationButtonPanel.setMinimumSize(new Dimension(fontSize * 3, 30));
83-
79+
80+
// Calculate sufficient width for the buttons based on zoom level
81+
// Use a multiplier that ensures enough space even at high zoom levels
82+
int buttonPanelWidth = (int) JBUIScale.scale(120); // Absolute width based on scale
83+
84+
setMaximumSize(new Dimension(buttonPanelWidth, 30));
85+
86+
conversationButtonPanel.setPreferredSize(new Dimension(buttonPanelWidth, 30));
87+
conversationButtonPanel.setMinimumSize(new Dimension(buttonPanelWidth, 30));
88+
8489
revalidate();
8590
repaint();
8691
}
@@ -102,6 +107,10 @@ public void loadConversationHistory() {
102107
* @return the button panel
103108
*/
104109
private @NotNull JPanel createButtonPanel() {
110+
// Add spacing between buttons to avoid overlapping
111+
FlowLayout layout = (FlowLayout) conversationButtonPanel.getLayout();
112+
layout.setHgap(JBUI.scale(10)); // Add horizontal gap between buttons
113+
105114
conversationButtonPanel.add(createActionButton(PlusIcon, e -> startNewConversation()));
106115
conversationButtonPanel.add(createActionButton(ClockIcon, e -> showConversationHistory()));
107116

src/main/java/com/devoxx/genie/ui/panel/LlmProviderPanel.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
import com.devoxx.genie.service.LLMProviderService;
99
import com.devoxx.genie.ui.listener.LLMSettingsChangeListener;
1010
import com.devoxx.genie.ui.renderer.ModelInfoRenderer;
11+
import com.devoxx.genie.ui.renderer.ModelProviderRenderer;
1112
import com.devoxx.genie.ui.settings.DevoxxGenieStateService;
13+
import com.devoxx.genie.ui.util.DevoxxGenieFontsUtil;
1214
import com.devoxx.genie.ui.util.NotificationUtil;
1315
import com.intellij.openapi.application.ApplicationManager;
1416
import com.intellij.openapi.project.Project;
@@ -59,7 +61,13 @@ public LlmProviderPanel(@NotNull Project project) {
5961
super(new BorderLayout());
6062
this.project = project;
6163

64+
// Set consistent renderers and fonts for both combo boxes
65+
modelProviderComboBox.setRenderer(new ModelProviderRenderer());
6266
modelNameComboBox.setRenderer(new ModelInfoRenderer());
67+
68+
// Set the font for the combo boxes themselves
69+
modelProviderComboBox.setFont(DevoxxGenieFontsUtil.getDropdownFont());
70+
modelNameComboBox.setFont(DevoxxGenieFontsUtil.getDropdownFont());
6371

6472
addModelProvidersToComboBox();
6573

@@ -157,6 +165,7 @@ private void refreshModels() {
157165

158166
updateModelNamesComboBox(selectedProvider.getName());
159167
modelNameComboBox.setRenderer(new ModelInfoRenderer());
168+
modelNameComboBox.setFont(DevoxxGenieFontsUtil.getDropdownFont());
160169
modelNameComboBox.revalidate();
161170
modelNameComboBox.repaint();
162171
refreshButton.setEnabled(true);
@@ -176,6 +185,8 @@ public void updateModelNamesComboBox(String modelProvider) {
176185
try {
177186
modelNameComboBox.removeAllItems();
178187
modelNameComboBox.setVisible(true);
188+
// Ensure font consistency is maintained when updating
189+
modelNameComboBox.setFont(DevoxxGenieFontsUtil.getDropdownFont());
179190

180191
ChatModelFactoryProvider
181192
.getFactoryByProvider(provider)
@@ -293,6 +304,7 @@ private void handleModelProviderSelectionChange(@NotNull ActionEvent e) {
293304
updateModelNamesComboBox(modelProvider.getName());
294305

295306
modelNameComboBox.setRenderer(new ModelInfoRenderer());
307+
modelNameComboBox.setFont(DevoxxGenieFontsUtil.getDropdownFont());
296308
modelNameComboBox.revalidate();
297309
modelNameComboBox.repaint();
298310
}

src/main/java/com/devoxx/genie/ui/renderer/CodeBlockNodeRenderer.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.commonmark.renderer.html.HtmlNodeRendererContext;
1818
import org.commonmark.renderer.html.HtmlWriter;
1919
import org.jetbrains.annotations.NotNull;
20+
import com.intellij.openapi.editor.colors.EditorColorsManager;
2021

2122
import java.util.HashMap;
2223
import java.util.Map;
@@ -70,7 +71,11 @@ private void renderNode(String codeSnippet, String info, boolean block) {
7071

7172
// Critical: we need to handle newlines properly in the code tag
7273
Map<String, String> codeStyle = new HashMap<>();
73-
codeStyle.put("style", "font-size:14pt; white-space: pre !important; -webkit-user-select: text; user-select: text;");
74+
// Use editor font size instead of hardcoded value and account for IDE scale factor
75+
int editorFontSize = EditorColorsManager.getInstance().getGlobalScheme().getEditorFontSize();
76+
// Use JBUI.scale to account for IDE zoom/scaling settings
77+
int scaledFontSize = com.intellij.util.ui.JBUI.scale(editorFontSize);
78+
codeStyle.put("style", "font-size:" + scaledFontSize + "px; white-space: pre !important; -webkit-user-select: text; user-select: text;");
7479
htmlOutputWriter.tag("code", codeStyle);
7580

7681
HighlightingMode highlightingMode = determineHighlightingMode(block);

src/main/java/com/devoxx/genie/ui/renderer/ModelInfoRenderer.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.intellij.ui.JBColor;
66
import com.intellij.ui.components.JBLabel;
77
import com.intellij.util.ui.JBUI;
8+
import com.devoxx.genie.ui.util.DevoxxGenieFontsUtil;
89

910
import javax.swing.*;
1011
import java.awt.*;
@@ -20,8 +21,10 @@ public ModelInfoRenderer() {
2021
add(nameLabel, BorderLayout.WEST);
2122
add(infoLabel, BorderLayout.EAST);
2223
setBorder(JBUI.Borders.empty(2));
23-
24-
infoLabel.setFont(JBUI.Fonts.smallFont());
24+
25+
// Use the centralized fonts for consistent styling
26+
nameLabel.setFont(DevoxxGenieFontsUtil.getDropdownFont());
27+
infoLabel.setFont(DevoxxGenieFontsUtil.getDropdownInfoFont());
2528
infoLabel.setForeground(JBColor.GRAY);
2629
}
2730

@@ -53,7 +56,10 @@ public Component getListCellRendererComponent(JList<? extends LanguageModel> lis
5356
setBackground(isSelected ? list.getSelectionBackground() : list.getBackground());
5457
setForeground(isSelected ? list.getSelectionForeground() : list.getForeground());
5558
setEnabled(list.isEnabled());
56-
setFont(list.getFont());
59+
60+
// Always ensure the fonts are set correctly (protection against JList overriding them)
61+
nameLabel.setFont(DevoxxGenieFontsUtil.getDropdownFont());
62+
infoLabel.setFont(DevoxxGenieFontsUtil.getDropdownInfoFont());
5763

5864
return this;
5965
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.devoxx.genie.ui.renderer;
2+
3+
import com.devoxx.genie.model.enumarations.ModelProvider;
4+
import com.intellij.ui.JBColor;
5+
import com.intellij.ui.components.JBLabel;
6+
import com.intellij.util.ui.JBUI;
7+
import com.devoxx.genie.ui.util.DevoxxGenieFontsUtil;
8+
9+
import javax.swing.*;
10+
import java.awt.*;
11+
12+
/**
13+
* Custom renderer for the Model Provider dropdown to ensure consistent font scaling with ModelInfoRenderer
14+
*/
15+
public class ModelProviderRenderer extends JPanel implements ListCellRenderer<ModelProvider> {
16+
private final JLabel nameLabel = new JBLabel();
17+
18+
public ModelProviderRenderer() {
19+
setLayout(new BorderLayout());
20+
add(nameLabel, BorderLayout.CENTER);
21+
setBorder(JBUI.Borders.empty(2));
22+
23+
// Use the centralized dropdown font
24+
nameLabel.setFont(DevoxxGenieFontsUtil.getDropdownFont());
25+
}
26+
27+
@Override
28+
public Component getListCellRendererComponent(JList<? extends ModelProvider> list,
29+
ModelProvider provider,
30+
int index,
31+
boolean isSelected,
32+
boolean cellHasFocus) {
33+
if (provider == null) {
34+
nameLabel.setText("");
35+
} else {
36+
nameLabel.setText(provider.getName());
37+
}
38+
39+
setBackground(isSelected ? list.getSelectionBackground() : list.getBackground());
40+
setForeground(isSelected ? list.getSelectionForeground() : list.getForeground());
41+
setEnabled(list.isEnabled());
42+
43+
// Always ensure the font is set correctly (protection against JList overriding it)
44+
nameLabel.setFont(DevoxxGenieFontsUtil.getDropdownFont());
45+
46+
return this;
47+
}
48+
}
Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,42 @@
11
package com.devoxx.genie.ui.util;
22

3+
import com.intellij.util.ui.JBUI;
4+
35
import java.awt.*;
46

7+
/**
8+
* Utility class for standardized font handling across the application
9+
*/
510
public class DevoxxGenieFontsUtil {
611
private DevoxxGenieFontsUtil() {
712
}
813

914
public static final String SOURCE_CODE_PRO_FONT = "Source Code Pro";
10-
15+
public static final String DROPDOWN_FONT_FAMILY = Font.DIALOG;
16+
public static final int DROPDOWN_FONT_SIZE = 14; // Increased base size for better readability
17+
18+
/**
19+
* Get a standardized font for code blocks
20+
*/
1121
public static final Font SourceCodeProFontPlan14 = new Font(SOURCE_CODE_PRO_FONT, Font.PLAIN, 14);
22+
23+
/**
24+
* Get a standardized scaled font for dropdown menus that respects IDE scaling
25+
* @return The font to use for dropdown menus
26+
*/
27+
public static Font getDropdownFont() {
28+
// We want to ensure the same size is used across all UI components
29+
int scaledSize = JBUI.scale(DROPDOWN_FONT_SIZE);
30+
return new Font(DROPDOWN_FONT_FAMILY, Font.PLAIN, scaledSize);
31+
}
32+
33+
/**
34+
* Get a standardized scaled font for secondary dropdown text (like token counts)
35+
* @return The font to use for secondary information in dropdowns
36+
*/
37+
public static Font getDropdownInfoFont() {
38+
// Slightly smaller than the main dropdown font
39+
int scaledSize = JBUI.scale(DROPDOWN_FONT_SIZE - 1);
40+
return new Font(DROPDOWN_FONT_FAMILY, Font.PLAIN, scaledSize);
41+
}
1242
}

src/main/resources/META-INF/plugin.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@
4040
<Li>Feat #586 : Added Gemini 2.5 Pro model by @stephanj</LI>
4141
<LI>Fix #588 : [Regression] Fix streaming responses by @stephanj</LI>
4242
<LI>Feat #590 : User can now configure which keys to use for newline by @stephanj</LI>
43-
<LI>Fix #595 : At least one message is required by @stephanj</LI>
43+
<LI>Fix #595 : At least one message is required (increased default chat memory to 50) by @stephanj</LI>
44+
<LI>Fix #589 : Font size for code snippets by @stephanj</LI>
4445
</UL>
4546
<h2>v0.5.2</h2>
4647
<UL>

0 commit comments

Comments
 (0)