Changeset View
Changeset View
Standalone View
Standalone View
src/ViewManager.cpp
Show First 20 Lines • Show All 256 Lines • ▼ Show 20 Line(s) | 106 | { | |||
---|---|---|---|---|---|
257 | // _viewSplitter->addAction(lastUsedViewReverseAction); | 257 | // _viewSplitter->addAction(lastUsedViewReverseAction); | ||
258 | const int SWITCH_TO_TAB_COUNT = 19; | 258 | const int SWITCH_TO_TAB_COUNT = 19; | ||
259 | for (int i = 0; i < SWITCH_TO_TAB_COUNT; i++) { | 259 | for (int i = 0; i < SWITCH_TO_TAB_COUNT; i++) { | ||
260 | action = new QAction(i18nc("@action Shortcut entry", "Switch to Tab %1", i + 1), this); | 260 | action = new QAction(i18nc("@action Shortcut entry", "Switch to Tab %1", i + 1), this); | ||
261 | connect(action, &QAction::triggered, this, [this, i]() { switchToView(i); }); | 261 | connect(action, &QAction::triggered, this, [this, i]() { switchToView(i); }); | ||
262 | collection->addAction(QStringLiteral("switch-to-tab-%1").arg(i), action); | 262 | collection->addAction(QStringLiteral("switch-to-tab-%1").arg(i), action); | ||
263 | } | 263 | } | ||
264 | 264 | | |||
265 | auto handleMultiTabActionsLambda = [=]{ | 265 | | ||
266 | connect(_viewContainer, &TabbedViewContainer::viewAdded, this, &ViewManager::toggleActionsBasedOnState); | ||||
267 | connect(_viewContainer, &TabbedViewContainer::viewRemoved, this, &ViewManager::toggleActionsBasedOnState); | ||||
268 | connect(_viewContainer, &QTabWidget::currentChanged, this, &ViewManager::toggleActionsBasedOnState); | ||||
269 | | ||||
270 | toggleActionsBasedOnState(); | ||||
271 | } | ||||
272 | | ||||
273 | void ViewManager::toggleActionsBasedOnState() { | ||||
266 | const int count = _viewContainer->count(); | 274 | const int count = _viewContainer->count(); | ||
267 | foreach(QAction *tabOnlyAction, _multiTabOnlyActions) { | 275 | foreach(QAction *tabOnlyAction, _multiTabOnlyActions) { | ||
268 | tabOnlyAction->setEnabled(count > 1); | 276 | tabOnlyAction->setEnabled(count > 1); | ||
269 | } | 277 | } | ||
270 | }; | | |||
271 | connect(_viewContainer, &TabbedViewContainer::viewAdded, this, handleMultiTabActionsLambda); | | |||
272 | connect(_viewContainer, &TabbedViewContainer::viewRemoved, this, handleMultiTabActionsLambda); | | |||
273 | 278 | | |||
274 | connect(_viewContainer, &QTabWidget::currentChanged, this, &ViewManager::updateDetachViewState); | 279 | if (_viewContainer && _viewContainer->activeViewSplitter()) { | ||
280 | const int splitCount = _viewContainer | ||||
281 | ->activeViewSplitter() | ||||
282 | ->getToplevelSplitter() | ||||
283 | ->findChildren<TerminalDisplay*>() | ||||
284 | .count(); | ||||
275 | 285 | | |||
276 | // Initial state | 286 | foreach (QAction *action, _multiSplitterOnlyActions) { | ||
277 | handleMultiTabActionsLambda(); | 287 | action->setEnabled(splitCount > 1); | ||
278 | updateDetachViewState(); | 288 | } | ||
289 | } | ||||
279 | } | 290 | } | ||
280 | 291 | | |||
281 | void ViewManager::switchToView(int index) | 292 | void ViewManager::switchToView(int index) | ||
282 | { | 293 | { | ||
283 | _viewContainer->setCurrentIndex(index); | 294 | _viewContainer->setCurrentIndex(index); | ||
284 | } | 295 | } | ||
285 | 296 | | |||
286 | void ViewManager::switchToTerminalDisplay(Konsole::TerminalDisplay* terminalDisplay) | 297 | void ViewManager::switchToTerminalDisplay(Konsole::TerminalDisplay* terminalDisplay) | ||
287 | { | 298 | { | ||
288 | auto splitter = qobject_cast<ViewSplitter*>(terminalDisplay->parentWidget()); | 299 | auto splitter = qobject_cast<ViewSplitter*>(terminalDisplay->parentWidget()); | ||
289 | auto toplevelSplitter = splitter->getToplevelSplitter(); | 300 | auto toplevelSplitter = splitter->getToplevelSplitter(); | ||
290 | 301 | | |||
291 | // Focus the TermialDisplay | 302 | // Focus the TermialDisplay | ||
292 | terminalDisplay->setFocus(); | 303 | terminalDisplay->setFocus(); | ||
293 | 304 | | |||
294 | if (_viewContainer->currentWidget() != toplevelSplitter) { | 305 | if (_viewContainer->currentWidget() != toplevelSplitter) { | ||
295 | // Focus the tab | 306 | // Focus the tab | ||
296 | switchToView(_viewContainer->indexOf(toplevelSplitter)); | 307 | switchToView(_viewContainer->indexOf(toplevelSplitter)); | ||
297 | } | 308 | } | ||
298 | } | 309 | } | ||
299 | 310 | | |||
300 | void ViewManager::updateDetachViewState() | | |||
301 | { | | |||
302 | if (_viewContainer && _viewContainer->activeViewSplitter()) { | | |||
303 | const int splitCount = _viewContainer | | |||
304 | ->activeViewSplitter() | | |||
305 | ->getToplevelSplitter() | | |||
306 | ->findChildren<TerminalDisplay*>() | | |||
307 | .count(); | | |||
308 | | ||||
309 | foreach (QAction *action, _multiSplitterOnlyActions) { | | |||
310 | action->setEnabled(splitCount > 1); | | |||
311 | } | | |||
312 | } | | |||
313 | } | | |||
314 | | ||||
315 | void ViewManager::focusUp() | 311 | void ViewManager::focusUp() | ||
316 | { | 312 | { | ||
317 | _viewContainer->activeViewSplitter()->focusUp(); | 313 | _viewContainer->activeViewSplitter()->focusUp(); | ||
318 | } | 314 | } | ||
319 | 315 | | |||
320 | void ViewManager::focusDown() | 316 | void ViewManager::focusDown() | ||
321 | { | 317 | { | ||
322 | _viewContainer->activeViewSplitter()->focusDown(); | 318 | _viewContainer->activeViewSplitter()->focusDown(); | ||
▲ Show 20 Lines • Show All 89 Lines • ▼ Show 20 Line(s) | 406 | { | |||
412 | if ((_viewContainer->findChildren<TerminalDisplay*>()).count() > 1) { | 408 | if ((_viewContainer->findChildren<TerminalDisplay*>()).count() > 1) { | ||
413 | auto activeSplitter = _viewContainer->activeViewSplitter(); | 409 | auto activeSplitter = _viewContainer->activeViewSplitter(); | ||
414 | auto terminal = activeSplitter->activeTerminalDisplay(); | 410 | auto terminal = activeSplitter->activeTerminalDisplay(); | ||
415 | auto newSplitter = new ViewSplitter(); | 411 | auto newSplitter = new ViewSplitter(); | ||
416 | newSplitter->addTerminalDisplay(terminal, Qt::Horizontal); | 412 | newSplitter->addTerminalDisplay(terminal, Qt::Horizontal); | ||
417 | QHash<TerminalDisplay*, Session*> detachedSessions = forgetAll(newSplitter); | 413 | QHash<TerminalDisplay*, Session*> detachedSessions = forgetAll(newSplitter); | ||
418 | emit terminalsDetached(newSplitter, detachedSessions); | 414 | emit terminalsDetached(newSplitter, detachedSessions); | ||
419 | focusAnotherTerminal(activeSplitter->getToplevelSplitter()); | 415 | focusAnotherTerminal(activeSplitter->getToplevelSplitter()); | ||
420 | updateDetachViewState(); | 416 | toggleActionsBasedOnState(); | ||
421 | } | 417 | } | ||
422 | } | 418 | } | ||
423 | 419 | | |||
424 | void ViewManager::detachActiveTab() | 420 | void ViewManager::detachActiveTab() | ||
425 | { | 421 | { | ||
426 | const int currentIdx = _viewContainer->currentIndex(); | 422 | const int currentIdx = _viewContainer->currentIndex(); | ||
427 | detachTab(currentIdx); | 423 | detachTab(currentIdx); | ||
428 | } | 424 | } | ||
▲ Show 20 Lines • Show All 64 Lines • ▼ Show 20 Line(s) | 488 | if ((!_pluggedController.isNull()) && (_pluggedController->session() == session)) { | |||
493 | // This is needed to remove this controller from factory() in | 489 | // This is needed to remove this controller from factory() in | ||
494 | // order to prevent BUG: 185466 - disappearing menu popup | 490 | // order to prevent BUG: 185466 - disappearing menu popup | ||
495 | emit unplugController(_pluggedController); | 491 | emit unplugController(_pluggedController); | ||
496 | } | 492 | } | ||
497 | 493 | | |||
498 | if (_sessionMap.size() > 0) { | 494 | if (_sessionMap.size() > 0) { | ||
499 | updateTerminalDisplayHistory(view, true); | 495 | updateTerminalDisplayHistory(view, true); | ||
500 | focusAnotherTerminal(toplevelSplitter); | 496 | focusAnotherTerminal(toplevelSplitter); | ||
501 | updateDetachViewState(); | 497 | toggleActionsBasedOnState(); | ||
502 | } | 498 | } | ||
503 | } | 499 | } | ||
504 | 500 | | |||
505 | void ViewManager::focusAnotherTerminal(ViewSplitter *toplevelSplitter) | 501 | void ViewManager::focusAnotherTerminal(ViewSplitter *toplevelSplitter) | ||
506 | { | 502 | { | ||
507 | auto tabTterminalDisplays = toplevelSplitter->findChildren<TerminalDisplay*>(); | 503 | auto tabTterminalDisplays = toplevelSplitter->findChildren<TerminalDisplay*>(); | ||
508 | if (tabTterminalDisplays.count() == 0) { | 504 | if (tabTterminalDisplays.count() == 0) { | ||
509 | return; | 505 | return; | ||
▲ Show 20 Lines • Show All 46 Lines • ▼ Show 20 Line(s) | 545 | { | |||
556 | // Create a new session with the selected profile. | 552 | // Create a new session with the selected profile. | ||
557 | auto *session = SessionManager::instance()->createSession(profile); | 553 | auto *session = SessionManager::instance()->createSession(profile); | ||
558 | session->addEnvironmentEntry(QStringLiteral("KONSOLE_DBUS_WINDOW=/Windows/%1").arg(managerId())); | 554 | session->addEnvironmentEntry(QStringLiteral("KONSOLE_DBUS_WINDOW=/Windows/%1").arg(managerId())); | ||
559 | 555 | | |||
560 | auto terminalDisplay = createView(session); | 556 | auto terminalDisplay = createView(session); | ||
561 | 557 | | |||
562 | _viewContainer->splitView(terminalDisplay, orientation); | 558 | _viewContainer->splitView(terminalDisplay, orientation); | ||
563 | 559 | | |||
564 | updateDetachViewState(); | 560 | toggleActionsBasedOnState(); | ||
565 | 561 | | |||
566 | // focus the new container | 562 | // focus the new container | ||
567 | terminalDisplay->setFocus(); | 563 | terminalDisplay->setFocus(); | ||
568 | } | 564 | } | ||
569 | 565 | | |||
570 | void ViewManager::expandActiveContainer() | 566 | void ViewManager::expandActiveContainer() | ||
571 | { | 567 | { | ||
572 | _viewContainer->activeViewSplitter()->adjustActiveTerminalDisplaySize(10); | 568 | _viewContainer->activeViewSplitter()->adjustActiveTerminalDisplaySize(10); | ||
▲ Show 20 Lines • Show All 57 Lines • ▼ Show 20 Line(s) | |||||
630 | } | 626 | } | ||
631 | 627 | | |||
632 | void ViewManager::attachView(TerminalDisplay *terminal, Session *session) | 628 | void ViewManager::attachView(TerminalDisplay *terminal, Session *session) | ||
633 | { | 629 | { | ||
634 | connect(session, &Konsole::Session::finished, this, &Konsole::ViewManager::sessionFinished, | 630 | connect(session, &Konsole::Session::finished, this, &Konsole::ViewManager::sessionFinished, | ||
635 | Qt::UniqueConnection); | 631 | Qt::UniqueConnection); | ||
636 | _sessionMap[terminal] = session; | 632 | _sessionMap[terminal] = session; | ||
637 | createController(session, terminal); | 633 | createController(session, terminal); | ||
638 | updateDetachViewState(); | 634 | toggleActionsBasedOnState(); | ||
639 | _terminalDisplayHistory.append(terminal); | 635 | _terminalDisplayHistory.append(terminal); | ||
640 | } | 636 | } | ||
641 | 637 | | |||
642 | TerminalDisplay *ViewManager::createView(Session *session) | 638 | TerminalDisplay *ViewManager::createView(Session *session) | ||
643 | { | 639 | { | ||
644 | // notify this view manager when the session finishes so that its view | 640 | // notify this view manager when the session finishes so that its view | ||
645 | // can be deleted | 641 | // can be deleted | ||
646 | // | 642 | // | ||
▲ Show 20 Lines • Show All 116 Lines • ▼ Show 20 Line(s) | 750 | { | |||
763 | _sessionMap.remove(display); | 759 | _sessionMap.remove(display); | ||
764 | if (session != nullptr) { | 760 | if (session != nullptr) { | ||
765 | if (session->views().count() == 0) { | 761 | if (session->views().count() == 0) { | ||
766 | session->close(); | 762 | session->close(); | ||
767 | } | 763 | } | ||
768 | } | 764 | } | ||
769 | 765 | | |||
770 | //we only update the focus if the splitter is still alive | 766 | //we only update the focus if the splitter is still alive | ||
771 | updateDetachViewState(); | 767 | toggleActionsBasedOnState(); | ||
772 | 768 | | |||
773 | // The below causes the menus to be messed up | 769 | // The below causes the menus to be messed up | ||
774 | // Only happens when using the tab bar close button | 770 | // Only happens when using the tab bar close button | ||
775 | // if (_pluggedController) | 771 | // if (_pluggedController) | ||
776 | // emit unplugController(_pluggedController); | 772 | // emit unplugController(_pluggedController); | ||
777 | } | 773 | } | ||
778 | 774 | | |||
779 | TerminalDisplay *ViewManager::createTerminalDisplay(Session *session) | 775 | TerminalDisplay *ViewManager::createTerminalDisplay(Session *session) | ||
▲ Show 20 Lines • Show All 345 Lines • Show Last 20 Lines |