diff --git a/include/eepp/scene/node.hpp b/include/eepp/scene/node.hpp index c6f550fb1..38cec5032 100644 --- a/include/eepp/scene/node.hpp +++ b/include/eepp/scene/node.hpp @@ -113,7 +113,7 @@ class EE_API Node : public Transformable { bool isVisible() const; - bool isHided() const; + bool hasVisibility() const; Node* setEnabled( const bool& enabled ); diff --git a/src/eepp/scene/node.cpp b/src/eepp/scene/node.cpp index 3393e6c25..70fbb7be6 100644 --- a/src/eepp/scene/node.cpp +++ b/src/eepp/scene/node.cpp @@ -201,8 +201,14 @@ bool Node::isVisible() const { return mVisible; } -bool Node::isHided() const { - return !mVisible; +bool Node::hasVisibility() const { + const Node* cur = this; + while ( cur ) { + if ( !cur->isVisible() ) + return false; + cur = cur->getParent(); + } + return true; } Node* Node::setEnabled( const bool& enabled ) { diff --git a/src/tools/ecode/ecode.cpp b/src/tools/ecode/ecode.cpp index 1417f1ac0..827ee67b6 100644 --- a/src/tools/ecode/ecode.cpp +++ b/src/tools/ecode/ecode.cpp @@ -1519,7 +1519,6 @@ void App::onWidgetFocusChange( UIWidget* widget ) { mDocInfo->setVisible( widget && widget->isType( UI_TYPE_CODEEDITOR ) ); mSettings->updateDocumentMenu(); - mSettings->updateTerminalMenu(); if ( widget && !widget->isType( UI_TYPE_CODEEDITOR ) ) { if ( widget->isType( UI_TYPE_TERMINAL ) ) setAppTitle( widget->asType()->getTitle() ); @@ -3016,10 +3015,6 @@ const std::stack& App::getRecentClosedFiles() const { return mRecentClosedFiles; } -void App::updateTerminalMenu() { - mSettings->updateTerminalMenu(); -} - UIMessageBox* App::newInputMsgBox( const String& title, const String& msg ) { UIMessageBox* msgBox = UIMessageBox::New( UIMessageBox::INPUT, msg ); msgBox->setTitle( title ); diff --git a/src/tools/ecode/ecode.hpp b/src/tools/ecode/ecode.hpp index 815322d2d..634c56e8b 100644 --- a/src/tools/ecode/ecode.hpp +++ b/src/tools/ecode/ecode.hpp @@ -481,8 +481,6 @@ class App : public UICodeEditorSplitter::Client, public PluginContextProvider { const std::stack& getRecentClosedFiles() const; - void updateTerminalMenu(); - void refreshFolderView(); bool isFileVisibleInTreeView( const std::string& filePath ); diff --git a/src/tools/ecode/settingsmenu.cpp b/src/tools/ecode/settingsmenu.cpp index 40b638507..51d9e7df6 100644 --- a/src/tools/ecode/settingsmenu.cpp +++ b/src/tools/ecode/settingsmenu.cpp @@ -314,6 +314,36 @@ UIMenu* SettingsMenu::createColorSchemeMenu( bool emptyMenu ) { return mColorSchemeMenus[0]; } +void SettingsMenu::forEachTerminal( const std::function fn ) { + mSplitter->forEachWidgetType( + UI_TYPE_TERMINAL, [&fn]( UIWidget* widget ) { fn( widget->asType() ); } ); + + if ( mApp->getStatusTerminalController() && + mApp->getStatusTerminalController()->getTabWidget() ) { + mApp->getStatusTerminalController()->getTabWidget()->forEachTab( + [&fn]( UITab* tab ) { fn( tab->getOwnedWidget()->asType() ); }, + UI_TYPE_TERMINAL ); + } +} + +UITerminal* SettingsMenu::getCurrentTerminal() const { + UITerminal* splitterTerm = + mSplitter->getCurWidget() && mSplitter->getCurWidget()->isType( UI_TYPE_TERMINAL ) + ? mSplitter->getCurWidget()->asType() + : nullptr; + /* TODO: Think in a better way to detect if the "Current Terminal" is the tab widget terminal */ + if ( splitterTerm == nullptr ) { + auto stc = mApp->getStatusTerminalController(); + if ( stc && stc->getTabWidget() && stc->getTabWidget()->getTabSelected() && + stc->getTabWidget()->getTabSelected()->getOwnedWidget() && + stc->getTabWidget()->getTabSelected()->getOwnedWidget()->isType( UI_TYPE_TERMINAL ) && + stc->getTabWidget()->getTabSelected()->getOwnedWidget()->hasVisibility() ) { + return stc->getTabWidget()->getTabSelected()->getOwnedWidget()->asType(); + } + } + return splitterTerm; +} + UIMenu* SettingsMenu::createDocumentMenu() { auto shouldCloseCb = []( UIMenuItem* ) -> bool { return false; }; @@ -926,6 +956,8 @@ UIMenu* SettingsMenu::createDocumentMenu() { UIMenu* SettingsMenu::createTerminalMenu() { mTerminalMenu = UIPopUpMenu::New(); + mTerminalMenu->on( Event::OnMenuShow, [this]( auto ) { updateTerminalMenu(); } ); + mTerminalMenu->add( i18n( "current_terminal", "Current Terminal" ) ) ->setTextAlign( UI_HALIGN_CENTER ); @@ -1012,20 +1044,9 @@ UIMenu* SettingsMenu::createTerminalMenu() { const std::string& id( event->getNode()->getId() ); std::string cursor = id.substr( 8 ); mApp->getConfig().term.cursorStyle = TerminalCursorHelper::modeFromString( cursor ); - mSplitter->forEachWidgetType( UI_TYPE_TERMINAL, [this]( UIWidget* widget ) { - widget->asType()->getTerm()->setCursorMode( - mApp->getConfig().term.cursorStyle ); + forEachTerminal( [this]( UITerminal* term ) { + term->getTerm()->setCursorMode( mApp->getConfig().term.cursorStyle ); } ); - - if ( mApp->getStatusTerminalController() && - mApp->getStatusTerminalController()->getTabWidget() ) { - mApp->getStatusTerminalController()->getTabWidget()->forEachTab( - [this]( UITab* tab ) { - tab->getOwnedWidget()->asType()->getTerm()->setCursorMode( - mApp->getConfig().term.cursorStyle ); - }, - UI_TYPE_TERMINAL ); - } } ); UIPopUpMenu* scrollBarTypeMenu = UIPopUpMenu::New(); @@ -1059,19 +1080,9 @@ UIMenu* SettingsMenu::createTerminalMenu() { std::string cursor = id.substr( 12 ); mApp->getConfig().term.scrollBarType = cursor == "overlay" ? ScrollViewType::Overlay : ScrollViewType::Outside; - mSplitter->forEachWidgetType( UI_TYPE_TERMINAL, [this]( UIWidget* widget ) { - widget->asType()->setScrollViewType( mApp->getConfig().term.scrollBarType ); + forEachTerminal( [this]( UITerminal* term ) { + term->setScrollViewType( mApp->getConfig().term.scrollBarType ); } ); - - if ( mApp->getStatusTerminalController() && - mApp->getStatusTerminalController()->getTabWidget() ) { - mApp->getStatusTerminalController()->getTabWidget()->forEachTab( - [this]( UITab* tab ) { - tab->getOwnedWidget()->asType()->setScrollViewType( - mApp->getConfig().term.scrollBarType ); - }, - UI_TYPE_TERMINAL ); - } } ); mTerminalMenu->addSubMenu( i18n( "scrollbar_type", "ScrollBar Type" ), nullptr, @@ -1113,20 +1124,9 @@ UIMenu* SettingsMenu::createTerminalMenu() { mApp->getConfig().term.scrollBarMode = mode == "auto" ? ScrollBarMode::Auto : ( mode == "on" ? ScrollBarMode::AlwaysOn : ScrollBarMode::AlwaysOff ); - mSplitter->forEachWidgetType( UI_TYPE_TERMINAL, [this]( UIWidget* widget ) { - widget->asType()->setVerticalScrollMode( - mApp->getConfig().term.scrollBarMode ); + forEachTerminal( [this]( UITerminal* term ) { + term->setVerticalScrollMode( mApp->getConfig().term.scrollBarMode ); } ); - - if ( mApp->getStatusTerminalController() && - mApp->getStatusTerminalController()->getTabWidget() ) { - mApp->getStatusTerminalController()->getTabWidget()->forEachTab( - [this]( UITab* tab ) { - tab->getOwnedWidget()->asType()->setVerticalScrollMode( - mApp->getConfig().term.scrollBarMode ); - }, - UI_TYPE_TERMINAL ); - } } ); mTerminalMenu->addSubMenu( i18n( "scrollbar_mode", "ScrollBar Mode" ), nullptr, @@ -1178,9 +1178,8 @@ UIMenu* SettingsMenu::createTerminalMenu() { } else if ( "warn-before-closing-tab" == id ) { bool active = event->getNode()->asType()->isActive(); mApp->getConfig().term.warnBeforeClosingTab = active; - } else if ( mSplitter->getCurWidget() && - mSplitter->getCurWidget()->isType( UI_TYPE_TERMINAL ) ) { - UITerminal* terminal = mSplitter->getCurWidget()->asType(); + } else if ( getCurrentTerminal() ) { + UITerminal* terminal = getCurrentTerminal(); if ( "exclusive-mode" == id ) { terminal->setExclusiveMode( event->getNode()->asType()->isActive() ); @@ -2335,8 +2334,7 @@ void SettingsMenu::updateProjectSettingsMenu() { } void SettingsMenu::updateTerminalMenu() { - bool enabled = - mSplitter->getCurWidget() && mSplitter->getCurWidget()->isType( UI_TYPE_TERMINAL ); + bool enabled = getCurrentTerminal() != nullptr; Node* child = mTerminalMenu->getFirstChild(); while ( child && child->getId() != "end_current_terminal" ) { @@ -2349,7 +2347,7 @@ void SettingsMenu::updateTerminalMenu() { mTerminalMenu->getItemId( "exclusive-mode" ) ->asType() - ->setActive( mSplitter->getCurWidget()->asType()->getExclusiveMode() ); + ->setActive( getCurrentTerminal()->getExclusiveMode() ); } void SettingsMenu::updateDocumentMenu() { diff --git a/src/tools/ecode/settingsmenu.hpp b/src/tools/ecode/settingsmenu.hpp index d65a1a077..564faf980 100644 --- a/src/tools/ecode/settingsmenu.hpp +++ b/src/tools/ecode/settingsmenu.hpp @@ -126,6 +126,10 @@ class SettingsMenu { Float mFileTypeMenusCreatedWithHeight{ 0 }; std::vector mColorSchemeMenus; Float mColorSchemeMenusCreatedWithHeight{ 0 }; + + void forEachTerminal( const std::function fn ); + + UITerminal* getCurrentTerminal() const; }; } // namespace ecode diff --git a/src/tools/ecode/statusterminalcontroller.cpp b/src/tools/ecode/statusterminalcontroller.cpp index 6919f91ab..488a0605e 100644 --- a/src/tools/ecode/statusterminalcontroller.cpp +++ b/src/tools/ecode/statusterminalcontroller.cpp @@ -175,9 +175,8 @@ UITerminal* StatusTerminalController::createTerminal( ? it->first : mContext->getTerminalManager()->getTerminalColorSchemes().begin()->first ); } ); - term->setCommand( UITerminal::getExclusiveModeToggleCommandName(), [term, this] { + term->setCommand( UITerminal::getExclusiveModeToggleCommandName(), [term] { term->setExclusiveMode( !term->getExclusiveMode() ); - mApp->updateTerminalMenu(); } ); term->setCommand( "close-tab", [this] { if ( tryTabClose( mTabWidget->getTabSelected() ) ) diff --git a/src/tools/ecode/terminalmanager.cpp b/src/tools/ecode/terminalmanager.cpp index 1ec3c0c97..199a2211c 100644 --- a/src/tools/ecode/terminalmanager.cpp +++ b/src/tools/ecode/terminalmanager.cpp @@ -598,9 +598,8 @@ UITerminal* TerminalManager::createNewTerminal( ? it->first : mTerminalColorSchemes.begin()->first ); } ); - term->setCommand( UITerminal::getExclusiveModeToggleCommandName(), [term, this] { + term->setCommand( UITerminal::getExclusiveModeToggleCommandName(), [term] { term->setExclusiveMode( !term->getExclusiveMode() ); - mApp->updateTerminalMenu(); } ); term->setCommand( "move-tab-to-start", [this] { auto widget = mApp->getSplitter()->getCurWidget();