Plan route point menu - Trim left/Trim right

This commit is contained in:
Dima-1 2020-08-18 14:41:36 +03:00
parent 43fe12c05c
commit 82905381dc
4 changed files with 96 additions and 43 deletions

View file

@ -262,22 +262,55 @@ public class MeasurementEditingContext {
return pt;
}
public void trimBefore(int selectedPointPosition) {
splitSegments(selectedPointPosition);
clearBeforeSegments();
}
public void trimAfter(int selectedPointPosition) {
splitSegments(selectedPointPosition + 1);
clearAfterSegments();
}
public void clearSegments() {
clearBeforeSegments();
clearAfterSegments();
}
public void clearBeforeSegments() {
before.points.clear();
after.points.clear();
if (isInSnapToRoadMode()) {
if (beforeCacheForSnap != null && afterCacheForSnap != null) {
if (beforeCacheForSnap != null) {
beforeCacheForSnap.points.clear();
afterCacheForSnap.points.clear();
}
needUpdateCacheForSnap = true;
} else {
beforeCacheForSnap = null;
needUpdateCacheForSnap = false;
}
}
public void clearAfterSegments() {
after.points.clear();
if (isInSnapToRoadMode()) {
if (afterCacheForSnap != null) {
afterCacheForSnap.points.clear();
}
needUpdateCacheForSnap = true;
} else {
afterCacheForSnap = null;
needUpdateCacheForSnap = false;
}
}
public boolean isFirstPointSelected() {
return selectedPointPosition == 0;
}
public boolean isLastPointSelected() {
return selectedPointPosition == getPoints().size() - 1;
}
public void scheduleRouteCalculateIfNotEmpty() {
needUpdateCacheForSnap = true;
if (application == null || (before.points.size() == 0 && after.points.size() == 0)) {

View file

@ -102,6 +102,8 @@ import static net.osmand.plus.measurementtool.SelectFileBottomSheet.Mode.ADD_TO_
import static net.osmand.plus.measurementtool.SelectFileBottomSheet.Mode.OPEN_TRACK;
import static net.osmand.plus.measurementtool.SelectFileBottomSheet.SelectFileListener;
import static net.osmand.plus.measurementtool.StartPlanRouteBottomSheet.StartPlanRouteListener;
import static net.osmand.plus.measurementtool.command.ClearPointsCommand.*;
import static net.osmand.plus.measurementtool.command.ClearPointsCommand.ClearCommandMode.*;
public class MeasurementToolFragment extends BaseOsmAndFragment implements RouteBetweenPointsFragmentListener,
OptionsFragmentListener, GpxApproximationFragmentListener, SelectedPointFragmentListener {
@ -701,7 +703,7 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
@Override
public void clearAllOnClick() {
MeasurementToolLayer measurementLayer = getMeasurementLayer();
editingCtx.getCommandManager().execute(new ClearPointsCommand(measurementLayer));
editingCtx.getCommandManager().execute(new ClearPointsCommand(measurementLayer, ALL));
editingCtx.cancelSnapToRoad();
if (pointsListOpened) {
hidePointsList();
@ -763,12 +765,25 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
@Override
public void onTrimRouteBefore() {
trimRoute(BEFORE);
}
@Override
public void onTrimRouteAfter() {
trimRoute(AFTER);
}
private void trimRoute(ClearCommandMode before) {
MeasurementToolLayer measurementLayer = getMeasurementLayer();
editingCtx.getCommandManager().execute(new ClearPointsCommand(measurementLayer, before));
if (pointsListOpened) {
hidePointsList();
}
editingCtx.setSelectedPointPosition(-1);
editingCtx.splitSegments(editingCtx.getBeforePoints().size() + editingCtx.getAfterPoints().size());
updateUndoRedoButton(false, redoBtn);
updateDistancePointsText();
saved = false;
}
@Override
@ -1009,7 +1024,6 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
mainIcon.setImageDrawable(getActiveIcon(R.drawable.ic_action_ruler));
editingCtx.resetAppMode();
editingCtx.cancelSnapToRoad();
visibleSnapToRoadIcon(false);
MapActivity mapActivity = getMapActivity();
if (mapActivity != null) {
mainView.findViewById(R.id.snap_to_road_progress_bar).setVisibility(View.GONE);
@ -1033,14 +1047,10 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
}
}
private void visibleSnapToRoadIcon(boolean show) {
private void hideSnapToRoadIcon() {
MapActivity mapActivity = getMapActivity();
if (mapActivity != null) {
if (show) {
mapActivity.findViewById(R.id.snap_to_road_image_button).setVisibility(View.VISIBLE);
} else {
mapActivity.findViewById(R.id.snap_to_road_image_button).setVisibility(View.GONE);
}
mapActivity.findViewById(R.id.snap_to_road_image_button).setVisibility(View.GONE);
}
}
@ -1794,9 +1804,8 @@ public class MeasurementToolFragment extends BaseOsmAndFragment implements Route
}
if (editingCtx.isInSnapToRoadMode()) {
resetSnapToRoadMode();
} else {
visibleSnapToRoadIcon(false);
}
hideSnapToRoadIcon();
if (!editingCtx.isNewData() && !planRouteMode) {
GPXFile gpx = editingCtx.getNewGpxData().getGpxFile();
Intent newIntent = new Intent(mapActivity, mapActivity.getMyApplication().getAppCustomization().getTrackActivity());

View file

@ -37,9 +37,15 @@ public class SelectedPointBottomSheetDialogFragment extends MenuBottomSheetDialo
public static final String TAG = SelectedPointBottomSheetDialogFragment.class.getSimpleName();
private static final Log LOG = PlatformUtil.getLog(SelectedPointBottomSheetDialogFragment.class);
private MeasurementEditingContext editingCtx;
@Override
public void createMenuItems(Bundle savedInstanceState) {
MapActivity mapActivity = getMapActivity();
if (mapActivity == null) {
return;
}
editingCtx = mapActivity.getMapLayers().getMeasurementToolLayer().getEditingCtx();
View titleView = UiUtilities.getInflater(getContext(), nightMode)
.inflate(R.layout.bottom_sheet_item_with_descr_pad_32dp, null, false);
@ -126,6 +132,7 @@ public class SelectedPointBottomSheetDialogFragment extends MenuBottomSheetDialo
dismiss();
}
})
.setDisabled(editingCtx.isFirstPointSelected())
.create();
items.add(trimRouteBefore);
@ -144,6 +151,7 @@ public class SelectedPointBottomSheetDialogFragment extends MenuBottomSheetDialo
dismiss();
}
})
.setDisabled(editingCtx.isLastPointSelected())
.create();
items.add(trimRouteAfter);
@ -164,6 +172,7 @@ public class SelectedPointBottomSheetDialogFragment extends MenuBottomSheetDialo
dismiss();
}
})
.setDisabled(editingCtx.isFirstPointSelected())
.create();
items.add(changeRouteTypeBefore);
@ -182,6 +191,7 @@ public class SelectedPointBottomSheetDialogFragment extends MenuBottomSheetDialo
dismiss();
}
})
.setDisabled(editingCtx.isLastPointSelected())
.create();
items.add(changeRouteTypeAfter);
@ -249,24 +259,15 @@ public class SelectedPointBottomSheetDialogFragment extends MenuBottomSheetDialo
@NonNull
private String getTitle() {
MapActivity mapActivity = getMapActivity();
if (mapActivity == null) {
return "";
}
MeasurementEditingContext editingCtx = mapActivity.getMapLayers().getMeasurementToolLayer().getEditingCtx();
int pos = editingCtx.getSelectedPointPosition();
String pointName = editingCtx.getPoints().get(pos).name;
if (!TextUtils.isEmpty(pointName)) {
return pointName;
}
NewGpxData newGpxData = editingCtx.getNewGpxData();
if (newGpxData != null && newGpxData.getActionType() == ActionType.ADD_ROUTE_POINTS) {
return getString(R.string.route_point) + " - " + (pos + 1);
}
return getString(R.string.plugin_distance_point) + " - " + (pos + 1);
}
@ -276,18 +277,15 @@ public class SelectedPointBottomSheetDialogFragment extends MenuBottomSheetDialo
if (mapActivity == null) {
return "";
}
StringBuilder description = new StringBuilder();
MeasurementEditingContext editingCtx = mapActivity.getMapLayers().getMeasurementToolLayer().getEditingCtx();
int pos = editingCtx.getSelectedPointPosition();
List<WptPt> points = editingCtx.getPoints();
WptPt pt = points.get(pos);
String pointDesc = pt.desc;
if (!TextUtils.isEmpty(pointDesc)) {
description.append(pointDesc);
} else if (pos < 1) {
} else if (pos < 1 && before) {
description.append(getString(R.string.shared_string_control_start));
} else {
float dist = 0;
@ -307,7 +305,6 @@ public class SelectedPointBottomSheetDialogFragment extends MenuBottomSheetDialo
}
description.append(OsmAndFormatter.getFormattedDistance(dist, mapActivity.getMyApplication()));
}
NewGpxData newGpxData = editingCtx.getNewGpxData();
if (newGpxData != null && newGpxData.getActionType() == ActionType.EDIT_SEGMENT) {
double elevation = pt.ele;
@ -321,22 +318,14 @@ public class SelectedPointBottomSheetDialogFragment extends MenuBottomSheetDialo
description.append(OsmAndFormatter.getFormattedSpeed(speed, mapActivity.getMyApplication()));
}
}
return description.toString();
}
@Nullable
private Drawable getRouteTypeIcon(boolean before) {
Drawable icon = getContentIcon(R.drawable.ic_action_split_interval);
MapActivity mapActivity = getMapActivity();
if (mapActivity == null) {
return icon;
}
MeasurementEditingContext editingCtx = mapActivity.getMapLayers().getMeasurementToolLayer().getEditingCtx();
int pos = editingCtx.getSelectedPointPosition();
pos = before ? pos : Math.max(pos - 1, 0);
String profileType = editingCtx.getPoints().get(pos).getProfileType();
ApplicationMode routeAppMode = ApplicationMode.valueOfStringKey(profileType, null);
if (routeAppMode != null) {

View file

@ -4,31 +4,54 @@ import net.osmand.GPXUtilities.WptPt;
import net.osmand.plus.measurementtool.MeasurementToolLayer;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class ClearPointsCommand extends MeasurementModeCommand {
private List<WptPt> points;
private boolean needUpdateCache;
ClearCommandMode clearMode;
private int pointPosition;
public ClearPointsCommand(MeasurementToolLayer measurementLayer) {
public enum ClearCommandMode {
ALL,
BEFORE,
AFTER
}
public ClearPointsCommand(MeasurementToolLayer measurementLayer, ClearCommandMode clearMode) {
super(measurementLayer);
this.clearMode = clearMode;
}
@Override
public boolean execute() {
pointPosition = getEditingCtx().getSelectedPointPosition();
executeCommand();
return true;
}
private void executeCommand() {
List<WptPt> pts = getEditingCtx().getPoints();
needUpdateCache = getEditingCtx().isNeedUpdateCacheForSnap();
points = new ArrayList<>(pts);
pts.clear();
getEditingCtx().clearSegments();
switch (clearMode) {
case ALL:
pts.clear();
getEditingCtx().clearSegments();
break;
case BEFORE:
getEditingCtx().trimBefore(pointPosition);
break;
case AFTER:
getEditingCtx().trimAfter(pointPosition);
}
refreshMap();
return true;
}
@Override
public void undo() {
getEditingCtx().clearSegments();
getEditingCtx().addPoints(points);
if (needUpdateCache) {
getEditingCtx().setNeedUpdateCacheForSnap(true);
@ -38,8 +61,7 @@ public class ClearPointsCommand extends MeasurementModeCommand {
@Override
public void redo() {
getEditingCtx().clearSegments();
refreshMap();
executeCommand();
}
@Override