diff --git a/src/ViewContainer.cpp b/src/ViewContainer.cpp --- a/src/ViewContainer.cpp +++ b/src/ViewContainer.cpp @@ -470,8 +470,8 @@ void TabbedViewContainer::currentTabChanged(int index) { if (index != -1) { - auto view = widget(index)->findChild(); - view->setFocus(); + auto splitview = qobject_cast(widget(index)); + auto view = splitview->activeTerminalDisplay(); updateTabHistory(view); emit activeViewChanged(view); setTabActivity(index, false); diff --git a/src/ViewManager.cpp b/src/ViewManager.cpp --- a/src/ViewManager.cpp +++ b/src/ViewManager.cpp @@ -466,7 +466,7 @@ auto terminalDisplay = createView(session); viewSplitter->addTerminalDisplay(terminalDisplay, orientation); - emit splitViewToggle(viewSplitter->terminalDisplays().count() > 0); + emit splitViewToggle(viewSplitter->count() > 0); // focus the new container terminalDisplay->setFocus(); diff --git a/src/ViewSplitter.h b/src/ViewSplitter.h --- a/src/ViewSplitter.h +++ b/src/ViewSplitter.h @@ -91,14 +91,6 @@ */ void setActiveTerminalDisplay(TerminalDisplay *container); - /** - * Returns a list of the containers held by this splitter - */ - QList terminalDisplays() const - { - return _terminalDisplays; - } - /** * Gives the focus to the active view in the next container */ @@ -124,23 +116,9 @@ /** Signal emitted when the last child widget is removed from the splitter */ void empty(ViewSplitter *splitter); -protected: - //virtual void focusEvent(QFocusEvent* event); - private: - // Adds container to splitter's internal list and - // connects signals and slots - void registerTerminalDisplay(TerminalDisplay *terminalDisplay); - // Removes container from splitter's internal list and - // removes signals and slots - void unregisterTerminalDisplay(TerminalDisplay *container); - void updateSizes(); - - void terminalDisplayDestroyed(QObject *terminalDisplay); - -private: - QList _terminalDisplays; + void childDestroyed(QObject *terminalDisplay); }; } #endif //VIEWSPLITTER_H diff --git a/src/ViewSplitter.cpp b/src/ViewSplitter.cpp --- a/src/ViewSplitter.cpp +++ b/src/ViewSplitter.cpp @@ -78,16 +78,6 @@ return splitter; } -void ViewSplitter::registerTerminalDisplay(TerminalDisplay *container) -{ - _terminalDisplays.append(container); -} - -void ViewSplitter::unregisterTerminalDisplay(TerminalDisplay *container) -{ - _terminalDisplays.removeOne(container); -} - void ViewSplitter::updateSizes() { int space; @@ -108,39 +98,29 @@ setSizes(widgetSizes); } -void ViewSplitter::removeTerminalDisplay(TerminalDisplay *terminalDisplay) -{ - Q_ASSERT(terminalDisplays().contains(terminalDisplay)); - unregisterTerminalDisplay(terminalDisplay); -} - void ViewSplitter::addTerminalDisplay(TerminalDisplay *terminalDisplay, Qt::Orientation containerOrientation) { ViewSplitter *splitter = activeSplitter(); - connect(terminalDisplay, &QWidget::destroyed, this, &ViewSplitter::terminalDisplayDestroyed); if (splitter->count() < 2 || containerOrientation == splitter->orientation()) { - splitter->registerTerminalDisplay(terminalDisplay); splitter->addWidget(terminalDisplay); if (splitter->orientation() != containerOrientation) { splitter->setOrientation(containerOrientation); } - + connect(terminalDisplay, &QObject::destroyed, this, &ViewSplitter::childDestroyed); splitter->updateSizes(); } else { auto newSplitter = new ViewSplitter(); + connect(newSplitter, &QObject::destroyed, this, &ViewSplitter::childDestroyed); + connect(terminalDisplay, &QObject::destroyed, newSplitter, &ViewSplitter::childDestroyed); TerminalDisplay *oldTerminalDisplay = splitter->activeTerminalDisplay(); + disconnect(oldTerminalDisplay, &QObject::destroyed, nullptr, nullptr); + connect(oldTerminalDisplay, &QObject::destroyed, newSplitter, &ViewSplitter::childDestroyed); const int oldContainerIndex = splitter->indexOf(oldTerminalDisplay); - - splitter->unregisterTerminalDisplay(oldTerminalDisplay); - - newSplitter->registerTerminalDisplay(oldTerminalDisplay); - newSplitter->registerTerminalDisplay(terminalDisplay); - newSplitter->addWidget(oldTerminalDisplay); newSplitter->addWidget(terminalDisplay); newSplitter->setOrientation(containerOrientation); @@ -151,9 +131,10 @@ } } -void ViewSplitter::terminalDisplayDestroyed(QObject *terminalDisplay) +void ViewSplitter::childDestroyed(QObject *childWidget) { - terminalDisplay->setParent(nullptr); + // remove the parent so count() has the correct value. + childWidget->setParent(nullptr); if (count() == 0) { deleteLater(); } @@ -195,41 +176,32 @@ { TerminalDisplay *active = activeTerminalDisplay(); - int index = _terminalDisplays.indexOf(active); + int index = indexOf(active); if (index == -1) { return; } - if (index == _terminalDisplays.count() - 1) { + if (index == count() - 1) { index = 0; } else { index++; } - - setActiveTerminalDisplay(_terminalDisplays.at(index)); + widget(index)->setFocus(Qt::OtherFocusReason); } void ViewSplitter::activatePreviousTerminalDisplay() { TerminalDisplay *active = activeTerminalDisplay(); - int index = _terminalDisplays.indexOf(active); + int index = indexOf(active); if (index == 0) { - index = _terminalDisplays.count() - 1; + index = count() - 1; } else { index--; } - - setActiveTerminalDisplay(_terminalDisplays.at(index)); -} - -void ViewSplitter::setActiveTerminalDisplay(TerminalDisplay *terminalDisplay) -{ - if (terminalDisplay != nullptr) { - terminalDisplay->setFocus(Qt::OtherFocusReason); - } + widget(index)->setFocus(Qt::OtherFocusReason); } TerminalDisplay *ViewSplitter::activeTerminalDisplay() const