void UncloseManager::GenericRemoveTab (const RemoveTabParams& params) { TabRecoverInfo info { params.RecoverData_, GetSessionProps (params.Widget_) }; const auto tab = qobject_cast<ITabWidget*> (params.Widget_); const auto rootWM = Proxy_->GetRootWindowsManager (); const auto winIdx = rootWM->GetWindowForTab (tab); const auto tabIdx = rootWM->GetTabWidget (winIdx)->IndexOf (params.Widget_); info.DynProperties_.append ({ "TabSessManager/Position", tabIdx }); for (const auto& action : UncloseMenu_->actions ()) if (action->property ("RecData") == params.RecoverData_) { UncloseMenu_->removeAction (action); action->deleteLater (); break; } const auto& fm = UncloseMenu_->fontMetrics (); const auto& elided = fm.elidedText (params.TabName_, Qt::ElideMiddle, 300); const auto action = new QAction { params.TabIcon_, elided, this }; action->setProperty ("RecData", params.RecoverData_); const auto plugin = tab->ParentMultiTabs (); new Util::SlotClosure<Util::DeleteLaterPolicy> { [uncloser = params.Uncloser_, info, plugin, action, winIdx, this] { action->deleteLater (); if (UncloseMenu_->defaultAction () == action) if (const auto nextAct = UncloseMenu_->actions ().value (1)) { UncloseMenu_->setDefaultAction (nextAct); nextAct->setShortcut (QString ("Ctrl+Shift+T")); } UncloseMenu_->removeAction (action); const auto propsGuard = TabsPropsMgr_->AppendProps (info.DynProperties_); const auto winGuard = TabsPropsMgr_->AppendWindow (winIdx); uncloser (plugin, info); }, action, SIGNAL (triggered ()), action }; if (UncloseMenu_->defaultAction ()) UncloseMenu_->defaultAction ()->setShortcut (QKeySequence ()); UncloseMenu_->insertAction (UncloseMenu_->actions ().value (0), action); UncloseMenu_->setDefaultAction (action); action->setShortcut (QString ("Ctrl+Shift+T")); }
void Plugin::handleRemoveTab (QWidget *widget) { auto tab = qobject_cast<ITabWidget*> (widget); if (!tab) return; auto recTab = qobject_cast<IRecoverableTab*> (widget); if (!recTab) return; const auto& recoverData = recTab->GetTabRecoverData (); if (recoverData.isEmpty ()) return; TabUncloseInfo info { { recoverData, GetSessionProps (widget) }, qobject_cast<IHaveRecoverableTabs*> (tab->ParentMultiTabs ()) }; const auto rootWM = Proxy_->GetRootWindowsManager (); const auto winIdx = rootWM->GetWindowForTab (tab); const auto tabIdx = rootWM->GetTabWidget (winIdx)->IndexOf (widget); info.RecInfo_.DynProperties_.append ({ "TabSessManager/Position", tabIdx }); const auto pos = std::find_if (UncloseAct2Data_.begin (), UncloseAct2Data_.end (), [&info] (const TabUncloseInfo& that) { return that.RecInfo_.Data_ == info.RecInfo_.Data_; }); if (pos != UncloseAct2Data_.end ()) { auto act = pos.key (); UncloseMenu_->removeAction (act); UncloseAct2Data_.erase (pos); delete act; } const auto& fm = UncloseMenu_->fontMetrics (); const QString& elided = fm.elidedText (recTab->GetTabRecoverName (), Qt::ElideMiddle, 300); QAction *action = new QAction (recTab->GetTabRecoverIcon (), elided, this); UncloseAct2Data_ [action] = info; connect (action, SIGNAL (triggered ()), this, SLOT (handleUnclose ())); if (UncloseMenu_->defaultAction ()) UncloseMenu_->defaultAction ()->setShortcut (QKeySequence ()); UncloseMenu_->insertAction (UncloseMenu_->actions ().value (0), action); UncloseMenu_->setDefaultAction (action); action->setShortcut (QString ("Ctrl+Shift+T")); }
void SeparateTabWidget::handleAddDefaultTab () { const auto& combined = XmlSettingsManager::Instance ()-> property ("DefaultNewTab").toString ().toLatin1 (); if (combined != "contextdependent") { const auto& parts = combined.split ('|'); if (parts.size () != 2) qWarning () << Q_FUNC_INFO << "incorrect split" << parts << combined; else { const QByteArray& newTabId = parts.at (0); const QByteArray& tabClass = parts.at (1); QObject *plugin = Core::Instance () .GetPluginManager ()->GetPluginByID (newTabId); IHaveTabs *iht = qobject_cast<IHaveTabs*> (plugin); if (!iht) qWarning () << Q_FUNC_INFO << "plugin with id" << newTabId << "is not a IMultiTabs"; else { iht->TabOpenRequested (tabClass); return; } } } IHaveTabs *highestIHT = 0; QByteArray highestTabClass; int highestPriority = 0; for (auto iht : Core::Instance ().GetPluginManager ()->GetAllCastableTo<IHaveTabs*> ()) for (const auto& info : iht->GetTabClasses ()) { if (!(info.Features_ & TFOpenableByRequest)) continue; if (info.Priority_ <= highestPriority) continue; highestIHT = iht; highestTabClass = info.TabClass_; highestPriority = info.Priority_; } const auto imtw = qobject_cast<ITabWidget*> (CurrentWidget ()); const int delta = 15; if (imtw && imtw->GetTabClassInfo ().Priority_ + delta > highestPriority) { highestIHT = qobject_cast<IHaveTabs*> (imtw->ParentMultiTabs ()); highestTabClass = imtw->GetTabClassInfo ().TabClass_; } if (!highestIHT) { qWarning () << Q_FUNC_INFO << "no IHT detected"; return; } highestIHT->TabOpenRequested (highestTabClass); }