Changeset af96e56


Ignore:
Timestamp:
Jul 19, 2010, 6:31:40 PM (8 years ago)
Author:
Michael Seifert <mseifert@…>
Branches:
master
Children:
16ac223
Parents:
a76ff72
Message:

Support for hiding and showing players in the apm plot

Location:
src/main/java/de/erichseifert/warp/gui
Files:
1 added
1 edited
1 moved

Legend:

Unmodified
Added
Removed
  • src/main/java/de/erichseifert/warp/gui/APMPlot.java

    ra76ff72 raf96e56  
    2828import java.awt.Paint;
    2929import java.awt.geom.Point2D;
     30import java.util.LinkedHashMap;
    3031import java.util.List;
     32import java.util.Map;
    3133
    3234import javax.swing.JPanel;
     
    3638import de.erichseifert.gral.DrawableConstants.Location;
    3739import de.erichseifert.gral.data.DataSeries;
     40import de.erichseifert.gral.data.DataSource;
    3841import de.erichseifert.gral.data.DataTable;
    3942import de.erichseifert.gral.data.Row;
     
    4447import de.erichseifert.gral.data.filters.Filter.Mode;
    4548import de.erichseifert.gral.data.statistics.Histogram1D;
    46 import de.erichseifert.gral.data.statistics.Histogram1D.Orientation;
     49import de.erichseifert.gral.data.statistics.Statistics.Orientation;
    4750import de.erichseifert.gral.plots.XYPlot;
    4851import de.erichseifert.gral.plots.areas.AreaRenderer;
     
    6063import de.erichseifert.warp.Player;
    6164
    62 public class APMChart extends JPanel {
     65public class APMPlot extends JPanel {
     66        private final Map<Player, DataSeries> dataByPlayer;
     67        private final XYPlot plot;
    6368        private ActionFilter actionFilter;
    6469
    65         public APMChart(Player... players) {
     70        public APMPlot(Player... players) {
    6671                super(new BorderLayout());
    6772
    68                 DataSeries[] playerData = new DataSeries[players.length];
     73                dataByPlayer = new LinkedHashMap<Player, DataSeries>();
     74
    6975                // For each of the specified players
    7076                for (int playerIndex = 0; playerIndex < players.length; playerIndex++) {
     
    9096                        double timeMax = actions.get(actions.size()-1).getTimestamp()/25.0;
    9197                        int cellCount = (int) Math.ceil(timeMax);
    92                         Number[][] cells = new Number[1][cellCount];
     98                        Number[][] cells = new Number[2][cellCount];
    9399                        // The intervals are one second wide
    94100                        for (int i = 0; i < cellCount; i++) {
    95101                                cells[0][i] = (double) i;
     102                                cells[1][i] = (double) i;
    96103                        }
    97104                        // The following histogram calculates the number of occurrences of a value in each sector
     
    112119                        Filter filterAPMSmooth = new Convolution(filterAPM, kernelAPMSmooth, Mode.ZERO, 1);
    113120                        DataSeries playerSeries = new DataSeries(player.getName(), filterAPMSmooth, 0, 1);
    114                         playerData[playerIndex] = playerSeries;
     121                        dataByPlayer.put(player, playerSeries);
    115122                }
    116123
    117                 XYPlot plot = new XYPlot(playerData);
     124                DataSource[] seriesArray = new DataSource[dataByPlayer.size()];
     125                plot = new XYPlot(dataByPlayer.values().toArray(seriesArray));
    118126                // Configure plot
    119127                plot.setSetting(XYPlot.TITLE, "Actions per minute (Smoothed)");
     
    126134                plot.getLegend().setSetting(Legend.ORIENTATION, DrawableConstants.Orientation.HORIZONTAL);
    127135                // Configure line, shape, and area renderers
    128                 for (int playerIndex = 0; playerIndex < players.length; playerIndex++) {
    129                         DataSeries playerSeries = playerData[playerIndex];
    130                         Color playerColor = players[playerIndex].getColor();
     136                for (Player player : players) {
     137                        DataSeries playerSeries = dataByPlayer.get(player);
     138                        Color playerColor = player.getColor();
    131139                        plot.setPointRenderer(playerSeries, null);
    132140                        LineRenderer lineRenderer = new DefaultLineRenderer2D();
     
    161169                add(plotPanel, BorderLayout.CENTER);
    162170        }
     171
     172        public void setPlayerVisible(Player player, boolean visible) {
     173                DataSource source = dataByPlayer.get(player);
     174                if (source != null) {
     175                        plot.setVisible(source, visible);
     176                }
     177                repaint();
     178        }
     179
     180        public XYPlot getPlot() {
     181                return plot;
     182        }
    163183}
  • src/main/java/de/erichseifert/warp/gui/ReplayParserGUI.java

    ra76ff72 raf96e56  
    4545import javax.swing.AbstractAction;
    4646import javax.swing.Action;
     47import javax.swing.Box;
    4748import javax.swing.DefaultComboBoxModel;
    4849import javax.swing.JCheckBox;
     
    156157        }
    157158
     159        private static class APMRenderer extends JPanel {
     160
     161                private static class APMRendererComponent extends JPanel implements VisibilityChangeListener<Player> {
     162                        private final DefaultPlayerRenderer<Player> playerRenderer;
     163                        private final APMPlot plot;
     164
     165                        public APMRendererComponent(Player... players) {
     166                                super(new BorderLayout());
     167
     168                                playerRenderer = new DefaultPlayerRenderer<Player>();
     169                                playerRenderer.addVisibilityChangeListener(this);
     170                                plot = new APMPlot(players);
     171                                add(plot, BorderLayout.CENTER);
     172
     173                                JPanel playerCompsContainer = new JPanel(new BorderLayout());
     174                                int playerCompOffsetY = (int) Math.round(plot.getPlot().getPlotArea().getY());
     175                                playerCompsContainer.setBorder(new EmptyBorder(playerCompOffsetY, 0, 0, 0));
     176                                add(playerCompsContainer, BorderLayout.EAST);
     177                                Box playerComps = Box.createVerticalBox();
     178                                playerCompsContainer.add(playerComps, BorderLayout.NORTH);
     179                                for (Player player : players) {
     180                                        Component playerComp = playerRenderer.getRendererComponent(player);
     181                                        playerComps.add(playerComp);
     182                                }
     183                        }
     184
     185                        @Override
     186                        public void visibilityChanged(VisibilityChangeEvent<Player> event) {
     187                                plot.setPlayerVisible(event.getSource(), event.isVisible());
     188                        }
     189                }
     190
     191                public APMRenderer() {
     192                }
     193
     194                public Component getRendererComponent(Player... players) {
     195                        return new APMRendererComponent(players);
     196                }
     197        }
     198
    158199        private final WARP warp;
    159200
     
    162203        private final JComboBox filterMode;
    163204        private final JTextField filterField;
     205        private final ExpandableSplitPane splitPane;
     206        private final APMRenderer apmRenderer;
    164207        private final JTabbedPane infoDisplay;
    165208        private final SC2ReplayRenderer replayRenderer;
     
    351394                toolbar.add(filterField);
    352395
    353                 JSplitPane splitPane = new JSplitPane();
     396                apmRenderer = new APMRenderer();
     397
     398                splitPane = new ExpandableSplitPane();
    354399                infoDisplay = new JTabbedPane(JTabbedPane.TOP, JTabbedPane.WRAP_TAB_LAYOUT);
    355400                infoDisplay.addTab("General", null);
     
    359404                        public void stateChanged(ChangeEvent e) {
    360405                                int selectionIndex = infoDisplay.getSelectedIndex();
    361                                 if (selectionIndex == 0 && infoDisplay.getComponentAt(0) == null) {
    362                                         infoDisplay.setComponentAt(0, replayRenderer.getRendererComponent((SC2Replay) selectedReplay));
    363                                 }
    364                                 else if (selectionIndex == 1 && infoDisplay.getComponentAt(1) == null) {
    365                                         Player[] players = new Player[selectedReplay.getPlayerCount()];
    366                                         selectedReplay.getPlayers().toArray(players);
    367                                         Component apmChart = new APMChart(players);
    368                                         infoDisplay.setComponentAt(1, apmChart);
     406                                if (selectionIndex == 0) {
     407                                        if (infoDisplay.getComponentAt(0) == null && selectedReplay != null) {
     408                                                infoDisplay.setComponentAt(0, replayRenderer.getRendererComponent((SC2Replay) selectedReplay));
     409                                        }
     410                                        splitPane.setExpanded(null, false);
     411                                }
     412                                else if (selectionIndex == 1) {
     413                                        if (infoDisplay.getComponentAt(1) == null && selectedReplay != null) {
     414                                                Player[] players = new Player[selectedReplay.getPlayerCount()];
     415                                                selectedReplay.getPlayers().toArray(players);
     416                                                Component apmRendererComp = apmRenderer.getRendererComponent(players);
     417                                                apmRendererComp.setMinimumSize(new Dimension(0, 0));
     418                                                infoDisplay.setComponentAt(1, apmRendererComp);
     419                                        }
     420                                        splitPane.setExpanded(JSplitPane.LEFT, true);
    369421                                }
    370422                        }
    371423                });
    372424                splitPane.setLeftComponent(infoDisplay);
     425                splitPane.setDividerLocation(470);
    373426                getContentPane().add(splitPane, BorderLayout.CENTER);
    374                 splitPane.setDividerLocation(470);
    375427
    376428                // Left side: Replay renderer
Note: See TracChangeset for help on using the changeset viewer.