]> gitweb.fperrin.net Git - GpsPrune.git/commitdiff
Add a panel to select by segment origin/segment-view
authorFrédéric Perrin <frederic.perrin@att.com>
Thu, 30 Jan 2020 16:19:03 +0000 (16:19 +0000)
committerFrédéric Perrin <frederic.perrin@att.com>
Thu, 30 Jan 2020 16:39:14 +0000 (16:39 +0000)
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 ef099d4c171d1651bfd627a3beb71bd271943a15..b6e05496e17335628c577dd799408b19361bf6f0 100644 (file)
@@ -818,6 +818,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 9dfc24f42394ad624d925589a2acd344411c12a0..92b215399053e7d9d1d2ba586a570c61be35e624 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
@@ -258,7 +286,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();
@@ -280,6 +308,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);
 
@@ -348,6 +398,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 7b7742fa0bc0cd17cbd48c72e8ebdf8702bb1c14..35ac13bbe9f4feb91555c3f099f84c2b26d567c3 100644 (file)
@@ -765,6 +765,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