Use DnD for tags and builtin filter subtasks

pull/820/head
Alex Baker 5 years ago
parent 7b2e7c3cc6
commit dbe04c8636

@ -40,13 +40,14 @@ public final class AstridTaskAdapter extends TaskAdapter {
@Override @Override
public boolean canMove(ViewHolder source, ViewHolder target) { public boolean canMove(ViewHolder source, ViewHolder target) {
return true; return !updater.isDescendantOf(target.task.getUuid(), source.task.getUuid());
} }
public boolean canIndent(int position, TaskContainer task) { @Override
String parentUuid = getItemUuid(position - 1); public int maxIndent(int previousPosition, TaskContainer task) {
int parentIndent = updater.getIndentForTask(parentUuid); TaskContainer previous = getTask(previousPosition);
return getIndent(task) <= parentIndent; String parentUuid = previous.getUuid();
return updater.getIndentForTask(parentUuid) + 1;
} }
@Override @Override
@ -56,11 +57,8 @@ public final class AstridTaskAdapter extends TaskAdapter {
@Override @Override
public void moved(int from, int to, int indent) { public void moved(int from, int to, int indent) {
String targetTaskId = getItemUuid(from); TaskContainer source = getTask(from);
if (!Task.isValidUuid(targetTaskId)) { String targetTaskId = source.getUuid();
return; // This can happen with gestures on empty parts of the list (e.g. extra space below
// tasks)
}
try { try {
if (to >= getCount()) { if (to >= getCount()) {
@ -69,6 +67,11 @@ public final class AstridTaskAdapter extends TaskAdapter {
String destinationTaskId = getItemUuid(to); String destinationTaskId = getItemUuid(to);
updater.moveTo(list, filter, targetTaskId, destinationTaskId); updater.moveTo(list, filter, targetTaskId, destinationTaskId);
} }
int currentIndent = updater.getIndentForTask(targetTaskId);
int delta = indent - currentIndent;
for (int i = 0 ; i < Math.abs(delta) ; i++) {
updater.indent(list, filter, targetTaskId, delta);
}
} catch (Exception e) { } catch (Exception e) {
Timber.e(e); Timber.e(e);
} }

@ -56,8 +56,8 @@ public final class GoogleTaskAdapter extends TaskAdapter {
} }
@Override @Override
public int maxIndent(int position, TaskContainer task) { public int maxIndent(int previousPosition, TaskContainer task) {
return position == 0 || task.hasChildren() ? 0 : 1; return task.hasChildren() ? 0 : 1;
} }
@Override @Override

@ -60,7 +60,7 @@ public class TaskAdapter {
return false; return false;
} }
public int maxIndent(int position, TaskContainer task) { public int maxIndent(int previousPosition, TaskContainer task) {
return 0; return 0;
} }

@ -391,6 +391,10 @@ public class SubtasksFilterUpdater {
applyToFilter(filter); applyToFilter(filter);
} }
public boolean isDescendantOf(String desc, String parent) {
return isDescendantOf(idToNode.get(desc), idToNode.get(parent));
}
// Returns true if desc is a descendant of parent // Returns true if desc is a descendant of parent
private boolean isDescendantOf(Node desc, Node parent) { private boolean isDescendantOf(Node desc, Node parent) {
Node curr = desc; Node curr = desc;

@ -9,7 +9,6 @@ import android.graphics.Canvas;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.adapter.TaskAdapter; import com.todoroo.astrid.adapter.TaskAdapter;
import com.todoroo.astrid.utility.Flags; import com.todoroo.astrid.utility.Flags;
import org.tasks.data.TaskContainer; import org.tasks.data.TaskContainer;
@ -17,7 +16,6 @@ import org.tasks.data.TaskContainer;
public class ItemTouchHelperCallback extends ItemTouchHelper.Callback { public class ItemTouchHelperCallback extends ItemTouchHelper.Callback {
private final TaskAdapter adapter; private final TaskAdapter adapter;
private final TaskListRecyclerAdapter recyclerAdapter; private final TaskListRecyclerAdapter recyclerAdapter;
private final TaskListFragment taskList;
private final Runnable onClear; private final Runnable onClear;
private int from = -1; private int from = -1;
private int to = -1; private int to = -1;
@ -25,13 +23,9 @@ public class ItemTouchHelperCallback extends ItemTouchHelper.Callback {
private boolean swiping; private boolean swiping;
ItemTouchHelperCallback( ItemTouchHelperCallback(
TaskAdapter adapter, TaskAdapter adapter, TaskListRecyclerAdapter recyclerAdapter, Runnable onClear) {
TaskListRecyclerAdapter recyclerAdapter,
TaskListFragment taskList,
Runnable onClear) {
this.adapter = adapter; this.adapter = adapter;
this.recyclerAdapter = recyclerAdapter; this.recyclerAdapter = recyclerAdapter;
this.taskList = taskList;
this.onClear = onClear; this.onClear = onClear;
} }
@ -85,7 +79,7 @@ public class ItemTouchHelperCallback extends ItemTouchHelper.Callback {
to == 0 || to == recyclerAdapter.getItemCount() - 1 to == 0 || to == recyclerAdapter.getItemCount() - 1
? 0 ? 0
: adapter.minIndent(from <= to ? to + 1 : to, task)); : adapter.minIndent(from <= to ? to + 1 : to, task));
source.setMaxIndent(adapter.maxIndent(to, task)); source.setMaxIndent(to == 0 ? 0 : adapter.maxIndent(from >= to ? to - 1 : to, task));
} }
@Override @Override
@ -175,7 +169,6 @@ public class ItemTouchHelperCallback extends ItemTouchHelper.Callback {
int delta = direction == ItemTouchHelper.RIGHT ? 1 : -1; int delta = direction == ItemTouchHelper.RIGHT ? 1 : -1;
int position = viewHolder.getAdapterPosition(); int position = viewHolder.getAdapterPosition();
recyclerAdapter.swiped(position, delta); recyclerAdapter.swiped(position, delta);
taskList.loadTaskListContent();
} }
boolean isDragging() { boolean isDragging() {

@ -59,7 +59,7 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter<ViewHolder>
this.actionModeProvider = actionModeProvider; this.actionModeProvider = actionModeProvider;
this.list = list; this.list = list;
itemTouchHelperCallback = itemTouchHelperCallback =
new ItemTouchHelperCallback(adapter, this, taskList, this::drainQueue); new ItemTouchHelperCallback(adapter, this, this::drainQueue);
isGoogleTaskList = taskList.getFilter() instanceof GtasksFilter; isGoogleTaskList = taskList.getFilter() instanceof GtasksFilter;
Pair<List<TaskContainer>, DiffResult> initial = Pair.create(list, null); Pair<List<TaskContainer>, DiffResult> initial = Pair.create(list, null);
disposables.add( disposables.add(
@ -262,6 +262,7 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter<ViewHolder>
adapter.moved(from, to, indent); adapter.moved(from, to, indent);
TaskContainer task = list.remove(from); TaskContainer task = list.remove(from);
list.add(from < to ? to - 1 : to, task); list.add(from < to ? to - 1 : to, task);
taskList.loadTaskListContent();
} }
void swiped(int position, int delta) { void swiped(int position, int delta) {

Loading…
Cancel
Save