mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-16 02:38:02 +00:00
Big update to FLabel, allowing auto icon resize, font resizing per axis, resize toggling, hover toggle, select toggle, and command execution ability.
This commit is contained in:
4
.gitattributes
vendored
4
.gitattributes
vendored
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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("<html>" + event.getTitle()
|
||||
+ ": " + event.getDifficulty()
|
||||
+ "<br>" + event.getDescription()
|
||||
+ "</html>");
|
||||
|
||||
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 */
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
@@ -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 {
|
||||
Reference in New Issue
Block a user