diff --git a/src/plugins/TabManager/tabmanagerwidgetcontroller.cpp b/src/plugins/TabManager/tabmanagerwidgetcontroller.cpp index e3c33cabc..999f9678e 100644 --- a/src/plugins/TabManager/tabmanagerwidgetcontroller.cpp +++ b/src/plugins/TabManager/tabmanagerwidgetcontroller.cpp @@ -18,12 +18,13 @@ * ============================================================ */ #include "tabmanagerwidgetcontroller.h" #include "tabmanagerwidget.h" -#include "clickablelabel.h" +#include "abstractbuttoninterface.h" #include "browserwindow.h" #include "tabwidget.h" #include "mainapplication.h" #include "tabbar.h" #include "statusbar.h" +#include "navigationbar.h" #include #include @@ -31,6 +32,26 @@ #include +class TabManagerButton : public AbstractButtonInterface +{ +public: + explicit TabManagerButton(QObject *parent = nullptr) + : AbstractButtonInterface(parent) + { + } + + QString id() const override + { + return QSL("tabmanager-icon"); + } + + QString name() const override + { + return tr("Tab Manager button"); + } +}; + + TabManagerWidgetController::TabManagerWidgetController(QObject* parent) : SideBarInterface(parent) , m_defaultTabManager(0) @@ -63,7 +84,7 @@ QWidget* TabManagerWidgetController::createSideBarWidget(BrowserWindow* mainWind return createTabManagerWidget(mainWindow, mainWindow); } -QWidget* TabManagerWidgetController::createStatusBarIcon(BrowserWindow* mainWindow) +AbstractButtonInterface* TabManagerWidgetController::createStatusBarIcon(BrowserWindow* mainWindow) { if (!defaultTabManager()) { return 0; @@ -73,11 +94,27 @@ QWidget* TabManagerWidgetController::createStatusBarIcon(BrowserWindow* mainWind return m_statusBarIcons.value(mainWindow); } - ClickableLabel* icon = new ClickableLabel(mainWindow); - icon->setCursor(Qt::PointingHandCursor); - QPixmap p(":tabmanager/data/tabmanager.png"); - icon->setPixmap(p.scaledToHeight(16)); + TabManagerButton* icon = new TabManagerButton(this); + icon->setIcon(QPixmap(":tabmanager/data/tabmanager.png")); + icon->setTitle(tr("Tab Manager")); icon->setToolTip(tr("Show Tab Manager")); + connect(icon, &AbstractButtonInterface::clicked, this, [=](AbstractButtonInterface::ClickController *c) { + if (!defaultTabManager()) { + return; + } + + static int frameWidth = (defaultTabManager()->frameGeometry().width() - defaultTabManager()->geometry().width()) / 2; + static int titleBarHeight = defaultTabManager()->style()->pixelMetric(QStyle::PM_TitleBarHeight); + + QSize newSize(defaultTabManager()->width(), mainWindow->height() - titleBarHeight - frameWidth); + QRect newGeo(c->popupPosition(newSize), newSize); + defaultTabManager()->setGeometry(newGeo); + raiseTabManager(); + + QTimer::singleShot(0, this, [=]() { + c->popupClosed(); + }); + }); QAction* showAction = createMenuAction(); showAction->setCheckable(false); @@ -85,8 +122,6 @@ QWidget* TabManagerWidgetController::createStatusBarIcon(BrowserWindow* mainWind mainWindow->addAction(showAction); connect(showAction, SIGNAL(triggered()), this, SLOT(raiseTabManager())); - connect(icon, SIGNAL(clicked(QPoint)), this, SLOT(raiseTabManager())); - m_statusBarIcons.insert(mainWindow, icon); m_actions.insert(mainWindow, showAction); @@ -137,14 +172,16 @@ TabManagerWidget* TabManagerWidgetController::defaultTabManager() void TabManagerWidgetController::addStatusBarIcon(BrowserWindow* window) { if (window) { - window->statusBar()->addPermanentWidget(createStatusBarIcon(window)); + window->statusBar()->addButton(createStatusBarIcon(window)); + window->navigationBar()->addToolButton(createStatusBarIcon(window)); } } void TabManagerWidgetController::removeStatusBarIcon(BrowserWindow* window) { if (window) { - window->statusBar()->removeWidget(m_statusBarIcons.value(window)); + window->statusBar()->removeButton(m_statusBarIcons.value(window)); + window->navigationBar()->removeToolButton(m_statusBarIcons.value(window)); window->removeAction(m_actions.value(window)); delete m_actions.value(window); delete m_statusBarIcons.value(window); @@ -166,20 +203,6 @@ void TabManagerWidgetController::raiseTabManager() return; } - ClickableLabel* icon = qobject_cast(sender()); - if (icon) { - static int frameWidth = (defaultTabManager()->frameGeometry().width() - defaultTabManager()->geometry().width()) / 2; - static int titleBarHeight = defaultTabManager()->style()->pixelMetric(QStyle::PM_TitleBarHeight); - - int y = qMax(0, icon->mapToGlobal(QPoint(0, 0)).y() - 1 - icon->window()->height() + titleBarHeight - frameWidth); - int x = icon->mapToGlobal(QPoint(0, 0)).x(); - if (!mApp->isRightToLeft()) { - x -= defaultTabManager()->width(); - } - QRect newGeo(x, y, defaultTabManager()->width(), icon->window()->height() - titleBarHeight - frameWidth); - defaultTabManager()->setGeometry(newGeo); - } - defaultTabManager()->activateWindow(); defaultTabManager()->showNormal(); defaultTabManager()->raise(); diff --git a/src/plugins/TabManager/tabmanagerwidgetcontroller.h b/src/plugins/TabManager/tabmanagerwidgetcontroller.h index 8728b3590..d6f144f6a 100644 --- a/src/plugins/TabManager/tabmanagerwidgetcontroller.h +++ b/src/plugins/TabManager/tabmanagerwidgetcontroller.h @@ -1,6 +1,7 @@ /* ============================================================ * TabManager plugin for Falkon * Copyright (C) 2013-2017 S. Razi Alavizadeh +* Copyright (C) 2018 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,6 +23,7 @@ #include "tabmanagerwidget.h" class WebPage; +class AbstractButtonInterface; class TabManagerWidgetController : public SideBarInterface { @@ -34,7 +36,7 @@ public: QAction* createMenuAction(); QWidget* createSideBarWidget(BrowserWindow* mainWindow); - QWidget* createStatusBarIcon(BrowserWindow* mainWindow); + AbstractButtonInterface* createStatusBarIcon(BrowserWindow* mainWindow); TabManagerWidget::GroupType groupType(); TabManagerWidget* createTabManagerWidget(BrowserWindow* mainClass, QWidget* parent = 0, bool defaultWidget = false); @@ -55,7 +57,7 @@ private: TabManagerWidget* m_defaultTabManager; TabManagerWidget::GroupType m_groupType; - QHash m_statusBarIcons; + QHash m_statusBarIcons; QHash m_actions; signals: