1
mirror of https://invent.kde.org/network/falkon.git synced 2024-12-20 10:46:35 +01:00

Merge pull request #2297 from srazi/improve_tabmanager

Improve TabManager
This commit is contained in:
David Rosca 2017-04-07 20:22:44 +02:00 committed by GitHub
commit 1d8b2345ac
10 changed files with 61 additions and 24 deletions

View File

@ -6,13 +6,13 @@ SOURCES += tabmanagerplugin.cpp \
tabmanagerwidget.cpp \ tabmanagerwidget.cpp \
tabmanagerwidgetcontroller.cpp \ tabmanagerwidgetcontroller.cpp \
tabmanagersettings.cpp \ tabmanagersettings.cpp \
tabfilterdelegate.cpp tabmanagerdelegate.cpp
HEADERS += tabmanagerplugin.h \ HEADERS += tabmanagerplugin.h \
tabmanagerwidget.h \ tabmanagerwidget.h \
tabmanagerwidgetcontroller.h \ tabmanagerwidgetcontroller.h \
tabmanagersettings.h \ tabmanagersettings.h \
tabfilterdelegate.h tabmanagerdelegate.h
RESOURCES += tabmanagerplugin.qrc RESOURCES += tabmanagerplugin.qrc

Binary file not shown.

After

Width:  |  Height:  |  Size: 657 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 696 B

View File

