Changeset View
Changeset View
Standalone View
Standalone View
src/ViewManager.cpp
Show First 20 Lines • Show All 447 Lines • ▼ Show 20 Line(s) | |||||
448 | { | 448 | { | ||
449 | splitView(Qt::Vertical); | 449 | splitView(Qt::Vertical); | ||
450 | } | 450 | } | ||
451 | 451 | | |||
452 | void ViewManager::splitView(Qt::Orientation orientation) | 452 | void ViewManager::splitView(Qt::Orientation orientation) | ||
453 | { | 453 | { | ||
454 | ViewContainer *container = createContainer(); | 454 | ViewContainer *container = createContainer(); | ||
455 | 455 | | |||
456 | // iterate over each session which has a view in the current active | | |||
457 | // container and create a new view for that session in a new container | | |||
458 | foreach (QWidget *view, _viewSplitter->activeContainer()->views()) { | | |||
459 | Session *session = _sessionMap[qobject_cast<TerminalDisplay *>(view)]; | | |||
460 | TerminalDisplay *display = createTerminalDisplay(session); | | |||
461 | const Profile::Ptr profile = SessionManager::instance()->sessionProfile(session); | | |||
462 | applyProfileToView(display, profile); | | |||
463 | ViewProperties *properties = createController(session, display); | | |||
464 | | ||||
465 | _sessionMap[display] = session; | | |||
466 | | ||||
467 | container->addView(display, properties); | | |||
468 | session->addView(display); | | |||
469 | } | | |||
470 | | ||||
471 | _viewSplitter->addContainer(container, orientation); | 456 | _viewSplitter->addContainer(container, orientation); | ||
457 | _viewSplitter->setActiveContainer(container); | ||||
458 | | ||||
472 | emit splitViewToggle(_viewSplitter->containers().count() > 0); | 459 | emit splitViewToggle(_viewSplitter->containers().count() > 0); | ||
473 | 460 | | |||
474 | // focus the new container | 461 | // focus the new container | ||
475 | container->containerWidget()->setFocus(); | 462 | container->containerWidget()->setFocus(); | ||
476 | 463 | | |||
477 | // ensure that the active view is focused after the split / unsplit | 464 | // ensure that the active view is focused after the split / unsplit | ||
478 | ViewContainer *activeContainer = _viewSplitter->activeContainer(); | 465 | ViewContainer *activeContainer = _viewSplitter->activeContainer(); | ||
466 | newSession(ProfileManager::instance()->defaultProfile()->name(), QDir::homePath()); | ||||
467 | | ||||
479 | QWidget *activeView = activeContainer != nullptr ? activeContainer->activeView() : nullptr; | 468 | QWidget *activeView = activeContainer != nullptr ? activeContainer->activeView() : nullptr; | ||
480 | 469 | | |||
481 | if (activeView != nullptr) { | 470 | if (activeView != nullptr) { | ||
482 | activeView->setFocus(Qt::OtherFocusReason); | 471 | activeView->setFocus(Qt::OtherFocusReason); | ||
483 | } | 472 | } | ||
484 | } | 473 | } | ||
485 | 474 | | |||
486 | void ViewManager::removeContainer(ViewContainer *container) | 475 | void ViewManager::removeContainer(ViewContainer *container) | ||
▲ Show 20 Lines • Show All 136 Lines • ▼ Show 20 Line(s) | 572 | { | |||
623 | 612 | | |||
624 | updateDetachViewState(); | 613 | updateDetachViewState(); | ||
625 | } | 614 | } | ||
626 | 615 | | |||
627 | void ViewManager::createView(Session *session) | 616 | void ViewManager::createView(Session *session) | ||
628 | { | 617 | { | ||
629 | // create the default container | 618 | // create the default container | ||
630 | if (_viewSplitter->containers().count() == 0) { | 619 | if (_viewSplitter->containers().count() == 0) { | ||
631 | ViewContainer *container = createContainer(); | 620 | _viewSplitter->addContainer(createContainer(), Qt::Vertical); | ||
632 | _viewSplitter->addContainer(container, Qt::Vertical); | | |||
633 | emit splitViewToggle(false); | 621 | emit splitViewToggle(false); | ||
634 | } | 622 | } | ||
635 | 623 | | |||
636 | // new tab will be put at the end by default. | 624 | // new tab will be put at the end by default. | ||
637 | int index = -1; | 625 | int index = -1; | ||
638 | 626 | | |||
639 | if (_newTabBehavior == PutNewTabAfterCurrentTab) { | 627 | if (_newTabBehavior == PutNewTabAfterCurrentTab) { | ||
640 | QWidget *view = activeView(); | 628 | QWidget *view = activeView(); | ||
641 | if (view != nullptr) { | 629 | if (view != nullptr) { | ||
642 | QList<QWidget *> views = _viewSplitter->activeContainer()->views(); | 630 | QList<QWidget *> views = _viewSplitter->activeContainer()->views(); | ||
643 | index = views.indexOf(view) + 1; | 631 | index = views.indexOf(view) + 1; | ||
644 | } | 632 | } | ||
645 | } | 633 | } | ||
646 | 634 | | |||
647 | // iterate over the view containers owned by this view manager | 635 | createView(session, _viewSplitter->activeContainer(), index); | ||
648 | // and create a new terminal display for the session in each of them, along with | | |||
649 | // a controller for the session/display pair | | |||
650 | foreach (ViewContainer *container, _viewSplitter->containers()) { | | |||
651 | createView(session, container, index); | | |||
652 | } | | |||
653 | } | 636 | } | ||
654 | 637 | | |||
655 | ViewContainer *ViewManager::createContainer() | 638 | ViewContainer *ViewManager::createContainer() | ||
656 | { | 639 | { | ||
657 | ViewContainer *container = nullptr; | 640 | TabbedViewContainer *container = new TabbedViewContainer(_navigationPosition, this, _viewSplitter);; | ||
658 | 641 | | |||
659 | switch (_navigationMethod) { | 642 | switch (_navigationMethod) { | ||
660 | case TabbedNavigation: | 643 | case TabbedNavigation: | ||
661 | { | 644 | { | ||
662 | auto tabbedContainer = new TabbedViewContainer(_navigationPosition, this, _viewSplitter); | 645 | connect(container, &TabbedViewContainer::detachTab, this, &ViewManager::detachView); | ||
663 | container = tabbedContainer; | 646 | connect(container, &TabbedViewContainer::closeTab, this, | ||
664 | | ||||
665 | connect(tabbedContainer, &TabbedViewContainer::detachTab, this, &ViewManager::detachView); | | |||
666 | connect(tabbedContainer, &TabbedViewContainer::closeTab, this, | | |||
667 | &ViewManager::closeTabFromContainer); | 647 | &ViewManager::closeTabFromContainer); | ||
668 | break; | 648 | break; | ||
669 | } | 649 | } | ||
670 | case NoNavigation: | 650 | case NoNavigation: | ||
671 | default: | 651 | default: | ||
672 | container = new StackedViewContainer(_viewSplitter); | 652 | container->setTabBarVisible(false); | ||
673 | } | 653 | } | ||
674 | 654 | | |||
675 | // FIXME: these code feels duplicated | 655 | // FIXME: these code feels duplicated | ||
676 | container->setNavigationVisibility(_navigationVisibility); | 656 | container->setNavigationVisibility(_navigationVisibility); | ||
677 | container->setNavigationPosition(_navigationPosition); | 657 | container->setNavigationPosition(_navigationPosition); | ||
678 | container->setNavigationTabWidthExpanding(_navigationTabWidthExpanding); | 658 | container->setNavigationTabWidthExpanding(_navigationTabWidthExpanding); | ||
679 | container->setStyleSheet(_navigationStyleSheet); | 659 | container->setStyleSheet(_navigationStyleSheet); | ||
680 | if (_showQuickButtons) { | 660 | if (_showQuickButtons) { | ||
▲ Show 20 Lines • Show All 416 Lines • ▼ Show 20 Line(s) | 1073 | if (ids.isEmpty()) { // Session file is unusable, start default Profile | |||
1097 | if (!session->isRunning()) { | 1077 | if (!session->isRunning()) { | ||
1098 | session->run(); | 1078 | session->run(); | ||
1099 | } | 1079 | } | ||
1100 | } | 1080 | } | ||
1101 | } | 1081 | } | ||
1102 | 1082 | | |||
1103 | int ViewManager::sessionCount() | 1083 | int ViewManager::sessionCount() | ||
1104 | { | 1084 | { | ||
1105 | return this->_sessionMap.size(); | 1085 | return _sessionMap.size(); | ||
1106 | } | 1086 | } | ||
1107 | 1087 | | |||
1108 | QStringList ViewManager::sessionList() | 1088 | QStringList ViewManager::sessionList() | ||
1109 | { | 1089 | { | ||
1110 | QStringList ids; | 1090 | QStringList ids; | ||
1111 | 1091 | | |||
1112 | QHash<TerminalDisplay *, Session *>::const_iterator i; | 1092 | QHash<TerminalDisplay *, Session *>::const_iterator i; | ||
1113 | for (i = _sessionMap.constBegin(); i != _sessionMap.constEnd(); ++i) { | 1093 | for (i = _sessionMap.constBegin(); i != _sessionMap.constEnd(); ++i) { | ||
Show All 22 Lines | 1115 | if (i.value()->sessionId() == sessionId) { | |||
1136 | ViewContainer *container = _viewSplitter->activeContainer(); | 1116 | ViewContainer *container = _viewSplitter->activeContainer(); | ||
1137 | if (container != nullptr) { | 1117 | if (container != nullptr) { | ||
1138 | container->setActiveView(i.key()); | 1118 | container->setActiveView(i.key()); | ||
1139 | } | 1119 | } | ||
1140 | } | 1120 | } | ||
1141 | } | 1121 | } | ||
1142 | } | 1122 | } | ||
1143 | 1123 | | |||
1144 | int ViewManager::newSession() | | |||
1145 | { | | |||
1146 | Profile::Ptr profile = ProfileManager::instance()->defaultProfile(); | | |||
1147 | Session *session = SessionManager::instance()->createSession(profile); | | |||
1148 | | ||||
1149 | session->addEnvironmentEntry(QStringLiteral("KONSOLE_DBUS_WINDOW=/Windows/%1").arg(managerId())); | | |||
1150 | | ||||
1151 | this->createView(session); | | |||
1152 | session->run(); | | |||
1153 | | ||||
1154 | return session->sessionId(); | | |||
1155 | } | | |||
1156 | | ||||
1157 | int ViewManager::newSession(const QString &profile) | | |||
1158 | { | | |||
1159 | const QList<Profile::Ptr> profilelist = ProfileManager::instance()->allProfiles(); | | |||
1160 | Profile::Ptr profileptr = ProfileManager::instance()->defaultProfile(); | | |||
1161 | | ||||
1162 | for (const auto &i : profilelist) { | | |||
1163 | if (i->name() == profile) { | | |||
1164 | profileptr = i; | | |||
1165 | break; | | |||
1166 | } | | |||
1167 | } | | |||
1168 | | ||||
1169 | Session *session = SessionManager::instance()->createSession(profileptr); | | |||
1170 | | ||||
1171 | session->addEnvironmentEntry(QStringLiteral("KONSOLE_DBUS_WINDOW=/Windows/%1").arg(managerId())); | | |||
1172 | | ||||
1173 | this->createView(session); | | |||
1174 | session->run(); | | |||
1175 | | ||||
1176 | return session->sessionId(); | | |||
1177 | } | | |||
1178 | | ||||
1179 | int ViewManager::newSession(const QString &profile, const QString &directory) | 1124 | int ViewManager::newSession(const QString &profile, const QString &directory) | ||
1180 | { | 1125 | { | ||
1181 | const QList<Profile::Ptr> profilelist = ProfileManager::instance()->allProfiles(); | | |||
1182 | Profile::Ptr profileptr = ProfileManager::instance()->defaultProfile(); | 1126 | Profile::Ptr profileptr = ProfileManager::instance()->defaultProfile(); | ||
1183 | 1127 | | |||
1128 | if (!profile.isEmpty()) { | ||||
1129 | const QList<Profile::Ptr> profilelist = ProfileManager::instance()->allProfiles(); | ||||
1184 | for (const auto &i : profilelist) { | 1130 | for (const auto &i : profilelist) { | ||
1185 | if (i->name() == profile) { | 1131 | if (i->name() == profile) { | ||
1186 | profileptr = i; | 1132 | profileptr = i; | ||
1187 | break; | 1133 | break; | ||
1188 | } | 1134 | } | ||
1189 | } | 1135 | } | ||
1136 | } | ||||
1190 | 1137 | | |||
1191 | Session *session = SessionManager::instance()->createSession(profileptr); | 1138 | Session *session = SessionManager::instance()->createSession(profileptr); | ||
1139 | if (!directory.isEmpty()) | ||||
1192 | session->setInitialWorkingDirectory(directory); | 1140 | session->setInitialWorkingDirectory(directory); | ||
1193 | 1141 | | |||
1194 | session->addEnvironmentEntry(QStringLiteral("KONSOLE_DBUS_WINDOW=/Windows/%1").arg(managerId())); | 1142 | session->addEnvironmentEntry(QStringLiteral("KONSOLE_DBUS_WINDOW=/Windows/%1").arg(managerId())); | ||
1195 | 1143 | | |||
1196 | this->createView(session); | 1144 | createView(session); | ||
1197 | session->run(); | 1145 | session->run(); | ||
1198 | 1146 | | |||
1199 | return session->sessionId(); | 1147 | return session->sessionId(); | ||
1200 | } | 1148 | } | ||
1201 | 1149 | | |||
1202 | QString ViewManager::defaultProfile() | 1150 | QString ViewManager::defaultProfile() | ||
1203 | { | 1151 | { | ||
1204 | return ProfileManager::instance()->defaultProfile()->name(); | 1152 | return ProfileManager::instance()->defaultProfile()->name(); | ||
1205 | } | 1153 | } | ||
1206 | 1154 | | |||
1207 | QStringList ViewManager::profileList() | 1155 | QStringList ViewManager::profileList() | ||
1208 | { | 1156 | { | ||
1209 | return ProfileManager::instance()->availableProfileNames(); | 1157 | return ProfileManager::instance()->availableProfileNames(); | ||
1210 | } | 1158 | } | ||
1211 | 1159 | | |||
1212 | void ViewManager::nextSession() | 1160 | void ViewManager::nextSession() | ||
1213 | { | 1161 | { | ||
1214 | this->nextView(); | 1162 | nextView(); | ||
1215 | } | 1163 | } | ||
1216 | 1164 | | |||
1217 | void ViewManager::prevSession() | 1165 | void ViewManager::prevSession() | ||
1218 | { | 1166 | { | ||
1219 | this->previousView(); | 1167 | previousView(); | ||
1220 | } | 1168 | } | ||
1221 | 1169 | | |||
1222 | void ViewManager::moveSessionLeft() | 1170 | void ViewManager::moveSessionLeft() | ||
1223 | { | 1171 | { | ||
1224 | this->moveActiveViewLeft(); | 1172 | moveActiveViewLeft(); | ||
1225 | } | 1173 | } | ||
1226 | 1174 | | |||
1227 | void ViewManager::moveSessionRight() | 1175 | void ViewManager::moveSessionRight() | ||
1228 | { | 1176 | { | ||
1229 | this->moveActiveViewRight(); | 1177 | moveActiveViewRight(); | ||
1230 | } | 1178 | } | ||
1231 | 1179 | | |||
1232 | void ViewManager::setTabWidthToText(bool useTextWidth) | 1180 | void ViewManager::setTabWidthToText(bool useTextWidth) | ||
1233 | { | 1181 | { | ||
1234 | ViewContainer *container = _viewSplitter->activeContainer(); | 1182 | ViewContainer *container = _viewSplitter->activeContainer(); | ||
1235 | Q_ASSERT(container); | 1183 | Q_ASSERT(container); | ||
1236 | container->setNavigationTextMode(useTextWidth); | 1184 | container->setNavigationTextMode(useTextWidth); | ||
1237 | } | 1185 | } | ||
▲ Show 20 Lines • Show All 68 Lines • Show Last 20 Lines |