Skip to content

Commit bd10e0c

Browse files
committed
SDL: update editor find and replace
1 parent 7602fa0 commit bd10e0c

File tree

4 files changed

+58
-16
lines changed

4 files changed

+58
-16
lines changed

ChangeLog

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
2019-07-10 (0.12.15)
2+
SDL: update editor find and replace
3+
14
2019-06-27 (0.12.15)
25
FLTK: file file save as
36
UI: fix reported crash in android printing null

src/platform/sdl/editor.cpp

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,10 @@ struct StatusMessage {
8989
_col = editor->getCol();
9090
}
9191

92+
void setDirty(TextEditInput *editor) {
93+
_dirty = !editor->isDirty();
94+
}
95+
9296
bool _dirty;
9397
int _row;
9498
int _col;
@@ -265,6 +269,8 @@ void System::editSource(String loadPath, bool restoreOnExit) {
265269
case SB_KEY_ESCAPE:
266270
widget = editWidget;
267271
helpWidget->hide();
272+
helpWidget->cancelMode();
273+
statusMessage.setDirty(editWidget);
268274
((Runtime *)this)->debugStop();
269275
break;
270276
case SB_KEY_CTRL('s'):
@@ -442,8 +448,10 @@ void System::editSource(String loadPath, bool restoreOnExit) {
442448
g_macro[g_macro_size++] = event.key;
443449
}
444450
if (event.key == SB_KEY_ENTER) {
445-
if (helpWidget->replaceMode()) {
451+
if (helpWidget->replaceModeWith()) {
446452
_output->setStatus("Replace string with. Esc=Close");
453+
} else if (helpWidget->replaceMode()) {
454+
_output->setStatus("Replace string. Enter=replace, Space=skip, Esc=Close");
447455
} else if (helpWidget->lineEditMode() && helpWidget->getTextLength()) {
448456
switch (inputMode) {
449457
case kExportAddr:
@@ -472,13 +480,23 @@ void System::editSource(String loadPath, bool restoreOnExit) {
472480
statusMessage._dirty = !widget->isDirty();
473481
widget = editWidget;
474482
helpWidget->hide();
483+
helpWidget->cancelMode();
475484
}
476485
redraw = true;
486+
} else if (helpWidget->replaceDoneMode()) {
487+
statusMessage._dirty = !widget->isDirty();
488+
widget = editWidget;
489+
helpWidget->hide();
490+
helpWidget->cancelMode();
477491
}
478492

479493
helpWidget->setFocus(widget == helpWidget);
480494
editWidget->setFocus(widget == editWidget);
481-
redraw |= statusMessage.update(editWidget, _output);
495+
if (helpWidget->searchMode()) {
496+
redraw = true;
497+
} else {
498+
redraw |= statusMessage.update(editWidget, _output);
499+
}
482500
if (redraw) {
483501
_output->redraw();
484502
}

src/ui/textedit.cpp

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -855,7 +855,7 @@ bool TextEditInput::edit(int key, int screenWidth, int charWidth) {
855855
bool TextEditInput::find(const char *word, bool next) {
856856
bool result = false;
857857
bool allUpper = true;
858-
int len = strlen(word);
858+
int len = word == NULL ? 0 : strlen(word);
859859
for (int i = 0; i < len; i++) {
860860
if (islower(word[i])) {
861861
allUpper = false;
@@ -1569,13 +1569,17 @@ char *TextEditInput::getWordBeforeCursor() {
15691569
return result;
15701570
}
15711571

1572-
bool TextEditInput::replaceNext(const char *buffer) {
1572+
bool TextEditInput::replaceNext(const char *buffer, bool skip) {
15731573
bool changed = false;
15741574
if (_state.select_start != _state.select_end &&
15751575
_buf._buffer != NULL && buffer != NULL) {
15761576
int start, end;
15771577
char *selection = getSelection(&start, &end);
1578-
stb_textedit_paste(&_buf, &_state, buffer, strlen(buffer));
1578+
if (!skip) {
1579+
stb_textedit_paste(&_buf, &_state, buffer, strlen(buffer));
1580+
} else {
1581+
_state.cursor++;
1582+
}
15791583
changed = find(selection, false);
15801584
free(selection);
15811585
}
@@ -1867,24 +1871,37 @@ bool TextEditHelpWidget::edit(int key, int screenWidth, int charWidth) {
18671871
result = TextEditInput::edit(key, screenWidth, charWidth);
18681872
_editor->find(_buf._buffer, key == SB_KEY_ENTER);
18691873
break;
1870-
case kSearchReplace:
1874+
case kEnterReplace:
18711875
result = TextEditInput::edit(key, screenWidth, charWidth);
18721876
if (key == SB_KEY_ENTER) {
18731877
_buf.clear();
1874-
_mode = kReplace;
1878+
_mode = kEnterReplaceWith;
18751879
} else {
18761880
_editor->find(_buf._buffer, false);
18771881
}
18781882
break;
1879-
case kReplace:
1883+
case kEnterReplaceWith:
18801884
if (key == SB_KEY_ENTER) {
1881-
if (!_editor->replaceNext(_buf._buffer)) {
1882-
_mode = kReplaceDone;
1883-
}
1885+
_mode = kReplace;
18841886
} else {
18851887
result = TextEditInput::edit(key, screenWidth, charWidth);
18861888
}
18871889
break;
1890+
case kReplace:
1891+
switch (key) {
1892+
case SB_KEY_ENTER:
1893+
if (!_editor->replaceNext(_buf._buffer, false)) {
1894+
_mode = kReplaceDone;
1895+
}
1896+
break;
1897+
case ' ':
1898+
if (!_editor->replaceNext(_buf._buffer, true)) {
1899+
// skip to next
1900+
_mode = kReplaceDone;
1901+
}
1902+
break;
1903+
}
1904+
break;
18881905
case kGotoLine:
18891906
result = TextEditInput::edit(key, screenWidth, charWidth);
18901907
if (key == SB_KEY_ENTER) {
@@ -2150,7 +2167,7 @@ void TextEditHelpWidget::createOutline() {
21502167

21512168
void TextEditHelpWidget::createSearch(bool replace) {
21522169
if (_mode != kSearch) {
2153-
reset(replace ? kSearchReplace : kSearch);
2170+
reset(replace ? kEnterReplace : kSearch);
21542171
}
21552172

21562173
char *text = _editor->getTextSelection(false);
@@ -2189,8 +2206,8 @@ void TextEditHelpWidget::createStackTrace(const char *error, int line, StackTrac
21892206
void TextEditHelpWidget::paste(const char *text) {
21902207
switch (_mode) {
21912208
case kSearch:
2192-
case kSearchReplace:
2193-
case kReplace:
2209+
case kEnterReplace:
2210+
case kEnterReplaceWith:
21942211
case kLineEdit:
21952212
TextEditInput::paste(text);
21962213
break;

src/ui/textedit.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ struct TextEditInput : public FormEditInput {
135135
void layout(int w, int h) { _width = w; _height = h; }
136136
const char *getNodeId();
137137
char *getWordBeforeCursor();
138-
bool replaceNext(const char *text);
138+
bool replaceNext(const char *text, bool skip);
139139
int getCompletions(StringList *list, int max);
140140
void selectNavigate(bool up);
141141

@@ -211,7 +211,8 @@ struct TextEditHelpWidget : public TextEditInput {
211211
kCompletion,
212212
kOutline,
213213
kSearch,
214-
kSearchReplace,
214+
kEnterReplace,
215+
kEnterReplaceWith,
215216
kReplace,
216217
kReplaceDone,
217218
kGotoLine,
@@ -235,10 +236,13 @@ struct TextEditHelpWidget : public TextEditInput {
235236
bool isDrawTop() { return true; }
236237
void layout(int w, int h) { _x = w - _width; _height = h; }
237238
void reset(HelpMode mode);
239+
void cancelMode() { _mode = kNone; }
238240
bool closeOnEnter() const;
241+
bool searchMode() const { return _mode >= kSearch && _mode <= kReplaceDone; }
239242
bool lineEditMode() const { return _mode == kLineEdit; }
240243
bool messageMode() const { return _mode == kMessage; }
241244
bool replaceMode() const { return _mode == kReplace; }
245+
bool replaceModeWith() const { return _mode == kEnterReplaceWith; }
242246
bool replaceDoneMode() const { return _mode == kReplaceDone; }
243247
bool selected(MAPoint2d pt, int scrollX, int scrollY, bool &redraw);
244248
void toggleKeyword();

0 commit comments

Comments
 (0)