Add undo/redo for reordering

This commit is contained in:
Alexander Sytnyk 2017-08-09 15:06:55 +03:00
parent 654f32652f
commit 284e96361e
5 changed files with 80 additions and 6 deletions

View file

@ -46,6 +46,7 @@ import net.osmand.plus.measurementtool.adapter.MeasurementToolItemTouchHelperCal
import net.osmand.plus.measurementtool.command.AddPointCommand;
import net.osmand.plus.measurementtool.command.CommandManager;
import net.osmand.plus.measurementtool.command.RemovePointCommand;
import net.osmand.plus.measurementtool.command.ReorderPointCommand;
import net.osmand.plus.views.OsmandMapTileView;
import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory;
import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopToolbarController;
@ -242,6 +243,10 @@ public class MeasurementToolFragment extends Fragment {
final ItemTouchHelper touchHelper = new ItemTouchHelper(new MeasurementToolItemTouchHelperCallback(adapter));
touchHelper.attachToRecyclerView(rv);
adapter.setAdapterListener(new MeasurementToolAdapter.MeasurementAdapterListener() {
private int fromPosition;
private int toPosition;
@Override
public void onPointRemove(int position) {
commandManager.execute(new RemovePointCommand(measurementLayer, position));
@ -265,8 +270,19 @@ public class MeasurementToolFragment extends Fragment {
@Override
public void onDragStarted(RecyclerView.ViewHolder holder) {
fromPosition = holder.getAdapterPosition();
touchHelper.startDrag(holder);
}
@Override
public void onDragEnded(RecyclerView.ViewHolder holder) {
toPosition = holder.getAdapterPosition();
if (toPosition != fromPosition) {
commandManager.execute(new ReorderPointCommand(measurementLayer, fromPosition, toPosition));
adapter.notifyDataSetChanged();
mapActivity.refreshMap();
}
}
});
rv.setLayoutManager(new LinearLayoutManager(getContext()));
rv.setAdapter(adapter);

View file

@ -74,7 +74,7 @@ public class MeasurementToolLayer extends OsmandMapLayer implements ContextMenuL
return measurementPoints.size();
}
LinkedList<WptPt> getMeasurementPoints() {
public LinkedList<WptPt> getMeasurementPoints() {
return measurementPoints;
}
@ -195,6 +195,10 @@ public class MeasurementToolLayer extends OsmandMapLayer implements ContextMenuL
}
}
public void refreshMap() {
view.refreshMap();
}
@Override
public void destroyLayer() {

View file

@ -26,7 +26,7 @@ public class MeasurementToolAdapter extends RecyclerView.Adapter<MeasurementTool
private final MapActivity mapActivity;
private final List<WptPt> points;
private MeasurementAdapterListener adapterListener;
private MeasurementAdapterListener listener;
public MeasurementToolAdapter(MapActivity mapActivity, List<WptPt> points) {
this.mapActivity = mapActivity;
@ -34,7 +34,7 @@ public class MeasurementToolAdapter extends RecyclerView.Adapter<MeasurementTool
}
public void setAdapterListener(MeasurementAdapterListener listener) {
this.adapterListener = listener;
this.listener = listener;
}
@Override
@ -50,7 +50,7 @@ public class MeasurementToolAdapter extends RecyclerView.Adapter<MeasurementTool
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
adapterListener.onItemClick(view);
listener.onItemClick(view);
}
});
return new MeasureToolItemVH(view);
@ -64,7 +64,7 @@ public class MeasurementToolAdapter extends RecyclerView.Adapter<MeasurementTool
@Override
public boolean onTouch(View view, MotionEvent event) {
if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) {
adapterListener.onDragStarted(holder);
listener.onDragStarted(holder);
}
return false;
}
@ -85,7 +85,7 @@ public class MeasurementToolAdapter extends RecyclerView.Adapter<MeasurementTool
holder.deleteBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
adapterListener.onPointRemove(holder.getAdapterPosition());
listener.onPointRemove(holder.getAdapterPosition());
}
});
}
@ -102,6 +102,11 @@ public class MeasurementToolAdapter extends RecyclerView.Adapter<MeasurementTool
return true;
}
@Override
public void onItemDismiss(RecyclerView.ViewHolder holder) {
listener.onDragEnded(holder);
}
static class MeasureToolItemVH extends RecyclerView.ViewHolder {
final ImageView iconReorder;
@ -127,5 +132,7 @@ public class MeasurementToolAdapter extends RecyclerView.Adapter<MeasurementTool
void onItemClick(View view);
void onDragStarted(RecyclerView.ViewHolder holder);
void onDragEnded(RecyclerView.ViewHolder holder);
}
}

View file

@ -38,7 +38,16 @@ public class MeasurementToolItemTouchHelperCallback extends ItemTouchHelper.Call
}
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
adapter.onItemDismiss(viewHolder);
}
interface ItemTouchHelperAdapter {
boolean onItemMove(int from, int to);
void onItemDismiss(RecyclerView.ViewHolder holder);
}
}

View file

@ -0,0 +1,38 @@
package net.osmand.plus.measurementtool.command;
import net.osmand.plus.measurementtool.MeasurementToolLayer;
import java.util.Collections;
public class ReorderPointCommand implements Command {
private final MeasurementToolLayer measurementLayer;
private final int from;
private final int to;
public ReorderPointCommand(MeasurementToolLayer measurementLayer, int from, int to) {
this.measurementLayer = measurementLayer;
this.from = from;
this.to = to;
}
@Override
public boolean execute() {
return true;
}
@Override
public void undo() {
swap();
}
@Override
public void redo() {
swap();
}
private void swap() {
Collections.swap(measurementLayer.getMeasurementPoints(), from, to);
measurementLayer.refreshMap();
}
}