diff --git a/include/eepp/ui/uitabwidget.hpp b/include/eepp/ui/uitabwidget.hpp index 8da60c23e..60975be9c 100644 --- a/include/eepp/ui/uitabwidget.hpp +++ b/include/eepp/ui/uitabwidget.hpp @@ -69,9 +69,9 @@ class EE_API UITabWidget : public UIWidget { virtual void setTheme( UITheme* Theme ); - UITab* getSelectedTab() const; + UITab* getTabSelected() const; - Uint32 getSelectedTabIndex() const; + Uint32 getTabSelectedIndex() const; UIWidget* getTabBar() const; diff --git a/src/eepp/maps/mapeditor/mapeditor.cpp b/src/eepp/maps/mapeditor/mapeditor.cpp index 85fbeedd0..03f73c52f 100644 --- a/src/eepp/maps/mapeditor/mapeditor.cpp +++ b/src/eepp/maps/mapeditor/mapeditor.cpp @@ -266,7 +266,7 @@ void MapEditor::createTabs() { void MapEditor::onTabSelected( const Event* ) { if ( NULL != mUIMap ) { - switch ( mTabWidget->getSelectedTabIndex() ) { + switch ( mTabWidget->getTabSelectedIndex() ) { case 0: mUIMap->editingDisable(); break; diff --git a/src/eepp/ui/uiscenenode.cpp b/src/eepp/ui/uiscenenode.cpp index 15e27c7d7..ada68cdb0 100644 --- a/src/eepp/ui/uiscenenode.cpp +++ b/src/eepp/ui/uiscenenode.cpp @@ -33,11 +33,7 @@ UISceneNode::UISceneNode( EE::Window::Window* window ) : SceneNode( window ), mRoot( NULL ), mIsLoading( false ), -#ifdef EE_DEBUG - mVerbose( true ), -#else mVerbose( false ), -#endif mUpdatingLayouts( false ), mUIThemeManager( UIThemeManager::New() ) { // Reset size since the SceneNode already set it but needs to set the size from zero to emmit diff --git a/src/eepp/ui/uitab.cpp b/src/eepp/ui/uitab.cpp index 63d06e689..701d9a59d 100644 --- a/src/eepp/ui/uitab.cpp +++ b/src/eepp/ui/uitab.cpp @@ -166,7 +166,7 @@ UIPushButton* UITab::setText( const String& text ) { tTabW->orderTabs(); - tTabW->setTabSelected( tTabW->getSelectedTab() ); + tTabW->setTabSelected( tTabW->getTabSelected() ); } } return this; @@ -261,7 +261,9 @@ Uint32 UITab::onMessage( const NodeMessage* message ) { break; } case NodeMessage::MouseUp: { - if ( tTabW->getTabsClosable() && ( flags & EE_BUTTON_MMASK ) ) { + if ( flags & EE_BUTTON_LMASK && message->getSender() != mCloseButton ) { + tTabW->setTabSelected( this ); + } else if ( tTabW->getTabsClosable() && ( flags & EE_BUTTON_MMASK ) ) { tTabW->tryCloseTab( this ); } else if ( flags & EE_BUTTONS_WUWD ) { if ( flags & EE_BUTTON_WUMASK ) { diff --git a/src/eepp/ui/uitabwidget.cpp b/src/eepp/ui/uitabwidget.cpp index 733e95bd8..8ba7e3cd9 100644 --- a/src/eepp/ui/uitabwidget.cpp +++ b/src/eepp/ui/uitabwidget.cpp @@ -557,7 +557,9 @@ UITab* UITabWidget::setTabSelected( UITab* Tab ) { if ( Tab == mTabSelected ) { refreshOwnedWidget( Tab ); - return NULL; + if ( Tab->getOwnedWidget() ) + Tab->getOwnedWidget()->setFocus(); + return Tab; } if ( NULL != mTabSelected ) { @@ -671,11 +673,11 @@ void UITabWidget::selectNextTab() { } } -UITab* UITabWidget::getSelectedTab() const { +UITab* UITabWidget::getTabSelected() const { return mTabSelected; } -Uint32 UITabWidget::getSelectedTabIndex() const { +Uint32 UITabWidget::getTabSelectedIndex() const { return mTabSelectedIndex; } diff --git a/src/tools/codeeditor/codeeditor.cpp b/src/tools/codeeditor/codeeditor.cpp index 3382cfaa5..ee59bf194 100644 --- a/src/tools/codeeditor/codeeditor.cpp +++ b/src/tools/codeeditor/codeeditor.cpp @@ -129,14 +129,14 @@ UITabWidget* App::findPreviousSplit( UICodeEditor* editor ) { void App::switchPreviousSplit( UICodeEditor* editor ) { UITabWidget* tabWidget = findPreviousSplit( editor ); - if ( tabWidget && tabWidget->getSelectedTab() && - tabWidget->getSelectedTab()->getOwnedWidget() ) { - tabWidget->getSelectedTab()->getOwnedWidget()->setFocus(); + if ( tabWidget && tabWidget->getTabSelected() && + tabWidget->getTabSelected()->getOwnedWidget() ) { + tabWidget->getTabSelected()->getOwnedWidget()->setFocus(); } else { tabWidget = findNextSplit( editor ); - if ( tabWidget && tabWidget->getSelectedTab() && - tabWidget->getSelectedTab()->getOwnedWidget() ) { - tabWidget->getSelectedTab()->getOwnedWidget()->setFocus(); + if ( tabWidget && tabWidget->getTabSelected() && + tabWidget->getTabSelected()->getOwnedWidget() ) { + tabWidget->getTabSelected()->getOwnedWidget()->setFocus(); } } } @@ -159,14 +159,14 @@ UITabWidget* App::findNextSplit( UICodeEditor* editor ) { void App::switchNextSplit( UICodeEditor* editor ) { UITabWidget* tabWidget = findNextSplit( editor ); - if ( tabWidget && tabWidget->getSelectedTab() && - tabWidget->getSelectedTab()->getOwnedWidget() ) { - tabWidget->getSelectedTab()->getOwnedWidget()->setFocus(); + if ( tabWidget && tabWidget->getTabSelected() && + tabWidget->getTabSelected()->getOwnedWidget() ) { + tabWidget->getTabSelected()->getOwnedWidget()->setFocus(); } else { tabWidget = findPreviousSplit( editor ); - if ( tabWidget && tabWidget->getSelectedTab() && - tabWidget->getSelectedTab()->getOwnedWidget() ) { - tabWidget->getSelectedTab()->getOwnedWidget()->setFocus(); + if ( tabWidget && tabWidget->getTabSelected() && + tabWidget->getTabSelected()->getOwnedWidget() ) { + tabWidget->getTabSelected()->getOwnedWidget()->setFocus(); } } } @@ -324,11 +324,14 @@ void App::focusSomeEditor( Node* searchFrom ) { if ( searchFrom && !editor ) editor = mUISceneNode->getRoot()->findByType( UI_TYPE_CODEEDITOR ); if ( editor && tabWidgetFromEditor( editor ) && !tabWidgetFromEditor( editor )->isClosing() ) { - editor->setFocus(); + UITabWidget* tabW = tabWidgetFromEditor( editor ); + if ( tabW && tabW->getTabCount() > 0 ) { + tabW->setTabSelected( tabW->getTabSelected() ); + } } else { UITabWidget* tabW = mUISceneNode->getRoot()->findByType( UI_TYPE_TABWIDGET ); if ( tabW && tabW->getTabCount() > 0 ) { - tabW->setTabSelected( tabW->getTabCount() - 1 ); + tabW->setTabSelected( tabW->getTabSelected() ); } } } @@ -349,6 +352,19 @@ void App::closeTabWidgets( UISplitter* splitter ) { } } +void App::addRemainingTabWidgets( Node* widget ) { + if ( widget->isType( UI_TYPE_TABWIDGET ) ) { + if ( std::find( mTabWidgets.begin(), mTabWidgets.end(), widget->asType() ) == + mTabWidgets.end() ) { + mTabWidgets.push_back( widget->asType() ); + } + } else if ( widget->isType( UI_TYPE_SPLITTER ) ) { + UISplitter* splitter = widget->asType(); + addRemainingTabWidgets( splitter->getFirstWidget() ); + addRemainingTabWidgets( splitter->getLastWidget() ); + } +} + void App::closeSplitter( UISplitter* splitter ) { splitter->setParent( mUISceneNode->getRoot() ); splitter->setVisible( false ); @@ -368,7 +384,10 @@ void App::onTabClosed( const TabEvent* tabEvent ) { if ( splitter ) { if ( splitter->isFull() ) { tabWidget->close(); - mTabWidgets.erase( std::find( mTabWidgets.begin(), mTabWidgets.end(), tabWidget ) ); + auto itWidget = std::find( mTabWidgets.begin(), mTabWidgets.end(), tabWidget ); + if ( itWidget != mTabWidgets.end() ) { + mTabWidgets.erase( itWidget ); + } // Remove splitter if it's redundant Node* parent = splitter->getParent(); @@ -381,6 +400,7 @@ void App::onTabClosed( const TabEvent* tabEvent ) { remainingNode->detach(); closeSplitter( splitter ); remainingNode->setParent( parentSplitter ); + addRemainingTabWidgets( remainingNode ); if ( wasFirst ) parentSplitter->swap(); focusSomeEditor( parentSplitter ); @@ -392,9 +412,7 @@ void App::onTabClosed( const TabEvent* tabEvent ) { closeSplitter( splitter ); eeASSERT( parent->getChildCount() == 0 ); remainingNode->setParent( parent ); - if ( remainingNode->isType( UI_TYPE_TABWIDGET ) ) { - mTabWidgets.push_back( remainingNode->asType() ); - } + addRemainingTabWidgets( remainingNode ); focusSomeEditor( NULL ); } return; @@ -413,9 +431,6 @@ std::pair App::createCodeEditorInTabWidget( UITabWidget* UICodeEditor* editor = createCodeEditor(); UITab* tab = tabWidget->add( editor->getDocument().getFilename(), editor ); editor->setData( (UintPtr)tab ); - tabWidget->addEventListener( Event::OnTabClosed, [&]( const Event* event ) { - onTabClosed( static_cast( event ) ); - } ); return std::make_pair( tab, editor ); } @@ -428,13 +443,16 @@ UITabWidget* App::createEditorWithTabWidget( Node* parent ) { tabWidget->setAllowRearrangeTabs( true ); tabWidget->addEventListener( Event::OnTabSelected, [&]( const Event* event ) { UITabWidget* tabWidget = event->getNode()->asType(); - mCurEditor = tabWidget->getSelectedTab()->getOwnedWidget()->asType(); + mCurEditor = tabWidget->getTabSelected()->getOwnedWidget()->asType(); updateEditorTitle( mCurEditor ); } ); tabWidget->setTabTryCloseCallback( [&]( UITab* tab ) -> bool { tryTabClose( tab->getOwnedWidget()->asType() ); return false; } ); + tabWidget->addEventListener( Event::OnTabClosed, [&]( const Event* event ) { + onTabClosed( static_cast( event ) ); + } ); createCodeEditorInTabWidget( tabWidget ); mTabWidgets.push_back( tabWidget ); return tabWidget; @@ -626,6 +644,7 @@ void App::initSearchBar() { addClickListener( mSearchBarLayout->find( "replace" ), "replace-selection" ); addClickListener( mSearchBarLayout->find( "replace_find" ), "find-and-replace" ); addClickListener( mSearchBarLayout->find( "replace_all" ), "replace-all" ); + addClickListener( mSearchBarLayout->find( "searchbar_close" ), "close-searchbar" ); replaceInput->addEventListener( Event::OnTabNavigate, [findInput]( const Event* ) { findInput->setFocus(); } ); } @@ -784,28 +803,43 @@ void App::init( const std::string& file ) { padding-right: 4dp; padding-bottom: 3dp; } + .close_button { + width: 12dp; + height: 12dp; + border-radius: 6dp; + background-color: var(--icon-back-hover); + foreground-image: poly(line, var(--icon-line-hover), "0dp 0dp, 6dp 6dp"), poly(line, var(--icon-line-hover), "6dp 0dp, 0dp 6dp"); + foreground-position: 3dp 3dp, 3dp 3dp; + transition: all 0.15s; + } + .close_button:hover { + background-color: var(--icon-back-alert); + } - - - + + + - - + + - - - - + + + + + + + - - + + diff --git a/src/tools/codeeditor/codeeditor.hpp b/src/tools/codeeditor/codeeditor.hpp index 3bdd75e05..f4b7ff3a2 100644 --- a/src/tools/codeeditor/codeeditor.hpp +++ b/src/tools/codeeditor/codeeditor.hpp @@ -126,6 +126,8 @@ class App { void closeTabWidgets( UISplitter* splitter ); void initSearchBar(); + + void addRemainingTabWidgets( Node* widget ); }; #endif // EE_TOOLS_CODEEDITOR_HPP