Added "join-lines" (SpartanJ/ecode#669).

Added "move-to-previous-paragraph", "move-to-next-paragraph", "select-paragraph", "delete-paragraph" (SpartanJ/ecode#670).
Updated codicon font and changed the AI Assistant main icon.
Improved `CommandPalette::build`.
This commit is contained in:
Martín Lucas Golini
2025-10-01 00:50:03 -03:00
parent 3ca72f91d3
commit 3d002678a8
7 changed files with 393 additions and 283 deletions

Binary file not shown.

View File

@@ -293,7 +293,7 @@ class EE_API TextDocument {
std::size_t getLineLength( Int64 ) const;
void safeLineOp( Int64 line, std::function<void(TextDocumentLine&)> op );
void safeLineOp( Int64 line, std::function<void( TextDocumentLine& )> op );
void getLineTextToBuffer( Int64 line, String& buffer ) const;
@@ -839,6 +839,21 @@ class EE_API TextDocument {
TextRange restrictRange = TextRange() );
void changeFilePath( const std::string& filePath, bool notify );
void joinLines();
TextPosition findPreviousEmptyLines( size_t selIdx );
TextPosition findNextEmptyLines( size_t selIdx );
void moveToNextParagraph();
void moveToPreviousParagraph();
void selectCurrentParagraph();
void deleteCurrentParagraph();
};
struct TextSearchParams {

View File

@@ -4132,6 +4132,87 @@ void TextDocument::trimTrailingWhitespace() {
}
}
void TextDocument::joinLines() {
if ( linesCount() < 2 )
return;
BoolScopedOp op( mDoingTextInput, true );
for ( size_t cursorIdx = mSelection.size() - 1; cursorIdx != (size_t)-1; --cursorIdx ) {
auto range = getSelectionIndex( cursorIdx ).normalized();
Int64 startLine = range.start().line();
Int64 endLine = range.hasSelection() ? range.end().line() : startLine;
Int64 joinTo = endLine + ( range.hasSelection() ? 0 : 1 );
if ( joinTo >= (Int64)linesCount() || startLine >= joinTo )
continue;
String joined;
for ( Int64 ln = startLine; ln <= joinTo; ln++ ) {
String part = getLineTextWithoutNewLine( ln );
if ( ln > startLine ) {
size_t lpos = part.find_first_not_of( " \t" );
part = lpos != String::InvalidPos ? part.substr( lpos ) : String();
}
if ( ln < joinTo ) {
size_t rpos = part.find_last_not_of( " \t" );
part = rpos != String::InvalidPos ? part.substr( 0, rpos + 1 ) : String();
}
if ( !joined.empty() )
joined += String( " " );
joined += part;
}
TextRange repRange( { startLine, 0 }, { joinTo, (Int64)( getLineLength( joinTo ) - 1 ) } );
remove( cursorIdx, repRange );
setSelection( cursorIdx, insert( cursorIdx, { startLine, 0 }, joined ) );
}
mergeSelection();
}
TextPosition TextDocument::findPreviousEmptyLines( size_t selIdx ) {
Int64 startLine = mSelection[selIdx].normalized().start().line() - 1;
bool found = false;
for ( ; startLine >= 0; --startLine ) {
if ( getLineLength( startLine ) == 1 ) {
found = true;
break;
}
}
return found ? TextPosition{ startLine, static_cast<Int64>( getLineLength( startLine ) ) }
: startOfDoc();
}
TextPosition TextDocument::findNextEmptyLines( size_t selIdx ) {
Int64 startLine = mSelection[selIdx].normalized().end().line() + 1;
bool found = false;
for ( ; startLine < static_cast<Int64>( linesCount() ); ++startLine ) {
if ( getLineLength( startLine ) == 1 ) {
found = true;
break;
}
}
return found ? TextPosition{ startLine, 0 } : endOfDoc();
}
void TextDocument::moveToPreviousParagraph() {
for ( size_t i = 0; i < mSelection.size(); ++i )
setSelection( i, findPreviousEmptyLines( i ) );
}
void TextDocument::moveToNextParagraph() {
for ( size_t i = 0; i < mSelection.size(); ++i )
setSelection( i, findNextEmptyLines( i ) );
}
void TextDocument::selectCurrentParagraph() {
for ( size_t i = 0; i < mSelection.size(); ++i )
setSelection( i, { findPreviousEmptyLines( i ), findNextEmptyLines( i ) } );
}
void TextDocument::deleteCurrentParagraph() {
selectCurrentParagraph();
deleteToNextChar();
}
void TextDocument::initializeCommands() {
mCommands["reset"] = [this] { reset(); };
mCommands["save"] = [this] { save(); };
@@ -4144,6 +4225,7 @@ void TextDocument::initializeCommands() {
mCommands["delete-to-end-of-line"] = [this] { deleteToEndOfLine(); };
mCommands["delete-selection"] = [this] { deleteSelection(); };
mCommands["delete-word"] = [this] { deleteWord(); };
mCommands["delete-paragraph"] = [this] { deleteCurrentParagraph(); };
mCommands["move-to-previous-char"] = [this] { moveToPreviousChar(); };
mCommands["move-to-previous-word"] = [this] { moveToPreviousWord(); };
mCommands["move-to-next-char"] = [this] { moveToNextChar(); };
@@ -4157,6 +4239,8 @@ void TextDocument::initializeCommands() {
mCommands["move-to-start-of-line"] = [this] { moveToStartOfLine(); };
mCommands["move-to-end-of-line"] = [this] { moveToEndOfLine(); };
mCommands["move-to-start-of-content"] = [this] { moveToStartOfContent(); };
mCommands["move-to-previous-paragraph"] = [this] { moveToPreviousParagraph(); };
mCommands["move-to-next-paragraph"] = [this] { moveToNextParagraph(); };
mCommands["move-lines-up"] = [this] { moveLinesUp(); };
mCommands["move-lines-down"] = [this] { moveLinesDown(); };
mCommands["select-to-previous-char"] = [this] { selectToPreviousChar(); };
@@ -4176,6 +4260,7 @@ void TextDocument::initializeCommands() {
mCommands["select-to-end-of-doc"] = [this] { selectToEndOfDoc(); };
mCommands["select-to-previous-page"] = [this] { selectToPreviousPage( mPageSize ); };
mCommands["select-to-next-page"] = [this] { selectToNextPage( mPageSize ); };
mCommands["select-paragraph"] = [this] { selectCurrentParagraph(); };
mCommands["select-all"] = [this] { selectAll(); };
mCommands["new-line"] = [this] { newLine(); };
mCommands["new-line-above"] = [this] { newLineAbove(); };
@@ -4197,6 +4282,7 @@ void TextDocument::initializeCommands() {
mCommands["to-base64"] = [this] { toBase64(); };
mCommands["from-base64"] = [this] { fromBase64(); };
mCommands["trim-trailing-whitespace"] = [this] { trimTrailingWhitespace(); };
mCommands["join-lines"] = [this] { joinLines(); };
if ( TEXT_DOCUMENT_COMMANDS.empty() ) {
for ( const auto& [cmd, _] : mCommands )

View File

@@ -4,6 +4,8 @@
namespace EE { namespace UI {
using IconPair = std::pair<const char*, Uint32>;
UIIconTheme* IconManager::init( const std::string& iconThemeName, FontTrueType* remixIconFont,
FontTrueType* noniconFont, FontTrueType* codIconFont ) {
@@ -11,288 +13,290 @@ UIIconTheme* IconManager::init( const std::string& iconThemeName, FontTrueType*
if ( remixIconFont && remixIconFont->loaded() ) {
remixIconFont->setIsEmojiFont( true );
std::unordered_map<std::string, Uint32> icons = {
{ "document-new", 0xecc3 },
{ "document-open", 0xed70 },
{ "document-save", 0xf0b3 },
{ "document-save-as", 0xf0b3 },
{ "document-close", 0xeb99 },
{ "quit", 0xeb97 },
{ "undo", 0xea58 },
{ "redo", 0xea5a },
{ "cut", 0xf0c1 },
{ "copy", 0xecd5 },
{ "paste", 0xeb91 },
{ "edit", 0xec86 },
{ "split-horizontal", 0xf17a },
{ "split-vertical", 0xf17b },
{ "find-replace", 0xed2b },
{ "folder-add", 0xed5a },
{ "file-add", 0xecc9 },
{ "file-copy", 0xecd3 },
{ "file-code", 0xecd1 },
{ "file-edit", 0xecdb },
{ "font-size", 0xed8d },
{ "delete-bin", 0xec1e },
{ "delete-text", 0xec1e },
{ "zoom-in", 0xf2db },
{ "zoom-out", 0xf2dd },
{ "zoom-reset", 0xeb47 },
{ "fullscreen", 0xed9c },
{ "keybindings", 0xee75 },
{ "search", 0xf0d1 },
{ "go-up", 0xea78 },
{ "ok", 0xeb7a },
{ "cancel", 0xeb98 },
{ "color-picker", 0xf13d },
{ "pixel-density", 0xed8c },
{ "go-to-line", 0xf1f8 },
{ "table-view", 0xf1de },
{ "list-view", 0xecf1 },
{ "menu-unfold", 0xef40 },
{ "menu-fold", 0xef3d },
{ "download-cloud", 0xec58 },
{ "layout-left", 0xee94 },
{ "layout-right", 0xee9b },
{ "color-scheme", 0xebd4 },
{ "global-settings", 0xedcf },
{ "folder-user", 0xed84 },
{ "help", 0xf045 },
{ "terminal", 0xf1f6 },
{ "earth", 0xec7a },
{ "arrow-down", 0xea4c },
{ "arrow-up", 0xea76 },
{ "arrow-down-s", 0xea4e },
{ "arrow-up-s", 0xea78 },
{ "arrow-right-s", 0xea6e },
{ "match-case", 0xed8d },
{ "palette", 0xefc5 },
{ "file-code", 0xecd1 },
{ "cursor-pointer", 0xec09 },
{ "drive", 0xedf8 },
{ "refresh", 0xf064 },
{ "hearth-pulse", 0xee10 },
{ "add", 0xea12 },
{ "hammer", 0xedee },
{ "eraser", 0xec9e },
{ "file-search", 0xed05 },
{ "window", 0xf2c4 },
{ "file-lock-fill", 0xecf2 },
{ "filetype-svg", 0xF3C5 },
{ "filetype-png", 0xF3C5 },
{ "filetype-jpg", 0xF3C5 },
{ "filetype-jpeg", 0xF3C5 },
{ "filetype-tga", 0xF3C5 },
{ "filetype-dds", 0xF3C5 },
{ "filetype-qoi", 0xF3C5 },
{ "filetype-bmp", 0xF3C5 },
{ "filetype-gif", 0xF3C5 },
{ "filetype-psd", 0xF3C5 },
{ "filetype-hdr", 0xF3C5 },
{ "filetype-pic", 0xF3C5 },
{ "filetype-pvr", 0xF3C5 },
{ "filetype-pkm", 0xF3C5 },
{ "filetype-mp3", 0xEF83 },
{ "filetype-ogg", 0xEF83 },
{ "filetype-wav", 0xEF83 },
{ "filetype-flac", 0xEF83 },
{ "settings", 0xF0E3 },
{ "stop", 0xF1A0 },
{ "text-wrap", 0xF200 },
{ "play-filled", 0xF00A },
{ "code-ai", 0xF56F },
{ "robot-2", 0xF3D9 },
{ "chat-history", 0xEB61 },
{ "chat-private", 0xEB69 },
{ "loader-2", 0xEEC2 },
{ "more-fill", 0xEF78 },
{ "volume-up-fill", 0xF2A1 },
{ "volume-down-fill", 0xF29B },
{ "volume-mute-fill", 0xF29D },
{ "pause-fill", 0xEFD7 },
};
for ( const auto& icon : std::initializer_list<IconPair>{
for ( const auto& icon : icons )
{ "document-new", 0xecc3 },
{ "document-open", 0xed70 },
{ "document-save", 0xf0b3 },
{ "document-save-as", 0xf0b3 },
{ "document-close", 0xeb99 },
{ "quit", 0xeb97 },
{ "undo", 0xea58 },
{ "redo", 0xea5a },
{ "cut", 0xf0c1 },
{ "copy", 0xecd5 },
{ "paste", 0xeb91 },
{ "edit", 0xec86 },
{ "split-horizontal", 0xf17a },
{ "split-vertical", 0xf17b },
{ "find-replace", 0xed2b },
{ "folder-add", 0xed5a },
{ "file-add", 0xecc9 },
{ "file-copy", 0xecd3 },
{ "file-code", 0xecd1 },
{ "file-edit", 0xecdb },
{ "font-size", 0xed8d },
{ "delete-bin", 0xec1e },
{ "delete-text", 0xec1e },
{ "zoom-in", 0xf2db },
{ "zoom-out", 0xf2dd },
{ "zoom-reset", 0xeb47 },
{ "fullscreen", 0xed9c },
{ "keybindings", 0xee75 },
{ "search", 0xf0d1 },
{ "go-up", 0xea78 },
{ "ok", 0xeb7a },
{ "cancel", 0xeb98 },
{ "color-picker", 0xf13d },
{ "pixel-density", 0xed8c },
{ "go-to-line", 0xf1f8 },
{ "table-view", 0xf1de },
{ "list-view", 0xecf1 },
{ "menu-unfold", 0xef40 },
{ "menu-fold", 0xef3d },
{ "download-cloud", 0xec58 },
{ "layout-left", 0xee94 },
{ "layout-right", 0xee9b },
{ "color-scheme", 0xebd4 },
{ "global-settings", 0xedcf },
{ "folder-user", 0xed84 },
{ "help", 0xf045 },
{ "terminal", 0xf1f6 },
{ "earth", 0xec7a },
{ "arrow-down", 0xea4c },
{ "arrow-up", 0xea76 },
{ "arrow-down-s", 0xea4e },
{ "arrow-up-s", 0xea78 },
{ "arrow-right-s", 0xea6e },
{ "match-case", 0xed8d },
{ "palette", 0xefc5 },
{ "file-code", 0xecd1 },
{ "cursor-pointer", 0xec09 },
{ "drive", 0xedf8 },
{ "refresh", 0xf064 },
{ "hearth-pulse", 0xee10 },
{ "add", 0xea12 },
{ "hammer", 0xedee },
{ "eraser", 0xec9e },
{ "file-search", 0xed05 },
{ "window", 0xf2c4 },
{ "file-lock-fill", 0xecf2 },
{ "filetype-svg", 0xF3C5 },
{ "filetype-png", 0xF3C5 },
{ "filetype-jpg", 0xF3C5 },
{ "filetype-jpeg", 0xF3C5 },
{ "filetype-tga", 0xF3C5 },
{ "filetype-dds", 0xF3C5 },
{ "filetype-qoi", 0xF3C5 },
{ "filetype-bmp", 0xF3C5 },
{ "filetype-gif", 0xF3C5 },
{ "filetype-psd", 0xF3C5 },
{ "filetype-hdr", 0xF3C5 },
{ "filetype-pic", 0xF3C5 },
{ "filetype-pvr", 0xF3C5 },
{ "filetype-pkm", 0xF3C5 },
{ "filetype-mp3", 0xEF83 },
{ "filetype-ogg", 0xEF83 },
{ "filetype-wav", 0xEF83 },
{ "filetype-flac", 0xEF83 },
{ "settings", 0xF0E3 },
{ "stop", 0xF1A0 },
{ "text-wrap", 0xF200 },
{ "play-filled", 0xF00A },
{ "code-ai", 0xF56F },
{ "robot-2", 0xF3D9 },
{ "chat-history", 0xEB61 },
{ "chat-private", 0xEB69 },
{ "loader-2", 0xEEC2 },
{ "more-fill", 0xEF78 },
{ "volume-up-fill", 0xF2A1 },
{ "volume-down-fill", 0xF29B },
{ "volume-mute-fill", 0xF29D },
{ "pause-fill", 0xEFD7 },
} ) {
iconTheme->add( UIGlyphIcon::New( icon.first, remixIconFont, icon.second ) );
}
}
if ( noniconFont && noniconFont->loaded() ) {
noniconFont->setIsEmojiFont( true );
std::unordered_map<std::string, Uint32> mimeIcons =
{ { "filetype-lua", 61826 },
{ "filetype-c", 61718 },
{ "filetype-h", 61792 },
{ "filetype-cs", 61720 },
{ "filetype-cpp", 61719 },
{ "filetype-hpp", 61719 },
{ "filetype-css", 61743 },
{ "filetype-conf", 61781 },
{ "filetype-cfg", 61781 },
{ "filetype-desktop", 61781 },
{ "filetype-service", 61781 },
{ "filetype-env", 61781 },
{ "filetype-properties", 61781 },
{ "filetype-ini", 61781 },
{ "filetype-dart", 61744 },
{ "filetype-diff", 61752 },
{ "filetype-zip", 61775 },
{ "filetype-go", 61789 },
{ "filetype-htm", 61799 },
{ "filetype-html", 61799 },
{ "filetype-java", 61809 },
{ "filetype-js", 61810 },
{ "filetype-json", 61811 },
{ "filetype-kt", 61814 },
{ "filetype-md", 61829 },
{ "filetype-perl", 61853 },
{ "filetype-php", 61855 },
{ "filetype-py", 61863 },
{ "filetype-pyc", 61863 },
{ "filetype-pyd", 61863 },
{ "filetype-swift", 61906 },
{ "filetype-rb", 61880 },
{ "filetype-rs", 61881 },
{ "filetype-ts", 61923 },
{ "filetype-jsx", 0xf1ab },
{ "filetype-tsx", 0xf1ab },
{ "filetype-yaml", 61945 },
{ "filetype-yml", 61945 },
{ "filetype-jpg", 61801 },
{ "filetype-png", 61801 },
{ "filetype-jpeg", 61801 },
{ "filetype-bmp", 61801 },
{ "filetype-tga", 61801 },
{ "filetype-sh", 61911 },
{ "filetype-bash", 61911 },
{ "filetype-fish", 61911 },
{ "filetype-scala", 61882 },
{ "filetype-r", 61866 },
{ "filetype-rake", 61880 },
{ "filetype-rss", 61879 },
{ "filetype-sql", 61746 },
{ "filetype-elm", 61763 },
{ "filetype-ex", 61971 },
{ "filetype-exs", 61971 },
{ "filetype-awk", 61971 },
{ "filetype-nim", 61734 },
{ "filetype-xml", 61769 },
{ "filetype-dockerfile", 61758 },
{ "filetype-scala", 61882 },
{ "filetype-sc", 61882 },
{ "filetype-perl", 61853 },
{ "filetype-vue", 0xf1f4 },
{ "file", 61766 },
{ "file-symlink", 61774 },
{ "folder", 0xF23B },
{ "folder-open", 0xF23C },
{ "tree-expanded", 0xF11E },
{ "tree-contracted", 0xF120 },
{ "github", 0xF184 },
{ "package", 61846 },
{ "tab-close", 61944 } };
for ( const auto& icon : std::initializer_list<IconPair>
for ( const auto& icon : mimeIcons )
{ { "filetype-lua", 61826 },
{ "filetype-c", 61718 },
{ "filetype-h", 61792 },
{ "filetype-cs", 61720 },
{ "filetype-cpp", 61719 },
{ "filetype-hpp", 61719 },
{ "filetype-css", 61743 },
{ "filetype-conf", 61781 },
{ "filetype-cfg", 61781 },
{ "filetype-desktop", 61781 },
{ "filetype-service", 61781 },
{ "filetype-env", 61781 },
{ "filetype-properties", 61781 },
{ "filetype-ini", 61781 },
{ "filetype-dart", 61744 },
{ "filetype-diff", 61752 },
{ "filetype-zip", 61775 },
{ "filetype-go", 61789 },
{ "filetype-htm", 61799 },
{ "filetype-html", 61799 },
{ "filetype-java", 61809 },
{ "filetype-js", 61810 },
{ "filetype-json", 61811 },
{ "filetype-kt", 61814 },
{ "filetype-md", 61829 },
{ "filetype-perl", 61853 },
{ "filetype-php", 61855 },
{ "filetype-py", 61863 },
{ "filetype-pyc", 61863 },
{ "filetype-pyd", 61863 },
{ "filetype-swift", 61906 },
{ "filetype-rb", 61880 },
{ "filetype-rs", 61881 },
{ "filetype-ts", 61923 },
{ "filetype-jsx", 0xf1ab },
{ "filetype-tsx", 0xf1ab },
{ "filetype-yaml", 61945 },
{ "filetype-yml", 61945 },
{ "filetype-jpg", 61801 },
{ "filetype-png", 61801 },
{ "filetype-jpeg", 61801 },
{ "filetype-bmp", 61801 },
{ "filetype-tga", 61801 },
{ "filetype-sh", 61911 },
{ "filetype-bash", 61911 },
{ "filetype-fish", 61911 },
{ "filetype-scala", 61882 },
{ "filetype-r", 61866 },
{ "filetype-rake", 61880 },
{ "filetype-rss", 61879 },
{ "filetype-sql", 61746 },
{ "filetype-elm", 61763 },
{ "filetype-ex", 61971 },
{ "filetype-exs", 61971 },
{ "filetype-awk", 61971 },
{ "filetype-nim", 61734 },
{ "filetype-xml", 61769 },
{ "filetype-dockerfile", 61758 },
{ "filetype-scala", 61882 },
{ "filetype-sc", 61882 },
{ "filetype-perl", 61853 },
{ "filetype-vue", 0xf1f4 },
{ "file", 61766 },
{ "file-symlink", 61774 },
{ "folder", 0xF23B },
{ "folder-open", 0xF23C },
{ "tree-expanded", 0xF11E },
{ "tree-contracted", 0xF120 },
{ "github", 0xF184 },
{ "package", 61846 },
{ "tab-close", 61944 } } ) {
iconTheme->add( UIGlyphIcon::New( icon.first, noniconFont, icon.second ) );
}
}
if ( codIconFont && codIconFont->loaded() ) {
codIconFont->setIsEmojiFont( true );
std::unordered_map<std::string, Uint32> codIcons = {
{ "symbol-text", 0xea93 },
{ "symbol-method", 0xea8c },
{ "symbol-function", 0xea8c },
{ "symbol-constructor", 0xea8c },
{ "symbol-field", 0xeb5f },
{ "symbol-variable", 0xea88 },
{ "symbol-class", 0xeb5b },
{ "symbol-interface", 0xeb61 },
{ "symbol-module", 0xea8b },
{ "symbol-property", 0xeb65 },
{ "symbol-unit", 0xea96 },
{ "symbol-value", 0xea95 },
{ "symbol-enum", 0xea95 },
{ "symbol-keyword", 0xeb62 },
{ "symbol-snippet", 0xeb66 },
{ "symbol-color", 0xeb5c },
{ "symbol-file", 0xeb60 },
{ "symbol-reference", 0xea94 },
{ "symbol-folder", 0xea83 },
{ "symbol-enum-member", 0xeb5e },
{ "symbol-constant", 0xeb5d },
{ "symbol-struct", 0xea91 },
{ "symbol-event", 0xea86 },
{ "symbol-operator", 0xeb64 },
{ "symbol-type-parameter", 0xea92 },
{ "expand-all", 0xeb95 },
{ "symbol-namespace", 0xea8b },
{ "symbol-package", 0xea8b },
{ "symbol-string", 0xeb8d },
{ "symbol-number", 0xea90 },
{ "symbol-boolean", 0xea8f },
{ "symbol-array", 0xea8a },
{ "symbol-object", 0xea8b },
{ "symbol-key", 0xea93 },
{ "symbol-null", 0xea8f },
{ "collapse-all", 0xeac5 },
{ "chevron-down", 0xeab4 },
{ "chevron-right", 0xeab6 },
{ "lightbulb-autofix", 0xeb13 },
{ "layout-sidebar-left-off", 0xec02 },
{ "layout-sidebar-left", 0xebf3 },
{ "warning", 0xea6c },
{ "error", 0xea87 },
{ "search-fuzzy", 0xec0d },
{ "source-control", 0xea68 },
{ "repo", 0xea62 },
{ "repo-pull", 0xeb40 },
{ "repo-push", 0xeb41 },
{ "repo-forked", 0xea63 },
{ "repo-fetch", 0xec1d },
{ "git-fetch", 0xf101 },
{ "git-commit", 0xeafc },
{ "git-stash", 0xec26 },
{ "git-stash-apply", 0xec27 },
{ "git-stash-pop", 0xec28 },
{ "git-merge", 0xeafe },
{ "diff-single", 0xec22 },
{ "remove", 0xeb3b },
{ "tag", 0xea66 },
{ "globe", 0xeb01 },
{ "circle-filled", 0xea71 },
{ "circle", 0xeabc },
{ "diff-multiple", 0xec23 },
{ "extensions", 0xeae6 },
{ "window-opt", 0xeb7f },
{ "tools", 0xeb6d },
{ "play", 0xeb2c },
{ "output", 0xeb9d },
{ "fold", 0xeaf5 },
{ "bug", 0xeaaf },
{ "debug", 0xead8 },
{ "debug-alt", 0xeb91 },
{ "debug-continue", 0xeacf },
{ "debug-disconnect", 0xead0 },
{ "debug-pause", 0xead1 },
{ "debug-restart", 0xead2 },
{ "debug-start", 0xead3 },
{ "debug-step-into", 0xead4 },
{ "debug-step-out", 0xead5 },
{ "debug-step-over", 0xead6 },
{ "debug-stop", 0xead7 },
{ "chrome-close", 0xeab8 },
{ "diff-added", 0xeadc },
{ "diff-removed", 0xeadf },
{ "eye", 0xea70 },
{ "eye-closed", 0xeae7 },
{ "settings-alt", 0xeb52 },
{ "attach", 0xec34 },
};
for ( const auto& icon : std::initializer_list<IconPair>{
for ( const auto& icon : codIcons )
{ "symbol-text", 0xea93 },
{ "symbol-method", 0xea8c },
{ "symbol-function", 0xea8c },
{ "symbol-constructor", 0xea8c },
{ "symbol-field", 0xeb5f },
{ "symbol-variable", 0xea88 },
{ "symbol-class", 0xeb5b },
{ "symbol-interface", 0xeb61 },
{ "symbol-module", 0xea8b },
{ "symbol-property", 0xeb65 },
{ "symbol-unit", 0xea96 },
{ "symbol-value", 0xea95 },
{ "symbol-enum", 0xea95 },
{ "symbol-keyword", 0xeb62 },
{ "symbol-snippet", 0xeb66 },
{ "symbol-color", 0xeb5c },
{ "symbol-file", 0xeb60 },
{ "symbol-reference", 0xea94 },
{ "symbol-folder", 0xea83 },
{ "symbol-enum-member", 0xeb5e },
{ "symbol-constant", 0xeb5d },
{ "symbol-struct", 0xea91 },
{ "symbol-event", 0xea86 },
{ "symbol-operator", 0xeb64 },
{ "symbol-type-parameter", 0xea92 },
{ "expand-all", 0xeb95 },
{ "symbol-namespace", 0xea8b },
{ "symbol-package", 0xea8b },
{ "symbol-string", 0xeb8d },
{ "symbol-number", 0xea90 },
{ "symbol-boolean", 0xea8f },
{ "symbol-array", 0xea8a },
{ "symbol-object", 0xea8b },
{ "symbol-key", 0xea93 },
{ "symbol-null", 0xea8f },
{ "collapse-all", 0xeac5 },
{ "chevron-down", 0xeab4 },
{ "chevron-right", 0xeab6 },
{ "lightbulb-autofix", 0xeb13 },
{ "layout-sidebar-left-off", 0xec02 },
{ "layout-sidebar-left", 0xebf3 },
{ "warning", 0xea6c },
{ "error", 0xea87 },
{ "search-fuzzy", 0xec0d },
{ "source-control", 0xea68 },
{ "repo", 0xea62 },
{ "repo-pull", 0xeb40 },
{ "repo-push", 0xeb41 },
{ "repo-forked", 0xea63 },
{ "repo-fetch", 0xec1d },
{ "git-fetch", 0xf101 },
{ "git-commit", 0xeafc },
{ "git-stash", 0xec26 },
{ "git-stash-apply", 0xec27 },
{ "git-stash-pop", 0xec28 },
{ "git-merge", 0xeafe },
{ "diff-single", 0xec22 },
{ "remove", 0xeb3b },
{ "tag", 0xea66 },
{ "globe", 0xeb01 },
{ "circle-filled", 0xea71 },
{ "circle", 0xeabc },
{ "diff-multiple", 0xec23 },
{ "extensions", 0xeae6 },
{ "window-opt", 0xeb7f },
{ "tools", 0xeb6d },
{ "play", 0xeb2c },
{ "output", 0xeb9d },
{ "fold", 0xeaf5 },
{ "bug", 0xeaaf },
{ "debug", 0xead8 },
{ "debug-alt", 0xeb91 },
{ "debug-continue", 0xeacf },
{ "debug-disconnect", 0xead0 },
{ "debug-pause", 0xead1 },
{ "debug-restart", 0xead2 },
{ "debug-start", 0xead3 },
{ "debug-step-into", 0xead4 },
{ "debug-step-out", 0xead5 },
{ "debug-step-over", 0xead6 },
{ "debug-stop", 0xead7 },
{ "chrome-close", 0xeab8 },
{ "diff-added", 0xeadc },
{ "diff-removed", 0xeadf },
{ "eye", 0xea70 },
{ "eye-closed", 0xeae7 },
{ "settings-alt", 0xeb52 },
{ "attach", 0xec34 },
{ "chat-sparkle", 0xEC4F },
} ) {
iconTheme->add( UIGlyphIcon::New( icon.first, codIconFont, icon.second ) );
}
}
iconTheme->add( UISVGIcon::New(

View File

@@ -6,14 +6,18 @@ std::vector<std::vector<std::string>>
CommandPalette::build( const std::vector<std::string>& commandList,
const EE::UI::KeyBindings& keybindings ) {
std::vector<std::vector<std::string>> ret;
std::unordered_set<std::string> processedCommands;
ret.reserve( commandList.size() );
processedCommands.reserve( commandList.size() );
for ( const auto& cmd : commandList ) {
if ( std::find_if( ret.begin(), ret.end(),
[&cmd]( const auto& other ) { return other[2] == cmd; } ) != ret.end() )
continue;
std::string cmdName( cmd );
String::capitalizeInPlace( cmdName );
String::replaceAll( cmdName, "-", " " );
ret.push_back( { cmdName, keybindings.getCommandKeybindString( cmd ), cmd } );
if ( processedCommands.insert( cmd ).second ) {
std::string cmdName( cmd );
String::capitalizeInPlace( cmdName );
String::replaceAll( cmdName, "-", " " );
ret.push_back(
{ std::move( cmdName ), keybindings.getCommandKeybindString( cmd ), cmd } );
}
}
return ret;
}

View File

@@ -240,7 +240,7 @@ void AIAssistantPlugin::load( PluginManager* pluginManager ) {
} );
}
return TabWidgetData{ chatUI, getPluginContext()->findIcon( "code-ai" ),
return TabWidgetData{ chatUI, getPluginContext()->findIcon( "chat-sparkle" ),
i18n( "ai_assistant", "AI Assistant" ) };
};
config.onSave = []( UIWidget* widget ) {
@@ -415,7 +415,7 @@ LLMChatUI* AIAssistantPlugin::newAIAssistant() {
if ( !splitter->hasSplit() )
tabWidget = splitter->splitTabWidget( SplitDirection::Right, tabWidget );
auto [tab, _] = splitter->createWidgetInTabWidget( tabWidget, chatUI, tabName );
auto icon = getPluginContext()->findIcon( "code-ai" );
auto icon = getPluginContext()->findIcon( "chat-sparkle" );
if ( icon )
tab->setIcon( icon );
return chatUI;
@@ -479,7 +479,7 @@ void AIAssistantPlugin::initUI() {
mStatusButton->setParent( mStatusBar );
mStatusButton->setId( "ai_assistant_but" );
mStatusButton->setClass( "status_but" );
mStatusButton->setIcon( iconDrawable( "code-ai", 14 ) );
mStatusButton->setIcon( iconDrawable( "chat-sparkle", 14 ) );
mStatusButton->setTooltipText( i18n( "ai_assistant", "AI Assistant" ) );
mStatusButton->on( Event::MouseClick,
[this]( const Event* ) { newAIAssistant()->setFocus(); } );

View File

@@ -392,13 +392,14 @@ LLMChatUI::LLMChatUI( PluginManager* manager ) :
setCmd( "ai-show-menu", [this] {
UIPopUpMenu* menu = UIPopUpMenu::New();
menu->add( i18n( "new_conversation", "New Conversation" ),
getUISceneNode()->findIconDrawable( "code-ai", PixelDensity::dpToPxI( 12 ) ),
getPlugin()
->getPluginContext()
->getMainLayout()
->getKeyBindings()
.getCommandKeybindString( "new-ai-assistant" ) )
menu->add(
i18n( "new_conversation", "New Conversation" ),
getUISceneNode()->findIconDrawable( "chat-sparkle", PixelDensity::dpToPxI( 12 ) ),
getPlugin()
->getPluginContext()
->getMainLayout()
->getKeyBindings()
.getCommandKeybindString( "new-ai-assistant" ) )
->setId( "new-ai-assistant" );
menu->add(