diff --git a/src/ViewContainer.h b/src/ViewContainer.h --- a/src/ViewContainer.h +++ b/src/ViewContainer.h @@ -78,13 +78,13 @@ ~TabbedViewContainer() Q_DECL_OVERRIDE; /** Adds a new view to the container widget */ - void addView(QWidget *view, ViewProperties *item, int index = -1); + void addView(TerminalDisplay *view, ViewProperties *item, int index = -1); /** Removes a view from the container */ - void removeView(QWidget *view); + void removeView(TerminalDisplay *view); /** Returns the ViewProperties instance associated with a particular view in the container */ - ViewProperties *viewProperties(QWidget *view) const; + ViewProperties *viewProperties(TerminalDisplay *view) const; void setTabActivity(int index, bool activity); void updateTitle(ViewProperties *item); @@ -140,6 +140,13 @@ void openTabContextMenu(const QPoint &point); void setNavigationVisibility(ViewManager::NavigationVisibility navigationVisibility); void moveTabToWindow(int index, QWidget *window); + + /* return the widget(int index) casted to TerminalDisplay* + * + * The only thing that this class holds are TerminalDisplays, so + * this is the only thing that should be used to retrieve widgets. + */ + TerminalDisplay *terminalAt(int index); Q_SIGNALS: /** Emitted when the container has no more children */ void empty(TabbedViewContainer *container); @@ -163,20 +170,20 @@ void moveViewRequest(int index, int sessionControllerId); /** Emitted when the active view changes */ - void activeViewChanged(QWidget *view); + void activeViewChanged(TerminalDisplay *view); /** Emitted when a view is added to the container. */ - void viewAdded(QWidget *view, ViewProperties *properties); + void viewAdded(TerminalDisplay *view, ViewProperties *properties); /** Emitted when a view is removed from the container. */ - void viewRemoved(QWidget *view); + void viewRemoved(TerminalDisplay *view); /** detach the specific tab */ - void detachTab(TabbedViewContainer *self, QWidget *activeView); + void detachTab(TabbedViewContainer *self, TerminalDisplay *activeView); protected: /** Returns the widgets which are associated with a particular navigation item */ - QList widgetsForItem(ViewProperties *item) const; + QList widgetsForItem(ViewProperties *item) const; /** * Rearranges the order of widgets in the container. @@ -195,11 +202,11 @@ void konsoleConfigChanged(); private: - void forgetView(QWidget *view); - void updateTabHistory(QWidget *view, bool remove = false); + void forgetView(TerminalDisplay *view); + void updateTabHistory(TerminalDisplay *view, bool remove = false); - QHash _navigation; - QList _tabHistory; + QHash _navigation; + QList _tabHistory; ViewManager *_connectedViewManager; QMenu *_contextPopupMenu; QToolButton *_newTabButton; diff --git a/src/ViewContainer.cpp b/src/ViewContainer.cpp --- a/src/ViewContainer.cpp +++ b/src/ViewContainer.cpp @@ -46,6 +46,7 @@ #include "KonsoleSettings.h" #include "SessionController.h" #include "DetachableTabBar.h" +#include "TerminalDisplay.h" // TODO Perhaps move everything which is Konsole-specific into different files @@ -86,7 +87,7 @@ connect(tabBar(), &QTabBar::customContextMenuRequested, this, &Konsole::TabbedViewContainer::openTabContextMenu); connect(tabBarWidget, &DetachableTabBar::detachTab, this, [this](int idx) { - emit detachTab(this, widget(idx)); + emit detachTab(this, qobject_cast(widget(idx))); }); connect(this, &TabbedViewContainer::currentChanged, this, &TabbedViewContainer::currentTabChanged); @@ -106,7 +107,7 @@ auto detachAction = _contextPopupMenu->addAction( QIcon::fromTheme(QStringLiteral("tab-detach")), i18nc("@action:inmenu", "&Detach Tab"), this, - [this] { emit detachTab(this, widget(_contextMenuTabIndex)); } + [this] { emit detachTab(this, terminalAt(_contextMenuTabIndex)); } ); detachAction->setObjectName(QStringLiteral("tab-detach")); #endif @@ -144,17 +145,22 @@ } } +TerminalDisplay *TabbedViewContainer::terminalAt(int index) +{ + return qobject_cast(widget(index)); +} + void TabbedViewContainer::moveTabToWindow(int index, QWidget *window) { - const int id = viewProperties(widget(index))->identifier(); + const int id = viewProperties(terminalAt(index))->identifier(); // This one line here will be removed as soon as I finish my new split handling. // it's hacky but it works. const auto widgets = window->findChildren(); const auto currentPos = QCursor::pos(); for(const auto dropWidget : widgets) { if (dropWidget->rect().contains(dropWidget->mapFromGlobal(currentPos))) { emit dropWidget->moveViewRequest(-1, id); - removeView(widget(index)); + removeView(terminalAt(index)); } } } @@ -218,8 +224,8 @@ const int currentIndex = indexOf(currentWidget()); int newIndex = direction == MoveViewLeft ? qMax(currentIndex - 1, 0) : qMin(currentIndex + 1, count() - 1); - auto swappedWidget = widget(newIndex); - auto currentWidget = widget(currentIndex); + auto swappedWidget = terminalAt(newIndex); + auto currentWidget = terminalAt(currentIndex); auto swappedContext = _navigation[swappedWidget]; auto currentContext = _navigation[currentWidget]; @@ -233,7 +239,7 @@ setCurrentIndex(newIndex); } -void TabbedViewContainer::addView(QWidget *view, ViewProperties *item, int index) +void TabbedViewContainer::addView(TerminalDisplay *view, ViewProperties *item, int index) { if (index == -1) { addTab(view, item->icon(), item->title()); @@ -256,14 +262,14 @@ void TabbedViewContainer::viewDestroyed(QObject *view) { - auto widget = static_cast(view); + auto widget = static_cast(view); const auto idx = indexOf(widget); removeTab(idx); forgetView(widget); } -void TabbedViewContainer::forgetView(QWidget *view) +void TabbedViewContainer::forgetView(TerminalDisplay *view) { _navigation.remove(view); updateTabHistory(view, true); @@ -273,7 +279,7 @@ } } -void TabbedViewContainer::removeView(QWidget *view) +void TabbedViewContainer::removeView(TerminalDisplay *view) { const int idx = indexOf(view); disconnect(view, &QWidget::destroyed, this, &Konsole::TabbedViewContainer::viewDestroyed); @@ -330,15 +336,15 @@ { if (_tabHistoryIndex != -1 && event->modifiers() == Qt::NoModifier) { _tabHistoryIndex = -1; - QWidget *active = currentWidget(); + auto *active = qobject_cast(currentWidget()); if (active != _tabHistory[0]) { // Update the tab history now that we have ended the walk-through updateTabHistory(active); } } } -void TabbedViewContainer::updateTabHistory(QWidget* view, bool remove) +void TabbedViewContainer::updateTabHistory(TerminalDisplay* view, bool remove) { if (_tabHistoryIndex != -1 && !remove) { // Do not reorder the tab history while we are walking through it @@ -356,13 +362,13 @@ } } -ViewProperties *TabbedViewContainer::viewProperties(QWidget *view) const +ViewProperties *TabbedViewContainer::viewProperties(TerminalDisplay *view) const { Q_ASSERT(_navigation.contains(view)); return _navigation[view]; } -QList TabbedViewContainer::widgetsForItem(ViewProperties *item) const +QList TabbedViewContainer::widgetsForItem(ViewProperties *item) const { return _navigation.keys(item); } @@ -386,7 +392,7 @@ void TabbedViewContainer::renameTab(int index) { if (index != -1) { - _navigation[widget(index)]->rename(); + _navigation[terminalAt(index)]->rename(); } } @@ -412,7 +418,7 @@ #endif // Add the read-only action - auto controller = _navigation[widget(_contextMenuTabIndex)]; + auto controller = _navigation[terminalAt(_contextMenuTabIndex)]; auto sessionController = qobject_cast(controller); if (sessionController != nullptr) { @@ -438,7 +444,7 @@ void TabbedViewContainer::currentTabChanged(int index) { if (index != -1) { - QWidget *view = widget(index); + auto *view = terminalAt(index); view->setFocus(); updateTabHistory(view); emit activeViewChanged(view); @@ -507,7 +513,7 @@ } void TabbedViewContainer::closeTerminalTab(int idx) { - auto currWidget = widget(idx); + auto currWidget = terminalAt(idx); auto controller = qobject_cast(_navigation[currWidget]); controller->closeSession(); } diff --git a/src/ViewManager.cpp b/src/ViewManager.cpp --- a/src/ViewManager.cpp +++ b/src/ViewManager.cpp @@ -882,7 +882,7 @@ list.reserve(container->count()); for(int i = 0, end = container->count(); i < end; i++) { - auto view = container->widget(i); + auto view = container->terminalAt(i); ViewProperties *properties = container->viewProperties(view); Q_ASSERT(properties); list << properties;