diff --git a/src/ViewContainer.h b/src/ViewContainer.h --- a/src/ViewContainer.h +++ b/src/ViewContainer.h @@ -78,13 +78,11 @@ ~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; void setTabActivity(int index, bool activity); void updateTitle(ViewProperties *item); @@ -140,6 +138,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,21 +168,18 @@ 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; - /** * Rearranges the order of widgets in the container. * @@ -195,11 +197,10 @@ 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; + 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, terminalAt(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 = terminalAt(index)->sessionController()->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,10 +224,10 @@ 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 swappedContext = _navigation[swappedWidget]; - auto currentContext = _navigation[currentWidget]; + auto swappedWidget = terminalAt(newIndex); + auto currentWidget = terminalAt(currentIndex); + auto swappedContext = swappedWidget->sessionController(); + auto currentContext = currentWidget->sessionController(); if (newIndex < currentIndex) { insertTab(newIndex, currentWidget, currentContext->icon(), currentContext->title()); @@ -233,15 +239,14 @@ 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()); } else { insertTab(index, view, item->icon(), item->title()); } - _navigation[view] = item; _tabHistory.append(view); connect(item, &Konsole::ViewProperties::titleChanged, this, &Konsole::TabbedViewContainer::updateTitle); @@ -256,24 +261,23 @@ 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); emit viewRemoved(view); if (count() == 0) { emit empty(this); } } -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 +334,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,17 +360,6 @@ } } -ViewProperties *TabbedViewContainer::viewProperties(QWidget *view) const -{ - Q_ASSERT(_navigation.contains(view)); - return _navigation[view]; -} - -QList TabbedViewContainer::widgetsForItem(ViewProperties *item) const -{ - return _navigation.keys(item); -} - void TabbedViewContainer::closeCurrentTab() { if (currentIndex() != -1) { @@ -386,7 +379,7 @@ void TabbedViewContainer::renameTab(int index) { if (index != -1) { - _navigation[widget(index)]->rename(); + terminalAt(index)->sessionController()->rename(); } } @@ -412,7 +405,7 @@ #endif // Add the read-only action - auto controller = _navigation[widget(_contextMenuTabIndex)]; + auto controller = terminalAt(_contextMenuTabIndex)->sessionController(); auto sessionController = qobject_cast(controller); if (sessionController != nullptr) { @@ -438,7 +431,7 @@ void TabbedViewContainer::currentTabChanged(int index) { if (index != -1) { - QWidget *view = widget(index); + auto *view = terminalAt(index); view->setFocus(); updateTabHistory(view); emit activeViewChanged(view); @@ -475,41 +468,36 @@ void TabbedViewContainer::updateActivity(ViewProperties *item) { - foreach (QWidget *widget, widgetsForItem(item)) { - const int index = indexOf(widget); - - if (index != currentIndex()) { - setTabActivity(index, true); - } + auto controller = qobject_cast(item); + auto index = indexOf(controller->view()); + if (index != currentIndex()) { + setTabActivity(index, true); } } void TabbedViewContainer::updateTitle(ViewProperties *item) { - foreach (QWidget *widget, widgetsForItem(item)) { - const int index = indexOf(widget); - QString tabText = item->title(); + auto controller = qobject_cast(item); - setTabToolTip(index, tabText); + const int index = indexOf(controller->view()); + QString tabText = item->title(); - // To avoid having & replaced with _ (shortcut indicator) - tabText.replace(QLatin1Char('&'), QLatin1String("&&")); - setTabText(index, tabText); - } + setTabToolTip(index, tabText); + + // To avoid having & replaced with _ (shortcut indicator) + tabText.replace(QLatin1Char('&'), QLatin1String("&&")); + setTabText(index, tabText); } void TabbedViewContainer::updateIcon(ViewProperties *item) { - foreach (QWidget *widget, widgetsForItem(item)) { - const int index = indexOf(widget); - setTabIcon(index, item->icon()); - } + auto controller = qobject_cast(item); + const int index = indexOf(controller->view()); + setTabIcon(index, item->icon()); } void TabbedViewContainer::closeTerminalTab(int idx) { - auto currWidget = widget(idx); - auto controller = qobject_cast(_navigation[currWidget]); - controller->closeSession(); + terminalAt(idx)->sessionController()->closeSession(); } ViewManager *TabbedViewContainer::connectedViewManager() diff --git a/src/ViewManager.cpp b/src/ViewManager.cpp --- a/src/ViewManager.cpp +++ b/src/ViewManager.cpp @@ -882,8 +882,8 @@ list.reserve(container->count()); for(int i = 0, end = container->count(); i < end; i++) { - auto view = container->widget(i); - ViewProperties *properties = container->viewProperties(view); + auto view = container->terminalAt(i); + ViewProperties *properties = view->sessionController(); Q_ASSERT(properties); list << properties; }