]> gitweb.fperrin.net Git - GpsPrune.git/commitdiff
Add a panel to select by segment
authorFrédéric Perrin <fred@fperrin.net>
Thu, 30 Jan 2020 16:19:03 +0000 (16:19 +0000)
committerFrédéric Perrin <fred@fperrin.net>
Fri, 21 May 2021 19:31:45 +0000 (20:31 +0100)
src/tim/prune/data/Track.java
src/tim/prune/gui/SegmentListModel.java [new file with mode: 0644]
src/tim/prune/gui/SelectorDisplay.java
src/tim/prune/lang/prune-texts_en.properties

index f45854a0e3d47a1fd5fc0ee6924732b3294decc0..9d67cc6c60ae9ab100dfffdbe5471404d4fb7abc 100644 (file)
@@ -793,6 +793,24 @@ public class Track
                }
        }
 
+       /**
+        * Collect all segment starts into the given list
+        * @param inList List to fill with waypoints
+        */
+       public void getSegmentStarts(List<DataPoint> inList)
+       {
+               // clear list
+               inList.clear();
+               // loop over points and copy all segment starts into list
+               for (int i=0; i<=_numPoints-1; i++)
+               {
+                       if (_dataPoints[i] != null && _dataPoints[i].getSegmentStart())
+                       {
+                               inList.add(_dataPoints[i]);
+                       }
+               }
+       }
+
 
        /**
         * Search for the given Point in the track and return the index
diff --git a/src/tim/prune/gui/SegmentListModel.java b/src/tim/prune/gui/SegmentListModel.java
new file mode 100644 (file)
index 0000000..bfe53af
--- /dev/null
@@ -0,0 +1,72 @@
+package tim.prune.gui;
+
+import java.util.ArrayList;
+import javax.swing.AbstractListModel;
+
+import tim.prune.data.DataPoint;
+import tim.prune.data.Track;
+import tim.prune.I18nManager;
+
+/**
+ * Class to act as list model for the segment list
+ */
+public class SegmentListModel extends AbstractListModel<String>
+{
+       Track _track = null;
+       ArrayList<DataPoint> _segmentStarts = null;
+
+       /**
+        * Constructor giving Track object
+        * @param inTrack Track object
+        */
+       public SegmentListModel(Track inTrack)
+       {
+               _track = inTrack;
+               _segmentStarts = new ArrayList<DataPoint>();
+               _track.getSegmentStarts(_segmentStarts);
+       }
+
+       /**
+        * @see javax.swing.ListModel#getSize()
+        */
+       public int getSize()
+       {
+               return _segmentStarts.size();
+       }
+
+       /**
+        * @see javax.swing.ListModel#getElementAt(int)
+        */
+       public String getElementAt(int inIndex)
+       {
+               return I18nManager.getText("details.lists.segments.label") + (inIndex + 1) + " (" + (getSegmentStart(inIndex) + 1) + " " + I18nManager.getText("details.lists.segments.to") + " " + (getSegmentEnd(inIndex) + 1) + ")";
+       }
+
+       /**
+        * Fire event to notify that contents have changed
+        */
+       public void fireChanged()
+       {
+               _track.getSegmentStarts(_segmentStarts);
+               this.fireContentsChanged(this, 0, getSize()-1);
+       }
+
+       /**
+
+        */
+       public int getSegmentStart(int inIndex)
+       {
+               return _track.getPointIndex(_segmentStarts.get(inIndex));
+       }
+
+       public int getSegmentEnd(int inIndex)
+       {
+               if (inIndex < getSize() - 1) {
+                       return _track.getPointIndex(_segmentStarts.get(inIndex + 1)) - 1;
+               }
+               else
+               {
+                       return _track.getNumPoints() - 1;
+               }
+       }
+}
index fa6630dc5b71400bd4f7202fb688f9a911cc3f6f..d1a4915d76caa86f644bcafedf012622acd06b96 100644 (file)
@@ -53,6 +53,10 @@ public class SelectorDisplay extends GenericDisplay
        private JPanel _audioListPanel = null;
        private JList<String> _audioList = null;
        private MediaListModel _audioListModel = null;
