diff --git a/.gitattributes b/.gitattributes index d391aca0835..1c3c47a0c10 100644 --- a/.gitattributes +++ b/.gitattributes @@ -11201,8 +11201,6 @@ src/main/java/forge/view/home/QuestFileLister.java -text src/main/java/forge/view/home/QuestPreferencesHandler.java -text src/main/java/forge/view/home/SplashFrame.java -text src/main/java/forge/view/home/StartButton.java -text -src/main/java/forge/view/home/SubButton.java -text -src/main/java/forge/view/home/SubTab.java -text src/main/java/forge/view/home/ViewConstructed.java -text src/main/java/forge/view/home/ViewDraft.java -text src/main/java/forge/view/home/ViewQuest.java -text @@ -11238,6 +11236,8 @@ src/main/java/forge/view/toolbox/FScrollPane.java -text src/main/java/forge/view/toolbox/FSkin.java -text src/main/java/forge/view/toolbox/FTextArea.java -text src/main/java/forge/view/toolbox/FVerticalTabPanel.java -text +src/main/java/forge/view/toolbox/SubButton.java -text +src/main/java/forge/view/toolbox/SubTab.java -text src/main/java/forge/view/toolbox/package-info.java svneol=native#text/plain src/main/java/net/slightlymagic/braids/LICENSE.txt svneol=native#text/plain src/main/java/net/slightlymagic/braids/util/ClumsyRunnable.java svneol=native#text/plain diff --git a/src/main/java/forge/control/match/ControlField.java b/src/main/java/forge/control/match/ControlField.java index 03adab06ec6..22117e88fc6 100644 --- a/src/main/java/forge/control/match/ControlField.java +++ b/src/main/java/forge/control/match/ControlField.java @@ -153,29 +153,31 @@ public class ControlField { */ private void addZoneListeners() { // Graveyard card list button - this.view.getLblGraveyard().enableHover(); + this.view.getLblGraveyard().setHoverable(true); this.view.getLblGraveyard().removeMouseListener(maGraveyard); this.view.getLblGraveyard().addMouseListener(maGraveyard); // Exile card list button - this.view.getLblExile().enableHover(); + this.view.getLblExile().setHoverable(true); this.view.getLblExile().removeMouseListener(maExiled); this.view.getLblExile().addMouseListener(maExiled); // Library card list button if (Constant.Runtime.DEV_MODE[0]) { - this.view.getLblLibrary().enableHover(); this.view.getLblLibrary().removeMouseListener(maLibrary); this.view.getLblLibrary().addMouseListener(maLibrary); // Hand button - this.view.getLblHand().enableHover(); + this.view.getLblHand().setHoverable(true); + } + else { + this.view.getLblLibrary().setHoverable(false); } this.view.getLblHand().removeMouseListener(maHand); this.view.getLblHand().addMouseListener(maHand); // Flashback card list button - this.view.getLblFlashback().enableHover(); + this.view.getLblFlashback().setHoverable(true); this.view.getLblFlashback().removeMouseListener(maFlashback); this.view.getLblFlashback().addMouseListener(maFlashback); } @@ -184,22 +186,22 @@ public class ControlField { * Adds listeners to mana "pool" labels, for paying mana. */ private void addPoolListeners() { - this.view.getLblBlack().enableHover(); + this.view.getLblBlack().setHoverable(true); this.view.getLblBlack().removeMouseListener(maBlack); this.view.getLblBlack().addMouseListener(maBlack); - this.view.getLblBlue().enableHover(); + this.view.getLblBlue().setHoverable(true); this.view.getLblBlue().removeMouseListener(maBlue); this.view.getLblBlue().addMouseListener(maBlue); - this.view.getLblGreen().enableHover(); + this.view.getLblGreen().setHoverable(true); this.view.getLblGreen().removeMouseListener(maGreen); this.view.getLblGreen().addMouseListener(maGreen); - this.view.getLblRed().enableHover(); + this.view.getLblRed().setHoverable(true); this.view.getLblRed().removeMouseListener(maRed); this.view.getLblRed().addMouseListener(maRed); - this.view.getLblWhite().enableHover(); + this.view.getLblWhite().setHoverable(true); this.view.getLblWhite().removeMouseListener(maWhite); this.view.getLblWhite().addMouseListener(maWhite); - this.view.getLblColorless().enableHover(); + this.view.getLblColorless().setHoverable(true); this.view.getLblColorless().removeMouseListener(maColorless); this.view.getLblColorless().addMouseListener(maColorless); } diff --git a/src/main/java/forge/view/home/ViewConstructed.java b/src/main/java/forge/view/home/ViewConstructed.java index 313488ddfff..a7d8a23b696 100644 --- a/src/main/java/forge/view/home/ViewConstructed.java +++ b/src/main/java/forge/view/home/ViewConstructed.java @@ -15,6 +15,7 @@ import forge.view.toolbox.FList; import forge.view.toolbox.FProgressBar; import forge.view.toolbox.FScrollPane; import forge.view.toolbox.FSkin; +import forge.view.toolbox.SubButton; /** * Assembles swing components for "Constructed" mode menu. diff --git a/src/main/java/forge/view/home/ViewDraft.java b/src/main/java/forge/view/home/ViewDraft.java index 68f9b9abae1..878e10e33aa 100644 --- a/src/main/java/forge/view/home/ViewDraft.java +++ b/src/main/java/forge/view/home/ViewDraft.java @@ -29,6 +29,7 @@ import forge.view.toolbox.FPanel; import forge.view.toolbox.FProgressBar; import forge.view.toolbox.FScrollPane; import forge.view.toolbox.FSkin; +import forge.view.toolbox.SubButton; /** * Assembles swing components for "Draft" mode menu. diff --git a/src/main/java/forge/view/home/ViewQuest.java b/src/main/java/forge/view/home/ViewQuest.java index b671706e57d..783efff86ac 100644 --- a/src/main/java/forge/view/home/ViewQuest.java +++ b/src/main/java/forge/view/home/ViewQuest.java @@ -38,6 +38,8 @@ import forge.view.toolbox.FRoundedPanel; import forge.view.toolbox.FScrollPane; import forge.view.toolbox.FSkin; import forge.view.toolbox.FTextArea; +import forge.view.toolbox.SubButton; +import forge.view.toolbox.SubTab; /** * Populates Swing components of Quest mode in home screen. @@ -106,7 +108,7 @@ public class ViewQuest extends JScrollPane { pnlLoadQuest = new JPanel(); pnlPrefs = new JPanel(); - lblTitle = new FLabel("New Quest"); + lblTitle = new FLabel("New Quest", SwingConstants.CENTER); lblLife = new FLabel(); lblCredits = new FLabel(); lblWins = new FLabel(); @@ -144,7 +146,7 @@ public class ViewQuest extends JScrollPane { final String constraints = "w 90%!, gap 0 0 0 20px, alignx center"; pnlViewport.add(pnlTabber, constraints + ", h 20px!"); - pnlViewport.add(pnlTitle, constraints + ", h 60px!"); + pnlViewport.add(pnlTitle, constraints + ", h 7%:7%:60px"); pnlViewport.add(pnlStats, constraints); pnlViewport.add(pnlDuels, constraints); pnlViewport.add(pnlChallenges, constraints); @@ -205,7 +207,10 @@ public class ViewQuest extends JScrollPane { pnlTitle.setLayout(new MigLayout("insets 0, gap 0, align center")); pnlTitle.setBackground(skin.getColor(FSkin.Colors.CLR_THEME).darker()); ((FRoundedPanel) pnlTitle).setBorderColor(clrBorders); - pnlTitle.add(lblTitle, "h 70%!, gap 0 0 0 10%!"); + + ((FLabel) lblTitle).setFontScaleBy(SwingConstants.HORIZONTAL); + ((FLabel) lblTitle).setFontScaleFactor(0.035); + pnlTitle.add(lblTitle, "w 98%!, h 70%!, gap 0 0 15%! 15%!"); } /** Layout permanent parts of stats panel. */ @@ -415,31 +420,31 @@ public class ViewQuest extends JScrollPane { //========= TAB SHOW METHODS /** Display handler for duel tab click. */ public void showDuelsTab() { - control.updateTabber(tabDuels); - this.hideAllPanels(); - pnlTitle.setVisible(true); - - if (AllZone.getQuestData() == null) { - lblTitle.setText("Start a new Quest in the \"Quests\" tab."); - return; - } - - setCurrentDeckStatus(); - updateDuels(); - updateStats(); - lblTitle.setText("Duels: " + control.getRankString()); - - if (control.getCurrentDeck() != null) { - pnlStart.setVisible(true); - - // Select first event. - selectedOpponent = (SelectablePanel) pnlDuels.getComponent(0); - selectedOpponent.setBackground(skin.getColor(FSkin.Colors.CLR_ACTIVE)); - } - SwingUtilities.invokeLater(new Runnable() { @Override public void run() { + control.updateTabber(tabDuels); + hideAllPanels(); + pnlTitle.setVisible(true); + + if (AllZone.getQuestData() == null) { + lblTitle.setText("Start a new Quest in the \"Quests\" tab."); + return; + } + + setCurrentDeckStatus(); + updateDuels(); + updateStats(); + lblTitle.setText("Duels: " + control.getRankString()); + + if (control.getCurrentDeck() != null) { + pnlStart.setVisible(true); + + // Select first event. + selectedOpponent = (SelectablePanel) pnlDuels.getComponent(0); + selectedOpponent.setBackground(skin.getColor(FSkin.Colors.CLR_ACTIVE)); + } + pnlStats.setVisible(true); pnlDuels.setVisible(true); } @@ -449,7 +454,7 @@ public class ViewQuest extends JScrollPane { /** Display handler for duel tab click. */ public void showChallengesTab() { control.updateTabber(tabChallenges); - this.hideAllPanels(); + hideAllPanels(); pnlTitle.setVisible(true); if (AllZone.getQuestData() == null) { @@ -547,7 +552,6 @@ public class ViewQuest extends JScrollPane { FLabel lblIcon = new FLabel(); lblIcon.setIconScaleFactor(1); - lblIcon.setForeground(skin.getColor(FSkin.Colors.CLR_TEXT)); if (!file.exists()) { lblIcon.setIcon(skin.getIcon(FSkin.ForgeIcons.ICO_UNKNOWN)); } @@ -556,22 +560,6 @@ public class ViewQuest extends JScrollPane { } this.add(lblIcon, "h 60px!, w 60px!, gap 10px 10px 10px 0, span 1 2"); - // Name - final FLabel lblName = new FLabel(event.getTitle() + ": " + event.getDifficulty()); - lblName.setFontScaleFactor(0.6); - this.add(lblName, "h 31px!, gap 0 0 10px 5px, wrap"); - - // Description - final FTextArea tarDesc = new FTextArea(); - tarDesc.setText(event.getDescription()); - tarDesc.setFont(skin.getItalicFont(12)); - this.add(tarDesc, "w 80%!, h 30px!"); - - this.setToolTipText("" + event.getTitle() - + ": " + event.getDifficulty() - + "
" + event.getDescription() - + ""); - this.addMouseListener(new MouseAdapter() { @Override public void mouseReleased(MouseEvent e) { @@ -599,6 +587,18 @@ public class ViewQuest extends JScrollPane { } } }); + + // Name + final FLabel lblName = new FLabel(event.getTitle() + ": " + event.getDifficulty()); + lblName.setFontScaleFactor(0.6); + lblName.setHoverable(false); + this.add(lblName, "h 31px!, gap 0 0 10px 5px, wrap"); + + // Description + final FTextArea tarDesc = new FTextArea(); + tarDesc.setText(event.getDescription()); + tarDesc.setFont(skin.getItalicFont(12)); + this.add(tarDesc, "w 80%!, h 30px!"); } /** @return QuestEvent */ diff --git a/src/main/java/forge/view/home/ViewSealed.java b/src/main/java/forge/view/home/ViewSealed.java index 86682d22e11..10982d584dc 100644 --- a/src/main/java/forge/view/home/ViewSealed.java +++ b/src/main/java/forge/view/home/ViewSealed.java @@ -13,6 +13,7 @@ import forge.view.toolbox.DeckLister; import forge.view.toolbox.FProgressBar; import forge.view.toolbox.FScrollPane; import forge.view.toolbox.FSkin; +import forge.view.toolbox.SubButton; /** * Assembles swing components for "Sealed" mode menu. diff --git a/src/main/java/forge/view/home/ViewSettings.java b/src/main/java/forge/view/home/ViewSettings.java index cac21695848..e5b25dec7a0 100644 --- a/src/main/java/forge/view/home/ViewSettings.java +++ b/src/main/java/forge/view/home/ViewSettings.java @@ -43,6 +43,7 @@ import forge.view.toolbox.FLabel; import forge.view.toolbox.FList; import forge.view.toolbox.FScrollPane; import forge.view.toolbox.FSkin; +import forge.view.toolbox.SubButton; /** * Assembles swing components for "Settings" mode menu. diff --git a/src/main/java/forge/view/home/ViewUtilities.java b/src/main/java/forge/view/home/ViewUtilities.java index 5f9de27a417..ca9c3336480 100644 --- a/src/main/java/forge/view/home/ViewUtilities.java +++ b/src/main/java/forge/view/home/ViewUtilities.java @@ -20,6 +20,7 @@ import forge.view.toolbox.FButton; import forge.view.toolbox.FOverlay; import forge.view.toolbox.FPanel; import forge.view.toolbox.FSkin; +import forge.view.toolbox.SubButton; /** * Assembles swing components for "Utilities" mode menu. diff --git a/src/main/java/forge/view/match/ViewField.java b/src/main/java/forge/view/match/ViewField.java index 5745c998404..58f951feb35 100644 --- a/src/main/java/forge/view/match/ViewField.java +++ b/src/main/java/forge/view/match/ViewField.java @@ -19,7 +19,6 @@ package forge.view.match; import java.awt.Color; import java.awt.Graphics; -import java.awt.Graphics2D; import java.awt.Image; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; @@ -672,12 +671,6 @@ public class ViewField extends FRoundedPanel { // difficulties in displaying the desired "flat" background and // also strange icon/action behavior. public class DetailLabel extends FLabel { - private boolean hover = false; - private final MouseAdapter madHover; - private int w, h, iw, ih; - private final Image img; - private Graphics2D g2d; - /** * Instance of JLabel detailing info about field: has icon and optional * hover effect. @@ -692,53 +685,11 @@ public class ViewField extends FRoundedPanel { this.setOpaque(false); this.setFontScaleFactor(0.5); - this.setBackground(clrHover); - img = skin.getImage(s0); - iw = img.getWidth(null); - ih = img.getHeight(null); + this.setIconScaleFactor(0.8); + this.setIconInBackground(true); + this.setIcon(new ImageIcon(skin.getImage(s0))); - // Hover effect - this.madHover = new MouseAdapter() { - @Override - public void mouseEntered(final MouseEvent e) { hover = true; repaint(); } - - @Override - public void mouseExited(final MouseEvent e) { hover = false; repaint(); } - }; - - this.enableHover(); - //this.clrBorders = ViewField.this.transparent; - } - - /** Enable hover effects for this label. */ - public void enableHover() { - this.disableHover(); - this.addMouseListener(this.madHover); - } - - /** Disable hover effects for this label. */ - public void disableHover() { - this.removeMouseListener(this.madHover); - } - - /* - * (non-Javadoc) - * - * @see javax.swing.JComponent#paintComponent(java.awt.Graphics) - */ - @Override - protected void paintComponent(final Graphics g) { - this.h = this.getHeight(); - this.w = this.getWidth(); - this.g2d = (Graphics2D) g.create(); - - if (hover) { - g2d.setColor(clrHover); - g2d.fillRect(0, 0, w, h); - } - - g2d.drawImage(img, 3, 5, h - 12, h - 10, 0, 0, iw, ih, null); - super.paintComponent(g); + this.setHoverable(true); } } diff --git a/src/main/java/forge/view/toolbox/FLabel.java b/src/main/java/forge/view/toolbox/FLabel.java index b6a5ae672f3..c70a63a1e1d 100644 --- a/src/main/java/forge/view/toolbox/FLabel.java +++ b/src/main/java/forge/view/toolbox/FLabel.java @@ -1,15 +1,21 @@ package forge.view.toolbox; +import java.awt.Color; import java.awt.Font; +import java.awt.Graphics; +import java.awt.Graphics2D; import java.awt.Image; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.SwingConstants; +import forge.Command; import forge.Singletons; /** @@ -23,13 +29,32 @@ import forge.Singletons; public class FLabel extends JLabel { private final FSkin skin; private final ComponentAdapter cadResize; - private boolean scaleAuto; - private double fontScaleFactor = 0.6; - private double iconScaleFactor = 0.8; - private double aspectRatio; - private Image img = null; - private int w, h; - private int fontStyle = Font.PLAIN; + private final MouseAdapter madEvents; + private final Color clrText, clrBorders, clrHover, clrInactive, clrActive; + + private boolean fontScaleAuto; + private boolean iconScaleAuto; + + private int fontScaleBy; + + private boolean iconInBackground; + private boolean opaque; + + private boolean selectable; + private boolean selected; + private boolean hoverable; + private boolean hovered; + + private double fontScaleFactor; + private double iconScaleFactor; + + private Image img; + private Graphics2D g2d; + private Command cmdClick; + private int x, y, w, h, iw, ih, sw, sh, ref; + private double iar; + + private int fontStyle; /** */ public FLabel() { @@ -64,60 +89,98 @@ public class FLabel extends JLabel { public FLabel(final String s0) { super(s0); this.skin = Singletons.getView().getSkin(); - this.setForeground(skin.getColor(FSkin.Colors.CLR_TEXT)); + // Final inits + this.clrText = skin.getColor(FSkin.Colors.CLR_TEXT); + this.clrBorders = skin.getColor(FSkin.Colors.CLR_BORDERS); + this.clrHover = skin.getColor(FSkin.Colors.CLR_HOVER); + this.clrActive = skin.getColor(FSkin.Colors.CLR_ACTIVE); + this.clrInactive = skin.getColor(FSkin.Colors.CLR_INACTIVE); + + // Custom properties + this.fontScaleAuto = true; + this.fontScaleFactor = 0.6; + this.iconScaleAuto = true; + this.iconScaleFactor = 0.8; + this.selectable = false; + this.selected = false; + this.hoverable = false; + this.hovered = false; + this.fontScaleBy = SwingConstants.VERTICAL; + this.fontStyle = Font.PLAIN; + this.iconInBackground = false; + + // Default properties + this.setForeground(clrText); + this.setBackground(clrInactive); this.setVerticalTextPosition(SwingConstants.CENTER); this.setVerticalAlignment(SwingConstants.CENTER); + // Resize adapter this.cadResize = new ComponentAdapter() { @Override public void componentResized(ComponentEvent e) { - switch (fontStyle) { - case Font.BOLD: - setFont(skin.getBoldFont((int) (getHeight() * fontScaleFactor))); - break; - case Font.ITALIC: - setFont(skin.getItalicFont((int) (getHeight() * fontScaleFactor))); - break; - default: - setFont(skin.getFont((int) (getHeight() * fontScaleFactor))); + if (fontScaleAuto) { + ref = (fontScaleBy == SwingConstants.VERTICAL ? getHeight() : getWidth()); + switch (fontStyle) { + case Font.BOLD: + setFont(skin.getBoldFont((int) (ref * fontScaleFactor))); + repaint(); + break; + case Font.ITALIC: + setFont(skin.getItalicFont((int) (ref * fontScaleFactor))); + break; + default: + setFont(skin.getFont((int) (ref * fontScaleFactor))); + } } - if (img == null) { return; } - aspectRatio = img.getWidth(null) / img.getHeight(null); - h = (int) (getHeight() * iconScaleFactor); - w = (int) (h * aspectRatio * iconScaleFactor); - if (w == 0 || h == 0) { return; } + // Non-background icon + if (img != null && iconScaleAuto && !iconInBackground) { + h = (int) (getHeight() * iconScaleFactor); + w = (int) (h * iar * iconScaleFactor); + if (w == 0 || h == 0) { return; } - FLabel.super.setIcon(new ImageIcon(img.getScaledInstance(w, h, Image.SCALE_SMOOTH))); + FLabel.super.setIcon(new ImageIcon(img.getScaledInstance(w, h, Image.SCALE_SMOOTH))); + } } }; + this.removeComponentListener(cadResize); + this.addComponentListener(cadResize); - this.setScaleAuto(true); + this.madEvents = new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { hovered = true; repaint(); } + @Override + public void mouseExited(MouseEvent e) { hovered = false; repaint(); } + @Override + public void mouseClicked(MouseEvent e) { + if (!selectable) { return; } + selected = (selected ? false : true); repaint(); + cmdClick.execute(); + } + }; + } + + /** @param b0   boolean */ + public void setHoverable(boolean b0) { + if (!b0) { this.removeMouseListener(madEvents); } + else { this.addMouseListener(madEvents); } + } + + /** @param b0   boolean */ + public void setSelectable(boolean b0) { + this.selectable = b0; + } + + /** @param d0   Scale factor for font size relative to label height, percent. + * If your font is "blowing up", try setting an explicity height/width for this label. */ + public void setFontScaleFactor(final double d0) { + this.fontScaleFactor = d0; } /** @param b0   {@link java.lang.boolean} */ - public void setScaleAuto(final boolean b0) { - this.scaleAuto = b0; - if (scaleAuto) { - this.addComponentListener(cadResize); - } - else { - this.removeComponentListener(cadResize); - } - } - - /** - * Sets whether bold or italic font should be used for this label. - * - * @param i0   Font.BOLD or Font.ITALIC - */ - public void setFontStyle(int i0) { - this.fontStyle = i0; - } - - /** @param d0   Scale factor for font size relative to label height, percent. */ - public void setFontScaleFactor(final double d0) { - this.fontScaleFactor = d0; + public void setFontScaleAuto(final boolean b0) { + this.fontScaleAuto = b0; } /** @param d0   Scale factor for icon size relative to label height, percent. */ @@ -125,22 +188,102 @@ public class FLabel extends JLabel { this.iconScaleFactor = d0; } - /** @return {@link java.lang.boolean} */ - public boolean isScaleAuto() { - return this.scaleAuto; + /** @param b0   Font drawn in background, or positioned by default. */ + public void setIconInBackground(final boolean b0) { + this.iconInBackground = b0; + // Reset icon in case this method has been called after setIcon(). + if (b0 && img != null) { setIcon(new ImageIcon(img)); } + } + + /** @param b0   {@link java.lang.boolean} */ + public void setIconScaleAuto(final boolean b0) { + this.iconScaleAuto = b0; + // Reset icon in case this method has been called after setIcon(). + if (!b0 && img != null) { setIcon(new ImageIcon(img)); } + } + + /** @param i0   int, must be SwingConstants.HORIZONTAL or VERTICAL */ + public void setFontScaleBy(int i0) { + if (i0 != SwingConstants.HORIZONTAL && i0 != SwingConstants.VERTICAL) { + throw new IllegalArgumentException("FLabel$setScaleBy " + + "must be passed either SwingConstants.HORIZONTAL " + + "or SwingConstants.VERTICAL."); + } + + this.fontScaleBy = i0; + } + + /** @param i0   must be Font.PLAIN, Font.BOLD, Font.ITALIC */ + public void setFontStyle(int i0) { + if (i0 != Font.PLAIN && i0 != Font.BOLD && i0 != Font.ITALIC) { + throw new IllegalArgumentException("FLabel$setFontStyle " + + "must be passed either Font.PLAIN, Font.BOLD, or Font.ITALIC."); + } + this.fontStyle = i0; } @Override public void setIcon(final Icon i0) { - if (scaleAuto) { - // Setting the icon in the usual way leads to scaling problems. - // So, only the image is saved, and scaled along with the font - // in the resize adapter. - if (i0 == null) { return; } - this.img = ((ImageIcon) i0).getImage(); - } - else { - super.setIcon(i0); + if (i0 == null) { return; } + // Will need image (not icon) for scaled and non-scaled. + if (iconInBackground) { this.img = ((ImageIcon) i0).getImage(); } + // Will need image if not in background, but scaled. + else if (iconScaleAuto) { this.img = ((ImageIcon) i0).getImage(); } + // If not in background, not scaled, can use original icon. + else { super.setIcon(i0); } + + if (img != null) { + iw = img.getWidth(null); + ih = img.getHeight(null); + iar = ((double) iw) / ((double) ih); } } + + /** @param c0   {@link forge.Command} on click */ + public void setCommand(Command c0) { + this.cmdClick = c0; + } + + @Override + public void setOpaque(final boolean b0) { + // Must be overridden to allow drawing order of background, icon, string + this.opaque = b0; + super.setOpaque(false); + } + + @Override + public void paintComponent(Graphics g) { + g2d = (Graphics2D) g.create(); + w = getWidth(); + h = getHeight(); + + // Opacity, select + if (this.opaque && !selected) { + g2d.setColor(clrInactive); + g2d.fillRect(0, 0, w, h); + } + else if (selectable && selected) { + g2d.setColor(clrActive); + g2d.fillRect(0, 0, w, h); + } + // Hover + if (hoverable && hovered && !selected) { + g2d.setColor(clrHover); + g2d.fillRect(0, 0, w, h); + g2d.setColor(clrBorders); + g2d.drawRect(0, 0, w - 1, h - 1); + } + + // Icon in background + if (iconInBackground) { + x = 3; + sh = (int) ((h - 2 * x) * iconScaleFactor); + sw = (int) (sh * iar); + y = (int) ((h - sh) / 2); + + g2d.drawImage(img, x, y, sw + x, sh + y, 0, 0, iw, ih, null); + } + + super.paintComponent(g); + } } diff --git a/src/main/java/forge/view/home/SubButton.java b/src/main/java/forge/view/toolbox/SubButton.java similarity index 76% rename from src/main/java/forge/view/home/SubButton.java rename to src/main/java/forge/view/toolbox/SubButton.java index 579a135c478..7f63afb42b0 100644 --- a/src/main/java/forge/view/home/SubButton.java +++ b/src/main/java/forge/view/toolbox/SubButton.java @@ -1,4 +1,4 @@ -package forge.view.home; +package forge.view.toolbox; import java.awt.Color; import java.awt.Graphics; @@ -12,7 +12,6 @@ import javax.swing.SwingConstants; import javax.swing.border.LineBorder; import forge.Singletons; -import forge.view.toolbox.FSkin; /** * Standard button used for for submenus on the home screen. @@ -21,6 +20,8 @@ import forge.view.toolbox.FSkin; @SuppressWarnings("serial") public class SubButton extends JButton { private FSkin skin; + private final Color clrHover, clrInactive; + /** */ public SubButton() { this(""); @@ -34,20 +35,23 @@ public class SubButton extends JButton { */ public SubButton(String txt0) { super(txt0); - skin = Singletons.getView().getSkin(); + this.skin = Singletons.getView().getSkin(); + this.clrHover = skin.getColor(FSkin.Colors.CLR_HOVER); + this.clrInactive = skin.getColor(FSkin.Colors.CLR_INACTIVE); + setBorder(new LineBorder(skin.getColor(FSkin.Colors.CLR_BORDERS), 1)); - setBackground(skin.getColor(FSkin.Colors.CLR_INACTIVE)); + setBackground(clrInactive); setForeground(skin.getColor(FSkin.Colors.CLR_TEXT)); setVerticalTextPosition(SwingConstants.CENTER); setFocusPainted(false); this.addMouseListener(new MouseAdapter() { public void mouseEntered(MouseEvent e) { - if (isEnabled()) { setBackground(skin.getColor(FSkin.Colors.CLR_HOVER)); } + if (isEnabled() && !isSelected()) { setBackground(clrHover); } } public void mouseExited(MouseEvent e) { - if (isEnabled()) { setBackground(skin.getColor(FSkin.Colors.CLR_INACTIVE)); } + if (isEnabled() && !isSelected()) { setBackground(clrInactive); } } }); @@ -70,6 +74,11 @@ public class SubButton extends JButton { else { setBackground(new Color(220, 220, 220)); } } + @Override + public void setSelected(boolean b0) { + super.setSelected(b0); + } + @Override public void paintComponent(Graphics g) { g.setColor(getBackground()); diff --git a/src/main/java/forge/view/home/SubTab.java b/src/main/java/forge/view/toolbox/SubTab.java similarity index 94% rename from src/main/java/forge/view/home/SubTab.java rename to src/main/java/forge/view/toolbox/SubTab.java index 6e4e6e6c84b..871d6e17a18 100644 --- a/src/main/java/forge/view/home/SubTab.java +++ b/src/main/java/forge/view/toolbox/SubTab.java @@ -1,4 +1,4 @@ -package forge.view.home; +package forge.view.toolbox; import java.awt.Color; import java.awt.Cursor; @@ -10,7 +10,6 @@ import javax.swing.JLabel; import javax.swing.JPanel; import forge.Singletons; -import forge.view.toolbox.FSkin; /** Standardized tab for submenus in home screen. */ public class SubTab extends JPanel {