diff --git a/src/Application.cpp b/src/Application.cpp --- a/src/Application.cpp +++ b/src/Application.cpp @@ -184,7 +184,7 @@ void Application::detachView(Session *session) { MainWindow *window = newMainWindow(); - window->createView(session); + window->viewManager()->createView(session); // When detaching a view, the size of the new window should equal the // size of the source window @@ -430,11 +430,11 @@ // see ViewContainer::NavigationVisibility if (m_parser->isSet(QStringLiteral("show-tabbar"))) { // always show - window->setNavigationVisibility(0); + window->viewManager()->setNavigationVisibility(0); } if (m_parser->isSet(QStringLiteral("hide-tabbar"))) { // never show - window->setNavigationVisibility(2); + window->viewManager()->setNavigationVisibility(2); } } return window; diff --git a/src/MainWindow.h b/src/MainWindow.h --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -87,11 +87,6 @@ */ Session *createSSHSession(Profile::Ptr profile, const QUrl &url); - /** - * create view for the specified session - */ - void createView(Session *session); - /** * Helper method to make this window get input focus */ @@ -102,13 +97,7 @@ */ void setMenuBarInitialVisibility(bool visible); - void setNavigationVisibility(int visibility); - void setNavigationPosition(int position); - void setNavigationStyleSheet(const QString &styleSheet); void setNavigationStyleSheetFromFile(const QUrl &styleSheetFile); - void setNavigationBehavior(int behavior); - void setNavigationTabWidthExpanding(bool expand); - void setShowQuickButtons(bool show); Q_SIGNALS: diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -497,22 +497,8 @@ if (!profile) { profile = ProfileManager::instance()->defaultProfile(); } - - Session *session = SessionManager::instance()->createSession(profile); - - if (!directory.isEmpty() && profile->startInCurrentSessionDir()) { - session->setInitialWorkingDirectory(directory); - } - - session->addEnvironmentEntry(QStringLiteral("KONSOLE_DBUS_WINDOW=/Windows/%1").arg(_viewManager->managerId())); - - // create view before starting the session process so that the session - // doesn't suffer a change in terminal size right after the session - // starts. Some applications such as GNU Screen and Midnight Commander - // don't like this happening - createView(session); - - return session; + int sessionId = _viewManager->newSession(profile->name(), directory); + return SessionManager::instance()->idToSession(sessionId); } Session *MainWindow::createSSHSession(Profile::Ptr profile, const QUrl &url) @@ -540,16 +526,11 @@ // doesn't suffer a change in terminal size right after the session // starts. some applications such as GNU Screen and Midnight Commander // don't like this happening - createView(session); + _viewManager->createView(session); return session; } -void MainWindow::createView(Session *session) -{ - _viewManager->createView(session); -} - void MainWindow::setFocus() { _viewManager->activeView()->setFocus(); @@ -774,59 +755,35 @@ removeMenuAccelerators(); } - setNavigationVisibility(KonsoleSettings::tabBarVisibility()); - setNavigationPosition(KonsoleSettings::tabBarPosition()); - setNavigationBehavior(KonsoleSettings::newTabBehavior()); - setNavigationTabWidthExpanding(KonsoleSettings::expandTabWidth()); - setShowQuickButtons(KonsoleSettings::showQuickButtons()); + _viewManager->setNavigationVisibility(KonsoleSettings::tabBarVisibility()); + _viewManager->setNavigationPosition(KonsoleSettings::tabBarPosition()); + _viewManager->setNavigationBehavior(KonsoleSettings::newTabBehavior()); + _viewManager->setNavigationTabWidthExpanding(KonsoleSettings::expandTabWidth()); + _viewManager->setShowQuickButtons(KonsoleSettings::showQuickButtons()); if (KonsoleSettings::tabBarUseUserStyleSheet()) { setNavigationStyleSheetFromFile(KonsoleSettings::tabBarUserStyleSheetFile()); } else { // Apply default values - setNavigationStyleSheet(KonsoleSettings::tabBarStyleSheet()); + _viewManager->setNavigationStyleSheet(KonsoleSettings::tabBarStyleSheet()); } setAutoSaveSettings(QStringLiteral("MainWindow"), KonsoleSettings::saveGeometryOnExit()); updateWindowCaption(); } -void MainWindow::setNavigationVisibility(int visibility) -{ - _viewManager->setNavigationVisibility(visibility); -} - -void MainWindow::setNavigationPosition(int position) -{ - _viewManager->setNavigationPosition(position); -} - -void MainWindow::setNavigationStyleSheet(const QString &styleSheet) -{ - _viewManager->setNavigationStyleSheet(styleSheet); -} - -void MainWindow::setNavigationBehavior(int behavior) -{ - _viewManager->setNavigationBehavior(behavior); -} - -void MainWindow::setNavigationTabWidthExpanding(bool expand) -{ - _viewManager->setNavigationTabWidthExpanding(expand); -} void MainWindow::setNavigationStyleSheetFromFile(const QUrl &styleSheetFile) { // Let's only deal w/ local files for now if (!styleSheetFile.isLocalFile()) { - setNavigationStyleSheet(KonsoleSettings::tabBarStyleSheet()); + _viewManager->setNavigationStyleSheet(KonsoleSettings::tabBarStyleSheet()); } QFile file(styleSheetFile.toLocalFile()); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { - setNavigationStyleSheet(KonsoleSettings::tabBarStyleSheet()); + _viewManager->setNavigationStyleSheet(KonsoleSettings::tabBarStyleSheet()); } QString styleSheetText; @@ -836,12 +793,7 @@ } // Replace current style sheet w/ loaded file - setNavigationStyleSheet(styleSheetText); -} - -void MainWindow::setShowQuickButtons(bool show) -{ - _viewManager->setShowQuickButtons(show); + _viewManager->setNavigationStyleSheet(styleSheetText); } void MainWindow::activateMenuBar() diff --git a/src/ViewContainer.h b/src/ViewContainer.h --- a/src/ViewContainer.h +++ b/src/ViewContainer.h @@ -405,6 +405,7 @@ Features supportedFeatures() const Q_DECL_OVERRIDE; void setNewViewMenu(QMenu *menu) Q_DECL_OVERRIDE; void setStyleSheet(const QString &styleSheet) Q_DECL_OVERRIDE; + void setTabBarVisible(bool visible); // return associated view manager ViewManager *connectedViewManager(); @@ -444,7 +445,6 @@ Q_DISABLE_COPY(TabbedViewContainer) void dynamicTabBarVisibility(); - void setTabBarVisible(bool visible); void setTabActivity(int index, bool activity); void renameTab(int index); void updateVisibilityOfQuickButtons(); @@ -462,26 +462,5 @@ QMenu *_contextPopupMenu; }; -/** A plain view container with no navigation display */ -class StackedViewContainer : public ViewContainer -{ - Q_OBJECT - -public: - explicit StackedViewContainer(QObject *parent); - ~StackedViewContainer() Q_DECL_OVERRIDE; - - QWidget *containerWidget() const Q_DECL_OVERRIDE; - QWidget *activeView() const Q_DECL_OVERRIDE; - void setActiveView(QWidget *view) Q_DECL_OVERRIDE; - -protected: - void addViewWidget(QWidget *view, int index) Q_DECL_OVERRIDE; - void removeViewWidget(QWidget *view) Q_DECL_OVERRIDE; - -private: - QPointer _containerWidget; - QPointer _stackWidget; -}; } #endif //VIEWCONTAINER_H diff --git a/src/ViewContainer.cpp b/src/ViewContainer.cpp --- a/src/ViewContainer.cpp +++ b/src/ViewContainer.cpp @@ -830,54 +830,3 @@ { return _connectedViewManager; } - -StackedViewContainer::StackedViewContainer(QObject *parent) : - ViewContainer(NavigationPositionTop, parent), - _containerWidget(nullptr), - _stackWidget(nullptr) -{ - _containerWidget = new QWidget; - auto layout = new QVBoxLayout(_containerWidget); - - _stackWidget = new QStackedWidget(_containerWidget); - - searchBar()->setParent(_containerWidget); - layout->addWidget(searchBar()); - layout->addWidget(_stackWidget); - layout->setContentsMargins(0, 0, 0, 0); -} - -StackedViewContainer::~StackedViewContainer() -{ - if (!_containerWidget.isNull()) { - _containerWidget->deleteLater(); - } -} - -QWidget *StackedViewContainer::containerWidget() const -{ - return _containerWidget; -} - -QWidget *StackedViewContainer::activeView() const -{ - return _stackWidget->currentWidget(); -} - -void StackedViewContainer::setActiveView(QWidget *view) -{ - _stackWidget->setCurrentWidget(view); -} - -void StackedViewContainer::addViewWidget(QWidget *view, int) -{ - _stackWidget->addWidget(view); -} - -void StackedViewContainer::removeViewWidget(QWidget *view) -{ - if (_stackWidget.isNull()) { - return; - } - _stackWidget->removeWidget(view); -} diff --git a/src/ViewManager.h b/src/ViewManager.h --- a/src/ViewManager.h +++ b/src/ViewManager.h @@ -251,18 +251,12 @@ /** DBus slot that sets the current (active) session window */ Q_SCRIPTABLE void setCurrentSession(int sessionId); - /** DBus slot that creates a new session in the current view. - * @param profile the name of the profile to be used - * started. - */ - Q_SCRIPTABLE int newSession(const QString &profile); - /** DBus slot that creates a new session in the current view. * @param profile the name of the profile to be used * @param directory the working directory where the session is * started. */ - Q_SCRIPTABLE int newSession(const QString &profile, const QString &directory); + Q_SCRIPTABLE int newSession(const QString &profile = QString(), const QString &directory = QString()); // TODO: its semantic is application-wide. Move it to more appropriate place // DBus slot that returns the name of default profile @@ -272,11 +266,6 @@ // DBus slot that returns a string list of defined (known) profiles Q_SCRIPTABLE QStringList profileList(); - /** DBus slot that creates a new session in the current view with the associated - * default profile and the default working directory - */ - Q_SCRIPTABLE int newSession(); - /** DBus slot that changes the view port to the next session */ Q_SCRIPTABLE void nextSession(); diff --git a/src/ViewManager.cpp b/src/ViewManager.cpp --- a/src/ViewManager.cpp +++ b/src/ViewManager.cpp @@ -453,29 +453,18 @@ { ViewContainer *container = createContainer(); - // iterate over each session which has a view in the current active - // container and create a new view for that session in a new container - foreach (QWidget *view, _viewSplitter->activeContainer()->views()) { - Session *session = _sessionMap[qobject_cast(view)]; - TerminalDisplay *display = createTerminalDisplay(session); - const Profile::Ptr profile = SessionManager::instance()->sessionProfile(session); - applyProfileToView(display, profile); - ViewProperties *properties = createController(session, display); - - _sessionMap[display] = session; - - container->addView(display, properties); - session->addView(display); - } - _viewSplitter->addContainer(container, orientation); + _viewSplitter->setActiveContainer(container); + emit splitViewToggle(_viewSplitter->containers().count() > 0); // focus the new container container->containerWidget()->setFocus(); // ensure that the active view is focused after the split / unsplit ViewContainer *activeContainer = _viewSplitter->activeContainer(); + newSession(ProfileManager::instance()->defaultProfile()->name(), QDir::homePath()); + QWidget *activeView = activeContainer != nullptr ? activeContainer->activeView() : nullptr; if (activeView != nullptr) { @@ -628,8 +617,7 @@ { // create the default container if (_viewSplitter->containers().count() == 0) { - ViewContainer *container = createContainer(); - _viewSplitter->addContainer(container, Qt::Vertical); + _viewSplitter->addContainer(createContainer(), Qt::Vertical); emit splitViewToggle(false); } @@ -644,32 +632,24 @@ } } - // iterate over the view containers owned by this view manager - // and create a new terminal display for the session in each of them, along with - // a controller for the session/display pair - foreach (ViewContainer *container, _viewSplitter->containers()) { - createView(session, container, index); - } + createView(session, _viewSplitter->activeContainer(), index); } ViewContainer *ViewManager::createContainer() { - ViewContainer *container = nullptr; + TabbedViewContainer *container = new TabbedViewContainer(_navigationPosition, this, _viewSplitter);; switch (_navigationMethod) { case TabbedNavigation: { - auto tabbedContainer = new TabbedViewContainer(_navigationPosition, this, _viewSplitter); - container = tabbedContainer; - - connect(tabbedContainer, &TabbedViewContainer::detachTab, this, &ViewManager::detachView); - connect(tabbedContainer, &TabbedViewContainer::closeTab, this, + connect(container, &TabbedViewContainer::detachTab, this, &ViewManager::detachView); + connect(container, &TabbedViewContainer::closeTab, this, &ViewManager::closeTabFromContainer); break; } case NoNavigation: default: - container = new StackedViewContainer(_viewSplitter); + container->setTabBarVisible(false); } // FIXME: these code feels duplicated @@ -1102,7 +1082,7 @@ int ViewManager::sessionCount() { - return this->_sessionMap.size(); + return _sessionMap.size(); } QStringList ViewManager::sessionList() @@ -1141,59 +1121,27 @@ } } -int ViewManager::newSession() -{ - Profile::Ptr profile = ProfileManager::instance()->defaultProfile(); - Session *session = SessionManager::instance()->createSession(profile); - - session->addEnvironmentEntry(QStringLiteral("KONSOLE_DBUS_WINDOW=/Windows/%1").arg(managerId())); - - this->createView(session); - session->run(); - - return session->sessionId(); -} - -int ViewManager::newSession(const QString &profile) -{ - const QList profilelist = ProfileManager::instance()->allProfiles(); - Profile::Ptr profileptr = ProfileManager::instance()->defaultProfile(); - - for (const auto &i : profilelist) { - if (i->name() == profile) { - profileptr = i; - break; - } - } - - Session *session = SessionManager::instance()->createSession(profileptr); - - session->addEnvironmentEntry(QStringLiteral("KONSOLE_DBUS_WINDOW=/Windows/%1").arg(managerId())); - - this->createView(session); - session->run(); - - return session->sessionId(); -} - int ViewManager::newSession(const QString &profile, const QString &directory) { - const QList profilelist = ProfileManager::instance()->allProfiles(); Profile::Ptr profileptr = ProfileManager::instance()->defaultProfile(); - for (const auto &i : profilelist) { - if (i->name() == profile) { - profileptr = i; - break; + if (!profile.isEmpty()) { + const QList profilelist = ProfileManager::instance()->allProfiles(); + for (const auto &i : profilelist) { + if (i->name() == profile) { + profileptr = i; + break; + } } } Session *session = SessionManager::instance()->createSession(profileptr); - session->setInitialWorkingDirectory(directory); + if (!directory.isEmpty()) + session->setInitialWorkingDirectory(directory); session->addEnvironmentEntry(QStringLiteral("KONSOLE_DBUS_WINDOW=/Windows/%1").arg(managerId())); - this->createView(session); + createView(session); session->run(); return session->sessionId(); @@ -1211,22 +1159,22 @@ void ViewManager::nextSession() { - this->nextView(); + nextView(); } void ViewManager::prevSession() { - this->previousView(); + previousView(); } void ViewManager::moveSessionLeft() { - this->moveActiveViewLeft(); + moveActiveViewLeft(); } void ViewManager::moveSessionRight() { - this->moveActiveViewRight(); + moveActiveViewRight(); } void ViewManager::setTabWidthToText(bool useTextWidth)