+       // Segments
+       private JPanel _segmentListPanel = null;
+       private JList<String> _segmentList = null;
+       private SegmentListModel _segmentListModel = null;
 
        // scrollbar interval
        private static final int SCROLLBAR_INTERVAL = 50;
@@ -144,6 +148,18 @@ public class SelectorDisplay extends GenericDisplay
                // don't add audio list either
                _listsPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
 
+               // Segment list
+               _segmentListModel = new SegmentListModel(_trackInfo.getTrack());
+               _segmentList = new JList<String>(_segmentListModel);
+               _segmentList.addListSelectionListener(new ListSelectionListener() {
+                       public void valueChanged(ListSelectionEvent e)
+                       {
+                               if (!e.getValueIsAdjusting()) {
+                                       selectSegment(_segmentList.getSelectedIndex());
+                               }
+                       }});
+               _segmentListPanel = makeListPanel("details.lists.segments", _segmentList);
+
                // add the controls to the main panel
                mainPanel.add(trackDetailsPanel);
                mainPanel.add(Box.createVerticalStrut(5));
@@ -189,6 +205,18 @@ public class SelectorDisplay extends GenericDisplay
                _trackInfo.selectAudio(inIndex);
        }
 
+       /**
+        *
+        */
+       private void selectSegment(int inIndex)
+       {
+               if (inIndex >= 0) {
+                       int start = _segmentListModel.getSegmentStart(inIndex);
+                       int end = _segmentListModel.getSegmentEnd(inIndex);
+                       _trackInfo.getSelection().selectRange(start, end);
+               }
+       }
+
        /**
         * Select the specified waypoint
         * @param inWaypointIndex index of selected waypoint
@@ -257,7 +285,7 @@ public class SelectorDisplay extends GenericDisplay
                _ignoreScrollEvents = false;
 
                // update waypoints and photos if necessary
-               if ((inUpdateType |
+               if ((inUpdateType &
                        (DataSubscriber.DATA_ADDED_OR_REMOVED | DataSubscriber.DATA_EDITED | DataSubscriber.WAYPOINTS_MODIFIED)) > 0)
                {
                        _waypointListModel.fireChanged();
@@ -279,6 +307,28 @@ public class SelectorDisplay extends GenericDisplay
                                _waypointList.clearSelection();
                        }
                }
+               if ((inUpdateType & (DataSubscriber.DATA_ADDED_OR_REMOVED | DataSubscriber.DATA_EDITED)) > 0)
+               {
+                       _segmentListModel.fireChanged();
+                       if (_segmentListModel.getSize() > 1)
+                       {
+                               _listsPanel.add(_segmentListPanel);
+                       }
+               }
+               // Deselect segment if selection goes beyond the selected
+               // segment
+               if ((inUpdateType & DataSubscriber.SELECTION_CHANGED) > 0)
+               {
+                       int segmentSelected = _segmentList.getSelectedIndex();
+                       if (segmentSelected >= 0)
+                       {
+                               if (_trackInfo.getSelection().getStart() != _segmentListModel.getSegmentStart(segmentSelected) ||
+                                   _trackInfo.getSelection().getEnd() != _segmentListModel.getSegmentEnd(segmentSelected))
+                               {
+                                       _segmentList.clearSelection();
+                               }
+                       }
+               }
                // Hide photo list if no photos loaded, same for audio
                redrawLists(_photoListModel.getSize() > 0, _audioListModel.getSize() > 0);
 
@@ -347,6 +397,7 @@ public class SelectorDisplay extends GenericDisplay
                _listsPanel.removeAll();
                _listsPanel.setLayout(new GridLayout(0, 1));
                _listsPanel.add(_waypointListPanel);
+               _listsPanel.add(_segmentListPanel);
                if (inShowPhotos) {
                        _listsPanel.add(_photoListPanel);
                }
index c219c5546d77c310b14e7042c4af575047923aeb..af672c4ae2cefcfd4e48f1bc56cb3f1ac815e987 100644 (file)
@@ -736,6 +736,9 @@ details.range.gradient=Gradient
 details.lists.waypoints=Waypoints
 details.lists.photos=Photos
 details.lists.audio=Audio
+details.lists.segments=Segments
+details.lists.segments.label=Segment #
+details.lists.segments.to=to
 details.photodetails=Photo details
 details.nophoto=No photo selected
 details.photo.loading=Loading