mirror of
https://github.com/JFormDesigner/FlatLaf.git
synced 2026-02-12 15:07:11 -06:00
Merge PR #386: TextField: leading and trailing components
This commit is contained in:
@@ -763,9 +763,9 @@ public interface FlatClientProperties
|
||||
/**
|
||||
* Specifies a component that will be placed at the leading edge of the tabs area.
|
||||
* <p>
|
||||
* For top and bottom tab placement, the layed out component size will be
|
||||
* For top and bottom tab placement, the laid out component size will be
|
||||
* the preferred component width and the tab area height.<br>
|
||||
* For left and right tab placement, the layed out component size will be
|
||||
* For left and right tab placement, the laid out component size will be
|
||||
* the tab area width and the preferred component height.
|
||||
* <p>
|
||||
* <strong>Component</strong> {@link javax.swing.JTabbedPane}<br>
|
||||
@@ -776,9 +776,9 @@ public interface FlatClientProperties
|
||||
/**
|
||||
* Specifies a component that will be placed at the trailing edge of the tabs area.
|
||||
* <p>
|
||||
* For top and bottom tab placement, the layed out component size will be
|
||||
* For top and bottom tab placement, the laid out component size will be
|
||||
* the available horizontal space (minimum is preferred component width) and the tab area height.<br>
|
||||
* For left and right tab placement, the layed out component size will be
|
||||
* For left and right tab placement, the laid out component size will be
|
||||
* the tab area width and the available vertical space (minimum is preferred component height).
|
||||
* <p>
|
||||
* <strong>Component</strong> {@link javax.swing.JTabbedPane}<br>
|
||||
@@ -863,6 +863,46 @@ public interface FlatClientProperties
|
||||
*/
|
||||
String TEXT_FIELD_TRAILING_ICON = "JTextField.trailingIcon";
|
||||
|
||||
/**
|
||||
* Specifies a component that will be placed at the leading edge of the text field.
|
||||
* <p>
|
||||
* The component will be positioned inside and aligned to the visible text field border.
|
||||
* There is no gap between the visible border and the component.
|
||||
* The laid out component size will be the preferred component width
|
||||
* and the inner text field height.
|
||||
* <p>
|
||||
* The component should be not opaque because the text field border is painted
|
||||
* slightly inside the usually visible border in some cases.
|
||||
* E.g. when focused (in some themes) or when an outline color is specified
|
||||
* (see {@link #OUTLINE}.
|
||||
* <p>
|
||||
* <strong>Component</strong> {@link javax.swing.JTextField} (and subclasses)<br>
|
||||
* <strong>Value type</strong> {@link javax.swing.JComponent}
|
||||
*
|
||||
* @since 2
|
||||
*/
|
||||
String TEXT_FIELD_LEADING_COMPONENT = "JTextField.leadingComponent";
|
||||
|
||||
/**
|
||||
* Specifies a component that will be placed at the trailing edge of the text field.
|
||||
* <p>
|
||||
* The component will be positioned inside and aligned to the visible text field border.
|
||||
* There is no gap between the visible border and the component.
|
||||
* The laid out component size will be the preferred component width
|
||||
* and the inner text field height.
|
||||
* <p>
|
||||
* The component should be not opaque because the text field border is painted
|
||||
* slightly inside the usually visible border in some cases.
|
||||
* E.g. when focused (in some themes) or when an outline color is specified
|
||||
* (see {@link #OUTLINE}.
|
||||
* <p>
|
||||
* <strong>Component</strong> {@link javax.swing.JTextField} (and subclasses)<br>
|
||||
* <strong>Value type</strong> {@link javax.swing.JComponent}
|
||||
*
|
||||
* @since 2
|
||||
*/
|
||||
String TEXT_FIELD_TRAILING_COMPONENT = "JTextField.trailingComponent";
|
||||
|
||||
//---- JToggleButton ------------------------------------------------------
|
||||
|
||||
/**
|
||||
|
||||
@@ -364,6 +364,12 @@ class UIDefaultsLoader
|
||||
if( resultValueType == null )
|
||||
resultValueType = tempResultValueType;
|
||||
|
||||
// do not parse styles here
|
||||
if( key.startsWith( "[style]" ) ) {
|
||||
resultValueType[0] = ValueType.STRING;
|
||||
return value;
|
||||
}
|
||||
|
||||
value = value.trim();
|
||||
|
||||
// null
|
||||
|
||||
@@ -47,8 +47,16 @@ public class FlatClearIcon
|
||||
@Styleable protected Color clearIconHoverColor = UIManager.getColor( "SearchField.clearIconHoverColor" );
|
||||
@Styleable protected Color clearIconPressedColor = UIManager.getColor( "SearchField.clearIconPressedColor" );
|
||||
|
||||
private final boolean ignoreButtonState;
|
||||
|
||||
public FlatClearIcon() {
|
||||
this( false );
|
||||
}
|
||||
|
||||
/** @since 2 */
|
||||
public FlatClearIcon( boolean ignoreButtonState ) {
|
||||
super( 16, 16, null );
|
||||
this.ignoreButtonState = ignoreButtonState;
|
||||
}
|
||||
|
||||
/** @since 2 */
|
||||
@@ -63,7 +71,7 @@ public class FlatClearIcon
|
||||
|
||||
@Override
|
||||
protected void paintIcon( Component c, Graphics2D g ) {
|
||||
if( c instanceof AbstractButton ) {
|
||||
if( !ignoreButtonState && c instanceof AbstractButton ) {
|
||||
ButtonModel model = ((AbstractButton)c).getModel();
|
||||
if( model.isPressed() || model.isRollover() ) {
|
||||
/*
|
||||
|
||||
@@ -45,8 +45,16 @@ public class FlatSearchIcon
|
||||
@Styleable protected Color searchIconHoverColor = UIManager.getColor( "SearchField.searchIconHoverColor" );
|
||||
@Styleable protected Color searchIconPressedColor = UIManager.getColor( "SearchField.searchIconPressedColor" );
|
||||
|
||||
private final boolean ignoreButtonState;
|
||||
|
||||
public FlatSearchIcon() {
|
||||
this( false );
|
||||
}
|
||||
|
||||
/** @since 2 */
|
||||
public FlatSearchIcon( boolean ignoreButtonState ) {
|
||||
super( 16, 16, null );
|
||||
this.ignoreButtonState = ignoreButtonState;
|
||||
}
|
||||
|
||||
/** @since 2 */
|
||||
@@ -70,8 +78,10 @@ public class FlatSearchIcon
|
||||
</svg>
|
||||
*/
|
||||
|
||||
g.setColor( FlatButtonUI.buttonStateColor( c, searchIconColor, searchIconColor,
|
||||
null, searchIconHoverColor, searchIconPressedColor ) );
|
||||
g.setColor( ignoreButtonState
|
||||
? searchIconColor
|
||||
: FlatButtonUI.buttonStateColor( c, searchIconColor, searchIconColor,
|
||||
null, searchIconHoverColor, searchIconPressedColor ) );
|
||||
|
||||
// paint magnifier
|
||||
Area area = new Area( new Ellipse2D.Float( 2, 2, 10, 10 ) );
|
||||
|
||||
@@ -30,6 +30,12 @@ public class FlatSearchWithHistoryIcon
|
||||
extends FlatSearchIcon
|
||||
{
|
||||
public FlatSearchWithHistoryIcon() {
|
||||
this( false );
|
||||
}
|
||||
|
||||
/** @since 2 */
|
||||
public FlatSearchWithHistoryIcon( boolean ignoreButtonState ) {
|
||||
super( ignoreButtonState );
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -19,12 +19,16 @@ package com.formdev.flatlaf.ui;
|
||||
import static com.formdev.flatlaf.FlatClientProperties.*;
|
||||
import static com.formdev.flatlaf.util.UIScale.scale;
|
||||
import java.awt.Color;
|
||||
import java.awt.Component;
|
||||
import java.awt.Container;
|
||||
import java.awt.Cursor;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.FontMetrics;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.Insets;
|
||||
import java.awt.LayoutManager;
|
||||
import java.awt.LayoutManager2;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.event.FocusListener;
|
||||
import java.beans.PropertyChangeEvent;
|
||||
@@ -32,10 +36,13 @@ import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import javax.swing.Icon;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JComboBox;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JSpinner;
|
||||
import javax.swing.JTextField;
|
||||
import javax.swing.JToggleButton;
|
||||
import javax.swing.JToolBar;
|
||||
import javax.swing.LookAndFeel;
|
||||
import javax.swing.UIManager;
|
||||
import javax.swing.plaf.ComponentUI;
|
||||
@@ -94,6 +101,8 @@ public class FlatTextFieldUI
|
||||
|
||||
/** @since 2 */ @Styleable protected Icon leadingIcon;
|
||||
/** @since 2 */ @Styleable protected Icon trailingIcon;
|
||||
/** @since 2 */ protected JComponent leadingComponent;
|
||||
/** @since 2 */ protected JComponent trailingComponent;
|
||||
|
||||
private Color oldDisabledBackground;
|
||||
private Color oldInactiveBackground;
|
||||
@@ -115,11 +124,17 @@ public class FlatTextFieldUI
|
||||
leadingIcon = clientProperty( c, TEXT_FIELD_LEADING_ICON, null, Icon.class );
|
||||
trailingIcon = clientProperty( c, TEXT_FIELD_TRAILING_ICON, null, Icon.class );
|
||||
|
||||
installLeadingComponent();
|
||||
installTrailingComponent();
|
||||
|
||||
installStyle();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void uninstallUI( JComponent c ) {
|
||||
uninstallLeadingComponent();
|
||||
uninstallTrailingComponent();
|
||||
|
||||
super.uninstallUI( c );
|
||||
|
||||
leadingIcon = null;
|
||||
@@ -225,6 +240,20 @@ public class FlatTextFieldUI
|
||||
trailingIcon = (e.getNewValue() instanceof Icon) ? (Icon) e.getNewValue() : null;
|
||||
c.repaint();
|
||||
break;
|
||||
|
||||
case TEXT_FIELD_LEADING_COMPONENT:
|
||||
uninstallLeadingComponent();
|
||||
installLeadingComponent();
|
||||
c.revalidate();
|
||||
c.repaint();
|
||||
break;
|
||||
|
||||
case TEXT_FIELD_TRAILING_COMPONENT:
|
||||
uninstallTrailingComponent();
|
||||
installTrailingComponent();
|
||||
c.revalidate();
|
||||
c.repaint();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -444,6 +473,12 @@ debug*/
|
||||
// add width of leading and trailing icons
|
||||
size.width += getLeadingIconWidth() + getTrailingIconWidth();
|
||||
|
||||
// add width of leading and trailing components
|
||||
if( leadingComponent != null && leadingComponent.isVisible() )
|
||||
size.width += leadingComponent.getPreferredSize().width;
|
||||
if( trailingComponent != null && trailingComponent.isVisible() )
|
||||
size.width += trailingComponent.getPreferredSize().width;
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
@@ -510,7 +545,8 @@ debug*/
|
||||
/**
|
||||
* Returns the rectangle used to paint leading and trailing icons.
|
||||
* It invokes {@code super.getVisibleEditorRect()} and reduces left and/or
|
||||
* right margin if the text field has leading or trailing icons.
|
||||
* right margin if the text field has leading or trailing icons or components.
|
||||
* Also the preferred widths of leading and trailing components are removed.
|
||||
*
|
||||
* @since 2
|
||||
*/
|
||||
@@ -519,10 +555,24 @@ debug*/
|
||||
if( r == null )
|
||||
return null;
|
||||
|
||||
// if a leading/trailing icon is shown, then the left/right margin is reduced
|
||||
// to the top margin, which places the icon nicely centered on left/right side
|
||||
boolean ltr = isLeftToRight();
|
||||
if( ltr ? hasLeadingIcon() : hasTrailingIcon() ) {
|
||||
|
||||
// remove width of leading/trailing components
|
||||
JComponent leftComponent = ltr ? leadingComponent : trailingComponent;
|
||||
JComponent rightComponent = ltr ? trailingComponent : leadingComponent;
|
||||
boolean leftVisible = leftComponent != null && leftComponent.isVisible();
|
||||
boolean rightVisible = rightComponent != null && rightComponent.isVisible();
|
||||
if( leftVisible ) {
|
||||
int w = leftComponent.getPreferredSize().width;
|
||||
r.x += w;
|
||||
r.width -= w;
|
||||
}
|
||||
if( rightVisible )
|
||||
r.width -= rightComponent.getPreferredSize().width;
|
||||
|
||||
// if a leading/trailing icons (or components) are shown, then the left/right margins are reduced
|
||||
// to the top margin, which places the icon nicely centered on left/right side
|
||||
if( leftVisible || (ltr ? hasLeadingIcon() : hasTrailingIcon()) ) {
|
||||
// reduce left margin
|
||||
Insets margin = getComponent().getMargin();
|
||||
int newLeftMargin = Math.min( margin.left, margin.top );
|
||||
@@ -532,7 +582,7 @@ debug*/
|
||||
r.width += diff;
|
||||
}
|
||||
}
|
||||
if( ltr ? hasTrailingIcon() : hasLeadingIcon() ) {
|
||||
if( rightVisible || (ltr ? hasTrailingIcon() : hasLeadingIcon()) ) {
|
||||
// reduce right margin
|
||||
Insets margin = getComponent().getMargin();
|
||||
int newRightMargin = Math.min( margin.right, margin.top );
|
||||
@@ -540,6 +590,10 @@ debug*/
|
||||
r.width += scale( margin.right - newRightMargin );
|
||||
}
|
||||
|
||||
// make sure that width and height are not negative
|
||||
r.width = Math.max( r.width, 0 );
|
||||
r.height = Math.max( r.height, 0 );
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -578,4 +632,152 @@ debug*/
|
||||
if( caret instanceof FlatCaret )
|
||||
((FlatCaret)caret).scrollCaretToVisible();
|
||||
}
|
||||
|
||||
/** @since 2 */
|
||||
protected void installLeadingComponent() {
|
||||
JTextComponent c = getComponent();
|
||||
leadingComponent = clientProperty( c, TEXT_FIELD_LEADING_COMPONENT, null, JComponent.class );
|
||||
if( leadingComponent != null ) {
|
||||
prepareLeadingOrTrailingComponent( leadingComponent );
|
||||
installLayout();
|
||||
c.add( leadingComponent );
|
||||
}
|
||||
}
|
||||
|
||||
/** @since 2 */
|
||||
protected void installTrailingComponent() {
|
||||
JTextComponent c = getComponent();
|
||||
trailingComponent = clientProperty( c, TEXT_FIELD_TRAILING_COMPONENT, null, JComponent.class );
|
||||
if( trailingComponent != null ) {
|
||||
prepareLeadingOrTrailingComponent( trailingComponent );
|
||||
installLayout();
|
||||
c.add( trailingComponent );
|
||||
}
|
||||
}
|
||||
|
||||
/** @since 2 */
|
||||
protected void uninstallLeadingComponent() {
|
||||
if( leadingComponent != null ) {
|
||||
getComponent().remove( leadingComponent );
|
||||
leadingComponent = null;
|
||||
}
|
||||
}
|
||||
|
||||
/** @since 2 */
|
||||
protected void uninstallTrailingComponent() {
|
||||
if( trailingComponent != null ) {
|
||||
getComponent().remove( trailingComponent );
|
||||
trailingComponent = null;
|
||||
}
|
||||
}
|
||||
|
||||
/** @since 2 */
|
||||
protected void prepareLeadingOrTrailingComponent( JComponent c ) {
|
||||
c.putClientProperty( STYLE_CLASS, "inTextField" );
|
||||
c.setCursor( Cursor.getDefaultCursor() );
|
||||
|
||||
if( c instanceof JButton || c instanceof JToggleButton )
|
||||
c.putClientProperty( BUTTON_TYPE, BUTTON_TYPE_TOOLBAR_BUTTON );
|
||||
else if( c instanceof JToolBar ) {
|
||||
for( Component child : c.getComponents() ) {
|
||||
if( child instanceof JComponent )
|
||||
((JComponent)child).putClientProperty( STYLE_CLASS, "inTextField" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void installLayout() {
|
||||
JTextComponent c = getComponent();
|
||||
LayoutManager oldLayout = c.getLayout();
|
||||
if( !(oldLayout instanceof FlatTextFieldLayout) )
|
||||
c.setLayout( new FlatTextFieldLayout( oldLayout ) );
|
||||
}
|
||||
|
||||
//---- class FlatTextFieldLayout ------------------------------------------
|
||||
|
||||
private class FlatTextFieldLayout
|
||||
implements LayoutManager2, UIResource
|
||||
{
|
||||
private final LayoutManager delegate;
|
||||
|
||||
FlatTextFieldLayout( LayoutManager delegate ) {
|
||||
this.delegate = delegate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addLayoutComponent( String name, Component comp ) {
|
||||
if( delegate != null )
|
||||
delegate.addLayoutComponent( name, comp );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeLayoutComponent( Component comp ) {
|
||||
if( delegate != null )
|
||||
delegate.removeLayoutComponent( comp );
|
||||
}
|
||||
|
||||
@Override
|
||||
public Dimension preferredLayoutSize( Container parent ) {
|
||||
return (delegate != null) ? delegate.preferredLayoutSize( parent ) : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Dimension minimumLayoutSize( Container parent ) {
|
||||
return (delegate != null) ? delegate.minimumLayoutSize( parent ) : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void layoutContainer( Container parent ) {
|
||||
if( delegate != null )
|
||||
delegate.layoutContainer( parent );
|
||||
|
||||
if( leadingComponent == null && trailingComponent == null )
|
||||
return;
|
||||
|
||||
int ow = FlatUIUtils.getBorderFocusAndLineWidth( getComponent() );
|
||||
int h = parent.getHeight() - ow - ow;
|
||||
boolean ltr = isLeftToRight();
|
||||
JComponent leftComponent = ltr ? leadingComponent : trailingComponent;
|
||||
JComponent rightComponent = ltr ? trailingComponent : leadingComponent;
|
||||
|
||||
// layout left component
|
||||
if( leftComponent != null && leftComponent.isVisible() ) {
|
||||
int w = leftComponent.getPreferredSize().width;
|
||||
leftComponent.setBounds( ow, ow, w, h );
|
||||
}
|
||||
|
||||
// layout right component
|
||||
if( rightComponent != null && rightComponent.isVisible() ) {
|
||||
int w = rightComponent.getPreferredSize().width;
|
||||
rightComponent.setBounds( parent.getWidth() - ow - w, ow, w, h );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addLayoutComponent( Component comp, Object constraints ) {
|
||||
if( delegate instanceof LayoutManager2 )
|
||||
((LayoutManager2)delegate).addLayoutComponent( comp, constraints );
|
||||
}
|
||||
|
||||
@Override
|
||||
public Dimension maximumLayoutSize( Container target ) {
|
||||
return (delegate instanceof LayoutManager2) ? ((LayoutManager2)delegate).maximumLayoutSize( target ) : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getLayoutAlignmentX( Container target ) {
|
||||
return (delegate instanceof LayoutManager2) ? ((LayoutManager2)delegate).getLayoutAlignmentX( target ) : 0.5f;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getLayoutAlignmentY( Container target ) {
|
||||
return (delegate instanceof LayoutManager2) ? ((LayoutManager2)delegate).getLayoutAlignmentY( target ) : 0.5f;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void invalidateLayout( Container target ) {
|
||||
if( delegate instanceof LayoutManager2 )
|
||||
((LayoutManager2)delegate).invalidateLayout( target );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -278,6 +278,32 @@ public class FlatUIUtils
|
||||
: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the scaled line thickness used to compute the border insets.
|
||||
*
|
||||
* @since 2
|
||||
*/
|
||||
public static float getBorderLineWidth( JComponent c ) {
|
||||
FlatBorder border = getOutsideFlatBorder( c );
|
||||
return (border != null)
|
||||
? UIScale.scale( (float) border.getLineWidth( c ) )
|
||||
: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the scaled thickness of the border.
|
||||
* This includes the outer focus border and the actual component border.
|
||||
*
|
||||
* @since 2
|
||||
*/
|
||||
public static int getBorderFocusAndLineWidth( JComponent c ) {
|
||||
FlatBorder border = getOutsideFlatBorder( c );
|
||||
return (border != null)
|
||||
? Math.round( UIScale.scale( (float) border.getFocusWidth( c ) )
|
||||
+ UIScale.scale( (float) border.getLineWidth( c ) ) )
|
||||
: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the scaled arc diameter of the border for the given component.
|
||||
*/
|
||||
|
||||
@@ -355,3 +355,19 @@ ToolTip.background = shade(@background,50%)
|
||||
#---- Tree ----
|
||||
|
||||
Tree.hash = lighten($Tree.background,5%)
|
||||
|
||||
|
||||
|
||||
#---- Styles ------------------------------------------------------------------
|
||||
|
||||
#---- inTextField ----
|
||||
# for leading/trailing components in text fields
|
||||
|
||||
[style]Button.inTextField = \
|
||||
focusable: false; \
|
||||
toolbar.margin: 1,1,1,1; \
|
||||
toolbar.spacingInsets: 1,1,1,1; \
|
||||
background: $TextField.background; \
|
||||
toolbar.hoverBackground: lighten($TextField.background,4%,derived); \
|
||||
toolbar.pressedBackground: lighten($TextField.background,6%,derived); \
|
||||
toolbar.selectedBackground: lighten($TextField.background,12%,derived)
|
||||
|
||||
@@ -227,6 +227,7 @@ Button.defaultButtonFollowsFocus = false
|
||||
Button.borderWidth = 1
|
||||
Button.default.borderWidth = 1
|
||||
|
||||
# for buttons in toolbars
|
||||
Button.toolbar.margin = 3,3,3,3
|
||||
Button.toolbar.spacingInsets = 1,2,1,2
|
||||
|
||||
@@ -889,3 +890,20 @@ Tree.icon.collapsedColor = @icon
|
||||
Tree.icon.leafColor = @icon
|
||||
Tree.icon.closedColor = @icon
|
||||
Tree.icon.openColor = @icon
|
||||
|
||||
|
||||
|
||||
#---- Styles ------------------------------------------------------------------
|
||||
|
||||
#---- inTextField ----
|
||||
# for leading/trailing components in text fields
|
||||
|
||||
[style]ToggleButton.inTextField = $[style]Button.inTextField
|
||||
|
||||
[style]ToolBar.inTextField = \
|
||||
floatable: false; \
|
||||
opaque: false; \
|
||||
borderMargins: 0,0,0,0
|
||||
|
||||
[style]ToolBarSeparator.inTextField = \
|
||||
separatorWidth: 3
|
||||
|
||||
@@ -362,3 +362,19 @@ ToolTip.background = lighten(@background,3%)
|
||||
#---- Tree ----
|
||||
|
||||
Tree.hash = darken($Tree.background,10%)
|
||||
|
||||
|
||||
|
||||
#---- Styles ------------------------------------------------------------------
|
||||
|
||||
#---- inTextField ----
|
||||
# for leading/trailing components in text fields
|
||||
|
||||
[style]Button.inTextField = \
|
||||
focusable: false; \
|
||||
toolbar.margin: 1,1,1,1; \
|
||||
toolbar.spacingInsets: 1,1,1,1; \
|
||||
background: $TextField.background; \
|
||||
toolbar.hoverBackground: darken($TextField.background,4%,derived); \
|
||||
toolbar.pressedBackground: darken($TextField.background,8%,derived); \
|
||||
toolbar.selectedBackground: darken($TextField.background,12%,derived)
|
||||
|
||||
Reference in New Issue
Block a user