From 790ed207834b2eb388b220a5fd95b4b427eaed60 Mon Sep 17 00:00:00 2001
From: RbCaVi <92527341+RbCaVi@users.noreply.github.com>
Date: Thu, 16 Mar 2023 00:33:26 -0400
Subject: [PATCH 1/6] Add a duplicate sketch function
---
.../com/calsignlabs/apde/EditorActivity.java | 50 +++++++++++++++++++
1 file changed, 50 insertions(+)
diff --git a/APDE/src/main/java/com/calsignlabs/apde/EditorActivity.java b/APDE/src/main/java/com/calsignlabs/apde/EditorActivity.java
index 3757c17..c06380e 100644
--- a/APDE/src/main/java/com/calsignlabs/apde/EditorActivity.java
+++ b/APDE/src/main/java/com/calsignlabs/apde/EditorActivity.java
@@ -1759,6 +1759,53 @@ public void launchRenameSketch() {
}
dialog.show();
}
+
+ /**
+ * Open the duplicate sketch AlertDialog
+ */
+ public void launchDuplicateSketch() {
+ AlertDialog.Builder alert = new AlertDialog.Builder(this);
+
+ alert.setTitle(String.format(Locale.US, getResources().getString(R.string.duplicate_sketch_title), getGlobalState().getSketchName()));
+ alert.setMessage(R.string.duplicate_sketch_message);
+
+ final EditText input = getGlobalState().createAlertDialogEditText(this, alert, getGlobalState().getSketchName(), true);
+
+ alert.setPositiveButton(R.string.duplicate_sketch_button, (dialog, whichButton) -> {
+ String sketchName = input.getText().toString();
+
+ try {
+ if (validateSketchName(sketchName) && !sketchName.equals(getGlobalState().getSketchName())) {
+ APDE.SketchMeta source = new APDE.SketchMeta(getGlobalState().getSketchLocationType(), getGlobalState().getSketchPath());
+ APDE.SketchMeta dest = new APDE.SketchMeta(source.getLocation(), source.getParent() + "/" + sketchName);
+
+ getGlobalState().copyFolder(source, dest, EditorActivity.this);
+
+ getGlobalState().setSketchName(sketchName);
+ updateSketchPath("/" + sketchName);
+ }
+
+ if (!PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getBoolean("use_hardware_keyboard", false)) {
+ ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(input.getWindowToken(), 0);
+ }
+ } catch (MaybeDocumentFile.MaybeDocumentFileException | FileNotFoundException e) {
+ e.printStackTrace();
+ }
+ });
+
+ alert.setNegativeButton(R.string.cancel, (dialog, whichButton) -> {
+ if (!PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getBoolean("use_hardware_keyboard", false)) {
+ ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(input.getWindowToken(), 0);
+ }
+ });
+
+ // Show the soft keyboard if the hardware keyboard is unavailable (hopefully)
+ AlertDialog dialog = alert.create();
+ if (!PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getBoolean("use_hardware_keyboard", false)) {
+ dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
+ }
+ dialog.show();
+ }
/**
* Called when the user selects "Load Sketch" - this will open the navigation drawer
@@ -2997,6 +3044,9 @@ public boolean onOptionsItemSelected(MenuItem item) {
case R.id.menu_rename:
launchRenameSketch();
return true;
+ case R.id.menu_duplicate:
+ launchDuplicateSketch();
+ return true;
case R.id.menu_copy_to_sketchbook:
copyToSketchbook();
return true;
From 8073646ab6f6033e84f67c8301aa11f4dbf8c150 Mon Sep 17 00:00:00 2001
From: RbCaVi <92527341+RbCaVi@users.noreply.github.com>
Date: Thu, 16 Mar 2023 00:38:42 -0400
Subject: [PATCH 2/6] Add a duplicate sketch option to the sketch menu
---
APDE/src/main/res/menu/activity_editor.xml | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/APDE/src/main/res/menu/activity_editor.xml b/APDE/src/main/res/menu/activity_editor.xml
index d0c63a8..7ad76a3 100644
--- a/APDE/src/main/res/menu/activity_editor.xml
+++ b/APDE/src/main/res/menu/activity_editor.xml
@@ -85,6 +85,10 @@
android:id="@+id/menu_rename"
app:showAsAction="never"
android:title="@string/editor_menu_rename_sketch" />
+
@@ -104,4 +108,4 @@
android:id="@+id/menu_tools"
app:showAsAction="never"
android:title="@string/editor_menu_tools" />
-
\ No newline at end of file
+
From 5075dcb52cc68baf15240071bf4548a6e7814259 Mon Sep 17 00:00:00 2001
From: RbCaVi <92527341+RbCaVi@users.noreply.github.com>
Date: Thu, 16 Mar 2023 00:48:00 -0400
Subject: [PATCH 3/6] Add duplicate tab and sketch
---
APDE/src/main/res/values/strings.xml | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/APDE/src/main/res/values/strings.xml b/APDE/src/main/res/values/strings.xml
index 0aae536..2d4982a 100644
--- a/APDE/src/main/res/values/strings.xml
+++ b/APDE/src/main/res/values/strings.xml
@@ -19,6 +19,7 @@
Tools
New Sketch
Rename Sketch
+ Duplicate Sketch
Delete Sketch
Sketch Properties
Copy to Sketchbook
@@ -28,6 +29,7 @@
New Tab
Rename Tab
+ Duplicate Tab
Delete Tab
@@ -422,4 +424,4 @@
APDE requires access to the external storage in order to store sketches there. Either grant the required permissions or change the sketchbook location to the internal storage.
Grant Permission
Use Internal Storage
-
\ No newline at end of file
+
From a0ef9a326907f6425552d2e950fa7ce56c52e5b8 Mon Sep 17 00:00:00 2001
From: RbCaVi <92527341+RbCaVi@users.noreply.github.com>
Date: Thu, 16 Mar 2023 00:50:21 -0400
Subject: [PATCH 4/6] Add duplicate tab
---
APDE/src/main/res/menu/tab_actions.xml | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/APDE/src/main/res/menu/tab_actions.xml b/APDE/src/main/res/menu/tab_actions.xml
index 2e9f7eb..d4ecca5 100644
--- a/APDE/src/main/res/menu/tab_actions.xml
+++ b/APDE/src/main/res/menu/tab_actions.xml
@@ -6,7 +6,10 @@
+
-
\ No newline at end of file
+
From 8332ca3e86cee9b477aa44d234d2898d0854e030 Mon Sep 17 00:00:00 2001
From: RbCaVi <92527341+RbCaVi@users.noreply.github.com>
Date: Thu, 16 Mar 2023 00:52:21 -0400
Subject: [PATCH 5/6] Add duplicate tab
---
APDE/src/main/res/menu/activity_editor.xml | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/APDE/src/main/res/menu/activity_editor.xml b/APDE/src/main/res/menu/activity_editor.xml
index 7ad76a3..ce03834 100644
--- a/APDE/src/main/res/menu/activity_editor.xml
+++ b/APDE/src/main/res/menu/activity_editor.xml
@@ -100,6 +100,10 @@
android:id="@+id/menu_tab_rename"
app:showAsAction="never"
android:title="@string/editor_menu_tab_rename" />
+
-
Date: Thu, 16 Mar 2023 01:14:53 -0400
Subject: [PATCH 6/6] Add partial duplicate support
---
.../com/calsignlabs/apde/EditorActivity.java | 23 +++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/APDE/src/main/java/com/calsignlabs/apde/EditorActivity.java b/APDE/src/main/java/com/calsignlabs/apde/EditorActivity.java
index c06380e..bbdda38 100644
--- a/APDE/src/main/java/com/calsignlabs/apde/EditorActivity.java
+++ b/APDE/src/main/java/com/calsignlabs/apde/EditorActivity.java
@@ -2842,9 +2842,11 @@ public boolean onLongClick(View v) {
menu.findItem(R.id.menu_redo).setVisible(false);
menu.findItem(R.id.menu_tab_delete).setVisible(false);
menu.findItem(R.id.menu_tab_rename).setVisible(false);
+ menu.findItem(R.id.menu_tab_duplicate).setVisible(false);
menu.findItem(R.id.menu_save).setVisible(false);
menu.findItem(R.id.menu_delete).setVisible(false);
menu.findItem(R.id.menu_rename).setVisible(false);
+ menu.findItem(R.id.menu_duplicate).setVisible(false);
menu.findItem(R.id.menu_copy_to_sketchbook).setVisible(false);
menu.findItem(R.id.menu_move_to_sketchbook).setVisible(false);
menu.findItem(R.id.menu_new).setVisible(false);
@@ -2863,6 +2865,7 @@ public boolean onLongClick(View v) {
menu.findItem(R.id.menu_run).setVisible(true);
menu.findItem(R.id.menu_tab_delete).setVisible(true);
menu.findItem(R.id.menu_tab_rename).setVisible(true);
+ menu.findItem(R.id.menu_tab_duplicate).setVisible(true);
menu.findItem(R.id.menu_tools).setVisible(true);
@@ -2888,6 +2891,7 @@ public boolean onLongClick(View v) {
menu.findItem(R.id.menu_redo).setVisible(false);
menu.findItem(R.id.menu_tab_delete).setVisible(false);
menu.findItem(R.id.menu_tab_rename).setVisible(false);
+ menu.findItem(R.id.menu_tab_duplicate).setVisible(false);
menu.findItem(R.id.menu_tools).setVisible(false);
}
@@ -2903,6 +2907,7 @@ public boolean onLongClick(View v) {
menu.findItem(R.id.menu_save).setVisible(true);
menu.findItem(R.id.menu_delete).setVisible(true);
menu.findItem(R.id.menu_rename).setVisible(true);
+ menu.findItem(R.id.menu_duplicate).setVisible(true);
menu.findItem(R.id.menu_copy_to_sketchbook).setVisible(false);
menu.findItem(R.id.menu_move_to_sketchbook).setVisible(false);
break;
@@ -2910,6 +2915,7 @@ public boolean onLongClick(View v) {
menu.findItem(R.id.menu_save).setVisible(true);
menu.findItem(R.id.menu_delete).setVisible(true);
menu.findItem(R.id.menu_rename).setVisible(false);
+ menu.findItem(R.id.menu_duplicate).setVisible(false);
menu.findItem(R.id.menu_copy_to_sketchbook).setVisible(false);
menu.findItem(R.id.menu_move_to_sketchbook).setVisible(true);
break;
@@ -2917,6 +2923,7 @@ public boolean onLongClick(View v) {
menu.findItem(R.id.menu_save).setVisible(true);
menu.findItem(R.id.menu_delete).setVisible(true);
menu.findItem(R.id.menu_rename).setVisible(true);
+ menu.findItem(R.id.menu_duplicate).setVisible(true);
menu.findItem(R.id.menu_copy_to_sketchbook).setVisible(true);
menu.findItem(R.id.menu_move_to_sketchbook).setVisible(false);
break;
@@ -2925,6 +2932,7 @@ public boolean onLongClick(View v) {
menu.findItem(R.id.menu_save).setVisible(false);
menu.findItem(R.id.menu_delete).setVisible(false);
menu.findItem(R.id.menu_rename).setVisible(false);
+ menu.findItem(R.id.menu_duplicate).setVisible(false);
menu.findItem(R.id.menu_copy_to_sketchbook).setVisible(true);
menu.findItem(R.id.menu_move_to_sketchbook).setVisible(false);
break;
@@ -2944,6 +2952,7 @@ public boolean onLongClick(View v) {
menu.findItem(R.id.menu_tab_new).setVisible(false);
menu.findItem(R.id.menu_tab_delete).setVisible(false);
menu.findItem(R.id.menu_tab_rename).setVisible(false);
+ menu.findItem(R.id.menu_tab_duplicate).setVisible(false);
// With auto-saving, we don't actually need to let the user save the sketch manually
// However, the keyboard shortcut will still be available
@@ -3071,6 +3080,9 @@ public boolean onOptionsItemSelected(MenuItem item) {
case R.id.menu_tab_rename:
renameTab();
return true;
+ case R.id.menu_tab_duplicate:
+ duplicateTab();
+ return true;
case R.id.menu_tab_delete:
deleteTab();
return true;
@@ -4049,6 +4061,9 @@ public boolean onMenuItemClick(MenuItem item) {
case R.id.menu_tab_rename:
renameTab();
return true;
+ case R.id.menu_tab_duplicate:
+ duplicateTab();
+ return true;
case R.id.menu_tab_delete:
deleteTab();
return true;
@@ -4157,6 +4172,14 @@ private void renameTab() {
createInputDialog(getResources().getString(R.string.tab_rename_dialog_title), getResources().getString(R.string.tab_rename_dialog_message), getSelectedSketchFile().getTitle(), RENAME_TAB);
}
+ /**
+ * Creates a user input dialog for duplicating the current tab
+ */
+ private void duplicateTab() {
+ if(tabs.size() > 0 && !getGlobalState().isExample())
+ createInputDialog(getResources().getString(R.string.tab_duplicate_dialog_title), getResources().getString(R.string.tab_duplicate_dialog_message), getSelectedSketchFile().getTitle(), DUPLICATE_TAB);
+ }
+
/**
* Creates a user input dialog for deleting the current tab
*/