Merge pull request #58 from CapslockRSPS/master
[FEATURE] Rewritten the login UI to provide a more clean UI
@@ -121,4 +121,5 @@ parabotv2
|
|||||||
releases
|
releases
|
||||||
._*
|
._*
|
||||||
|
|
||||||
Test.java
|
Test.java
|
||||||
|
*.DS_Store
|
||||||
@@ -96,6 +96,17 @@
|
|||||||
</resources>
|
</resources>
|
||||||
|
|
||||||
<plugins>
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-resources-plugin</artifactId>
|
||||||
|
<version>2.5</version>
|
||||||
|
<configuration>
|
||||||
|
<encoding>UTF-8</encoding>
|
||||||
|
<nonFilteredFileExtensions>
|
||||||
|
<nonFilteredFileExtension>ttf</nonFilteredFileExtension>
|
||||||
|
</nonFilteredFileExtensions>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
|||||||
@@ -26,4 +26,7 @@ public class Configuration {
|
|||||||
public static final String BUGSNAG_API = "d79752cf94dd4beb24c3d312a8609f53";
|
public static final String BUGSNAG_API = "d79752cf94dd4beb24c3d312a8609f53";
|
||||||
|
|
||||||
public static final Version BOT_VERSION = ProjectProperties.getProjectVersion();
|
public static final Version BOT_VERSION = ProjectProperties.getProjectVersion();
|
||||||
|
|
||||||
|
public static final String BOT_TITLE = "Parabot";
|
||||||
|
public static final String BOT_SLOGAN = "The best RuneScape private server bot";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ public class ServerSelector extends JPanel {
|
|||||||
|
|
||||||
|
|
||||||
setLayout(new BorderLayout());
|
setLayout(new BorderLayout());
|
||||||
setPreferredSize(new Dimension(600, 400));
|
setPreferredSize(new Dimension(600, 350));
|
||||||
|
|
||||||
JPanel interior = new JPanel(null);
|
JPanel interior = new JPanel(null);
|
||||||
|
|
||||||
@@ -66,8 +66,7 @@ public class ServerSelector extends JPanel {
|
|||||||
.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
|
.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
|
||||||
scrlInterior
|
scrlInterior
|
||||||
.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
|
.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
|
||||||
|
add(scrlInterior);
|
||||||
add(scrlInterior, BorderLayout.CENTER);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,250 +1,291 @@
|
|||||||
package org.parabot.core.ui.components;
|
package org.parabot.core.ui.components;
|
||||||
|
|
||||||
|
import org.parabot.core.Configuration;
|
||||||
import org.parabot.core.Core;
|
import org.parabot.core.Core;
|
||||||
import org.parabot.core.forum.AccountManager;
|
import org.parabot.core.forum.AccountManager;
|
||||||
import org.parabot.core.forum.AccountManagerAccess;
|
import org.parabot.core.forum.AccountManagerAccess;
|
||||||
import org.parabot.core.io.ProgressListener;
|
import org.parabot.core.io.ProgressListener;
|
||||||
import org.parabot.core.ui.ServerSelector;
|
import org.parabot.core.ui.ServerSelector;
|
||||||
import org.parabot.core.ui.images.Images;
|
import org.parabot.core.ui.images.Images;
|
||||||
|
import org.parabot.core.ui.fonts.Fonts;
|
||||||
import org.parabot.core.ui.utils.UILog;
|
import org.parabot.core.ui.utils.UILog;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
import java.awt.event.ActionListener;
|
import java.awt.event.ActionListener;
|
||||||
|
import java.awt.geom.Line2D;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.awt.image.RescaleOp;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An informative JPanel which tells the user what bot is doing
|
* An informative JPanel which tells the user what bot is doing
|
||||||
*
|
|
||||||
* @author Everel
|
|
||||||
*
|
*
|
||||||
|
* @author Everel
|
||||||
*/
|
*/
|
||||||
public class VerboseLoader extends JPanel implements ProgressListener {
|
public class VerboseLoader extends JPanel implements ProgressListener {
|
||||||
private static final long serialVersionUID = 7412412644921803896L;
|
private static final long serialVersionUID = 7412412644921803896L;
|
||||||
private static VerboseLoader current;
|
private static VerboseLoader current;
|
||||||
private static String state = "Initializing loader...";
|
private static String state = "Initializing loader...";
|
||||||
|
|
||||||
public static final int STATE_AUTHENTICATION = 0;
|
|
||||||
public static final int STATE_LOADING = 1;
|
|
||||||
public static final int STATE_SERVER_SELECT = 2;
|
|
||||||
private int currentState;
|
|
||||||
|
|
||||||
private static AccountManager manager;
|
|
||||||
|
|
||||||
private FontMetrics fontMetrics;
|
|
||||||
private BufferedImage background;
|
|
||||||
private ProgressBar progressBar;
|
|
||||||
private JPanel loginPanel;
|
|
||||||
|
|
||||||
public static final AccountManagerAccess MANAGER_FETCHER = new AccountManagerAccess() {
|
|
||||||
|
|
||||||
@Override
|
private static final int STATE_AUTHENTICATION = 0;
|
||||||
public final void setManager(AccountManager manager) {
|
public static final int STATE_LOADING = 1;
|
||||||
VerboseLoader.manager = manager;
|
private static final int STATE_SERVER_SELECT = 2;
|
||||||
}
|
private int currentState;
|
||||||
|
|
||||||
};
|
private static AccountManager manager;
|
||||||
|
|
||||||
private VerboseLoader(String username, String password) {
|
private FontMetrics fontMetrics;
|
||||||
if(current != null) {
|
private BufferedImage background, banner, loginBox;
|
||||||
throw new IllegalStateException("MainScreenComponent already made.");
|
private ProgressBar progressBar;
|
||||||
}
|
private JPanel loginPanel;
|
||||||
current = this;
|
|
||||||
this.background = Images.getResource("/storage/images/background.png");
|
|
||||||
this.progressBar = new ProgressBar(400, 20);
|
|
||||||
setLayout(new GridBagLayout());
|
|
||||||
setSize(775, 510);
|
|
||||||
setPreferredSize(new Dimension(775, 510));
|
|
||||||
setDoubleBuffered(true);
|
|
||||||
setOpaque(false);
|
|
||||||
|
|
||||||
if(username != null && password != null) {
|
|
||||||
if(Core.inDebugMode() || manager.login(username, password, false)) {
|
|
||||||
currentState = STATE_SERVER_SELECT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(currentState == STATE_AUTHENTICATION) {
|
|
||||||
addLoginPanel();
|
|
||||||
} else if(currentState == STATE_SERVER_SELECT) {
|
|
||||||
addServerPanel();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addServerPanel() {
|
|
||||||
JPanel servers = ServerSelector.getInstance();
|
|
||||||
add(servers, new GridBagConstraints());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addLoginPanel() {
|
|
||||||
loginPanel = new JPanel();
|
|
||||||
loginPanel.setOpaque(false);
|
|
||||||
|
|
||||||
loginPanel.setLayout(new BoxLayout(loginPanel, BoxLayout.Y_AXIS));
|
|
||||||
|
|
||||||
Font labelFont = new Font("Times New Roman", Font.PLAIN, 11);
|
|
||||||
|
|
||||||
JLabel usernameLabel = new JLabel("Username");
|
|
||||||
usernameLabel.setFont(labelFont);
|
|
||||||
usernameLabel.setAlignmentX(Box.CENTER_ALIGNMENT);
|
|
||||||
usernameLabel.setForeground(Color.white);
|
|
||||||
|
|
||||||
final JTextField userInput = new JTextField(25);
|
|
||||||
final JTextField passInput = new JPasswordField(25);
|
|
||||||
userInput.addActionListener(new ActionListener() {
|
|
||||||
|
|
||||||
@Override
|
public static final AccountManagerAccess MANAGER_FETCHER = new AccountManagerAccess() {
|
||||||
public void actionPerformed(ActionEvent e) {
|
|
||||||
passInput.requestFocus();
|
@Override
|
||||||
}
|
public final void setManager(AccountManager manager) {
|
||||||
|
VerboseLoader.manager = manager;
|
||||||
});
|
}
|
||||||
userInput.setFont(labelFont);
|
|
||||||
userInput.setAlignmentX(Box.CENTER_ALIGNMENT);
|
};
|
||||||
userInput.setMaximumSize(userInput.getPreferredSize());
|
|
||||||
|
private VerboseLoader(String username, String password) {
|
||||||
final JButton login = new JButton("Login");
|
if (current != null) {
|
||||||
|
throw new IllegalStateException("MainScreenComponent already made.");
|
||||||
passInput.setAlignmentX(Box.CENTER_ALIGNMENT);
|
}
|
||||||
passInput.setMaximumSize(userInput.getPreferredSize());
|
current = this;
|
||||||
|
this.background = Images.getResource("/storage/images/background.png");
|
||||||
|
this.banner = Images.getResource("/storage/images/logo.png");
|
||||||
|
this.loginBox = Images.getResource("/storage/images/login.png");
|
||||||
|
this.progressBar = new ProgressBar(400, 20);
|
||||||
|
setLayout(new GridBagLayout());
|
||||||
|
setSize(775, 510);
|
||||||
|
setPreferredSize(new Dimension(775, 510));
|
||||||
|
setDoubleBuffered(true);
|
||||||
|
setOpaque(false);
|
||||||
|
|
||||||
|
if (username != null && password != null) {
|
||||||
|
if (Core.inDebugMode() || manager.login(username, password, false)) {
|
||||||
|
currentState = STATE_SERVER_SELECT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentState == STATE_AUTHENTICATION) {
|
||||||
|
addLoginPanel();
|
||||||
|
} else if (currentState == STATE_SERVER_SELECT) {
|
||||||
|
addServerPanel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addServerPanel() {
|
||||||
|
JPanel servers = ServerSelector.getInstance();
|
||||||
|
GridBagLayout bagLayout = (GridBagLayout) getLayout();
|
||||||
|
GridBagConstraints c = new GridBagConstraints();
|
||||||
|
|
||||||
|
c.weightx = 1;
|
||||||
|
c.weighty = 1;
|
||||||
|
c.gridx = 0;
|
||||||
|
c.gridy = 0;
|
||||||
|
c.anchor = GridBagConstraints.SOUTH;
|
||||||
|
c.insets = new Insets(0, 0, 25, 0);
|
||||||
|
|
||||||
|
bagLayout.setConstraints(servers, c);
|
||||||
|
add(servers);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addLoginPanel() {
|
||||||
|
loginPanel = new JPanel();
|
||||||
|
loginPanel.setOpaque(false);
|
||||||
|
|
||||||
|
loginPanel.setLayout(new BoxLayout(loginPanel, BoxLayout.Y_AXIS));
|
||||||
|
|
||||||
|
Font labelFont = Fonts.getResource("leelawadee.ttf");
|
||||||
|
|
||||||
|
JLabel usernameLabel = new JLabel("Username");
|
||||||
|
usernameLabel.setFont(labelFont);
|
||||||
|
usernameLabel.setAlignmentX(Box.CENTER_ALIGNMENT);
|
||||||
|
usernameLabel.setForeground(Color.white);
|
||||||
|
|
||||||
|
final JTextField userInput = new JTextField(20);
|
||||||
|
final JTextField passInput = new JPasswordField(20);
|
||||||
|
userInput.addActionListener(new ActionListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
passInput.requestFocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
userInput.setFont(labelFont);
|
||||||
|
userInput.setAlignmentX(Box.CENTER_ALIGNMENT);
|
||||||
|
userInput.setMaximumSize(userInput.getPreferredSize());
|
||||||
|
|
||||||
|
final JButton login = new JButton("Login");
|
||||||
|
|
||||||
|
passInput.setAlignmentX(Box.CENTER_ALIGNMENT);
|
||||||
|
passInput.setMaximumSize(userInput.getPreferredSize());
|
||||||
passInput.setPreferredSize(new Dimension(userInput.getWidth(), 20));
|
passInput.setPreferredSize(new Dimension(userInput.getWidth(), 20));
|
||||||
passInput.addActionListener(new ActionListener() {
|
passInput.addActionListener(new ActionListener() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
login.doClick();
|
login.doClick();
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
JLabel passwordLabel = new JLabel("Password");
|
|
||||||
passwordLabel.setFont(labelFont);
|
|
||||||
passwordLabel.setAlignmentX(Box.CENTER_ALIGNMENT);
|
|
||||||
passwordLabel.setForeground(Color.white);
|
|
||||||
|
|
||||||
|
|
||||||
login.setAlignmentX(Box.CENTER_ALIGNMENT);
|
|
||||||
login.setOpaque(false);
|
|
||||||
|
|
||||||
login.addActionListener(new ActionListener() {
|
|
||||||
|
|
||||||
@Override
|
JLabel passwordLabel = new JLabel("Password");
|
||||||
public void actionPerformed(ActionEvent e) {
|
passwordLabel.setFont(labelFont);
|
||||||
if(manager.login(userInput.getText(), passInput.getText(), false)) {
|
passwordLabel.setAlignmentX(Box.CENTER_ALIGNMENT);
|
||||||
switchState(STATE_SERVER_SELECT);
|
passwordLabel.setForeground(Color.white);
|
||||||
} else {
|
|
||||||
Core.verbose("Failed to log in.");
|
|
||||||
UILog.log("Error", "Incorrect username or password. Have you tried logging into http://bdn.parabot.org/account/", JOptionPane.ERROR_MESSAGE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
loginPanel.add(Box.createRigidArea(new Dimension(0, 5)));
|
|
||||||
loginPanel.add(usernameLabel);
|
|
||||||
loginPanel.add(Box.createRigidArea(new Dimension(0, 5)));
|
|
||||||
loginPanel.add(userInput);
|
|
||||||
loginPanel.add(Box.createRigidArea(new Dimension(0, 5)));
|
|
||||||
loginPanel.add(passwordLabel);
|
|
||||||
loginPanel.add(Box.createRigidArea(new Dimension(0, 5)));
|
|
||||||
loginPanel.add(passInput);
|
|
||||||
loginPanel.add(Box.createRigidArea(new Dimension(0, 5)));
|
|
||||||
loginPanel.add(login);
|
|
||||||
loginPanel.add(Box.createRigidArea(new Dimension(0, 5)));
|
|
||||||
|
|
||||||
add(loginPanel, new GridBagConstraints());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void switchState(int state) {
|
|
||||||
removeAll();
|
|
||||||
if(state == STATE_AUTHENTICATION) {
|
|
||||||
addLoginPanel();
|
|
||||||
} else if(state == STATE_SERVER_SELECT) {
|
|
||||||
addServerPanel();
|
|
||||||
}
|
|
||||||
this.currentState = state;
|
|
||||||
revalidate();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
login.setAlignmentX(Box.CENTER_ALIGNMENT);
|
||||||
* Paints on this panel
|
login.setOpaque(false);
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void paintComponent(Graphics graphics) {
|
|
||||||
super.paintComponent(graphics);
|
|
||||||
|
|
||||||
|
|
||||||
Graphics2D g = (Graphics2D) graphics;
|
|
||||||
g.setRenderingHint(
|
|
||||||
RenderingHints.KEY_TEXT_ANTIALIASING,
|
|
||||||
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
|
|
||||||
|
|
||||||
g.drawImage(background, 0, 0, null);
|
|
||||||
|
|
||||||
if (fontMetrics == null) {
|
|
||||||
fontMetrics = g.getFontMetrics();
|
|
||||||
}
|
|
||||||
|
|
||||||
if(currentState == STATE_AUTHENTICATION) {
|
|
||||||
g.setColor(new Color(74, 74, 72, 100));
|
|
||||||
g.fillRect(loginPanel.getX() - 10, loginPanel.getY(), loginPanel.getWidth() + 20, loginPanel.getHeight());
|
|
||||||
g.setColor(Color.black);
|
|
||||||
g.drawRect(loginPanel.getX() - 10, loginPanel.getY(), loginPanel.getWidth() + 20, loginPanel.getHeight());
|
|
||||||
}
|
|
||||||
|
|
||||||
g.setColor(Color.white);
|
|
||||||
|
|
||||||
if(currentState == STATE_LOADING) {
|
|
||||||
progressBar.draw(g, (getWidth() / 2) - 200, 220);
|
|
||||||
g.setFont(new Font("Times New Roman", Font.PLAIN, 14));
|
|
||||||
int x = (getWidth() / 2) - (fontMetrics.stringWidth(state) / 2);
|
|
||||||
g.drawString(state, x, 200);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
g.setFont(new Font("Times New Roman", Font.PLAIN, 12));
|
|
||||||
final String version = "v2.1";
|
|
||||||
g.drawString(version,
|
|
||||||
getWidth() - g.getFontMetrics().stringWidth(version) - 10,
|
|
||||||
getHeight() - 12);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
login.addActionListener(new ActionListener() {
|
||||||
* Gets instance of this panel
|
|
||||||
* @return instance of this panel
|
|
||||||
*/
|
|
||||||
public static VerboseLoader get(String username, String password) {
|
|
||||||
return current == null ? new VerboseLoader(username, password) : current;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets instance of this panel
|
|
||||||
* @return instance of this panel
|
|
||||||
*/
|
|
||||||
public static VerboseLoader get() {
|
|
||||||
return current == null ? new VerboseLoader(null, null) : current;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* Updates the status message and repaints the panel
|
public void actionPerformed(ActionEvent e) {
|
||||||
* @param message
|
if (manager.login(userInput.getText(), passInput.getText(), false)) {
|
||||||
*/
|
switchState(STATE_SERVER_SELECT);
|
||||||
public static void setState(final String message) {
|
} else {
|
||||||
state = message;
|
Core.verbose("Failed to log in.");
|
||||||
current.repaint();
|
UILog.log("Error", "Incorrect username or password. Have you tried logging into http://bdn.parabot.org/account/", JOptionPane.ERROR_MESSAGE);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
});
|
||||||
public void onProgressUpdate(double value) {
|
|
||||||
progressBar.setValue(value);
|
|
||||||
this.repaint();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
loginPanel.add(Box.createRigidArea(new Dimension(0, 5)));
|
||||||
public void updateDownloadSpeed(double mbPerSecond) {
|
loginPanel.add(usernameLabel);
|
||||||
progressBar.setText(String.format("(%.2fMB/s)", mbPerSecond));
|
loginPanel.add(Box.createRigidArea(new Dimension(0, 5)));
|
||||||
}
|
loginPanel.add(userInput);
|
||||||
|
loginPanel.add(Box.createRigidArea(new Dimension(0, 5)));
|
||||||
|
loginPanel.add(passwordLabel);
|
||||||
|
loginPanel.add(Box.createRigidArea(new Dimension(0, 5)));
|
||||||
|
loginPanel.add(passInput);
|
||||||
|
loginPanel.add(Box.createRigidArea(new Dimension(0, 5)));
|
||||||
|
loginPanel.add(login);
|
||||||
|
loginPanel.add(Box.createRigidArea(new Dimension(0, 5)));
|
||||||
|
|
||||||
|
add(loginPanel, new GridBagConstraints());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void switchState(int state) {
|
||||||
|
removeAll();
|
||||||
|
if (state == STATE_AUTHENTICATION) {
|
||||||
|
addLoginPanel();
|
||||||
|
} else if (state == STATE_SERVER_SELECT) {
|
||||||
|
addServerPanel();
|
||||||
|
}
|
||||||
|
this.currentState = state;
|
||||||
|
revalidate();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Paints on this panel
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void paintComponent(Graphics graphics) {
|
||||||
|
super.paintComponent(graphics);
|
||||||
|
|
||||||
|
|
||||||
|
Graphics2D g = (Graphics2D) graphics;
|
||||||
|
g.setRenderingHint(
|
||||||
|
RenderingHints.KEY_TEXT_ANTIALIASING,
|
||||||
|
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
|
||||||
|
|
||||||
|
g.drawImage(background, 0, 0, null);
|
||||||
|
float[] scales = {1f, 1f, 1f, 0.9f};
|
||||||
|
float[] offsets = new float[4];
|
||||||
|
RescaleOp rop = new RescaleOp(scales, offsets, null);
|
||||||
|
g.drawImage(banner, rop, 0, 0);
|
||||||
|
|
||||||
|
g.setStroke(new BasicStroke(5));
|
||||||
|
g.setPaint(Color.WHITE);
|
||||||
|
|
||||||
|
g.draw(new Line2D.Float(0, 0, this.getWidth(), 0));
|
||||||
|
g.draw(new Line2D.Float(0, 0, 0, 120));
|
||||||
|
g.draw(new Line2D.Float(0, 120, this.getWidth(), 120));
|
||||||
|
g.draw(new Line2D.Float(this.getWidth() - 6, 0, this.getWidth() - 6, 120));
|
||||||
|
|
||||||
|
g.setColor(Color.white);
|
||||||
|
|
||||||
|
g.setFont(Fonts.getResource("leelawadee.ttf", 30));
|
||||||
|
g.getFont().deriveFont(Font.BOLD);
|
||||||
|
g.drawString(Configuration.BOT_TITLE, 20, 50);
|
||||||
|
|
||||||
|
g.setFont(Fonts.getResource("leelawadee.ttf", 15));
|
||||||
|
g.getFont().deriveFont(Font.ITALIC);
|
||||||
|
g.drawString(Configuration.BOT_SLOGAN, 20, 85);
|
||||||
|
|
||||||
|
if (fontMetrics == null) {
|
||||||
|
fontMetrics = g.getFontMetrics();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentState == STATE_AUTHENTICATION) {
|
||||||
|
/*g.setColor(new Color(74, 74, 72, 100));
|
||||||
|
g.fillRect(loginPanel.getX() - 10, loginPanel.getY(), loginPanel.getWidth() + 20, loginPanel.getHeight());
|
||||||
|
g.setColor(Color.black);
|
||||||
|
g.drawRect(loginPanel.getX() - 10, loginPanel.getY(), loginPanel.getWidth() + 20, loginPanel.getHeight());*/
|
||||||
|
g.drawImage(loginBox, loginPanel.getX() - 30, loginPanel.getY() - 22, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
g.setColor(Color.white);
|
||||||
|
|
||||||
|
if (currentState == STATE_LOADING) {
|
||||||
|
progressBar.draw(g, (getWidth() / 2) - 200, 220);
|
||||||
|
g.setFont(new Font("Times New Roman", Font.PLAIN, 14));
|
||||||
|
int x = (getWidth() / 2) - (fontMetrics.stringWidth(state) / 2);
|
||||||
|
g.drawString(state, x, 200);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
g.setFont(Fonts.getResource("leelawadee.ttf"));
|
||||||
|
final String version = Configuration.BOT_VERSION.get();
|
||||||
|
g.drawString(version,
|
||||||
|
getWidth() - g.getFontMetrics().stringWidth(version) - 10,
|
||||||
|
getHeight() - 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets instance of this panel
|
||||||
|
*
|
||||||
|
* @return instance of this panel
|
||||||
|
*/
|
||||||
|
public static VerboseLoader get(String username, String password) {
|
||||||
|
return current == null ? new VerboseLoader(username, password) : current;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets instance of this panel
|
||||||
|
*
|
||||||
|
* @return instance of this panel
|
||||||
|
*/
|
||||||
|
public static VerboseLoader get() {
|
||||||
|
return current == null ? new VerboseLoader(null, null) : current;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the status message and repaints the panel
|
||||||
|
*
|
||||||
|
* @param message
|
||||||
|
*/
|
||||||
|
public static void setState(final String message) {
|
||||||
|
state = message;
|
||||||
|
current.repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onProgressUpdate(double value) {
|
||||||
|
progressBar.setValue(value);
|
||||||
|
this.repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateDownloadSpeed(double mbPerSecond) {
|
||||||
|
progressBar.setText(String.format("(%.2fMB/s)", mbPerSecond));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package org.parabot.core.ui.fonts;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Capslock
|
||||||
|
*/
|
||||||
|
public class Fonts {
|
||||||
|
private static final java.util.List<ParabotFont> FONT_CACHE = new ArrayList<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calls the getResource with the default size of 12
|
||||||
|
*
|
||||||
|
* @param resource
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static Font getResource(final String resource) {
|
||||||
|
return getResource(resource, 12f);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Font getResource(final String fileName, float size) {
|
||||||
|
ParabotFont parabotFont = null;
|
||||||
|
|
||||||
|
for (ParabotFont font : FONT_CACHE) {
|
||||||
|
if (font.getLocation().equalsIgnoreCase(fileName) && font.getSize() == size) {
|
||||||
|
parabotFont = font;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parabotFont == null) {
|
||||||
|
parabotFont = new ParabotFont(fileName, size);
|
||||||
|
FONT_CACHE.add(parabotFont);
|
||||||
|
}
|
||||||
|
|
||||||
|
return parabotFont.getFont();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
package org.parabot.core.ui.fonts;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Capslock
|
||||||
|
*/
|
||||||
|
public class ParabotFont {
|
||||||
|
|
||||||
|
private String location;
|
||||||
|
private Font font;
|
||||||
|
|
||||||
|
public ParabotFont(String location, float size) {
|
||||||
|
if (!location.toLowerCase().startsWith("/storage/fonts/")) {
|
||||||
|
location = "/storage/fonts/" + location;
|
||||||
|
}
|
||||||
|
this.location = location;
|
||||||
|
|
||||||
|
try {
|
||||||
|
this.font = createFont(size);
|
||||||
|
} catch (FontFormatException | IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Font createFont(float size) throws IOException, FontFormatException {
|
||||||
|
return Font.createFont(Font.TRUETYPE_FONT, Fonts.class.getResourceAsStream(this.location)).deriveFont(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getSize() {
|
||||||
|
return font.getSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLocation() {
|
||||||
|
return location;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Font getFont() {
|
||||||
|
return font;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (obj != null) {
|
||||||
|
if (obj instanceof ParabotFont) {
|
||||||
|
ParabotFont otherFont = (ParabotFont) obj;
|
||||||
|
if (otherFont.getSize() == this.getSize()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Before Width: | Height: | Size: 152 B After Width: | Height: | Size: 152 B |
|
Before Width: | Height: | Size: 1.5 MiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 299 B After Width: | Height: | Size: 299 B |
|
Before Width: | Height: | Size: 332 B After Width: | Height: | Size: 332 B |
|
Before Width: | Height: | Size: 331 B After Width: | Height: | Size: 331 B |
|
Before Width: | Height: | Size: 325 B After Width: | Height: | Size: 325 B |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 489 B After Width: | Height: | Size: 489 B |
|
Before Width: | Height: | Size: 357 B After Width: | Height: | Size: 357 B |
|
Before Width: | Height: | Size: 371 B After Width: | Height: | Size: 371 B |
|
Before Width: | Height: | Size: 307 B After Width: | Height: | Size: 307 B |
|
Before Width: | Height: | Size: 311 B After Width: | Height: | Size: 311 B |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 611 B After Width: | Height: | Size: 611 B |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 343 B After Width: | Height: | Size: 343 B |
|
Before Width: | Height: | Size: 893 B After Width: | Height: | Size: 893 B |
|
Before Width: | Height: | Size: 328 B After Width: | Height: | Size: 328 B |
|
Before Width: | Height: | Size: 431 B After Width: | Height: | Size: 431 B |
|
Before Width: | Height: | Size: 371 B After Width: | Height: | Size: 371 B |
|
Before Width: | Height: | Size: 452 B After Width: | Height: | Size: 452 B |
|
Before Width: | Height: | Size: 668 B After Width: | Height: | Size: 668 B |
|
Before Width: | Height: | Size: 354 B After Width: | Height: | Size: 354 B |
|
Before Width: | Height: | Size: 276 B After Width: | Height: | Size: 276 B |
|
Before Width: | Height: | Size: 310 B After Width: | Height: | Size: 310 B |
|
Before Width: | Height: | Size: 377 B After Width: | Height: | Size: 377 B |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 76 KiB |
|
After Width: | Height: | Size: 130 KiB |
|
After Width: | Height: | Size: 89 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 125 B After Width: | Height: | Size: 125 B |
|
Before Width: | Height: | Size: 155 B After Width: | Height: | Size: 155 B |
|
Before Width: | Height: | Size: 110 B After Width: | Height: | Size: 110 B |