diff --git a/include/eepp/ui/tools/uicodeeditorsplitter.hpp b/include/eepp/ui/tools/uicodeeditorsplitter.hpp index ef3bd1e09..3f25f451b 100644 --- a/include/eepp/ui/tools/uicodeeditorsplitter.hpp +++ b/include/eepp/ui/tools/uicodeeditorsplitter.hpp @@ -278,7 +278,7 @@ class EE_API UICodeEditorSplitter { tryCloseTabsToDirection( mCurWidget, UITabWidget::FocusTabBehavior::Default, true ); } ); t.setCommand( "create-new", [this] { - auto d = createCodeEditorInTabWidget( tabWidgetFromWidget( mCurWidget ) ); + auto d = createCodeEditorInTabWidget( getPreferredTabWidget() ); if ( d.first != nullptr && d.second != nullptr ) { d.first->getTabWidget()->setTabSelected( d.first ); } else if ( !mTabWidgets.empty() ) { @@ -381,6 +381,14 @@ class EE_API UICodeEditorSplitter { bool isWidgetInAnyWidget( UIWidget* ) const; + void setOpenDocumentsInMainSplit( bool open ) { mOpenDocumentsInMainSplit = open; } + + bool openDocumentsInMainSplit() const { return mOpenDocumentsInMainSplit; } + + UITabWidget* getFirstTabWidget() const; + + UITabWidget* getPreferredTabWidget() const; + protected: UISceneNode* mUISceneNode{ nullptr }; std::shared_ptr mThreadPool; @@ -395,6 +403,7 @@ class EE_API UICodeEditorSplitter { bool mHideTabBarOnSingleTab{ true }; bool mFirstCodeEditor{ true }; bool mVisualSplitting{ true }; + bool mOpenDocumentsInMainSplit{ false }; UICodeEditor* mAboutToAddEditor{ nullptr }; UIMessageBox* mTryCloseMsgBox{ nullptr }; Mutex mTabWidgetMutex; diff --git a/src/eepp/ui/doc/syntaxdefinitionmanager.cpp b/src/eepp/ui/doc/syntaxdefinitionmanager.cpp index 11779130a..c621fd0fa 100644 --- a/src/eepp/ui/doc/syntaxdefinitionmanager.cpp +++ b/src/eepp/ui/doc/syntaxdefinitionmanager.cpp @@ -1381,7 +1381,7 @@ const SyntaxDefinition& SyntaxDefinitionManager::getByHeader( std::string_view h for ( const auto& hdr : preDefinition->getHeaders() ) { LuaPattern words( hdr ); int start, end; - if ( words.find( header.data(), start, end ) ) { + if ( words.find( header.data(), start, end, 0, header.size() ) ) { return preDefinition->load(); } } diff --git a/src/eepp/ui/tools/uicodeeditorsplitter.cpp b/src/eepp/ui/tools/uicodeeditorsplitter.cpp index 95bd449f1..1659cac61 100644 --- a/src/eepp/ui/tools/uicodeeditorsplitter.cpp +++ b/src/eepp/ui/tools/uicodeeditorsplitter.cpp @@ -329,8 +329,17 @@ bool UICodeEditorSplitter::loadDocument( std::shared_ptr doc, return true; } +UITabWidget* UICodeEditorSplitter::getFirstTabWidget() const { + eeASSERT( !mTabWidgets.empty() ); + return mTabWidgets[0]; +} + +UITabWidget* UICodeEditorSplitter::getPreferredTabWidget() const { + return mOpenDocumentsInMainSplit ? getFirstTabWidget() : tabWidgetFromWidget( mCurWidget ); +} + std::pair UICodeEditorSplitter::createEditorInNewTab() { - auto d = createCodeEditorInTabWidget( tabWidgetFromWidget( mCurWidget ) ); + auto d = createCodeEditorInTabWidget( getPreferredTabWidget() ); if ( d.first == nullptr || d.second == nullptr ) { if ( !mTabWidgets.empty() && mTabWidgets[0]->getTabCount() > 0 ) { d = createCodeEditorInTabWidget( mTabWidgets[0] ); @@ -347,7 +356,7 @@ std::pair UICodeEditorSplitter::createEditorInNewTab() { std::pair UICodeEditorSplitter::loadDocumentInNewTab( std::shared_ptr doc ) { - auto d = createCodeEditorInTabWidget( tabWidgetFromWidget( mCurWidget ) ); + auto d = createCodeEditorInTabWidget( getPreferredTabWidget() ); if ( d.first == nullptr || d.second == nullptr ) { if ( !mTabWidgets.empty() && mTabWidgets[0]->getTabCount() > 0 ) { d = createCodeEditorInTabWidget( mTabWidgets[0] ); @@ -421,7 +430,7 @@ void UICodeEditorSplitter::loadAsyncFileFromPath( std::pair UICodeEditorSplitter::loadFileFromPathInNewTab( const std::string& path ) { - auto d = createCodeEditorInTabWidget( tabWidgetFromWidget( mCurWidget ) ); + auto d = createCodeEditorInTabWidget( getPreferredTabWidget() ); if ( d.first == nullptr || d.second == nullptr ) { if ( !mTabWidgets.empty() && mTabWidgets[0]->getTabCount() > 0 ) { d = createCodeEditorInTabWidget( mTabWidgets[0] ); @@ -469,7 +478,7 @@ void UICodeEditorSplitter::loadAsyncFileFromPathInNewTab( loadFileFromPathInNewTab( path ); return; } - auto d = createCodeEditorInTabWidget( tabWidgetFromWidget( mCurWidget ) ); + auto d = createCodeEditorInTabWidget( getPreferredTabWidget() ); if ( d.first == nullptr || d.second == nullptr ) { if ( !mTabWidgets.empty() && mTabWidgets[0]->getTabCount() > 0 ) { d = createCodeEditorInTabWidget( mTabWidgets[0] ); diff --git a/src/tools/ecode/appconfig.cpp b/src/tools/ecode/appconfig.cpp index cd3dab998..593bdadd5 100644 --- a/src/tools/ecode/appconfig.cpp +++ b/src/tools/ecode/appconfig.cpp @@ -118,6 +118,8 @@ void AppConfig::load( const std::string& confPath, std::string& keybindingsPath, editor.highlightCurrentLine = ini.getValueB( "editor", "highlight_current_line", true ); editor.verticalScrollbar = ini.getValueB( "editor", "vertical_scrollbar", true ); editor.horizontalScrollbar = ini.getValueB( "editor", "horizontal_scrollbar", true ); + editor.openDocumentsInMainSplit = + ini.getValueB( "editor", "open_documents_in_main_split", false ); ui.fontSize = ini.getValue( "ui", "font_size", "11dp" ); ui.panelFontSize = ini.getValue( "ui", "panel_font_size", "11dp" ); ui.showSidePanel = ini.getValueB( "ui", "show_side_panel", true ); @@ -304,9 +306,8 @@ void AppConfig::save( const std::vector& recentFiles, iniState.setValue( "files", "recentfiles", String::join( urlEncode( recentFiles ), ';' ) ); iniState.setValue( "folders", "recentfolders", String::join( urlEncode( recentFolders ), ';' ) ); + iniState.setValueU( "editor", "last_run_version", ecode::Version::getVersionNum() ); - iniState.setValue( "ui", "side_panel_tabs_order", - String::join( windowState.sidePanelTabsOrder, ',' ) ); ini.setValueB( "editor", "show_line_numbers", editor.showLineNumbers ); ini.setValueB( "editor", "show_white_spaces", editor.showWhiteSpaces ); ini.setValueB( "editor", "show_indentation_guides", editor.showIndentationGuides ); @@ -315,7 +316,9 @@ void AppConfig::save( const std::vector& recentFiles, ini.setValueB( "editor", "highlight_current_line", editor.highlightCurrentLine ); ini.setValueB( "editor", "vertical_scrollbar", editor.verticalScrollbar ); ini.setValueB( "editor", "horizontal_scrollbar", editor.horizontalScrollbar ); + ini.setValueB( "editor", "open_documents_in_main_split", editor.openDocumentsInMainSplit ); ini.setValue( "editor", "font_size", editor.fontSize.toString() ); + ini.setValue( "ui", "font_size", ui.fontSize.toString() ); ini.setValue( "ui", "panel_font_size", ui.panelFontSize.toString() ); if ( !terminalMode ) @@ -339,6 +342,8 @@ void AppConfig::save( const std::vector& recentFiles, ini.setValue( "ui", "font_antialiasing", FontTrueType::fontAntialiasingToString( ui.fontAntialiasing ) ); ini.setValueB( "ui", "editor_font_in_input_fields", ui.editorFontInInputFields ); + iniState.setValue( "ui", "side_panel_tabs_order", + String::join( windowState.sidePanelTabsOrder, ',' ) ); ini.setValueB( "document", "trim_trailing_whitespaces", doc.trimTrailingWhitespaces ); ini.setValueB( "document", "force_new_line_at_end_of_file", doc.forceNewLineAtEndOfFile ); diff --git a/src/tools/ecode/appconfig.hpp b/src/tools/ecode/appconfig.hpp index 1f7a20d1a..af2c5bcdb 100644 --- a/src/tools/ecode/appconfig.hpp +++ b/src/tools/ecode/appconfig.hpp @@ -87,6 +87,7 @@ struct CodeEditorConfig { bool hideTabBarOnSingleTab{ true }; bool hideTabBar{ false }; bool tabSwitcher{ false }; + bool openDocumentsInMainSplit{ false }; UITabWidget::TabJumpMode tabJumpMode{ UITabWidget::TabJumpMode::Linear }; bool singleClickNavigation{ false }; diff --git a/src/tools/ecode/ecode.cpp b/src/tools/ecode/ecode.cpp index ddcb7bd9d..f256ea6d7 100644 --- a/src/tools/ecode/ecode.cpp +++ b/src/tools/ecode/ecode.cpp @@ -921,7 +921,9 @@ void App::onFileDropped( std::string file, bool openBinaryAsDocument ) { !codeEditor->getDocument().isEmpty() ) && !doesntNeedEmptyEditor ) { auto d = mSplitter->createCodeEditorInTabWidget( - mSplitter->tabWidgetFromEditor( codeEditor ) ); + mConfig.editor.openDocumentsInMainSplit + ? mSplitter->getPreferredTabWidget() + : mSplitter->tabWidgetFromEditor( codeEditor ) ); codeEditor = d.second; tab = d.first; } @@ -2675,8 +2677,9 @@ void App::onCodeEditorCreated( UICodeEditor* editor, TextDocument& doc ) { doc.setCommand( "clone-document-buffer", [this] { if ( mSplitter->curEditorExistsAndFocused() && mSplitter->getCurEditor() ) { UICodeEditor* editor = mSplitter->getCurEditor(); - auto d = - mSplitter->createCodeEditorInTabWidget( mSplitter->tabWidgetFromWidget( editor ) ); + auto d = mSplitter->createCodeEditorInTabWidget( + mConfig.editor.openDocumentsInMainSplit ? mSplitter->getPreferredTabWidget() + : mSplitter->tabWidgetFromWidget( editor ) ); if ( d.first == nullptr && d.second == nullptr && !mSplitter->getTabWidgets().empty() ) d = mSplitter->createCodeEditorInTabWidget( mSplitter->getTabWidgets()[0] ); if ( d.first != nullptr || d.second != nullptr ) { @@ -4331,6 +4334,7 @@ void App::init( InitParameters& params ) { mInitColorScheme ); mSplitter->setHideTabBarOnSingleTab( mConfig.editor.hideTabBarOnSingleTab ); mSplitter->setHideTabBar( mConfig.editor.hideTabBar ); + mSplitter->setOpenDocumentsInMainSplit( mConfig.editor.openDocumentsInMainSplit ); mSplitter->setOnTabWidgetCreateCb( [this]( UITabWidget* tabWidget ) { tabWidget->getTabBar()->onDoubleClick( [this]( const MouseEvent* ) { mSplitter->createEditorInNewTab(); } ); diff --git a/src/tools/ecode/settingsmenu.cpp b/src/tools/ecode/settingsmenu.cpp index bc3a7b9b3..2b3ca96af 100644 --- a/src/tools/ecode/settingsmenu.cpp +++ b/src/tools/ecode/settingsmenu.cpp @@ -1320,42 +1320,22 @@ UIMenu* SettingsMenu::createWindowMenu() { auto colorSchemeExt = ColorSchemePreferences::fromStringExt( item->getId() ); mApp->setUIColorSchemeFromUserInteraction( colorSchemeExt ); } ); - mWindowMenu->addSubMenu( i18n( "ui_language", "UI Language" ), findIcon( "globe" ), - createLanguagesMenu() ); + mWindowMenu->addSubMenu( i18n( "fonts_configuration", "Fonts Configuration" ), + findIcon( "font-size" ), createFontsMenu() ); mWindowMenu->addSubMenu( i18n( "ui_prefes_color_scheme", "UI Prefers Color Scheme" ), findIcon( "color-scheme" ), colorsMenu ); mWindowMenu->addSubMenu( i18n( "ui_thene", "UI Theme" ), findIcon( "palette" ), createThemesMenu() ); + mWindowMenu->addSubMenu( i18n( "ui_language", "UI Language" ), findIcon( "globe" ), + createLanguagesMenu() ); mWindowMenu->addSubMenu( i18n( "ui_renderer", "Renderer" ), findIcon( "package" ), createRendererMenu() ); - mWindowMenu->addSubMenu( i18n( "ui_font_hint", "Font Hint" ), findIcon( "font-size" ), - createFontHintMenu() ); - mWindowMenu->addSubMenu( i18n( "ui_font_antialiasing", "Font Anti-Aliasing" ), - findIcon( "font-size" ), createFontAntiAliasingMenu() ); + mWindowMenu ->add( i18n( "ui_scale_factor", "UI Scale Factor (Pixel Density)" ), findIcon( "pixel-density" ) ) ->setId( "ui-scale-factor" ); - mWindowMenu->add( i18n( "ui_font_size", "UI Font Size" ), findIcon( "font-size" ) ) - ->setId( "ui-font-size" ); - mWindowMenu->add( i18n( "ui_panel_font_size", "UI Panel Font Size" ), findIcon( "font-size" ) ) - ->setId( "ui-panel-font-size" ); - mWindowMenu->add( i18n( "editor_font_size", "Editor Font Size" ), findIcon( "font-size" ) ) - ->setId( "editor-font-size" ); - mWindowMenu->add( i18n( "terminal_font_size", "Terminal Font Size" ), findIcon( "font-size" ) ) - ->setId( "terminal-font-size" ); - mWindowMenu - ->add( i18n( "sans-serif_font_ellipsis", "Sans-Serif Font..." ), findIcon( "font-size" ) ) - ->setId( "sans-serif-font" ); - mWindowMenu - ->add( i18n( "monospace_font_ellipsis", "Monospace Font..." ), findIcon( "font-size" ) ) - ->setId( "monospace-font" ); - mWindowMenu - ->add( i18n( "terminal_font_ellipsis", "Terminal Font..." ), findIcon( "font-size" ) ) - ->setId( "terminal-font" ); - mWindowMenu - ->add( i18n( "fallback_font_ellipsis", "Fallback Font..." ), findIcon( "font-size" ) ) - ->setId( "fallback-font" ); + mWindowMenu->addSeparator(); mWindowMenu ->add( i18n( "key_bindings", "Key Bindings" ), findIcon( "keybindings" ), @@ -1458,6 +1438,14 @@ UIMenu* SettingsMenu::createWindowMenu() { "of the current window unless no project is currently loaded." ) ) ->setId( "open-project-in-new-window" ); + mWindowMenu + ->addCheckBox( i18n( "open_documents_in_main_split", "Open Documents in Main Split" ), + mApp->getConfig().editor.openDocumentsInMainSplit ) + ->setTooltipText( i18n( "open_documents_in_main_split_tooltip", + "Always open new documents in the main split (top-left), " + "instead of the last active split." ) ) + ->setId( "open-documents-in-main-split" ); + mWindowMenu ->addCheckBox( i18n( "use_native_file_dialogs", "Enable Native File Dialogs" ), mApp->getConfig().ui.nativeFileDialogs ) @@ -1502,6 +1490,11 @@ UIMenu* SettingsMenu::createWindowMenu() { bool active = item->asType()->isActive(); mApp->getConfig().ui.openProjectInNewWindow = active; mApp->saveConfig(); + } else if ( "open-documents-in-main-split" == item->getId() ) { + bool active = item->asType()->isActive(); + mApp->getConfig().editor.openDocumentsInMainSplit = active; + mApp->saveConfig(); + mApp->getSplitter()->setOpenDocumentsInMainSplit( active ); } else if ( "native-file-dialogs" == item->getId() ) { bool active = item->asType()->isActive(); mApp->getConfig().ui.nativeFileDialogs = active; @@ -2938,6 +2931,41 @@ UIMenu* SettingsMenu::createFontAntiAliasingMenu() { return mFontAntiAliasingMenu; } +UIMenu* SettingsMenu::createFontsMenu() { + mFontsMenu = UIPopUpMenu::New(); + mFontsMenu->addSubMenu( i18n( "ui_font_hint", "Font Hint" ), findIcon( "font-size" ), + createFontHintMenu() ); + mFontsMenu->addSubMenu( i18n( "ui_font_antialiasing", "Font Anti-Aliasing" ), + findIcon( "font-size" ), createFontAntiAliasingMenu() ); + mFontsMenu->add( i18n( "ui_font_size", "UI Font Size" ), findIcon( "font-size" ) ) + ->setId( "ui-font-size" ); + mFontsMenu->add( i18n( "ui_panel_font_size", "UI Panel Font Size" ), findIcon( "font-size" ) ) + ->setId( "ui-panel-font-size" ); + mFontsMenu->add( i18n( "editor_font_size", "Editor Font Size" ), findIcon( "font-size" ) ) + ->setId( "editor-font-size" ); + mFontsMenu->add( i18n( "terminal_font_size", "Terminal Font Size" ), findIcon( "font-size" ) ) + ->setId( "terminal-font-size" ); + mFontsMenu + ->add( i18n( "sans-serif_font_ellipsis", "Sans-Serif Font..." ), findIcon( "font-size" ) ) + ->setId( "sans-serif-font" ); + mFontsMenu + ->add( i18n( "monospace_font_ellipsis", "Monospace Font..." ), findIcon( "font-size" ) ) + ->setId( "monospace-font" ); + mFontsMenu->add( i18n( "terminal_font_ellipsis", "Terminal Font..." ), findIcon( "font-size" ) ) + ->setId( "terminal-font" ); + mFontsMenu->add( i18n( "fallback_font_ellipsis", "Fallback Font..." ), findIcon( "font-size" ) ) + ->setId( "fallback-font" ); + mFontsMenu->on( Event::OnItemClicked, [this]( const Event* event ) { + if ( !event->getNode()->isType( UI_TYPE_MENUITEM ) ) + return; + String text = String( event->getNode()->asType()->getId() ).toLower(); + String::replaceAll( text, " ", "-" ); + String::replaceAll( text, "/", "-" ); + runCommand( text ); + } ); + return mFontsMenu; +} + void SettingsMenu::updateMenu() { bool showMenuBar = mApp->getConfig().ui.showMenuBar; mSettingsButton->setVisible( !showMenuBar ); diff --git a/src/tools/ecode/settingsmenu.hpp b/src/tools/ecode/settingsmenu.hpp index 564faf980..ef11fba18 100644 --- a/src/tools/ecode/settingsmenu.hpp +++ b/src/tools/ecode/settingsmenu.hpp @@ -46,6 +46,8 @@ class SettingsMenu { UIMenu* createFontAntiAliasingMenu(); + UIMenu* createFontsMenu(); + void updateTerminalMenu(); void updateProjectSettingsMenu(); @@ -122,6 +124,7 @@ class SettingsMenu { UIMenuBar* mMenuBar{ nullptr }; UIPopUpMenu* mFontHintMenu{ nullptr }; UIPopUpMenu* mFontAntiAliasingMenu{ nullptr }; + UIPopUpMenu* mFontsMenu{ nullptr }; std::vector mFileTypeMenus; Float mFileTypeMenusCreatedWithHeight{ 0 }; std::vector mColorSchemeMenus;