diff --git a/platform/platform-api/src/com/intellij/ui/tabs/impl/IslandsPainterProvider.kt b/platform/platform-api/src/com/intellij/ui/tabs/impl/IslandsPainterProvider.kt index e8718aa7077d..1f170e23a231 100644 --- a/platform/platform-api/src/com/intellij/ui/tabs/impl/IslandsPainterProvider.kt +++ b/platform/platform-api/src/com/intellij/ui/tabs/impl/IslandsPainterProvider.kt @@ -3,7 +3,9 @@ package com.intellij.ui.tabs.impl import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.components.serviceOrNull +import com.intellij.ui.tabs.JBTabsPosition import org.jetbrains.annotations.ApiStatus +import java.awt.Insets @ApiStatus.Experimental @ApiStatus.Internal @@ -18,4 +20,6 @@ open class IslandsPainterProvider { open fun useMacScrollBar(): Boolean = false open fun isTabOccupiesWholeHeight(): Boolean = true + + open fun getSingleRowTabInsets(tabsPosition: JBTabsPosition): Insets? = null } \ No newline at end of file diff --git a/platform/platform-api/src/com/intellij/ui/tabs/impl/singleRow/SingleRowLayout.java b/platform/platform-api/src/com/intellij/ui/tabs/impl/singleRow/SingleRowLayout.java index 12880a8438b7..80138f53bb85 100644 --- a/platform/platform-api/src/com/intellij/ui/tabs/impl/singleRow/SingleRowLayout.java +++ b/platform/platform-api/src/com/intellij/ui/tabs/impl/singleRow/SingleRowLayout.java @@ -6,6 +6,7 @@ import com.intellij.ui.tabs.TabInfo; import com.intellij.ui.tabs.TabsUtil; import com.intellij.ui.tabs.impl.*; import com.intellij.util.ObjectUtils; +import com.intellij.util.ui.JBInsets; import org.intellij.lang.annotations.MagicConstant; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; @@ -151,6 +152,12 @@ public abstract class SingleRowLayout extends TabLayout { data.insets.left += tabs.getFirstTabOffset(); } + IslandsPainterProvider provider = IslandsPainterProvider.getInstance(); + var additionalInsets = provider == null ? null : provider.getSingleRowTabInsets(tabs.getTabsPosition()); + if (additionalInsets != null) { + data.insets = JBInsets.addInsets(data.insets, additionalInsets); + } + JBTabsImpl.Toolbar selectedForeToolbar = tabs.infoToForeToolbar.get(selected); data.hfToolbar = new WeakReference<>( diff --git a/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaTabbedPaneUI.java b/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaTabbedPaneUI.java index b38d01db035a..f26ef2a5c832 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaTabbedPaneUI.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaTabbedPaneUI.java @@ -7,6 +7,7 @@ import com.intellij.openapi.application.impl.InternalUICustomization; import com.intellij.openapi.ui.JBPopupMenu; import com.intellij.openapi.util.SystemInfo; import com.intellij.ui.JBColor; +import com.intellij.ui.JBTabsPaneImpl; import com.intellij.ui.RelativeFont; import com.intellij.ui.paint.LinePainter2D; import com.intellij.ui.paint.RectanglePainter2D; @@ -300,7 +301,8 @@ public class DarculaTabbedPaneUI extends BasicTabbedPaneUI { @Override protected void paintTabBackground(Graphics g, int tabPlacement, int tabIndex, int x, int y, int w, int h, boolean isSelected) { InternalUICustomization customization = InternalUICustomization.getInstance(); - if (customization != null && customization.paintTab(g, new Rectangle(x, y, w, h), tabIndex == hoverTab, isSelected)) { + if (customization != null && customization.paintTab(g, JBTabsPaneImpl.swingConstantToEnum(tabPlacement), new Rectangle(x, y, w, h), + tabIndex == hoverTab, isSelected)) { return; } diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/InternalUICustomization.kt b/platform/platform-impl/src/com/intellij/openapi/application/impl/InternalUICustomization.kt index fe09d0054216..77ecb839a2c6 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/InternalUICustomization.kt +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/InternalUICustomization.kt @@ -21,6 +21,7 @@ import com.intellij.ui.BorderPainter import com.intellij.ui.JBColor import com.intellij.ui.mac.WindowTabsComponent import com.intellij.ui.tabs.JBTabPainter +import com.intellij.ui.tabs.JBTabsPosition import com.intellij.ui.tabs.impl.JBTabsImpl import com.intellij.ui.tabs.impl.TabLabel import com.intellij.ui.tabs.impl.TabPainterAdapter @@ -167,11 +168,13 @@ open class InternalUICustomization { open fun paintProjectTab(frame: JFrame, label: TabLabel, g: Graphics, tabs: JBTabsImpl, selected: Boolean, index: Int, lastIndex: Int): Boolean = false - open fun paintTab(g: Graphics, rect: Rectangle, hovered: Boolean, selected: Boolean): Boolean = false + open fun paintTab(g: Graphics, position: JBTabsPosition, rect: Rectangle, hovered: Boolean, selected: Boolean): Boolean = false open fun paintTabBorder(g: Graphics, tabPlacement: Int, tabIndex: Int, x: Int, y: Int, w: Int, h: Int, isSelected: Boolean): Boolean = false open fun getTabLayoutStart(layout: ContentLayout): Int = 0 + + open fun getSingleRowTabInsets(tabsPosition: JBTabsPosition): Insets? = null } @ApiStatus.Internal diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsInternalPainterProvider.kt b/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsInternalPainterProvider.kt index ae8719870d30..8ce4579f30e9 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsInternalPainterProvider.kt +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsInternalPainterProvider.kt @@ -2,8 +2,10 @@ package com.intellij.openapi.application.impl.islands import com.intellij.openapi.application.impl.InternalUICustomization +import com.intellij.ui.tabs.JBTabsPosition import com.intellij.ui.tabs.impl.IslandsPainterProvider import com.intellij.ui.tabs.impl.TabPainterAdapter +import java.awt.Insets internal class IslandsInternalPainterProvider : IslandsPainterProvider() { override fun createCommonTabPainter(): TabPainterAdapter? { @@ -18,4 +20,9 @@ internal class IslandsInternalPainterProvider : IslandsPainterProvider() { val customization = InternalUICustomization.getInstance() return customization?.isTabOccupiesWholeHeight ?: super.isTabOccupiesWholeHeight() } + + override fun getSingleRowTabInsets(tabsPosition: JBTabsPosition): Insets? { + val customization = InternalUICustomization.getInstance() + return if (customization == null) super.getSingleRowTabInsets(tabsPosition) else customization.getSingleRowTabInsets(tabsPosition) + } } \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsTabPainter.kt b/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsTabPainter.kt index c7d1065e49fb..2d3318e5016d 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsTabPainter.kt +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsTabPainter.kt @@ -52,7 +52,7 @@ internal class IslandsTabPainterAdapter(isDefault: Boolean, debugger: Boolean, v GraphicsUtil.setupAAPainting(g2) tabs.setFirstTabOffset(JBUI.scale(3)) - (tabPainter as IslandsTabPainter).paintTab(g2, rect, info.tabColor, active, hovered, selected) + (tabPainter as IslandsTabPainter).paintTab(g2, tabs.tabsPosition, rect, info.tabColor, active, hovered, selected) } finally { g2.dispose() @@ -128,11 +128,11 @@ internal open class IslandsTabPainter(isDefault: Boolean, isToolWindow: Boolean) override fun getBackgroundColor(): Color = myTheme.background!! override fun paintTab(position: JBTabsPosition, g: Graphics2D, rect: Rectangle, borderThickness: Int, tabColor: Color?, active: Boolean, hovered: Boolean) { - paintTab(g, rect, tabColor, active, hovered, false) + paintTab(g, position, rect, tabColor, active, hovered, false) } override fun paintSelectedTab(position: JBTabsPosition, g: Graphics2D, rect: Rectangle, borderThickness: Int, tabColor: Color?, active: Boolean, hovered: Boolean) { - paintTab(g, rect, tabColor, active, hovered, true) + paintTab(g, position, rect, tabColor, active, hovered, true) } override fun paintBorderLine(g: Graphics2D, thickness: Int, from: Point, to: Point) { @@ -157,14 +157,15 @@ internal open class IslandsTabPainter(isDefault: Boolean, isToolWindow: Boolean) RectanglePainter2D.FILL.paint(g, rect.x.toDouble(), rect.y.toDouble(), rect.width.toDouble(), rect.height.toDouble()) } - open fun paintTab(g: Graphics2D, rect: Rectangle, tabColor: Color?, active: Boolean, hovered: Boolean, selected: Boolean) { + open fun paintTab(g: Graphics2D, position: JBTabsPosition, rect: Rectangle, tabColor: Color?, active: Boolean, hovered: Boolean, selected: Boolean) { val arc = JBUI.CurrentTheme.MainToolbar.Button.hoverArc().float.toDouble() val compactMode = UISettings.getInstance().compactMode - val hOffset = JBUIScale.scale(if (compactMode) 2f else 4f).toDouble() + val hOffset = JBUIScale.scale(getHOffsetUnscaled(compactMode, position).toFloat()).toDouble() + val minVOffset = JBUIScale.scale(if (compactMode) 4f else 8f).toDouble() val fullHeight = JBUIScale.scale(if (compactMode) 24f else 28f).toDouble() - val vOffset = (rect.height - fullHeight).coerceAtLeast(JBUIScale.scale(8f).toDouble()) + val vOffset = (rect.height - fullHeight).coerceAtLeast(minVOffset) val x = rect.x + hOffset val y = floor(rect.y + vOffset / 2.0) @@ -185,6 +186,13 @@ internal open class IslandsTabPainter(isDefault: Boolean, isToolWindow: Boolean) RectanglePainter2D.DRAW.paint(g, x, y, width, height, arc) } + private fun getHOffsetUnscaled(compactMode: Boolean, position: JBTabsPosition): Int { + return when (position.isSide) { + true -> 6 + false -> if (compactMode) 2 else 4 + } + } + private val hoverBackground = JBColor("EditorTabs.hoverBackground", JBColor(Color(0xE5, 0xEE, 0xFF, 0x80), Color(0x34, 0x3E, 0x51, 0x80))) private val inactiveBorderColor = JBColor("EditorTabs.inactiveUnderlinedTabBorderColor", JBColor(Color(0x7F, 0x99, 0xC3, 0x80), Color(0x7F, 0x99, 0xC3, 0x80))) diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsUICustomization.kt b/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsUICustomization.kt index 11038ea3866c..a1db2cf5f212 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsUICustomization.kt +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsUICustomization.kt @@ -811,9 +811,9 @@ internal class IslandsUICustomization : InternalUICustomization() { } } - override fun paintTab(g: Graphics2D, rect: Rectangle, tabColor: Color?, active: Boolean, hovered: Boolean, selected: Boolean) { + override fun paintTab(g: Graphics2D, position: JBTabsPosition, rect: Rectangle, tabColor: Color?, active: Boolean, hovered: Boolean, selected: Boolean) { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON) - super.paintTab(g, rect, tabColor, active, hovered, selected) + super.paintTab(g, position, rect, tabColor, active, hovered, selected) } } @@ -821,9 +821,9 @@ internal class IslandsUICustomization : InternalUICustomization() { override val debuggerTabPainterAdapter: IslandsTabPainterAdapter = IslandsTabPainterAdapter(true, true, isManyIslandEnabled) - override fun paintTab(g: Graphics, rect: Rectangle, hovered: Boolean, selected: Boolean): Boolean { + override fun paintTab(g: Graphics, position: JBTabsPosition, rect: Rectangle, hovered: Boolean, selected: Boolean): Boolean { if (isManyIslandEnabled) { - toolWindowTabPainter.paintTab(g as Graphics2D, rect, null, true, hovered, selected) + toolWindowTabPainter.paintTab(g as Graphics2D, position, rect, null, true, hovered, selected) return true } return true @@ -840,6 +840,12 @@ internal class IslandsUICustomization : InternalUICustomization() { return 0 } + override fun getSingleRowTabInsets(tabsPosition: JBTabsPosition): Insets? { + val compactMode = UISettings.getInstance().compactMode + + return if (isManyIslandEnabled && tabsPosition.isSide && compactMode) JBUI.insetsTop(3) else null + } + private fun getMainBackgroundColor(): Color { return JBColor.namedColor("MainWindow.background", JBColor.PanelBackground) } diff --git a/platform/platform-impl/src/com/intellij/ui/JBTabsPaneImpl.java b/platform/platform-impl/src/com/intellij/ui/JBTabsPaneImpl.java index e11e47c78742..296223c5f2e8 100644 --- a/platform/platform-impl/src/com/intellij/ui/JBTabsPaneImpl.java +++ b/platform/platform-impl/src/com/intellij/ui/JBTabsPaneImpl.java @@ -8,6 +8,7 @@ import com.intellij.ui.tabs.JBTabsPosition; import com.intellij.ui.tabs.TabInfo; import com.intellij.ui.tabs.TabsListener; import com.intellij.ui.tabs.impl.JBEditorTabs; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -84,7 +85,8 @@ public class JBTabsPaneImpl implements TabbedPane { tabs.setTabsPosition(position); } - private static @NotNull JBTabsPosition swingConstantToEnum(int tabPlacement) { + @ApiStatus.Internal + public static @NotNull JBTabsPosition swingConstantToEnum(int tabPlacement) { return switch (tabPlacement) { case SwingConstants.TOP -> JBTabsPosition.top; case SwingConstants.BOTTOM -> JBTabsPosition.bottom; diff --git a/platform/platform-resources/src/themes/islands/ManyIslandsDark.theme.json b/platform/platform-resources/src/themes/islands/ManyIslandsDark.theme.json index 542ba50f205e..18ee75caa5f4 100644 --- a/platform/platform-resources/src/themes/islands/ManyIslandsDark.theme.json +++ b/platform/platform-resources/src/themes/islands/ManyIslandsDark.theme.json @@ -166,6 +166,8 @@ "tabInsets": "-7,8,-7,8", "tabInsets.compact": "-2,6,-2,4", + "verticalTabInsets": "-2,10,-2,10", + "verticalTabInsets.compact": "0,10,0,10", "tabContentActionsRightInsets": "0,4,0,2" }, diff --git a/platform/platform-resources/src/themes/islands/ManyIslandsLight.theme.json b/platform/platform-resources/src/themes/islands/ManyIslandsLight.theme.json index a204e07e9192..dc98a8c7ba26 100644 --- a/platform/platform-resources/src/themes/islands/ManyIslandsLight.theme.json +++ b/platform/platform-resources/src/themes/islands/ManyIslandsLight.theme.json @@ -121,6 +121,8 @@ "tabInsets": "-6,8,-6,8", "tabInsets.compact": "-2,6,-2,4", + "verticalTabInsets": "-2,10,-2,10", + "verticalTabInsets.compact": "0,10,0,10", "tabContentActionsRightInsets": "0,2,0,2" },