Complete world record in footer and settings
This commit is contained in:
parent
4c87a025d6
commit
0fa050d80e
|
@ -1,34 +1,42 @@
|
||||||
package org.fenix.WorldRecord;
|
package org.fenix.WorldRecord;
|
||||||
|
|
||||||
import javax.swing.*;
|
import org.fenix.llanfair.dialog.*;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.awt.event.ActionEvent;
|
import javax.swing.*;
|
||||||
import java.awt.event.ActionListener;
|
import java.awt.event.*;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
public class RecordDialog extends JDialog
|
public class RecordDialog extends LlanfairDialog
|
||||||
{
|
{
|
||||||
private JLabel searchLabel = new JLabel("Search game:");
|
private JLabel searchLabel = new JLabel("Search game:");
|
||||||
private JTextField searchField = new JTextField();
|
|
||||||
private JButton searchButton = new JButton("Search");
|
private JButton searchButton = new JButton("Search");
|
||||||
|
private JTextField searchField = new JTextField();
|
||||||
|
|
||||||
private JLabel gamesLabel = new JLabel("Games:");
|
|
||||||
private DefaultComboBoxModel<Game> gameListModel = new DefaultComboBoxModel<>();
|
private DefaultComboBoxModel<Game> gameListModel = new DefaultComboBoxModel<>();
|
||||||
private JComboBox<Game> games = new JComboBox<>(gameListModel);
|
private JComboBox<Game> games = new JComboBox<>(gameListModel);
|
||||||
|
private JLabel gamesLabel = new JLabel("Games:");
|
||||||
|
|
||||||
private JLabel categoriesLabel = new JLabel("Categories:");
|
|
||||||
private DefaultComboBoxModel<Category> categoryListModel = new DefaultComboBoxModel<>();
|
private DefaultComboBoxModel<Category> categoryListModel = new DefaultComboBoxModel<>();
|
||||||
private JComboBox<Category> categories = new JComboBox<>(categoryListModel);
|
private JComboBox<Category> categories = new JComboBox<>(categoryListModel);
|
||||||
|
private JLabel categoriesLabel = new JLabel("Categories:");
|
||||||
|
|
||||||
private JLabel worldRecord = new JLabel();
|
|
||||||
private JButton ok = new JButton("Ok");
|
|
||||||
private JButton close = new JButton("Close");
|
private JButton close = new JButton("Close");
|
||||||
|
private JButton ok = new JButton("Ok");
|
||||||
|
private JLabel worldRecord = new JLabel();
|
||||||
|
|
||||||
private String category_id = "";
|
private ActionListener categoryListener;
|
||||||
|
private ActionListener gameListener;
|
||||||
|
|
||||||
public RecordDialog()
|
private Category category;
|
||||||
|
private EditRun editRun;
|
||||||
|
|
||||||
|
|
||||||
|
public RecordDialog(EditRun editRun)
|
||||||
{
|
{
|
||||||
|
this.editRun = editRun;
|
||||||
|
|
||||||
JPanel searchPanel = new JPanel(new FlowLayout());
|
JPanel searchPanel = new JPanel(new FlowLayout());
|
||||||
{
|
{
|
||||||
searchField.setPreferredSize(new Dimension(200,30));
|
searchField.setPreferredSize(new Dimension(200,30));
|
||||||
|
@ -50,13 +58,6 @@ public class RecordDialog extends JDialog
|
||||||
gamesPanel.add(games);
|
gamesPanel.add(games);
|
||||||
|
|
||||||
games.setEnabled(false);
|
games.setEnabled(false);
|
||||||
|
|
||||||
games.addActionListener(new ActionListener() {
|
|
||||||
public void actionPerformed(ActionEvent e)
|
|
||||||
{
|
|
||||||
getCategories((Game) games.getSelectedItem());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
JPanel categoriesPanel = new JPanel(new GridLayout(1,2));
|
JPanel categoriesPanel = new JPanel(new GridLayout(1,2));
|
||||||
{
|
{
|
||||||
|
@ -64,13 +65,6 @@ public class RecordDialog extends JDialog
|
||||||
categoriesPanel.add(categories);
|
categoriesPanel.add(categories);
|
||||||
|
|
||||||
categories.setEnabled(false);
|
categories.setEnabled(false);
|
||||||
|
|
||||||
categories.addActionListener(new ActionListener() {
|
|
||||||
public void actionPerformed(ActionEvent e)
|
|
||||||
{
|
|
||||||
getWorldRecord((Category) categories.getSelectedItem());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
JPanel buttonPanel = new JPanel(new FlowLayout());
|
JPanel buttonPanel = new JPanel(new FlowLayout());
|
||||||
{
|
{
|
||||||
|
@ -106,20 +100,31 @@ public class RecordDialog extends JDialog
|
||||||
pack();
|
pack();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Search the game title on speedrun.com
|
||||||
|
* @param name The name of the game
|
||||||
|
*/
|
||||||
private void searchGame(String name)
|
private void searchGame(String name)
|
||||||
{
|
{
|
||||||
|
this.resetFields();
|
||||||
|
|
||||||
ArrayList<Game> games = new ArrayList<>();
|
ArrayList<Game> games = new ArrayList<>();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
games = WorldRecordParser.searchGames(name);
|
games = WorldRecordParser.searchGames(name);
|
||||||
} catch (IOException e)
|
} catch (IOException e)
|
||||||
{
|
{
|
||||||
System.out.println("fout");
|
showError();
|
||||||
}
|
}
|
||||||
|
|
||||||
this.setGames(games);
|
this.setGames(games);
|
||||||
|
this.addGameListener();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the categories for a game on speedrun.com
|
||||||
|
* @param game A game object received from the game search
|
||||||
|
*/
|
||||||
private void getCategories(Game game)
|
private void getCategories(Game game)
|
||||||
{
|
{
|
||||||
ArrayList<Category> categories = new ArrayList<>();
|
ArrayList<Category> categories = new ArrayList<>();
|
||||||
|
@ -128,12 +133,17 @@ public class RecordDialog extends JDialog
|
||||||
categories = WorldRecordParser.getCategories(game);
|
categories = WorldRecordParser.getCategories(game);
|
||||||
} catch (IOException e)
|
} catch (IOException e)
|
||||||
{
|
{
|
||||||
System.out.println("fout");
|
showError();
|
||||||
}
|
}
|
||||||
|
|
||||||
this.setCategories(categories);
|
this.setCategories(categories);
|
||||||
|
this.addCategoryListener();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the world record time and owner from speedrun.com
|
||||||
|
* @param category A category object received from the category search
|
||||||
|
*/
|
||||||
private void getWorldRecord(Category category)
|
private void getWorldRecord(Category category)
|
||||||
{
|
{
|
||||||
String worldRecord = "";
|
String worldRecord = "";
|
||||||
|
@ -142,16 +152,20 @@ public class RecordDialog extends JDialog
|
||||||
worldRecord = WorldRecordParser.getRecord(category);
|
worldRecord = WorldRecordParser.getRecord(category);
|
||||||
} catch (IOException e)
|
} catch (IOException e)
|
||||||
{
|
{
|
||||||
System.out.println("fout");
|
showError();
|
||||||
}
|
}
|
||||||
|
|
||||||
this.worldRecord.setText(worldRecord);
|
this.worldRecord.setText(worldRecord);
|
||||||
this.category_id = category.getId();
|
this.category = category;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Append the games in the array to the games combobox
|
||||||
|
* @param games A ArrayList of game objects
|
||||||
|
*/
|
||||||
private void setGames(ArrayList<Game> games)
|
private void setGames(ArrayList<Game> games)
|
||||||
{
|
{
|
||||||
gameListModel.removeAllElements();
|
this.resetFields();
|
||||||
|
|
||||||
for(Game game: games)
|
for(Game game: games)
|
||||||
{
|
{
|
||||||
|
@ -161,6 +175,10 @@ public class RecordDialog extends JDialog
|
||||||
this.games.setEnabled(true);
|
this.games.setEnabled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Append the categories in the array to the categories checkbox
|
||||||
|
* @param categories A ArrayList of Category objects
|
||||||
|
*/
|
||||||
private void setCategories(ArrayList<Category> categories)
|
private void setCategories(ArrayList<Category> categories)
|
||||||
{
|
{
|
||||||
categoryListModel.removeAllElements();
|
categoryListModel.removeAllElements();
|
||||||
|
@ -173,14 +191,95 @@ public class RecordDialog extends JDialog
|
||||||
this.categories.setEnabled(true);
|
this.categories.setEnabled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close the dialog without saving
|
||||||
|
*/
|
||||||
private void close()
|
private void close()
|
||||||
{
|
{
|
||||||
this.setVisible(false);
|
this.setVisible(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close the dialog and send a signal to the parent window
|
||||||
|
*/
|
||||||
private void actionOk()
|
private void actionOk()
|
||||||
{
|
{
|
||||||
this.category_id = ((Category) categories.getSelectedItem()).getId();
|
this.category = ((Category) categories.getSelectedItem());
|
||||||
this.setVisible(false);
|
this.setVisible(false);
|
||||||
|
|
||||||
|
this.editRun.recordSet();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add the changeListener to the categories combobox
|
||||||
|
*/
|
||||||
|
private void addCategoryListener()
|
||||||
|
{
|
||||||
|
categoryListener = new ActionListener() {
|
||||||
|
public void actionPerformed(ActionEvent e)
|
||||||
|
{
|
||||||
|
getWorldRecord((Category) categories.getSelectedItem());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
categories.addActionListener(categoryListener);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add the changeListener to the games combobox
|
||||||
|
*/
|
||||||
|
private void addGameListener()
|
||||||
|
{
|
||||||
|
|
||||||
|
gameListener = new ActionListener() {
|
||||||
|
public void actionPerformed(ActionEvent e)
|
||||||
|
{
|
||||||
|
getCategories((Game) games.getSelectedItem());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
games.addActionListener(gameListener);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset the comboboxes
|
||||||
|
*/
|
||||||
|
private void resetFields()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
categories.removeActionListener(categoryListener);
|
||||||
|
games.removeActionListener(gameListener);
|
||||||
|
} catch (Exception e){}
|
||||||
|
|
||||||
|
categories.setEnabled(false);
|
||||||
|
games.setEnabled(false);
|
||||||
|
|
||||||
|
gameListModel.removeAllElements();
|
||||||
|
categoryListModel.removeAllElements();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void showError()
|
||||||
|
{
|
||||||
|
JOptionPane.showMessageDialog(null, "Could not connect to speedrun.com",
|
||||||
|
"Error", JOptionPane.ERROR_MESSAGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the selected category object
|
||||||
|
* @return Category
|
||||||
|
*/
|
||||||
|
public Category getCategory()
|
||||||
|
{
|
||||||
|
return category;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the selected record string
|
||||||
|
* @return String
|
||||||
|
*/
|
||||||
|
public String getRecordString()
|
||||||
|
{
|
||||||
|
return worldRecord.getText();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -117,9 +117,9 @@ public class WorldRecordParser
|
||||||
String time = "";
|
String time = "";
|
||||||
|
|
||||||
if(hours != 0)
|
if(hours != 0)
|
||||||
time += hours + ":";
|
time += String.format("%02d:", hours);
|
||||||
|
|
||||||
time += minutes + ":" + seconds;
|
time += String.format("%02d:%02d", minutes, seconds);
|
||||||
|
|
||||||
if(time_seconds % 1 != 0)
|
if(time_seconds % 1 != 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package org.fenix.llanfair;
|
package org.fenix.llanfair;
|
||||||
|
|
||||||
import com.thoughtworks.xstream.annotations.XStreamOmitField;
|
import com.thoughtworks.xstream.annotations.XStreamOmitField;
|
||||||
|
import org.fenix.WorldRecord.Category;
|
||||||
|
import org.fenix.WorldRecord.WorldRecordParser;
|
||||||
import org.fenix.llanfair.config.Settings;
|
import org.fenix.llanfair.config.Settings;
|
||||||
import org.fenix.utils.TableModelSupport;
|
import org.fenix.utils.TableModelSupport;
|
||||||
import org.fenix.utils.config.Configuration;
|
import org.fenix.utils.config.Configuration;
|
||||||
|
@ -104,7 +106,7 @@ public class Run implements TableModel, Serializable {
|
||||||
|
|
||||||
public static final String COMPLETED_ATTEMPT_COUNTER_PROPERTY = "run.completedAttemptCounter";
|
public static final String COMPLETED_ATTEMPT_COUNTER_PROPERTY = "run.completedAttemptCounter";
|
||||||
|
|
||||||
|
public static final String RECORD_CATEGORY_PROPERTY = "run.record.category";
|
||||||
|
|
||||||
public static final String DELAYED_START_PROPERTY = "run.delayedStart";
|
public static final String DELAYED_START_PROPERTY = "run.delayedStart";
|
||||||
|
|
||||||
|
@ -185,6 +187,8 @@ public class Run implements TableModel, Serializable {
|
||||||
@XStreamOmitField
|
@XStreamOmitField
|
||||||
private int sessionAttempts;
|
private int sessionAttempts;
|
||||||
|
|
||||||
|
private Category recordCategory;
|
||||||
|
|
||||||
// ----------------------------------------------------------- CONSTRUCTORS
|
// ----------------------------------------------------------- CONSTRUCTORS
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -598,6 +602,23 @@ public class Run implements TableModel, Serializable {
|
||||||
|
|
||||||
public int getSessionAttempts() { return sessionAttempts; }
|
public int getSessionAttempts() { return sessionAttempts; }
|
||||||
|
|
||||||
|
public String getRecordString() {
|
||||||
|
String recordString;
|
||||||
|
|
||||||
|
try {
|
||||||
|
recordString = WorldRecordParser.getRecord(this.recordCategory);
|
||||||
|
} catch (Exception e) {
|
||||||
|
recordString = "Unknown World Record";
|
||||||
|
}
|
||||||
|
|
||||||
|
return recordString;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Category getRecordCategory()
|
||||||
|
{
|
||||||
|
return recordCategory;
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------- SETTERS
|
// ---------------------------------------------------------------- SETTERS
|
||||||
|
|
||||||
public<T> T getSetting( String key ) {
|
public<T> T getSetting( String key ) {
|
||||||
|
@ -648,6 +669,15 @@ public class Run implements TableModel, Serializable {
|
||||||
pcSupport.firePropertyChange(DELAYED_START_PROPERTY, old, delayedStart);
|
pcSupport.firePropertyChange(DELAYED_START_PROPERTY, old, delayedStart);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setRecordCategory(Category category)
|
||||||
|
{
|
||||||
|
Category old = this.recordCategory;
|
||||||
|
|
||||||
|
this.recordCategory = category;
|
||||||
|
|
||||||
|
pcSupport.firePropertyChange(RECORD_CATEGORY_PROPERTY, old, name);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Inserts the given segment at the end. If it's the first segment being
|
* Inserts the given segment at the end. If it's the first segment being
|
||||||
* added, the run becomes {@link State#READY}, meaning it can be started.
|
* added, the run becomes {@link State#READY}, meaning it can be started.
|
||||||
|
@ -1155,6 +1185,9 @@ public class Run implements TableModel, Serializable {
|
||||||
if ( configuration == null ) {
|
if ( configuration == null ) {
|
||||||
configuration = new Configuration();
|
configuration = new Configuration();
|
||||||
}
|
}
|
||||||
|
if(recordCategory == null) {
|
||||||
|
recordCategory = new Category("", "");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -29,6 +29,7 @@ class Footer extends JPanel {
|
||||||
private static final int TEXT = 0x04;
|
private static final int TEXT = 0x04;
|
||||||
private static final int BEST = 0x08;
|
private static final int BEST = 0x08;
|
||||||
private static final int VERBOSE = 0x10;
|
private static final int VERBOSE = 0x10;
|
||||||
|
private static final int WORLD_RECORD = 0x20;
|
||||||
|
|
||||||
private static final int INSET = 3;
|
private static final int INSET = 3;
|
||||||
|
|
||||||
|
@ -90,7 +91,7 @@ class Footer extends JPanel {
|
||||||
preferredSize = null;
|
preferredSize = null;
|
||||||
resize = false;
|
resize = false;
|
||||||
|
|
||||||
worldRecord = new JLabel("World record: 5 by xem92");
|
worldRecord = new JLabel();
|
||||||
|
|
||||||
setRun(run);
|
setRun(run);
|
||||||
setOpaque(false);
|
setOpaque(false);
|
||||||
|
@ -252,6 +253,8 @@ class Footer extends JPanel {
|
||||||
updateValues(TIME | TEXT);
|
updateValues(TIME | TEXT);
|
||||||
updateSize();
|
updateSize();
|
||||||
forceResize();
|
forceResize();
|
||||||
|
} else if (Run.RECORD_CATEGORY_PROPERTY.equals(property)) {
|
||||||
|
updateValues(WORLD_RECORD);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -585,6 +588,9 @@ class Footer extends JPanel {
|
||||||
labelDeltaBest.setText("" + Language.LB_FT_DELTA_BEST);
|
labelDeltaBest.setText("" + Language.LB_FT_DELTA_BEST);
|
||||||
labelSumOfBest.setText("" + Language.LB_FT_SUM_OF_BEST);
|
labelSumOfBest.setText("" + Language.LB_FT_SUM_OF_BEST);
|
||||||
}
|
}
|
||||||
|
if((identifier & WORLD_RECORD) == WORLD_RECORD) {
|
||||||
|
worldRecord.setText(run.getRecordString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateSize() {
|
private void updateSize() {
|
||||||
|
|
Reference in a new issue