@ -1,6 +1,6 @@
/* ============================================================ /* ============================================================
* QupZilla - Qt web browser * QupZilla - Qt web browser
* Copyright (C) 2016 S. Razi Alavizadeh <s.r.alavizadeh@gmail.com> * Copyright (C) 2016-2017 S. Razi Alavizadeh <s.r.alavizadeh@gmail.com>
* Copyright (C) 2017 David Rosca <nowrep@gmail.com> * Copyright (C) 2017 David Rosca <nowrep@gmail.com>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
@ -16,25 +16,26 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
* ============================================================ */ * ============================================================ */
#include "tabfilterdelegate.h" #include "tabmanagerdelegate.h"
#include <QPainter> #include <QPainter>
#include <QApplication> #include <QApplication>
#include <QTextLayout> #include <QTextLayout>
TabFilterDelegate::TabFilterDelegate(QObject* parent) TabManagerDelegate::TabManagerDelegate(QObject* parent)
: QStyledItemDelegate(parent) : QStyledItemDelegate(parent)
{ {
} }
// most of codes taken from QCommonStyle::drawControl() and add our custom text drawer // most of codes taken from QCommonStyle::drawControl() and add our custom text drawer
void TabFilterDelegate::paint(QPainter* painter, const QStyleOptionViewItem &option, const QModelIndex &index) const void TabManagerDelegate::paint(QPainter* painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{ {
QStyleOptionViewItem opt = option; QStyleOptionViewItem opt = option;
initStyleOption(&opt, index); initStyleOption(&opt, index);
const QWidget* w = opt.widget; const QWidget* w = opt.widget;
const QStyle* style = w ? w->style() : QApplication::style(); const QStyle* style = w ? w->style() : QApplication::style();
const Qt::LayoutDirection direction = w ? w->layoutDirection() : QApplication::layoutDirection();
const QPalette::ColorRole colorRole = opt.state & QStyle::State_Selected ? QPalette::HighlightedText : QPalette::Text; const QPalette::ColorRole colorRole = opt.state & QStyle::State_Selected ? QPalette::HighlightedText : QPalette::Text;
@ -61,6 +62,21 @@ void TabFilterDelegate::paint(QPainter* painter, const QStyleOptionViewItem &opt
// draw the background // draw the background
style->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter, w); style->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter, w);
// draw close button
if (index.column() == 1) {
if (opt.state & QStyle::State_MouseOver) {
static const int buttonSize = 16;
static const QPixmap closeTabButton(":tabmanager/data/closetab.png");
static const QPixmap addTabButton(":tabmanager/data/addtab.png");
const QRect rect(opt.rect.right() - buttonSize, (opt.rect.height() - buttonSize) / 2 + opt.rect.y(), buttonSize, buttonSize);
painter->drawPixmap(style->visualRect(direction, opt.rect, rect), (index.parent().isValid() ? closeTabButton : addTabButton));
}
painter->restore();
return;
}
// draw the check mark // draw the check mark
if (opt.features & QStyleOptionViewItem::HasCheckIndicator) { if (opt.features & QStyleOptionViewItem::HasCheckIndicator) {
QStyleOptionViewItem opt2(opt); QStyleOptionViewItem opt2(opt);
@ -140,7 +156,7 @@ static QSizeF viewItemTextLayout(QTextLayout &textLayout, int lineWidth)
// most of codes taken from QCommonStylePrivate::viewItemDrawText() // most of codes taken from QCommonStylePrivate::viewItemDrawText()
// added highlighting and simplified for single-line textlayouts // added highlighting and simplified for single-line textlayouts
void TabFilterDelegate::viewItemDrawText(QPainter *p, const QStyleOptionViewItem *option, const QRect &rect, void TabManagerDelegate::viewItemDrawText(QPainter *p, const QStyleOptionViewItem *option, const QRect &rect,
const QString &text, const QColor &color, const QString &searchText) const const QString &text, const QColor &color, const QString &searchText) const
{ {
if (text.isEmpty()) { if (text.isEmpty()) {

View File

@ -1,6 +1,6 @@
/* ============================================================ /* ============================================================
* QupZilla - WebKit based browser * QupZilla - WebKit based browser
* Copyright (C) 2016 S. Razi Alavizadeh <s.r.alavizadeh@gmail.com> * Copyright (C) 2016-2017 S. Razi Alavizadeh <s.r.alavizadeh@gmail.com>
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -15,15 +15,15 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
* ============================================================ */ * ============================================================ */
#ifndef TABFILTERDELEGATE_H #ifndef TABMANAGERDELEGATE_H
#define TABFILTERDELEGATE_H #define TABMANAGERDELEGATE_H
#include <QStyledItemDelegate> #include <QStyledItemDelegate>
class TabFilterDelegate : public QStyledItemDelegate class TabManagerDelegate : public QStyledItemDelegate
{ {
public: public:
explicit TabFilterDelegate(QObject* parent = 0); explicit TabManagerDelegate(QObject* parent = 0);
void paint(QPainter* painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; void paint(QPainter* painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
@ -36,4 +36,4 @@ private:
}; };
#endif // TABFILTERDELEGATE_H #endif // TABMANAGERDELEGATE_H

View File

@ -1,6 +1,6 @@
/* ============================================================ /* ============================================================
* TabManager plugin for QupZilla * TabManager plugin for QupZilla
* Copyright (C) 2013-2016 S. Razi Alavizadeh <s.r.alavizadeh@gmail.com> * Copyright (C) 2013-2017 S. Razi Alavizadeh <s.r.alavizadeh@gmail.com>
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -51,7 +51,7 @@ PluginSpec TabManagerPlugin::pluginSpec()
spec.name = "Tab Manager"; spec.name = "Tab Manager";
spec.info = "Simple yet powerful tab manager for QupZilla"; spec.info = "Simple yet powerful tab manager for QupZilla";
spec.description = "Adds ability to managing tabs and windows"; spec.description = "Adds ability to managing tabs and windows";
spec.version = "0.6.0"; spec.version = "0.7.0";
spec.author = "Razi Alavizadeh <s.r.alavizadeh@gmail.com>"; spec.author = "Razi Alavizadeh <s.r.alavizadeh@gmail.com>";
spec.icon = QPixmap(":tabmanager/data/tabmanager.png"); spec.icon = QPixmap(":tabmanager/data/tabmanager.png");
spec.hasSettings = true; spec.hasSettings = true;

View File

@ -1,6 +1,6 @@
/* ============================================================ /* ============================================================
* TabManager plugin for QupZilla * TabManager plugin for QupZilla
* Copyright (C) 2013 S. Razi Alavizadeh <s.r.alavizadeh@gmail.com> * Copyright (C) 2013-2017 S. Razi Alavizadeh <s.r.alavizadeh@gmail.com>
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by

View File

@ -7,6 +7,8 @@
<file>data/tab-loading.png</file> <file>data/tab-loading.png</file>
<file>data/tab-pinned.png</file> <file>data/tab-pinned.png</file>
<file>data/side-by-side.png</file> <file>data/side-by-side.png</file>
<file>data/closetab.png</file>
<file>data/addtab.png</file>
<file>locale/ar_SA.qm</file> <file>locale/ar_SA.qm</file>
<file>locale/bg_BG.qm</file> <file>locale/bg_BG.qm</file>
<file>locale/ca_ES.qm</file> <file>locale/ca_ES.qm</file>

View File

@ -1,6 +1,6 @@
/* ============================================================ /* ============================================================
* TabManager plugin for QupZilla * TabManager plugin for QupZilla
* Copyright (C) 2013-2016 S. Razi Alavizadeh <s.r.alavizadeh@gmail.com> * Copyright (C) 2013-2017 S. Razi Alavizadeh <s.r.alavizadeh@gmail.com>
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -29,7 +29,7 @@
#include "bookmarks.h" #include "bookmarks.h"
#include "tabmanagerplugin.h" #include "tabmanagerplugin.h"
#include "tldextractor/tldextractor.h" #include "tldextractor/tldextractor.h"
#include "tabfilterdelegate.h" #include "tabmanagerdelegate.h"
#include <QDesktopWidget> #include <QDesktopWidget>
@ -59,6 +59,14 @@ TabManagerWidget::TabManagerWidget(BrowserWindow* mainClass, QWidget* parent, bo
} }
ui->setupUi(this); ui->setupUi(this);
ui->treeWidget->setUniformRowHeights(true);
ui->treeWidget->setColumnCount(2);
ui->treeWidget->header()->hide();
ui->treeWidget->header()->setStretchLastSection(false);
ui->treeWidget->header()->setSectionResizeMode(0, QHeaderView::Stretch);
ui->treeWidget->header()->setSectionResizeMode(1, QHeaderView::Fixed);
ui->treeWidget->header()->resizeSection(1, 16);
ui->treeWidget->setExpandsOnDoubleClick(false); ui->treeWidget->setExpandsOnDoubleClick(false);
ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu); ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
@ -71,11 +79,11 @@ TabManagerWidget::TabManagerWidget(BrowserWindow* mainClass, QWidget* parent, bo
ui->filterBar->addWidget(closeButton, LineEdit::RightSide); ui->filterBar->addWidget(closeButton, LineEdit::RightSide);
ui->filterBar->hide(); ui->filterBar->hide();
ui->treeWidget->setItemDelegate(new TabFilterDelegate(ui->treeWidget)); ui->treeWidget->setItemDelegate(new TabManagerDelegate(ui->treeWidget));
connect(closeButton, SIGNAL(clicked(bool)), this, SLOT(filterBarClosed())); connect(closeButton, SIGNAL(clicked(bool)), this, SLOT(filterBarClosed()));
connect(ui->filterBar, SIGNAL(textChanged(QString)), this, SLOT(filterChanged(QString))); connect(ui->filterBar, SIGNAL(textChanged(QString)), this, SLOT(filterChanged(QString)));
connect(ui->treeWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)), this, SLOT(itemDoubleClick(QTreeWidgetItem*,int))); connect(ui->treeWidget, SIGNAL(itemClicked(QTreeWidgetItem*,int)), this, SLOT(onItemActivated(QTreeWidgetItem*,int)));
connect(ui->treeWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(customContextMenuRequested(QPoint))); connect(ui->treeWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(customContextMenuRequested(QPoint)));
} }
@ -201,7 +209,7 @@ void TabManagerWidget::refreshTree()
m_waitForRefresh = false; m_waitForRefresh = false;
} }
void TabManagerWidget::itemDoubleClick(QTreeWidgetItem* item, int) void TabManagerWidget::onItemActivated(QTreeWidgetItem* item, int column)
{ {
if (!item) { if (!item) {
return; return;
@ -214,6 +222,14 @@ void TabManagerWidget::itemDoubleClick(QTreeWidgetItem* item, int)
return; return;
} }
if (column == 1) {
if (item->childCount() == 0 && tabWidget)
mainWindow->tabWidget()->requestCloseTab(mainWindow->tabWidget()->indexOf(tabWidget));
else if (item->childCount() > 0)
QMetaObject::invokeMethod(mainWindow, "addTab");
return;
}
if (mainWindow->isMinimized()) { if (mainWindow->isMinimized()) {
mainWindow->showNormal(); mainWindow->showNormal();
} }
@ -345,7 +361,7 @@ bool TabManagerWidget::eventFilter(QObject* obj, QEvent* event)
if (obj == ui->treeWidget) { if (obj == ui->treeWidget) {
// switch to tab/window on enter // switch to tab/window on enter
if (keyEvent->key() == Qt::Key_Enter || keyEvent->key() == Qt::Key_Return) { if (keyEvent->key() == Qt::Key_Enter || keyEvent->key() == Qt::Key_Return) {
itemDoubleClick(ui->treeWidget->currentItem(), 0); onItemActivated(ui->treeWidget->currentItem(), 0);
return QObject::eventFilter(obj, event); return QObject::eventFilter(obj, event);
} }
@ -377,6 +393,9 @@ bool TabManagerWidget::eventFilter(QObject* obj, QEvent* event)
} }
} }
if (obj == ui->treeWidget && (event->type() == QEvent::Resize || event->type() == QEvent::Show))
ui->treeWidget->setColumnHidden(1, ui->treeWidget->viewport()->width() < 150);
return QObject::eventFilter(obj, event); return QObject::eventFilter(obj, event);
} }

View File

@ -1,6 +1,6 @@
/* ============================================================ /* ============================================================
* TabManager plugin for QupZilla * TabManager plugin for QupZilla
* Copyright (C) 2013-2016 S. Razi Alavizadeh <s.r.alavizadeh@gmail.com> * Copyright (C) 2013-2017 S. Razi Alavizadeh <s.r.alavizadeh@gmail.com>
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -91,7 +91,7 @@ private:
private slots: private slots:
void refreshTree(); void refreshTree();
void processActions(); void processActions();
void itemDoubleClick(QTreeWidgetItem* item, int); void onItemActivated(QTreeWidgetItem* item, int column);
bool isTabSelected(); bool isTabSelected();
void customContextMenuRequested(const QPoint &pos); void customContextMenuRequested(const QPoint &pos);
void filterChanged(const QString &filter, bool force = false); void filterChanged(const QString &filter, bool force = false);