Added option to force opening documents in main split (Settings -> Window -> Open Documents in Main Split).

This commit is contained in:
Martín Lucas Golini
2025-12-29 01:44:04 -03:00
parent dfc23a5084
commit 1d2dd61cf5
8 changed files with 96 additions and 37 deletions

View File

@@ -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<ThreadPool> 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;

View File

@@ -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();
}
}

View File

@@ -329,8 +329,17 @@ bool UICodeEditorSplitter::loadDocument( std::shared_ptr<TextDocument> doc,
return true;
}
UITabWidget* UICodeEditorSplitter::getFirstTabWidget() const {
eeASSERT( !mTabWidgets.empty() );
return mTabWidgets[0];
}
UITabWidget* UICodeEditorSplitter::getPreferredTabWidget() const {
return mOpenDocumentsInMainSplit ? getFirstTabWidget() : tabWidgetFromWidget( mCurWidget );
}
std::pair<UITab*, UICodeEditor*> 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<UITab*, UICodeEditor*> UICodeEditorSplitter::createEditorInNewTab() {
std::pair<UITab*, UICodeEditor*>
UICodeEditorSplitter::loadDocumentInNewTab( std::shared_ptr<TextDocument> 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<UITab*, UICodeEditor*>
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] );

View File

@@ -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<std::string>& 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<std::string>& 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<std::string>& 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 );

View File

@@ -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 };

View File

@@ -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(); } );

View File

@@ -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<UIMenuCheckBox>()->isActive();
mApp->getConfig().ui.openProjectInNewWindow = active;
mApp->saveConfig();
} else if ( "open-documents-in-main-split" == item->getId() ) {
bool active = item->asType<UIMenuCheckBox>()->isActive();
mApp->getConfig().editor.openDocumentsInMainSplit = active;
mApp->saveConfig();
mApp->getSplitter()->setOpenDocumentsInMainSplit( active );
} else if ( "native-file-dialogs" == item->getId() ) {
bool active = item->asType<UIMenuCheckBox>()->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<UIMenuItem>()->getId() ).toLower();
String::replaceAll( text, " ", "-" );
String::replaceAll( text, "/", "-" );
runCommand( text );
} );
return mFontsMenu;
}
void SettingsMenu::updateMenu() {
bool showMenuBar = mApp->getConfig().ui.showMenuBar;
mSettingsButton->setVisible( !showMenuBar );

View File

@@ -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<UIPopUpMenu*> mFileTypeMenus;
Float mFileTypeMenusCreatedWithHeight{ 0 };
std::vector<UIPopUpMenu*> mColorSchemeMenus;