Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 73 additions & 0 deletions APDE/src/main/java/com/calsignlabs/apde/EditorActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -2795,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);
Expand All @@ -2816,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);

Expand All @@ -2841,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);
}

Expand All @@ -2856,20 +2907,23 @@ 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;
case TEMPORARY:
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;
case EXTERNAL:
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;
Expand All @@ -2878,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;
Expand All @@ -2897,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
Expand Down Expand Up @@ -2997,6 +3053,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;
Expand All @@ -3021,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;
Expand Down Expand Up @@ -3999,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;
Expand Down Expand Up @@ -4107,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
*/
Expand Down
10 changes: 9 additions & 1 deletion APDE/src/main/res/menu/activity_editor.xml
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,10 @@
android:id="@+id/menu_rename"
app:showAsAction="never"
android:title="@string/editor_menu_rename_sketch" />
<item
android:id="@+id/menu_duplicate"
app:showAsAction="never"
android:title="@string/editor_menu_duplicate_sketch" />
<item android:id="@+id/menu_delete"
app:showAsAction="never"
android:title="@string/editor_menu_delete_sketch" />
Expand All @@ -96,6 +100,10 @@
android:id="@+id/menu_tab_rename"
app:showAsAction="never"
android:title="@string/editor_menu_tab_rename" />
<item
android:id="@+id/menu_tab_duplicate"
app:showAsAction="never"
android:title="@string/editor_menu_tab_duplicate" />
<item
android:id="@+id/menu_tab_delete"
app:showAsAction="never"
Expand All @@ -104,4 +112,4 @@
android:id="@+id/menu_tools"
app:showAsAction="never"
android:title="@string/editor_menu_tools" />
</menu>
</menu>
5 changes: 4 additions & 1 deletion APDE/src/main/res/menu/tab_actions.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@
<item
android:id="@+id/menu_tab_rename"
android:title="@string/editor_menu_tab_rename"/>
<item
android:id="@+id/menu_tab_duplicate"
android:title="@string/editor_menu_tab_duplicate"/>
<item
android:id="@+id/menu_tab_delete"
android:title="@string/editor_menu_tab_delete"/>
</menu>
</menu>
4 changes: 3 additions & 1 deletion APDE/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
<string name="editor_menu_tools">Tools</string>
<string name="editor_menu_new_sketch">New Sketch</string>
<string name="editor_menu_rename_sketch">Rename Sketch</string>
<string name="editor_menu_duplicate_sketch">Duplicate Sketch</string>
<string name="editor_menu_delete_sketch">Delete Sketch</string>
<string name="editor_menu_open_sketch_properties">Sketch Properties</string>
<string name="editor_menu_copy_to_sketchbook">Copy to Sketchbook</string>
Expand All @@ -28,6 +29,7 @@

<string name="editor_menu_tab_new">New Tab</string>
<string name="editor_menu_tab_rename">Rename Tab</string>
<string name="editor_menu_tab_duplicate">Duplicate Tab</string>
<string name="editor_menu_tab_delete">Delete Tab</string>

<!-- This is the title of the settings activity. -->
Expand Down Expand Up @@ -422,4 +424,4 @@
<string name="external_storage_dialog_message">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.</string>
<string name="external_storage_dialog_grant_permission_button">Grant Permission</string>
<string name="external_storage_dialog_use_internal_storage_button">Use Internal Storage</string>
</resources>
</resources>