mirror of
https://github.com/SpartanJ/eepp.git
synced 2026-05-31 02:26:29 +03:00
Added UIDataBind: simple two way data binding between data and widgets.
UIDocFindReplace: first working version completed. TextDocument: Fixed findTextLast when using case-insensitive search. StyleSheet: Added StyleSheet::markerExists. ecode: DocSearchController minor refactor.
This commit is contained in:
@@ -32,76 +32,74 @@ void DocSearchController::initSearchBar(
|
||||
{ mApp->getKeybind( "open-global-search" ), "open-global-search" } } );
|
||||
kbind.addKeybindsStringUnordered( keybindings );
|
||||
|
||||
UITextInput* findInput = mSearchBarLayout->find<UITextInput>( "search_find" );
|
||||
findInput->setEscapePastedText( true );
|
||||
UITextInput* replaceInput = mSearchBarLayout->find<UITextInput>( "search_replace" );
|
||||
UICheckBox* caseSensitiveChk = mSearchBarLayout->find<UICheckBox>( "case_sensitive" );
|
||||
UICheckBox* escapeSequenceChk = mSearchBarLayout->find<UICheckBox>( "escape_sequence" );
|
||||
UICheckBox* wholeWordChk = mSearchBarLayout->find<UICheckBox>( "whole_word" );
|
||||
UICheckBox* luaPatternChk = mSearchBarLayout->find<UICheckBox>( "lua_pattern" );
|
||||
mFindInput = mSearchBarLayout->find<UITextInput>( "search_find" );
|
||||
mFindInput->setEscapePastedText( true );
|
||||
mReplaceInput = mSearchBarLayout->find<UITextInput>( "search_replace" );
|
||||
mCaseSensitiveChk = mSearchBarLayout->find<UICheckBox>( "case_sensitive" );
|
||||
mEscapeSequenceChk = mSearchBarLayout->find<UICheckBox>( "escape_sequence" );
|
||||
mWholeWordChk = mSearchBarLayout->find<UICheckBox>( "whole_word" );
|
||||
mLuaPatternChk = mSearchBarLayout->find<UICheckBox>( "lua_pattern" );
|
||||
UIPushButton* replaceAllButton = mSearchBarLayout->find<UIPushButton>( "replace_all" );
|
||||
UIPushButton* findPrevButton = mSearchBarLayout->find<UIPushButton>( "find_prev" );
|
||||
UIPushButton* findNextButton = mSearchBarLayout->find<UIPushButton>( "find_next" );
|
||||
UIPushButton* replaceButton = mSearchBarLayout->find<UIPushButton>( "replace" );
|
||||
UIPushButton* findReplaceButton = mSearchBarLayout->find<UIPushButton>( "replace_find" );
|
||||
caseSensitiveChk->setChecked( searchBarConfig.caseSensitive );
|
||||
luaPatternChk->setChecked( searchBarConfig.luaPattern );
|
||||
wholeWordChk->setChecked( searchBarConfig.wholeWord );
|
||||
escapeSequenceChk->setChecked( searchBarConfig.escapeSequence );
|
||||
UIWidget* closeButton = mSearchBarLayout->find<UIWidget>( "searchbar_close" );
|
||||
mCaseSensitiveChk->setChecked( searchBarConfig.caseSensitive );
|
||||
mLuaPatternChk->setChecked( searchBarConfig.luaPattern );
|
||||
mWholeWordChk->setChecked( searchBarConfig.wholeWord );
|
||||
mEscapeSequenceChk->setChecked( searchBarConfig.escapeSequence );
|
||||
|
||||
luaPatternChk->setTooltipText( kbind.getCommandKeybindString( "toggle-lua-pattern" ) );
|
||||
caseSensitiveChk->setTooltipText( kbind.getCommandKeybindString( "change-case" ) );
|
||||
wholeWordChk->setTooltipText( kbind.getCommandKeybindString( "change-whole-word" ) );
|
||||
mLuaPatternChk->setTooltipText( kbind.getCommandKeybindString( "toggle-lua-pattern" ) );
|
||||
mCaseSensitiveChk->setTooltipText( kbind.getCommandKeybindString( "change-case" ) );
|
||||
mWholeWordChk->setTooltipText( kbind.getCommandKeybindString( "change-whole-word" ) );
|
||||
std::string kbindEscape = kbind.getCommandKeybindString( "change-escape-sequence" );
|
||||
if ( !kbindEscape.empty() )
|
||||
escapeSequenceChk->setTooltipText( escapeSequenceChk->getTooltipText() + " (" +
|
||||
mEscapeSequenceChk->setTooltipText( mEscapeSequenceChk->getTooltipText() + " (" +
|
||||
kbindEscape + ")" );
|
||||
|
||||
caseSensitiveChk->addEventListener(
|
||||
Event::OnValueChange, [&, caseSensitiveChk]( const Event* ) {
|
||||
mSearchState.caseSensitive = caseSensitiveChk->isChecked();
|
||||
} );
|
||||
|
||||
escapeSequenceChk->addEventListener(
|
||||
Event::OnValueChange, [&, escapeSequenceChk]( const Event* ) {
|
||||
mSearchState.escapeSequences = escapeSequenceChk->isChecked();
|
||||
} );
|
||||
|
||||
wholeWordChk->addEventListener( Event::OnValueChange, [&, wholeWordChk]( const Event* ) {
|
||||
mSearchState.wholeWord = wholeWordChk->isChecked();
|
||||
mCaseSensitiveChk->addEventListener( Event::OnValueChange, [&]( const Event* ) {
|
||||
mSearchState.caseSensitive = mCaseSensitiveChk->isChecked();
|
||||
} );
|
||||
|
||||
luaPatternChk->addEventListener( Event::OnValueChange, [&, luaPatternChk]( const Event* ) {
|
||||
mSearchState.type = luaPatternChk->isChecked() ? TextDocument::FindReplaceType::LuaPattern
|
||||
mEscapeSequenceChk->addEventListener( Event::OnValueChange, [&]( const Event* ) {
|
||||
mSearchState.escapeSequences = mEscapeSequenceChk->isChecked();
|
||||
} );
|
||||
|
||||
mWholeWordChk->addEventListener( Event::OnValueChange, [&]( const Event* ) {
|
||||
mSearchState.wholeWord = mWholeWordChk->isChecked();
|
||||
} );
|
||||
|
||||
mLuaPatternChk->addEventListener( Event::OnValueChange, [&]( const Event* ) {
|
||||
mSearchState.type = mLuaPatternChk->isChecked() ? TextDocument::FindReplaceType::LuaPattern
|
||||
: TextDocument::FindReplaceType::Normal;
|
||||
} );
|
||||
|
||||
findInput->addEventListener( Event::OnTextChanged, [&, findInput]( const Event* ) {
|
||||
mFindInput->addEventListener( Event::OnTextChanged, [&]( const Event* ) {
|
||||
if ( mSearchState.editor && mEditorSplitter->editorExists( mSearchState.editor ) ) {
|
||||
mSearchState.text = findInput->getText();
|
||||
mSearchState.text = mFindInput->getText();
|
||||
mSearchState.editor->setHighlightWord( mSearchState.text );
|
||||
if ( !mSearchState.text.empty() ) {
|
||||
mSearchState.editor->getDocument().setSelection( { 0, 0 } );
|
||||
if ( !findNextText( mSearchState ) ) {
|
||||
findInput->addClass( "error" );
|
||||
mFindInput->addClass( "error" );
|
||||
} else {
|
||||
findInput->removeClass( "error" );
|
||||
mFindInput->removeClass( "error" );
|
||||
}
|
||||
} else {
|
||||
findInput->removeClass( "error" );
|
||||
mFindInput->removeClass( "error" );
|
||||
mSearchState.editor->getDocument().setSelection(
|
||||
mSearchState.editor->getDocument().getSelection().start() );
|
||||
}
|
||||
}
|
||||
} );
|
||||
findInput->addEventListener(
|
||||
Event::OnTextPasted, [&, findInput, escapeSequenceChk]( const Event* ) {
|
||||
if ( findInput->getUISceneNode()->getWindow()->getClipboard()->getText().find( '\n' ) !=
|
||||
String::InvalidPos ) {
|
||||
if ( !escapeSequenceChk->isChecked() )
|
||||
escapeSequenceChk->setChecked( true );
|
||||
}
|
||||
} );
|
||||
mFindInput->addEventListener( Event::OnTextPasted, [&]( const Event* ) {
|
||||
if ( mFindInput->getUISceneNode()->getWindow()->getClipboard()->getText().find( '\n' ) !=
|
||||
String::InvalidPos ) {
|
||||
if ( !mEscapeSequenceChk->isChecked() )
|
||||
mEscapeSequenceChk->setChecked( true );
|
||||
}
|
||||
} );
|
||||
mSearchBarLayout->addCommand( "close-searchbar", [&] {
|
||||
hideSearchBar();
|
||||
if ( mEditorSplitter->getCurWidget() )
|
||||
@@ -114,43 +112,39 @@ void DocSearchController::initSearchBar(
|
||||
}
|
||||
} );
|
||||
mSearchBarLayout->addCommand( "repeat-find", [this] { findNextText( mSearchState ); } );
|
||||
mSearchBarLayout->addCommand( "replace-all", [this, replaceInput] {
|
||||
size_t count = replaceAll( mSearchState, replaceInput->getText() );
|
||||
mSearchBarLayout->addCommand( "replace-all", [this] {
|
||||
size_t count = replaceAll( mSearchState, mReplaceInput->getText() );
|
||||
mApp->getNotificationCenter()->addNotification(
|
||||
String::format( "Replaced %zu occurrences.", count ) );
|
||||
replaceInput->setFocus();
|
||||
} );
|
||||
mSearchBarLayout->addCommand( "find-and-replace", [this, replaceInput] {
|
||||
findAndReplace( mSearchState, replaceInput->getText() );
|
||||
mReplaceInput->setFocus();
|
||||
} );
|
||||
mSearchBarLayout->addCommand(
|
||||
"find-and-replace", [this] { findAndReplace( mSearchState, mReplaceInput->getText() ); } );
|
||||
mSearchBarLayout->addCommand( "find-prev", [this] { findPrevText( mSearchState ); } );
|
||||
mSearchBarLayout->addCommand( "replace-selection", [this, replaceInput] {
|
||||
replaceSelection( mSearchState, replaceInput->getText() );
|
||||
mSearchBarLayout->addCommand( "replace-selection", [this] {
|
||||
replaceSelection( mSearchState, mReplaceInput->getText() );
|
||||
} );
|
||||
mSearchBarLayout->addCommand( "change-case", [&, caseSensitiveChk] {
|
||||
caseSensitiveChk->setChecked( !caseSensitiveChk->isChecked() );
|
||||
} );
|
||||
mSearchBarLayout->addCommand( "change-whole-word", [&, wholeWordChk] {
|
||||
wholeWordChk->setChecked( !wholeWordChk->isChecked() );
|
||||
} );
|
||||
mSearchBarLayout->addCommand( "change-escape-sequence", [&, escapeSequenceChk] {
|
||||
escapeSequenceChk->setChecked( !escapeSequenceChk->isChecked() );
|
||||
} );
|
||||
mSearchBarLayout->addCommand( "toggle-lua-pattern", [&, luaPatternChk] {
|
||||
luaPatternChk->setChecked( !luaPatternChk->isChecked() );
|
||||
mSearchBarLayout->addCommand(
|
||||
"change-case", [&] { mCaseSensitiveChk->setChecked( !mCaseSensitiveChk->isChecked() ); } );
|
||||
mSearchBarLayout->addCommand( "change-whole-word",
|
||||
[&] { mWholeWordChk->setChecked( !mWholeWordChk->isChecked() ); } );
|
||||
mSearchBarLayout->addCommand( "change-escape-sequence", [&] {
|
||||
mEscapeSequenceChk->setChecked( !mEscapeSequenceChk->isChecked() );
|
||||
} );
|
||||
mSearchBarLayout->addCommand(
|
||||
"toggle-lua-pattern", [&] { mLuaPatternChk->setChecked( !mLuaPatternChk->isChecked() ); } );
|
||||
mSearchBarLayout->addCommand( "open-global-search", [&] { mApp->showGlobalSearch( false ); } );
|
||||
|
||||
addReturnListener( findInput, "repeat-find" );
|
||||
addReturnListener( replaceInput, "find-and-replace" );
|
||||
addReturnListener( mFindInput, "repeat-find" );
|
||||
addReturnListener( mReplaceInput, "find-and-replace" );
|
||||
addClickListener( findPrevButton, "find-prev" );
|
||||
addClickListener( findNextButton, "repeat-find" );
|
||||
addClickListener( replaceButton, "replace-selection" );
|
||||
addClickListener( findReplaceButton, "find-and-replace" );
|
||||
addClickListener( replaceAllButton, "replace-all" );
|
||||
addClickListener( mSearchBarLayout->find<UIWidget>( "searchbar_close" ), "close-searchbar" );
|
||||
replaceInput->addEventListener( Event::OnTabNavigate,
|
||||
[findInput]( const Event* ) { findInput->setFocus(); } );
|
||||
addClickListener( closeButton, "close-searchbar" );
|
||||
mReplaceInput->addEventListener( Event::OnTabNavigate,
|
||||
[&]( const Event* ) { mFindInput->setFocus(); } );
|
||||
}
|
||||
|
||||
void DocSearchController::showFindView() {
|
||||
@@ -162,19 +156,15 @@ void DocSearchController::showFindView() {
|
||||
UICodeEditor* editor = mEditorSplitter->getCurEditor();
|
||||
mSearchState.editor = editor;
|
||||
mSearchState.range = TextRange();
|
||||
mSearchState.caseSensitive =
|
||||
mSearchBarLayout->find<UICheckBox>( "case_sensitive" )->isChecked();
|
||||
mSearchState.wholeWord = mSearchBarLayout->find<UICheckBox>( "whole_word" )->isChecked();
|
||||
mSearchState.escapeSequences =
|
||||
mSearchBarLayout->find<UICheckBox>( "escape_sequence" )->isChecked();
|
||||
mSearchState.type = mSearchBarLayout->find<UICheckBox>( "lua_pattern" )->isChecked()
|
||||
? TextDocument::FindReplaceType::LuaPattern
|
||||
: TextDocument::FindReplaceType::Normal;
|
||||
mSearchState.caseSensitive = mCaseSensitiveChk->isChecked();
|
||||
mSearchState.wholeWord = mWholeWordChk->isChecked();
|
||||
mSearchState.escapeSequences = mEscapeSequenceChk->isChecked();
|
||||
mSearchState.type = mLuaPatternChk->isChecked() ? TextDocument::FindReplaceType::LuaPattern
|
||||
: TextDocument::FindReplaceType::Normal;
|
||||
mSearchBarLayout->setEnabled( true )->setVisible( true );
|
||||
|
||||
UITextInput* findInput = mSearchBarLayout->find<UITextInput>( "search_find" );
|
||||
findInput->getDocument().selectAll();
|
||||
findInput->setFocus();
|
||||
mFindInput->getDocument().selectAll();
|
||||
mFindInput->setFocus();
|
||||
|
||||
const TextDocument& doc = editor->getDocument();
|
||||
|
||||
@@ -185,13 +175,13 @@ void DocSearchController::showFindView() {
|
||||
mSearchState.range = doc.getSelection( true );
|
||||
|
||||
if ( !text.empty() && doc.getSelection().inSameLine() ) {
|
||||
findInput->setText( text );
|
||||
findInput->getDocument().selectAll();
|
||||
} else if ( !findInput->getText().empty() ) {
|
||||
findInput->getDocument().selectAll();
|
||||
mFindInput->setText( text );
|
||||
mFindInput->getDocument().selectAll();
|
||||
} else if ( !mFindInput->getText().empty() ) {
|
||||
mFindInput->getDocument().selectAll();
|
||||
}
|
||||
}
|
||||
mSearchState.text = findInput->getText();
|
||||
mSearchState.text = mFindInput->getText();
|
||||
editor->setHighlightTextRange( mSearchState.range );
|
||||
editor->setHighlightWord( mSearchState.text );
|
||||
editor->getDocument().setActiveClient( editor );
|
||||
@@ -203,7 +193,6 @@ bool DocSearchController::findPrevText( SearchState& search ) {
|
||||
if ( !search.editor || !mEditorSplitter->editorExists( search.editor ) || search.text.empty() )
|
||||
return false;
|
||||
|
||||
UITextInput* findInput = mSearchBarLayout->find<UITextInput>( "search_find" );
|
||||
search.editor->getDocument().setActiveClient( search.editor );
|
||||
mLastSearch = search.text;
|
||||
TextDocument& doc = search.editor->getDocument();
|
||||
@@ -222,18 +211,18 @@ bool DocSearchController::findPrevText( SearchState& search ) {
|
||||
search.range );
|
||||
if ( found.isValid() ) {
|
||||
doc.setSelection( found );
|
||||
findInput->removeClass( "error" );
|
||||
mFindInput->removeClass( "error" );
|
||||
return true;
|
||||
} else {
|
||||
found = doc.findLast( txt, range.end(), search.caseSensitive, search.wholeWord, search.type,
|
||||
range );
|
||||
if ( found.isValid() ) {
|
||||
doc.setSelection( found );
|
||||
findInput->removeClass( "error" );
|
||||
mFindInput->removeClass( "error" );
|
||||
return true;
|
||||
}
|
||||
}
|
||||
findInput->addClass( "error" );
|
||||
mFindInput->addClass( "error" );
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -243,7 +232,6 @@ bool DocSearchController::findNextText( SearchState& search ) {
|
||||
if ( !search.editor || !mEditorSplitter->editorExists( search.editor ) || search.text.empty() )
|
||||
return false;
|
||||
|
||||
UITextInput* findInput = mSearchBarLayout->find<UITextInput>( "search_find" );
|
||||
search.editor->getDocument().setActiveClient( search.editor );
|
||||
mLastSearch = search.text;
|
||||
TextDocument& doc = search.editor->getDocument();
|
||||
@@ -262,18 +250,18 @@ bool DocSearchController::findNextText( SearchState& search ) {
|
||||
doc.find( txt, from, search.caseSensitive, search.wholeWord, search.type, range );
|
||||
if ( found.isValid() ) {
|
||||
doc.setSelection( found.reversed() );
|
||||
findInput->removeClass( "error" );
|
||||
mFindInput->removeClass( "error" );
|
||||
return true;
|
||||
} else {
|
||||
found = doc.find( txt, range.start(), search.caseSensitive, search.wholeWord, search.type,
|
||||
range );
|
||||
if ( found.isValid() ) {
|
||||
doc.setSelection( found.reversed() );
|
||||
findInput->removeClass( "error" );
|
||||
mFindInput->removeClass( "error" );
|
||||
return true;
|
||||
}
|
||||
}
|
||||
findInput->addClass( "error" );
|
||||
mFindInput->addClass( "error" );
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -360,15 +348,11 @@ SearchState& DocSearchController::getSearchState() {
|
||||
}
|
||||
|
||||
SearchBarConfig DocSearchController::getSearchBarConfig() const {
|
||||
UICheckBox* caseSensitiveChk = mSearchBarLayout->find<UICheckBox>( "case_sensitive" );
|
||||
UICheckBox* escapeSequenceChk = mSearchBarLayout->find<UICheckBox>( "escape_sequence" );
|
||||
UICheckBox* wholeWordChk = mSearchBarLayout->find<UICheckBox>( "whole_word" );
|
||||
UICheckBox* luaPatternChk = mSearchBarLayout->find<UICheckBox>( "lua_pattern" );
|
||||
SearchBarConfig searchBarConfig;
|
||||
searchBarConfig.caseSensitive = caseSensitiveChk->isChecked();
|
||||
searchBarConfig.luaPattern = luaPatternChk->isChecked();
|
||||
searchBarConfig.wholeWord = wholeWordChk->isChecked();
|
||||
searchBarConfig.escapeSequence = escapeSequenceChk->isChecked();
|
||||
searchBarConfig.caseSensitive = mCaseSensitiveChk->isChecked();
|
||||
searchBarConfig.luaPattern = mLuaPatternChk->isChecked();
|
||||
searchBarConfig.wholeWord = mWholeWordChk->isChecked();
|
||||
searchBarConfig.escapeSequence = mEscapeSequenceChk->isChecked();
|
||||
return searchBarConfig;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user