Skip to content
This repository has been archived by the owner on Sep 6, 2021. It is now read-only.

Added ESC, Y, A, N, and S as keyboard shortcuts to the Replace and Find ... #5969

Closed
wants to merge 7 commits into from
Closed

Conversation

mrplants
Copy link

Submitting fix to bug: #5005. ESC, Y, A, N, and S keyboard shortcuts were added to the Replace and Find function. No deletion of code was necessary. I simply attached a handler to the 'modalBar' object that watched for key events and performed the necessary functions fi the above keyCodes were realized.

@mrplants
Copy link
Author

I replaced the == with === in order to pass the Travis CI test.

@ghost ghost assigned redmunds Nov 13, 2013
@peterflynn
Copy link
Member

Adding a couple drive-by comments... also @mrplants, we need you to sign the contributor agreement before this can be merged.

@@ -572,6 +572,30 @@ define(function (require, exports, module) {
modalBar = null;
}
});
modalBar.getRoot().on("keyup", function (e) {
if (e.keyCode === 27 /*ESC*/ || e.keyCode === 89 /*Y*/ || e.keyCode === 65 /*A*/ || e.keyCode === 78 /*N*/ || e.keyCode === 83 /*S*/) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should use the KeyEvent constants here

@peterflynn
Copy link
Member

Also, looks like this pull request adds an empty file called "Run"... can you remove that from the diff?

@peterflynn
Copy link
Member

One last point: I wondered whether the mnemonics Y/N/S/A should be localized since the buttons will have different labels in other locales. But we don't do that for any other shortcuts, and it's already covered by the shortcut localization story -- so IMHO no need to worry about it here.

@marcelgerber
Copy link
Contributor

@peterflynn Maybe we should just pick the first char out of the string, for example in german Ja is Yes, which means using J.

@mrplants
Copy link
Author

@SAplayer How do we map the first letter to a KeyEvent value? What if it's Chinese? String parsing would be difficult in that case I assume.

@mrplants
Copy link
Author

@peterflynn I made the changes and signed the agreement. Thanks for the help.

@SAplayer:
Maybe instead of (Y), it could be (ENTER), and instead of (N), it could be (RIGHT ARROW / LEFT ARROW). And (S) doesn't really need to be there because (ESCAPE) quits it anyways. (SPACEBAR or something else...) could be the replace-all command.

So the keyboard commands would be:
ENTER - replace the currently selected item
RIGHT_ARROW / DOWN_ARROW - go to the closest match after current
LEFT_ARROW / UP_ARROW - go to the closest match before current
SPACE_BAR - replace-all mode
ESCAPE - end the find & replace mode

This way, it can be language-agnostic. Let me know what you think and I'll implement it.

@marcelgerber
Copy link
Contributor

I realized this wasn't a good idea, too. We had to implement special cases like if two strings began with the same char.
Your idea isn't bad, but we definitely shouldn't use ENTER. Enter is handled on tabbing, so normally it does replace the current match, but after tabbing it skips the current match.

@peterflynn Maybe we could add the shortcut key to the modalbar, so german would be Ja (Y) for example.

modalBar.prepareClose();
modalBar.close();
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using a switch would make this code block cleaner. And you don't really need the first If, if you are then handling each keyCode in it's own if.

@mrplants
Copy link
Author

Are there any other problems with this Pull Request that I should fix?

@TomMalbran
Copy link
Contributor

Yes. Please use JSLint when coding for Brackets. If you code in Brackets just enable it to check the code. Right now there is an error with the switch, which should be switch (e.keyCode) {, and you don't need the last default statement in the switch. You will also avoid most of this Travis failures checking the code with JSLint.

@redmunds
Copy link
Contributor

@mrplants We're currently trying to close down Sprint 34, so we're not merging any pull requests until that is done. I'll take a final look probably next week.

@mrplants
Copy link
Author

I found a JSLinter and fixed my code. Please advise for any other changes when you review the pull request again.

@redmunds
Copy link
Contributor

@mrplants This is a nice improvement!

This code doesn't quite follow the existing flow of code. I can see 2 ways (so far) where this causes bugs:

  1. Type some text in page to replace, type in replacement text, then keep pressing "Y" until last instance of text has been replace. The modal bar is not dismissed after last replace. Same operation clicking "Y" button dismisses modal bar when done.
  2. If I click the "All..." button, the modal bar is dismissed, but if I press "A" key, it is not dismissed.

Look at the code in the modalBar.getRoot().on("click", function (e) { above. Notice how it closes the modal bar on every click. The normal code processing will re-invoke the modal bar when required. Your code should do the same. Also notice the "replace-stop" case that destroys modalBar (that has already been closed).

@redmunds
Copy link
Contributor

The Escape and Stop cases are doing the same thing:

        case KeyEvent.DOM_VK_ESCAPE:
            modalBar.close();
            break;
        case KeyEvent.DOM_VK_S:
            modalBar.close();
            break;

So they can be consolidated:

        case KeyEvent.DOM_VK_ESCAPE:
        case KeyEvent.DOM_VK_S:
            modalBar.close();
            break;

Note that this code will likely change due to my previous comment, but these 2 cases will probably still be the same and can still be consolidated.

@redmunds
Copy link
Contributor

Done with review. Let me know when you push fixes to your branch and I'll review again.

@redmunds
Copy link
Contributor

Note that it's best practice to create a branch for your changes. This way you can update your master branch with brackets repo updates, etc. without affecting your pull request. This also allows you to have multiple pull requests.

@peterflynn
Copy link
Member

Closing since this is going to be invalidated by the find/replace UI cleanup user story within the next day or two. I'll see if I can work the keyboard handling into that change. If not, @mrplants would you be willing to set up a new pull request based on that newer code after it lands?

@peterflynn peterflynn closed this Dec 3, 2013
@mrplants
Copy link
Author

mrplants commented Dec 5, 2013

@peterflynn Definitely. I would love to take responsibility for that. Let me know when I should pull and I'll make the necessary changes to add keyboard handling.

On a side note, I'm a student and I have an assignment to improve a data structure in an open source project. Do you think that Brackets has this? I'm looking for a project with the following restrictions:

The improvement will increase efficiency or speed
It is based on a data structure
It is relatively beginner coding. I'm not an expert at JS quite yet.

Any ideas? I realize that the assignment is kind of useless and out of scope, but if you could find something like this for me, I would really appreciate it.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants