You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

221 lines
6.6 KiB

/* ============================================================
* TabManager plugin for Falkon
* Copyright (C) 2013-2017 S. Razi Alavizadeh <s.r.alavizadeh@gmail.com>
*
* 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
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* ============================================================ */
#include "tabmanagerplugin.h"
#include "tabmanagerwidget.h"
#include "browserwindow.h"
#include "pluginproxy.h"
#include "mainapplication.h"
#include "sidebar.h"
#include "tabwidget.h"
#include "tabbar.h"
#include "tabmanagersettings.h"
#include "../config.h"
#include <QInputDialog>
#include <QSettings>
#include <QAction>
#include <QTimer>
#include <QMenu>
QString TabManagerPlugin::s_settingsPath;
TabManagerPlugin::TabManagerPlugin()
: QObject()
, m_controller(0)
, m_tabManagerWidget(0)
, m_viewType(Undefined)
, m_initState(false)
, m_asTabBarReplacement(false)
{
}
void TabManagerPlugin::init(InitState state, const QString &settingsPath)
{
Q_UNUSED(state)
m_controller = new TabManagerWidgetController(this);
connect(mApp->plugins(), SIGNAL(mainWindowCreated(BrowserWindow*)), this, SLOT(mainWindowCreated(BrowserWindow*)));
connect(mApp->plugins(), SIGNAL(mainWindowDeleted(BrowserWindow*)), m_controller, SLOT(mainWindowDeleted(BrowserWindow*)));
connect(mApp->plugins(), SIGNAL(webPageCreated(WebPage*)), m_controller, SIGNAL(requestRefreshTree()));
connect(mApp->plugins(), SIGNAL(webPageDeleted(WebPage*)), m_controller, SIGNAL(requestRefreshTree(WebPage*)));
s_settingsPath = settingsPath + QL1S("/TabManager");
m_initState = true;
// load settings
QSettings settings(s_settingsPath + QL1S("/tabmanager.ini"), QSettings::IniFormat);
settings.beginGroup("View");
m_controller->setGroupType(TabManagerWidget::GroupType(settings.value("GroupType", TabManagerWidget::GroupByWindow).toInt()));
m_viewType = ViewType(settings.value("ViewType", ShowAsWindow).toInt());
m_asTabBarReplacement = settings.value("AsTabBarReplacement", false).toBool();
settings.endGroup();
setAsTabBarReplacement(m_asTabBarReplacement);
insertManagerWidget();
}
void TabManagerPlugin::unload()
{
saveSettings();
setTabBarVisible(true);
removeManagerWidget();
delete m_controller;
}
bool TabManagerPlugin::testPlugin()
{
return (Qz::VERSION == QLatin1String(FALKON_VERSION));
}
void TabManagerPlugin::showSettings(QWidget* parent)
{
auto* settings = new TabManagerSettings(this, parent);
settings->exec();
}
void TabManagerPlugin::populateExtensionsMenu(QMenu* menu)
{
if (viewType() == ShowAsWindow) {
QAction* showAction = m_controller->createMenuAction();
showAction->setCheckable(false);
connect(showAction, SIGNAL(triggered()), m_controller, SLOT(raiseTabManager()));
menu->addAction(showAction);
}
}
void TabManagerPlugin::insertManagerWidget()
{
if (viewType() == ShowAsSideBar) {
SideBarManager::addSidebar("TabManager", m_controller);
}
else if (viewType() == ShowAsWindow) {
if (!m_tabManagerWidget) {
m_tabManagerWidget = m_controller->createTabManagerWidget(mApp->getWindow(), 0, true);
m_tabManagerWidget->setWindowFlags(Qt::Window);
}
}
if (m_initState) {
const auto windows = mApp->windows();
for (BrowserWindow* window : windows) {
mainWindowCreated(window, false);
}
m_initState = false;
}
}
void TabManagerPlugin::mainWindowCreated(BrowserWindow* window, bool refresh)
{
if (window) {
window->tabWidget()->tabBar()->setForceHidden(m_asTabBarReplacement);
if (m_viewType == ShowAsWindow) {
m_controller->addStatusBarIcon(window);
}
connect(window->tabWidget(), SIGNAL(currentChanged(int)), m_controller, SIGNAL(requestRefreshTree()));
connect(window->tabWidget(), SIGNAL(pinStateChanged(int,bool)), m_controller, SIGNAL(requestRefreshTree()));
}
if (refresh) {
m_controller->emitRefreshTree();
}
}
void TabManagerPlugin::setTabBarVisible(bool visible)
{
const auto windows = mApp->windows();
for (BrowserWindow* window : windows) {
window->tabWidget()->tabBar()->setForceHidden(!visible);
}
}
void TabManagerPlugin::removeManagerWidget()
{
if (viewType() == ShowAsSideBar) {
SideBarManager::removeSidebar(m_controller);
}
else if (viewType() == ShowAsWindow) {
// remove statusbar icon
const auto windows = mApp->windows();
for (BrowserWindow* window : windows) {
m_controller->removeStatusBarIcon(window);
}
m_tabManagerWidget->close();
delete m_tabManagerWidget;
m_tabManagerWidget = 0;
}
}
TabManagerPlugin::ViewType TabManagerPlugin::viewType()
{
return m_viewType;
}
void TabManagerPlugin::setViewType(ViewType type)
{
if (m_viewType != type) {
removeManagerWidget();
m_viewType = type;
insertManagerWidget();
if (!m_initState) {
if (m_viewType == ShowAsSideBar) {
mApp->getWindow()->sideBarManager()->showSideBar("TabManager");
}
else if (m_viewType == ShowAsWindow) {
// add statusbar icon
const auto windows = mApp->windows();
for (BrowserWindow* window : windows) {
m_controller->addStatusBarIcon(window);
}
}
}
}
}
QString TabManagerPlugin::settingsPath()
{
return s_settingsPath;
}
void TabManagerPlugin::saveSettings()
{
QSettings settings(s_settingsPath + QL1S("/tabmanager.ini"), QSettings::IniFormat);
settings.beginGroup("View");
settings.setValue("GroupType", m_controller->groupType());
settings.setValue("ViewType", viewType());
settings.setValue("AsTabBarReplacement", asTabBarReplacement());
settings.endGroup();
}
bool TabManagerPlugin::asTabBarReplacement() const
{
return m_asTabBarReplacement;
}
void TabManagerPlugin::setAsTabBarReplacement(bool yes)
{
m_asTabBarReplacement = yes;
setTabBarVisible(!m_asTabBarReplacement);
}