summaryrefslogtreecommitdiff
path: root/src/tabbar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tabbar.cpp')
-rw-r--r--src/tabbar.cpp568
1 files changed, 0 insertions, 568 deletions
diff --git a/src/tabbar.cpp b/src/tabbar.cpp
deleted file mode 100644
index 5339a7d0..00000000
--- a/src/tabbar.cpp
+++ /dev/null
@@ -1,568 +0,0 @@
-/* ============================================================
-*
-* This file is a part of the rekonq project
-*
-* Copyright (C) 2008 Benjamin C. Meyer <ben@meyerhome.net>
-* Copyright (C) 2008-2012 by Andrea Diamantini <adjam7 at gmail dot com>
-* Copyright (C) 2009 by Paweł Prażak <pawelprazak at gmail dot com>
-* Copyright (C) 2009-2011 by Lionel Chauvin <megabigbug@yahoo.fr>
-*
-*
-* 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 2 of
-* the License or (at your option) version 3 or any later version
-* accepted by the membership of KDE e.V. (or its successor approved
-* by the membership of KDE e.V.), which shall act as a proxy
-* defined in Section 14 of version 3 of the license.
-*
-* 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/>.
-*
-* ============================================================ */
-
-
-//Self Includes
-#include "tabbar.h"
-#include "tabbar.moc"
-
-// Local Includes
-#include "rekonq.h"
-
-#include "application.h"
-#include "historymanager.h"
-#include "iconmanager.h"
-#include "mainview.h"
-#include "mainwindow.h"
-#include "webpage.h"
-#include "webtab.h"
-#include "websnap.h"
-#include "tabhighlighteffect.h"
-#include "tabpreviewpopup.h"
-#include "searchengine.h"
-
-// KDE Includes
-#include <KActionMenu>
-#include <KMenu>
-#include <KToolBar>
-#include <KColorScheme>
-#include <KAcceleratorManager>
-
-// Qt Includes
-#include <QLabel>
-#include <QLayout>
-#include <QMouseEvent>
-#include <QToolButton>
-#include <QPropertyAnimation>
-#include <QStyleOptionFrameV3>
-#include <QSignalMapper>
-#include <QTimer>
-
-
-static inline QByteArray highlightPropertyName(int index)
-{
- return QByteArray("hAnim").append(QByteArray::number(index));
-}
-
-
-// ----------------------------------------------
-
-
-TabBar::TabBar(QWidget *parent)
- : KTabBar(parent)
- , m_actualIndex(-1)
- , m_currentTabPreviewIndex(-1)
- , m_isFirstTimeOnTab(true)
- , m_tabHighlightEffect(new TabHighlightEffect(this))
- , m_animationMapper(new QSignalMapper(this))
-{
- setElideMode(Qt::ElideRight);
-
- setDocumentMode(true);
- setTabsClosable(true);
- setMovable(true);
-
- setContextMenuPolicy(Qt::CustomContextMenu);
-
- // avoid ambiguos shortcuts. See BUG:275858
- KAcceleratorManager::setNoAccel(this);
-
- connect(this, SIGNAL(contextMenu(int, QPoint)), this, SLOT(contextMenu(int, QPoint)));
- connect(this, SIGNAL(emptyAreaContextMenu(QPoint)), this, SLOT(emptyAreaContextMenu(QPoint)));
-
- connect(m_animationMapper, SIGNAL(mapped(int)), this, SLOT(removeAnimation(int)));
- setGraphicsEffect(m_tabHighlightEffect);
-
- setAnimatedTabHighlighting(ReKonfig::animatedTabHighlighting());
- setAcceptDrops(true);
-}
-
-
-QSize TabBar::tabSizeHint(int index) const
-{
- Q_UNUSED(index);
-
- MainView *view = qobject_cast<MainView *>(parent());
-
- int buttonSize = view->addTabButton()->size().width();
- int tabBarWidth = view->size().width() - buttonSize;
- int baseWidth = view->sizeHint().width() / baseWidthDivisor;
- int minWidth = view->sizeHint().width() / minWidthDivisor;
-
- int w;
- if (baseWidth * count() < tabBarWidth)
- {
- w = baseWidth;
- }
- else
- {
- if (count() > 0 && tabBarWidth / count() > minWidth)
- {
- w = tabBarWidth / count();
- }
- else
- {
- w = minWidth;
- }
- }
-
- int h = KTabBar::tabSizeHint(index).height();
-
- QSize ts = QSize(w, h);
- return ts;
-}
-
-
-void TabBar::cloneTab()
-{
- emit cloneTab(m_actualIndex);
- m_actualIndex = -1;
-}
-
-
-void TabBar::closeTab()
-{
- emit closeTab(m_actualIndex);
- m_actualIndex = -1;
-}
-
-
-void TabBar::closeOtherTabs()
-{
- emit closeOtherTabs(m_actualIndex);
- m_actualIndex = -1;
-}
-
-
-void TabBar::reloadTab()
-{
- emit reloadTab(m_actualIndex);
- m_actualIndex = -1;
-}
-
-
-void TabBar::detachTab()
-{
- emit detachTab(m_actualIndex);
- m_actualIndex = -1;
-}
-
-
-void TabBar::showTabPreview()
-{
- if (m_isFirstTimeOnTab)
- m_isFirstTimeOnTab = false;
-
- //delete previous tab preview
- delete m_previewPopup.data();
- m_previewPopup.clear();
-
- MainView *mv = qobject_cast<MainView *>(parent());
-
- WebTab *indexedTab = mv->webTab(m_currentTabPreviewIndex);
- WebTab *currentTab = mv->webTab(currentIndex());
-
- // check if view && currentView exist before using them :)
- if (!currentTab || !indexedTab)
- return;
-
- // no previews during load
- if (indexedTab->isPageLoading())
- return;
-
- // Make sure the hovered webtab match the current size
- // Only the active one is updated by window resize events
- indexedTab->resize(currentTab->size());
-
- m_previewPopup = new TabPreviewPopup(indexedTab , this);
-
- int tabWidth = tabSizeHint(m_currentTabPreviewIndex).width();
- int tabBarWidth = mv->size().width();
- int leftIndex = tabRect(m_currentTabPreviewIndex).x() + (tabRect(m_currentTabPreviewIndex).width() - tabWidth) / 2;
- int popupWidth = m_previewPopup.data()->thumbnailSize().width();
-
- // Center the popup if the tab width is bigger or smaller
- leftIndex += (tabWidth - popupWidth) / 2;
-
- if (leftIndex < 0)
- {
- leftIndex = 0;
- }
- else if (leftIndex + tabWidth > tabBarWidth)
- {
- leftIndex = tabBarWidth - tabWidth;
- }
-
- QPoint pos(leftIndex, tabRect(m_currentTabPreviewIndex).y() + tabRect(m_currentTabPreviewIndex).height());
- m_previewPopup.data()->show(mapToGlobal(pos));
-}
-
-
-void TabBar::hideEvent(QHideEvent *event)
-{
- if (!event->spontaneous())
- {
- qobject_cast<MainView *>(parent())->addTabButton()->hide();
- }
- KTabBar::hideEvent(event);
-}
-
-
-void TabBar::showEvent(QShowEvent *event)
-{
- KTabBar::showEvent(event);
- if (!event->spontaneous())
- {
- qobject_cast<MainView *>(parent())->addTabButton()->show();
- }
-}
-
-
-void TabBar::mouseMoveEvent(QMouseEvent *event)
-{
- if (count() == 1)
- {
- return;
- }
-
- KTabBar::mouseMoveEvent(event);
-
- if (ReKonfig::hoveringTabOption() == 0)
- {
- //Find the tab under the mouse
- const int tabIndex = tabAt(event->pos());
-
- // if found and not the current tab then show tab preview
- if (tabIndex != -1
- && tabIndex != currentIndex()
- && m_currentTabPreviewIndex != tabIndex
- && event->buttons() == Qt::NoButton
- )
- {
- m_currentTabPreviewIndex = tabIndex;
-
- // if first time over tab, apply a small delay. If not, show it now!
- m_isFirstTimeOnTab
- ? QTimer::singleShot(200, this, SLOT(showTabPreview()))
- : showTabPreview();
- }
-
- // if current tab or not found then hide previous tab preview
- if (tabIndex == currentIndex() || tabIndex == -1)
- {
- if (!m_previewPopup.isNull())
- {
- m_previewPopup.data()->hide();
- }
- m_currentTabPreviewIndex = -1;
- }
- }
-}
-
-
-void TabBar::leaveEvent(QEvent *event)
-{
- if (ReKonfig::hoveringTabOption() == 0)
- {
- //if leave tabwidget then hide previous tab preview
- if (!m_previewPopup.isNull())
- {
- m_previewPopup.data()->hide();
- }
- m_currentTabPreviewIndex = -1;
- m_isFirstTimeOnTab = true;
- }
-
- KTabBar::leaveEvent(event);
-}
-
-
-void TabBar::mousePressEvent(QMouseEvent *event)
-{
- if (ReKonfig::hoveringTabOption() == 0)
- {
- if (!m_previewPopup.isNull())
- {
- m_previewPopup.data()->hide();
- }
- m_currentTabPreviewIndex = -1;
- }
-
- // just close tab on middle mouse click
- if (event->button() == Qt::MidButton)
- return;
-
- KTabBar::mousePressEvent(event);
-}
-
-
-void TabBar::contextMenu(int tab, const QPoint &pos)
-{
- KActionMenu *closedTabsMenu = setupHistoryActions();
-
- m_actualIndex = tab;
-
- KMenu menu;
- MainWindow *mainWindow = rApp->mainWindow();
-
- menu.addAction(mainWindow->actionByName(QL1S("new_tab")));
- menu.addAction(mainWindow->actionByName(QL1S("clone_tab")));
- if (count() > 1)
- {
- menu.addAction(mainWindow->actionByName(QL1S("detach_tab")));
- }
- menu.addAction(mainWindow->actionByName(QL1S("open_last_closed_tab")));
- menu.addAction(closedTabsMenu);
- menu.addSeparator();
- menu.addAction(mainWindow->actionByName(QL1S("close_tab")));
- if (count() > 1)
- {
- menu.addAction(mainWindow->actionByName(QL1S("close_other_tabs")));
- }
- menu.addSeparator();
- menu.addAction(mainWindow->actionByName(QL1S("reload_tab")));
- if (count() > 1)
- {
- menu.addAction(mainWindow->actionByName(QL1S("reload_all_tabs")));
- }
- menu.exec(pos);
-}
-
-
-void TabBar::emptyAreaContextMenu(const QPoint &pos)
-{
- KActionMenu *closedTabsMenu = setupHistoryActions();
-
- KMenu menu;
- MainWindow *mainWindow = rApp->mainWindow();
-
- menu.addAction(mainWindow->actionByName(QL1S("new_tab")));
- menu.addAction(mainWindow->actionByName(QL1S("open_last_closed_tab")));
- menu.addAction(closedTabsMenu);
- menu.addSeparator();
- menu.addAction(mainWindow->actionByName(QL1S("reload_all_tabs")));
-
- KToolBar *mainBar = mainWindow->toolBar("mainToolBar");
- if (!mainBar->isVisible())
- {
- menu.addAction(mainBar->toggleViewAction());
- }
-
- menu.exec(pos);
-}
-
-
-void TabBar::tabRemoved(int index)
-{
- if (ReKonfig::hoveringTabOption() == 0)
- {
- if (!m_previewPopup.isNull())
- {
- m_previewPopup.data()->hide();
- }
- m_currentTabPreviewIndex = -1;
- }
-
- if (ReKonfig::animatedTabHighlighting())
- removeAnimation(index);
-}
-
-
-KActionMenu *TabBar::setupHistoryActions()
-{
- MainWindow *w = rApp->mainWindow();
- MainView *mv = qobject_cast<MainView *>(parent());
-
- QAction *openLastClosedTabAction = w->actionByName(QL1S("open_last_closed_tab"));
-
- bool closedTabsAvailable = (mv->recentlyClosedTabs().size() > 0);
- openLastClosedTabAction->setEnabled(closedTabsAvailable);
-
- KActionMenu *am = new KActionMenu(KIcon("tab-new"), i18n("Closed Tabs"), this);
- am->setDelayed(false);
- am->setEnabled(closedTabsAvailable);
-
- if (am->menu())
- am->menu()->clear();
-
- if (!closedTabsAvailable)
- return am;
-
- for (int i = 0; i < mv->recentlyClosedTabs().count(); ++i)
- {
- TabHistory item = mv->recentlyClosedTabs().at(i);
- KAction *a = new KAction(rApp->iconManager()->iconForUrl(item.url), item.title, this);
- a->setData(i);
- connect(a, SIGNAL(triggered()), mv, SLOT(openClosedTab()));
- am->addAction(a);
- }
-
- return am;
-}
-
-
-QRect TabBar::tabTextRect(int index)
-{
- QStyleOptionTabV3 option;
- initStyleOption(&option, index);
- return style()->subElementRect(QStyle::SE_TabBarTabText, &option, this);
-}
-
-
-void TabBar::setTabHighlighted(int index)
-{
- const QByteArray propertyName = highlightPropertyName(index);
- const QColor highlightColor = KColorScheme(QPalette::Active, KColorScheme::Window).foreground(KColorScheme::PositiveText).color();
-
- if (tabTextColor(index) != highlightColor)
- {
- if (ReKonfig::animatedTabHighlighting())
- {
- m_tabHighlightEffect->setEnabled(true);
- m_tabHighlightEffect->setProperty(propertyName, qreal(0.9));
- QPropertyAnimation *anim = new QPropertyAnimation(m_tabHighlightEffect, propertyName);
- m_highlightAnimation.insert(propertyName, anim);
-
- //setup the animation
- anim->setStartValue(0.9);
- anim->setEndValue(0.0);
- anim->setDuration(500);
- anim->setLoopCount(2);
- anim->start(QAbstractAnimation::DeleteWhenStopped);
-
- m_animationMapper->setMapping(anim, index);
- connect(anim, SIGNAL(finished()), m_animationMapper, SLOT(map()));
- }
-
- setTabTextColor(index, highlightColor);
- }
-}
-
-
-void TabBar::resetTabHighlighted(int index)
-{
- if (ReKonfig::animatedTabHighlighting())
- removeAnimation(index);
-
- setTabTextColor(index, KColorScheme(QPalette::Active, KColorScheme::Window).foreground(KColorScheme::NormalText).color());
-}
-
-
-void TabBar::removeAnimation(int index)
-{
- const QByteArray propertyName = highlightPropertyName(index);
- m_tabHighlightEffect->setProperty(propertyName, QVariant()); //destroy the property
-
- QPropertyAnimation *anim = m_highlightAnimation.take(propertyName);
- m_animationMapper->removeMappings(anim);
- delete anim;
-
- if (m_highlightAnimation.isEmpty())
- m_tabHighlightEffect->setEnabled(false);
-}
-
-
-void TabBar::setAnimatedTabHighlighting(bool enabled)
-{
- if (enabled)
- m_tabHighlightEffect->setEnabled(true);
- else
- {
- m_tabHighlightEffect->setEnabled(false);
-
- //cleanup
- QHashIterator<QByteArray, QPropertyAnimation*> i(m_highlightAnimation);
- while (i.hasNext())
- {
- i.next();
- m_tabHighlightEffect->setProperty(i.key(), QVariant()); //destroy the property
-
- QPropertyAnimation *anim = m_highlightAnimation.take(i.key());
- m_animationMapper->removeMappings(anim);
- delete anim;
- }
- }
-}
-
-
-void TabBar::dropEvent(QDropEvent* event)
-{
- if (event->mimeData()->hasUrls())
- {
- int urlCount = event->mimeData()->urls().count();
- if (urlCount > 1)
- {
- Q_FOREACH(const QUrl & url, event->mimeData()->urls())
- rApp->loadUrl(url, Rekonq::NewTab);
- }
- else
- rApp->loadUrl(event->mimeData()->urls().first(), Rekonq::NewFocusedTab);
- }
- else if (event->mimeData()->hasText())
- {
- //In case the text is a valid URL
- if (isURLValid(event->mimeData()->text()))
- rApp->loadUrl(KUrl(event->mimeData()->text()), Rekonq::NewFocusedTab);
- else
- {
- KService::Ptr defaultSearchEngine = SearchEngine::defaultEngine();
- if (defaultSearchEngine)
- rApp->loadUrl(KUrl(SearchEngine::buildQuery(defaultSearchEngine, event->mimeData()->text())), Rekonq::NewFocusedTab);
- }
- }
- KTabBar::dropEvent(event);
-}
-
-
-void TabBar::dragEnterEvent(QDragEnterEvent* event)
-{
- if (event->mimeData()->hasUrls() || event->mimeData()->hasText())
- event->acceptProposedAction();
- else
- KTabBar::dragEnterEvent(event);
-}
-
-
-bool TabBar::isURLValid(const QString &url)
-{
- QString editedURL = url;
- bool isValid = false;
- if (editedURL.startsWith(QL1S("http://")) || editedURL.startsWith(QL1S("https://")) || editedURL.startsWith(QL1S("ftp://")))
- editedURL = editedURL.remove(QRegExp("(http|https|ftp)://"));
- if (editedURL.contains(QL1C('.')) && editedURL.indexOf(QL1C('.')) > 0 && editedURL.indexOf(QL1C('.')) < editedURL.length() && !editedURL.trimmed().contains(QL1C(' '))
- && QUrl::fromUserInput(editedURL).isValid())
- isValid = true;
- return isValid;
-}
-
-
-void TabBar::tabLayoutChange()
-{
- KTabBar::tabLayoutChange();
- emit tabLayoutChanged();
-}