Browse Source

Added support for adjustable iteration count.

Press enter to alter the iteration.
If something other than a valid int is typed into the text field,
nothing at all will happen.
If unreasonable things are entered, the slider will politely re-adjust
the value.
Currently the setting does not save and jumping to iteration 100000
might murder the program's flow.
Ludwig Tietze 6 years ago
parent
commit
84fe06ddb7

+ 1 - 1
src/classes/HolonElement.java

@@ -259,7 +259,7 @@ public class HolonElement {
         if (flexible) {
             return ((float) amount) * energyPerElement;
         } else {
-            return ((float) amount) * availableEnergyPerElementAt[x];
+            return ((float) amount) * availableEnergyPerElementAt[x%100];//TODO: Adapt graph length
         }
     }
 

+ 10 - 1
src/ui/model/Model.java

@@ -69,6 +69,8 @@ public class Model {
     private boolean useFlexibleDevices = true;
     /** whether the supplyBars should be shown or not */
     private boolean showSupplyBars = true;
+    //TODO:
+    private int iterations=100;
     
     /** the Fairness model in use */
     private short fairnessModel = 0;
@@ -376,7 +378,7 @@ public class Model {
      * @return ITERATIONS
      */
     public int getIterations() {
-        return ITERATIONS;
+        return iterations;
     }
 
     private void notifyGraphListeners() {
@@ -923,6 +925,13 @@ public class Model {
 		this.showSupplyBars = showSupplyBars;
 	}
 	
+	/**
+	 * @param iterations the number of steps for this simulation
+	 */
+	public void setIterations(int iterations){
+		this.iterations=iterations;
+	}
+	
 	/**
 	 * @return the fairnessModel
 	 */

+ 2 - 1
src/ui/view/AddObjectPopUp.java

@@ -322,7 +322,8 @@ public class AddObjectPopUp extends JDialog {
 			selectedFile = fileChooser.getSelectedFile();
 			filePath = selectedFile.getAbsolutePath();
 			sourcePath.setText(filePath);
-			ImageIcon icon = new ImageIcon(
+			ImageIcon icon = new ImageIcon(//TODO: ugly
+					
 					new ImageIcon(filePath).getImage().getScaledInstance(50, 50, Image.SCALE_SMOOTH));
 			lblImagePreview.setIcon(icon);
 			imageChanged = true;

+ 6 - 1
src/ui/view/GUI.java

@@ -2090,7 +2090,12 @@ public class GUI implements CategoryListener {
 
 		timePanel = new TimePanel(model, controller);
 		timePanel.setBorder(null);
-		((JSlider) (timePanel.getComponent(1)))
+		((JSlider)
+				(
+						((Container)timePanel.getComponent(1))//timePanel
+						.getComponent(1)//timeSlider
+				)
+		)//TODO: This hardcoded shit
 				.addChangeListener(changeEvent -> {
 					int i = model.getCurIteration();
 					controller.calculateStateForTimeStep(i);

+ 42 - 9
src/ui/view/TimePanel.java

@@ -17,18 +17,23 @@ import java.awt.event.*;
  * 
  * @author Gruppe14
  */
-public class TimePanel extends JPanel {
+public class TimePanel extends JPanel implements ActionListener{
 
 	private static final long serialVersionUID = 1L;
+	private static final int MAX_ITERATIONS=100000;
 	final JButton playBtn = new JButton();
 	final JButton timeResetBtn = new JButton();
 	final JButton timeForwardBtn = new JButton();
-	;
+	
 	final JButton timeBackwardBtn = new JButton();
+	JTextField iterationsField;
+	final JLabel iterationsLabel=new JLabel("  Iterations  ");
 	private final JPanel btnAndSpeedPanel = new JPanel();
 	private final JPanel speedPanel = new JPanel();
 	private final JPanel timeBtnPanel = new JPanel();
-	JSlider timeSlider = new JSlider() {
+	private final JPanel iterationsPanel=new JPanel();
+	private final JPanel timePanel=new JPanel();
+	JSlider timeSlider = new JSlider() {//TODO:
 		/**
 		 *
 		 */
@@ -81,7 +86,7 @@ public class TimePanel extends JPanel {
 		this.controller = cont;
 
 		// One Iteration
-		timer = new Timer(0, new ActionListener() {
+		timer = new Timer(0, new ActionListener() {//TODO: Merge all these damned listeners.
 			@Override
 			public void actionPerformed(ActionEvent ae) {
 				timeSlider.setValue(timeSlider.getValue() + 1);
@@ -101,8 +106,8 @@ public class TimePanel extends JPanel {
 		// Slider
 		timeSlider.setPaintTicks(true);
 		timeSlider.setPaintLabels(true);
-		timeSlider.setMinorTickSpacing(1);
-		timeSlider.setMajorTickSpacing(5);
+		timeSlider.setMajorTickSpacing((int)Math.ceil(((double)model.getIterations())/20));
+		timeSlider.setMinorTickSpacing((int)Math.ceil(((double)model.getIterations())/100));
 		timeSlider.setToolTipText(Languages.getLanguage()[93]);
 		timeSlider.setMaximum(model.getIterations() - 1);
 		timeSlider.setValue(0);
@@ -222,10 +227,19 @@ public class TimePanel extends JPanel {
 		btnAndSpeedPanel.setBorder(null);
 		btnAndSpeedPanel.add(timeBtnPanel, BorderLayout.NORTH);
 		btnAndSpeedPanel.add(speedPanel, BorderLayout.CENTER);
-
+		iterationsPanel.setLayout(new GridLayout(3,1));
+		iterationsPanel.add(iterationsLabel, BorderLayout.NORTH);
+		iterationsField=new JTextField(6);//Considering hundreds of thousands in an extreme case
+		iterationsField.setText(""+model.getIterations());
+		iterationsField.addActionListener(this);//TODO
+		iterationsPanel.add(iterationsField);
+		iterationsPanel.add(new JLabel(), BorderLayout.SOUTH);
+		timePanel.setLayout(new BorderLayout());
+		timePanel.add(iterationsPanel, BorderLayout.WEST);
+		timePanel.add(timeSlider, BorderLayout.CENTER);
 		this.add(btnAndSpeedPanel, BorderLayout.WEST);
-		this.add(timeSlider);
-
+		add(timePanel);
+		
 		//Disable Keys
 		timeSlider.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, false), "UP_ARROW");
 		timeSlider.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, false), "DOWN_ARROW");
@@ -269,4 +283,23 @@ public class TimePanel extends JPanel {
 	public JSlider getTimeSlider() {
 		return timeSlider;
 	}
+
+	@Override
+	public void actionPerformed(ActionEvent arg0) {//I dislike anon classes.
+		try{
+			int iterations=Integer.parseInt(iterationsField.getText());
+			boolean resetField=true;
+			if(iterations<1)iterations=1;
+			else if(iterations>MAX_ITERATIONS)iterations=MAX_ITERATIONS;
+			else resetField=false;
+			if(resetField)iterationsField.setText(""+iterations);
+			model.setIterations(Integer.parseInt(iterationsField.getText()));
+			timeSlider.setMaximum(model.getIterations());
+			timeSlider.setLabelTable(null);//Otherwise the ticks won't update
+			timeSlider.setMajorTickSpacing((int)Math.ceil(((double)model.getIterations())/20));
+			timeSlider.setMinorTickSpacing((int)Math.ceil(((double)model.getIterations())/100));
+		}catch(NumberFormatException e){
+			
+		}
+	}
 }