void TabBarWidget::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton && event->modifiers().testFlag(Qt::ShiftModifier)) { const int tab = tabAt(event->pos()); if (tab >= 0) { emit requestedClose(tab); return; } } QTabBar::mousePressEvent(event); if (event->button() == Qt::MiddleButton) { const int tab = tabAt(event->pos()); if (tab < 0) { ActionsManager::triggerAction(ActionsManager::NewTabAction, this); } else if (SettingsManager::getValue(QLatin1String("TabBar/CloseOnMiddleClick")).toBool()) { emit requestedClose(tab); } } hidePreview(); }
void DockAppItem::onMousePress(QMouseEvent *event) { Q_UNUSED(event) hidePreview(true); emit mousePress(); }
void MediaPreviewWidget::showPreview(PhotoData *photo) { if (!photo || photo->full->isNull()) { hidePreview(); return; } startShow(); _photo = photo; _document = nullptr; resetGifAndCache(); }
void MediaPreviewWidget::showPreview(DocumentData *document) { if (!document || (!document->isAnimation() && !document->sticker())) { hidePreview(); return; } startShow(); _photo = nullptr; _document = document; resetGifAndCache(); }
void TabBarWidget::leaveEvent(QEvent *event) { QTabBar::leaveEvent(event); hidePreview(); m_tabSize = 0; m_hoveredTab = -1; QStatusTipEvent statusTipEvent((QString())); QApplication::sendEvent(this, &statusTipEvent); updateGeometry(); adjustSize(); }
void TabBarWidget::contextMenuEvent(QContextMenuEvent *event) { m_clickedTab = tabAt(event->pos()); hidePreview(); QMenu menu(this); menu.addAction(ActionsManager::getAction(QLatin1String("NewTab"), this)); menu.addAction(ActionsManager::getAction(QLatin1String("NewTabPrivate"), this)); if (m_clickedTab >= 0) { const bool isPinned = getTabProperty(m_clickedTab, QLatin1String("isPinned"), false).toBool(); menu.addAction(tr("Clone Tab"), this, SLOT(cloneTab()))->setEnabled(getTabProperty(m_clickedTab, QLatin1String("canClone"), false).toBool()); menu.addAction((isPinned ? tr("Unpin Tab") : tr("Pin Tab")), this, SLOT(pinTab())); menu.addSeparator(); menu.addAction(tr("Detach Tab"), this, SLOT(detachTab()))->setEnabled(count() > 1); menu.addSeparator(); if (isPinned) { QAction *closeAction = menu.addAction(Utils::getIcon(QLatin1String("tab-close")), tr("Close Tab")); ActionsManager::setupLocalAction(ActionsManager::getAction(QLatin1String("CloseTab"), this), closeAction, true); closeAction->setEnabled(false); } else { menu.addAction(ActionsManager::getAction(QLatin1String("CloseTab"), this)); } const int amount = (count() - getPinnedTabsAmount()); menu.addAction(Utils::getIcon(QLatin1String("tab-close-other")), tr("Close Other Tabs"), this, SLOT(closeOther()))->setEnabled(amount > 0 && !(amount == 1 && !isPinned)); } menu.exec(event->globalPos()); m_clickedTab = -1; if (underMouse()) { m_previewTimer = startTimer(250); } }
void TabBarWidget::mouseReleaseEvent(QMouseEvent *event) { QTabBar::mouseReleaseEvent(event); if (event->button() == Qt::MidButton) { const int tab = tabAt(event->pos()); if (tab < 0) { ActionsManager::triggerAction(QLatin1String("NewTab"), this); } else if (SettingsManager::getValue(QLatin1String("TabBar/CloseOnMiddleClick")).toBool()) { emit requestedClose(tab); } } hidePreview(); }
void DockItem::showMenu(const QPoint &menuPos) { if (getMenuContent().isEmpty()) return; hidePreview(true); if (m_dbusMenuManager == nullptr) { m_dbusMenuManager = new DBusMenuManager(this); } QDBusPendingReply<QDBusObjectPath> pr = m_dbusMenuManager->RegisterMenu(); pr.waitForFinished(); if (pr.isValid()) { QDBusObjectPath op = pr.value(); if (m_dbusMenu != nullptr) { m_dbusMenu->deleteLater(); } m_dbusMenu = new DBusMenu(op.path(), this); connect(m_dbusMenu, &DBusMenu::ItemInvoked, this, &DockItem::invokeMenuItem); connect(m_dbusMenu, &DBusMenu::MenuUnregistered, [=] { setHoverable(true); }); QPoint pos = menuPos.isNull() ? QPoint(globalX() + width() / 2, globalY()) : menuPos; QJsonObject targetObj; targetObj.insert("x", QJsonValue(pos.x())); targetObj.insert("y", QJsonValue(pos.y())); targetObj.insert("isDockMenu", QJsonValue(true)); targetObj.insert("menuJsonContent", QJsonValue(getMenuContent())); m_dbusMenu->ShowMenu(QString(QJsonDocument(targetObj).toJson())); setHoverable(false); } }
void DockAppItem::onMouseLeave() { m_appBG->setIsHovered(false); hidePreview(false); }
void DockAppItem::initPreviewContainer() { m_previewContainer = new AppPreviewsContainer(); connect(m_previewContainer,&AppPreviewsContainer::requestHide, [=]{hidePreview();}); connect(m_previewContainer,&AppPreviewsContainer::sizeChanged, this, &DockAppItem::needPreviewUpdate); }
void TabBarWidget::showPreview(int index) { if (!m_enablePreviews || (window() && !window()->underMouse())) { hidePreview(); return; } if (index >= 0 && m_clickedTab < 0) { if (!m_previewWidget) { m_previewWidget = new PreviewWidget(this); } QPoint position; // Note that screen rectangle, tab rectangle and preview rectangle could have // negative values on multiple monitors systems. All calculations must be done in context // of a current screen rectangle. Because top left point of current screen could // have coordinates (-1366, 250) instead of (0, 0). ///TODO: Calculate screen rectangle based on current mouse pointer position const QRect screen = QApplication::desktop()->screenGeometry(this); QRect rectangle = tabRect(index); rectangle.moveTo(mapToGlobal(rectangle.topLeft())); m_previewWidget->setPreview(getTabProperty(index, QLatin1String("title"), tr("(Untitled)")).toString(), ((index == currentIndex()) ? QPixmap() : getTabProperty(index, "thumbnail", QPixmap()).value<QPixmap>())); switch (shape()) { case QTabBar::RoundedEast: position = QPoint((rectangle.left() - m_previewWidget->width()), qMax(screen.top(), ((rectangle.bottom() - (rectangle.height() / 2)) - (m_previewWidget->height() / 2)))); break; case QTabBar::RoundedWest: position = QPoint(rectangle.right(), qMax(screen.top(), ((rectangle.bottom() - (rectangle.height() / 2)) - (m_previewWidget->height() / 2)))); break; case QTabBar::RoundedSouth: position = QPoint(qMax(screen.left(), ((rectangle.right() - (rectangle.width() / 2)) - (m_previewWidget->width() / 2))), (rectangle.top() - m_previewWidget->height())); break; default: position = QPoint(qMax(screen.left(), ((rectangle.right() - (rectangle.width() / 2)) - (m_previewWidget->width() / 2))), rectangle.bottom()); break; } if ((position.x() + m_previewWidget->width()) > screen.right()) { position.setX(screen.right() - m_previewWidget->width()); } if ((position.y() + m_previewWidget->height()) > screen.bottom()) { position.setY(screen.bottom() - m_previewWidget->height()); } if (m_previewWidget->isVisible()) { m_previewWidget->setPosition(position); } else { m_previewWidget->move(position); m_previewWidget->show(); } } else if (m_previewWidget) { m_previewWidget->hide(); } }
void TabBarWidget::contextMenuEvent(QContextMenuEvent *event) { m_clickedTab = tabAt(event->pos()); hidePreview(); QMenu menu(this); menu.addAction(ActionsManager::getAction(ActionsManager::NewTabAction, this)); menu.addAction(ActionsManager::getAction(ActionsManager::NewTabPrivateAction, this)); if (m_clickedTab >= 0) { const bool isPinned = getTabProperty(m_clickedTab, QLatin1String("isPinned"), false).toBool(); Action *cloneTabAction = new Action(ActionsManager::CloneTabAction, &menu); cloneTabAction->setEnabled(getTabProperty(m_clickedTab, QLatin1String("canClone"), false).toBool()); Action *pinTabAction = new Action(ActionsManager::PinTabAction, &menu); pinTabAction->setOverrideText(isPinned ? QT_TRANSLATE_NOOP("actions", "Unpin Tab") : QT_TRANSLATE_NOOP("actions", "Pin Tab")); Action *detachTabAction = new Action(ActionsManager::DetachTabAction, &menu); detachTabAction->setEnabled(count() > 1); menu.addAction(cloneTabAction); menu.addAction(pinTabAction); menu.addSeparator(); menu.addAction(detachTabAction); menu.addSeparator(); if (isPinned) { Action *closeTabAction = new Action(ActionsManager::CloseTabAction, &menu); closeTabAction->setEnabled(false); menu.addAction(closeTabAction); } else { menu.addAction(ActionsManager::getAction(ActionsManager::CloseTabAction, this)); } const int amount = (count() - getPinnedTabsAmount()); Action *closeOtherTabsAction = new Action(ActionsManager::CloseOtherTabsAction, &menu); closeOtherTabsAction->setEnabled(amount > 0 && !(amount == 1 && !isPinned)); menu.addAction(closeOtherTabsAction); menu.addAction(ActionsManager::getAction(ActionsManager::ClosePrivateTabsAction, this)); connect(cloneTabAction, SIGNAL(triggered()), this, SLOT(cloneTab())); connect(pinTabAction, SIGNAL(triggered()), this, SLOT(pinTab())); connect(detachTabAction, SIGNAL(triggered()), this, SLOT(detachTab())); connect(closeOtherTabsAction, SIGNAL(triggered()), this, SLOT(closeOtherTabs())); } menu.addSeparator(); QMenu *arrangeMenu = menu.addMenu(tr("Arrange")); arrangeMenu->addAction(ActionsManager::getAction(ActionsManager::RestoreTabAction, this)); arrangeMenu->addSeparator(); arrangeMenu->addAction(ActionsManager::getAction(ActionsManager::RestoreAllAction, this)); arrangeMenu->addAction(ActionsManager::getAction(ActionsManager::MaximizeAllAction, this)); arrangeMenu->addAction(ActionsManager::getAction(ActionsManager::MinimizeAllAction, this)); arrangeMenu->addSeparator(); arrangeMenu->addAction(ActionsManager::getAction(ActionsManager::CascadeAllAction, this)); arrangeMenu->addAction(ActionsManager::getAction(ActionsManager::TileAllAction, this)); QAction *cycleAction = new QAction(tr("Switch tabs using the mouse wheel"), this); cycleAction->setCheckable(true); cycleAction->setChecked(!SettingsManager::getValue(QLatin1String("TabBar/RequireModifierToSwitchTabOnScroll")).toBool()); connect(cycleAction, SIGNAL(toggled(bool)), this, SLOT(setCycle(bool))); ToolBarWidget *toolBar = qobject_cast<ToolBarWidget*>(parentWidget()); if (toolBar) { QList<QAction*> actions; actions.append(cycleAction); menu.addMenu(ToolBarWidget::createCustomizationMenu(ToolBarsManager::TabBar, actions, &menu)); } else { QMenu *customizationMenu = menu.addMenu(tr("Customize")); customizationMenu->addAction(cycleAction); customizationMenu->addSeparator(); customizationMenu->addAction(ActionsManager::getAction(ActionsManager::LockToolBarsAction, this)); } menu.exec(event->globalPos()); cycleAction->deleteLater(); m_clickedTab = -1; if (underMouse()) { m_previewTimer = startTimer(250); } }
void TabBarWidget::mousePressEvent(QMouseEvent *event) { QTabBar::mousePressEvent(event); hidePreview(); }
void TabBarWidget::showPreview(int index) { if (!m_enablePreviews || (parentWidget() && !parentWidget()->parentWidget()->parentWidget()->underMouse())) { hidePreview(); return; } if (index >= 0 && m_clickedTab < 0) { if (!m_previewWidget) { m_previewWidget = new PreviewWidget(this); } QPoint position; QRect rectangle = tabRect(index); rectangle.moveTo(mapToGlobal(rectangle.topLeft())); m_previewWidget->setPreview(getTabProperty(index, QLatin1String("title"), tr("(Untitled)")).toString(), ((index == currentIndex()) ? QPixmap() : getTabProperty(index, "thumbnail", QPixmap()).value<QPixmap>())); switch (shape()) { case QTabBar::RoundedEast: position = QPoint((rectangle.left() - m_previewWidget->width()), qMax(0, ((rectangle.bottom() - (rectangle.height() / 2)) - (m_previewWidget->height() / 2)))); break; case QTabBar::RoundedWest: position = QPoint(rectangle.right(), qMax(0, ((rectangle.bottom() - (rectangle.height() / 2)) - (m_previewWidget->height() / 2)))); break; case QTabBar::RoundedSouth: position = QPoint(qMax(0, ((rectangle.right() - (rectangle.width() / 2)) - (m_previewWidget->width() / 2))), (rectangle.top() - m_previewWidget->height())); break; default: position = QPoint(qMax(0, ((rectangle.right() - (rectangle.width() / 2)) - (m_previewWidget->width() / 2))), rectangle.bottom()); break; } const QRect screen = QApplication::desktop()->screenGeometry(this); if ((position.x() + m_previewWidget->width()) > screen.bottomRight().x()) { position.setX(screen.width() - m_previewWidget->width()); } if ((position.y() + m_previewWidget->height()) > screen.bottomRight().y()) { position.setY(screen.height() - m_previewWidget->height()); } if (m_previewWidget->isVisible()) { m_previewWidget->setPosition(position); } else { m_previewWidget->move(position); m_previewWidget->show(); } } else if (m_previewWidget) { m_previewWidget->hide(); } }