From 4b363ed35e880a6a74ac7784fcad713c62902f3a Mon Sep 17 00:00:00 2001 From: Andrea Diamantini Date: Tue, 3 Jan 2012 18:31:13 +0100 Subject: improve closed tabs management - remove reopened tabs from the closed tabs list. - limit them to MAX 8 elements (it seems enough to me) - save history also when there is just one tab closed - DON'T save history when you opened a "rekonq" page BUG:271224 --- src/mainview.cpp | 112 +++++++++++++++++++++++++++-------------------------- src/mainview.h | 8 ++-- src/mainwindow.cpp | 5 ++- src/mainwindow.h | 2 +- src/newtabpage.cpp | 109 ++++++++++++++++++++++++++++++++++----------------- src/newtabpage.h | 7 +--- src/tabbar.cpp | 16 ++++---- src/tabbar.h | 2 +- src/webtab.cpp | 2 +- src/webtab.h | 3 +- 10 files changed, 154 insertions(+), 112 deletions(-) (limited to 'src') diff --git a/src/mainview.cpp b/src/mainview.cpp index 50fff2ac..62851590 100644 --- a/src/mainview.cpp +++ b/src/mainview.cpp @@ -2,7 +2,7 @@ * * This file is a part of the rekonq project * -* Copyright (C) 2008-2011 by Andrea Diamantini +* Copyright (C) 2008-2012 by Andrea Diamantini * Copyright (C) 2009 by Paweł Prażak * Copyright (C) 2009-2011 by Lionel Chauvin * Copyright (C) 2010 by Matthieu Gicquel @@ -421,14 +421,45 @@ void MainView::closeTab(int index, bool del) if (index < 0 || index >= count()) return; + WebTab *tabToClose = webTab(index); + if (!tabToClose) + return; + + if (tabToClose->view()->isModified()) + { + int risp = KMessageBox::warningContinueCancel(this, + i18n("This tab contains changes that have not been submitted.\n" + "Closing the tab will discard these changes.\n" + "Do you really want to close this tab?\n"), + i18n("Closing Modified Tab"), KGuiItem(i18n("Close &Tab"), "tab-close"), KStandardGuiItem::cancel()); + if (risp != KMessageBox::Continue) + return; + } + + kDebug() << "URL: " << tabToClose->url(); + kDebug() << "rekonq page: " << tabToClose->page()->isOnRekonqPage(); + + if (!tabToClose->url().isEmpty() + && tabToClose->url().scheme() != QL1S("about") + && !tabToClose->page()->isOnRekonqPage() + && !QWebSettings::globalSettings()->testAttribute(QWebSettings::PrivateBrowsingEnabled) + ) + { + const int recentlyClosedTabsLimit = 8; + TabHistory history(tabToClose->view()->history()); + + m_recentlyClosedTabs.removeAll(history); + if (m_recentlyClosedTabs.count() == recentlyClosedTabsLimit) + m_recentlyClosedTabs.removeLast(); + m_recentlyClosedTabs.prepend(history); + } + + // what to do if there is just one tab... if (count() == 1) { if (ReKonfig::lastTabClosesWindow()) { emit closeWindow(); -// // closing window... -// MainWindow *w = qobject_cast(parent()); -// w->close(); return; } @@ -453,34 +484,7 @@ void MainView::closeTab(int index, bool del) } return; } - - WebTab *tabToClose = webTab(index); - if (!tabToClose) - return; - - if (tabToClose->view()->isModified()) - { - int risp = KMessageBox::warningContinueCancel(this, - i18n("This tab contains changes that have not been submitted.\n" - "Closing the tab will discard these changes.\n" - "Do you really want to close this tab?\n"), - i18n("Closing Modified Tab"), KGuiItem(i18n("Close &Tab"), "tab-close"), KStandardGuiItem::cancel()); - if (risp != KMessageBox::Continue) - return; - } - - if (!tabToClose->url().isEmpty() - && !QWebSettings::globalSettings()->testAttribute(QWebSettings::PrivateBrowsingEnabled) - ) - { - const int recentlyClosedTabsLimit = 10; - TabHistory history(tabToClose->view()->history()); - - m_recentlyClosedTabs.removeAll(history); - if (m_recentlyClosedTabs.count() == recentlyClosedTabsLimit) - m_recentlyClosedTabs.removeLast(); - m_recentlyClosedTabs.prepend(history); - } + // else... removeTab(index); updateTabBar(); // UI operation: do it ASAP!! @@ -494,6 +498,7 @@ void MainView::closeTab(int index, bool del) } } + void MainView::webViewLoadStarted() { WebView *view = qobject_cast(sender()); @@ -623,37 +628,34 @@ void MainView::previousTab() } -void MainView::openLastClosedTab() +void MainView::openClosedTab() { - if (m_recentlyClosedTabs.isEmpty()) + KAction *action = qobject_cast(sender()); + if (!action) return; - TabHistory history = m_recentlyClosedTabs.takeFirst(); - WebView *view = rApp->mainWindow()->mainView()->newWebTab()->view(); - - history.applyHistory(view->history()); + int index = action->data().toInt(); + kDebug() << "TAB INDEX TO RESTORE:" << index; + restoreClosedTab(index); } -void MainView::openClosedTab() +void MainView::restoreClosedTab(int i, bool inNewTab) { - KAction *action = qobject_cast(sender()); - if (action) - { - WebView *view = rApp->mainWindow()->mainView()->newWebTab()->view(); - TabHistory history; - Q_FOREACH(const TabHistory & item, m_recentlyClosedTabs) - { - if (item.history == action->data().toByteArray()) - { - history = item; - break; - } - } - history.applyHistory(view->history()); + if (m_recentlyClosedTabs.isEmpty()) + return; - m_recentlyClosedTabs.removeAll(history); - } + TabHistory history = m_recentlyClosedTabs.takeAt(i); + + WebView *view = inNewTab + ? newWebTab()->view() + : currentWebTab()->view() + ; + + history.applyHistory(view->history()); + + // just to get sure... + m_recentlyClosedTabs.removeAll(history); } diff --git a/src/mainview.h b/src/mainview.h index 4e6f1bbb..28185e48 100644 --- a/src/mainview.h +++ b/src/mainview.h @@ -2,7 +2,7 @@ * * This file is a part of the rekonq project * -* Copyright (C) 2008-2011 by Andrea Diamantini +* Copyright (C) 2008-2012 by Andrea Diamantini * Copyright (C) 2009 by Paweł Prażak * Copyright (C) 2009-2011 by Lionel Chauvin * Copyright (C) 2010 by Matthieu Gicquel @@ -106,6 +106,8 @@ public: return m_recentlyClosedTabs; } + void restoreClosedTab(int i, bool inNewTab = true); + Q_SIGNALS: // current tab signals void currentTitle(const QString &url); @@ -144,8 +146,6 @@ public Q_SLOTS: void nextTab(); void previousTab(); - void openLastClosedTab(); - void openClosedTab(); void switchToTab(const int index); void loadFavorite(const int index); @@ -164,6 +164,8 @@ private Q_SLOTS: void windowCloseRequested(); + void openClosedTab(); + protected: virtual void resizeEvent(QResizeEvent *event); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 01310bfb..98936e96 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2,7 +2,7 @@ * * This file is a part of the rekonq project * -* Copyright (C) 2008-2011 by Andrea Diamantini +* Copyright (C) 2008-2012 by Andrea Diamantini * Copyright (C) 2009 by Paweł Prażak * Copyright (C) 2009-2011 by Lionel Chauvin * Copyright (C) 2010 by Matthieu Gicquel @@ -451,9 +451,10 @@ void MainWindow::setupActions() connect(a, SIGNAL(triggered(bool)), m_view, SLOT(previousTab())); a = new KAction(KIcon("tab-new"), i18n("Open Last Closed Tab"), this); + a->setData(0); // last tab has always index = 0 a->setShortcut(KShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_T)); actionCollection()->addAction(QL1S("open_last_closed_tab"), a); - connect(a, SIGNAL(triggered(bool)), m_view, SLOT(openLastClosedTab())); + connect(a, SIGNAL(triggered(bool)), m_view, SLOT(openClosedTab())); // Closed Tabs Menu KActionMenu *closedTabsMenu = new KActionMenu(KIcon("tab-new"), i18n("Closed Tabs"), this); diff --git a/src/mainwindow.h b/src/mainwindow.h index 2b413900..04a59a14 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -3,7 +3,7 @@ * * This file is a part of the rekonq project * -* Copyright (C) 2008-2011 by Andrea Diamantini +* Copyright (C) 2008-2012 by Andrea Diamantini * Copyright (C) 2009 by Paweł Prażak * Copyright (C) 2009-2011 by Lionel Chauvin * Copyright (C) 2010 by Matthieu Gicquel diff --git a/src/newtabpage.cpp b/src/newtabpage.cpp index 0372aad3..00c7f81d 100644 --- a/src/newtabpage.cpp +++ b/src/newtabpage.cpp @@ -81,6 +81,7 @@ NewTabPage::NewTabPage(QWebFrame *frame) void NewTabPage::generate(const KUrl &url) { + // about:preview links if (KUrl("about:preview").isParentOf(url)) { if (url.fileName() == QL1S("add")) @@ -113,6 +114,7 @@ void NewTabPage::generate(const KUrl &url) } } + // about:tabs links if (KUrl("about:tabs").isParentOf(url)) { if (url.fileName() == QL1S("show")) @@ -133,6 +135,7 @@ void NewTabPage::generate(const KUrl &url) w->raise(); return; } + if (url.fileName() == QL1S("remove")) { const int winIndex = url.queryItem(QL1S("win")).toInt(); @@ -147,6 +150,19 @@ void NewTabPage::generate(const KUrl &url) } } + // about:closedTabs links + if (KUrl("about:closedTabs").isParentOf(url)) + { + if (url.fileName() == QL1S("restore")) + { + const int tabIndex = url.queryItem(QL1S("tab")).toInt(); + kDebug() << "tab = " << tabIndex; + + rApp->mainWindow()->mainView()->restoreClosedTab(tabIndex, false); + return; + } + } + if (url == KUrl("about:downloads/clear")) { rApp->downloadManager()->clearDownloadsHistory(); @@ -407,6 +423,7 @@ void NewTabPage::closedTabsPage() QList links = rApp->mainWindow()->mainView()->recentlyClosedTabs(); + kDebug() << "CLOSED TABS: " << links.count(); if (links.isEmpty()) { m_root.addClass(QL1S("empty")); @@ -417,12 +434,13 @@ void NewTabPage::closedTabsPage() for (int i = 0; i < links.count(); ++i) { TabHistory item = links.at(i); + kDebug() << "URL " << i << " : " << item.url; QWebElement prev; if (item.url.isEmpty()) continue; - prev = validPreview(i, item.url, item.title); + prev = closedTabPreview(i, item.url, item.title); prev.setAttribute(QL1S("id"), QL1S("preview") + QVariant(i).toString()); hideControls(prev); @@ -543,7 +561,6 @@ QWebElement NewTabPage::emptyPreview(int index) QL1S("about:preview/modify/") + QVariant(index).toString()); setupPreview(prev, index); - //hideControls(prev); return prev; } @@ -570,6 +587,39 @@ QWebElement NewTabPage::emptyPreview(int index) // connect(snap, SIGNAL(snapDone(bool)), frame->page(), SLOT(updateImage(bool)), Qt::UniqueConnection); // return prev; // } +// +// +// void NewTabPage::updateThumbs() +// { +// // Update page, but only if open +// if (m_root.document().findAll(QL1S("#rekonq-newtabpage")).count() == 0) +// return; +// if (m_root.findAll(QL1S(".favorites")).count() == 0 && m_root.findAll(QL1S(".closedTabs")).count() == 0) +// return; +// +// QStringList urls = ReKonfig::previewUrls(); +// QStringList names = ReKonfig::previewNames(); +// +// for (int i = 0; i < urls.count(); i++) +// { +// KUrl url = KUrl(urls.at(i)); +// QString title = names.at(i); +// +// if (WebSnap::existsImage(url)) +// { +// QWebElement prev = m_root.findFirst(QL1S("#preview") + QVariant(i).toString()); +// if (KUrl(prev.findFirst("a").attribute(QL1S("href"))) == url) +// { +// QWebElement newPrev = validPreview(i, url, title); +// +// if (m_root.findAll(QL1S(".closedTabs")).count() != 0) +// hideControls(newPrev); +// +// prev.replace(newPrev); +// } +// } +// } +// } QWebElement NewTabPage::validPreview(int index, const KUrl &url, const QString &title) @@ -611,6 +661,28 @@ QWebElement NewTabPage::tabPreview(int winIndex, int tabIndex, const KUrl &url, } +QWebElement NewTabPage::closedTabPreview(int index, const KUrl &url, const QString &title) +{ + QWebElement prev = markup(QL1S(".thumbnail")); + + QString previewPath = WebSnap::existsImage(url) + ? QL1S("file://") + WebSnap::imagePathFromUrl(url) + : rApp->iconManager()->iconPathForUrl(url) + ; + + QString href = QL1S("about:closedTabs/restore?tab=") + QString::number(index); + + prev.findFirst(QL1S(".preview img")).setAttribute(QL1S("src") , previewPath); + prev.findFirst(QL1S("a")).setAttribute(QL1S("href"), href); + prev.findFirst(QL1S("span a")).setAttribute(QL1S("href"), href); + prev.findFirst(QL1S("span a")).setPlainText(checkTitle(title)); + + setupPreview(prev, index); + showControls(prev); + return prev; +} + + void NewTabPage::hideControls(QWebElement e) { e.findFirst(QL1S(".remove")).setStyleProperty(QL1S("visibility"), QL1S("hidden")); @@ -651,39 +723,6 @@ void NewTabPage::setupTabPreview(QWebElement e, int winIndex, int tabIndex) } -void NewTabPage::updateThumbs() -{ - // Update page, but only if open - if (m_root.document().findAll(QL1S("#rekonq-newtabpage")).count() == 0) - return; - if (m_root.findAll(QL1S(".favorites")).count() == 0 && m_root.findAll(QL1S(".closedTabs")).count() == 0) - return; - - QStringList urls = ReKonfig::previewUrls(); - QStringList names = ReKonfig::previewNames(); - - for (int i = 0; i < urls.count(); i++) - { - KUrl url = KUrl(urls.at(i)); - QString title = names.at(i); - - if (WebSnap::existsImage(url)) - { - QWebElement prev = m_root.findFirst(QL1S("#preview") + QVariant(i).toString()); - if (KUrl(prev.findFirst("a").attribute(QL1S("href"))) == url) - { - QWebElement newPrev = validPreview(i, url, title); - - if (m_root.findAll(QL1S(".closedTabs")).count() != 0) - hideControls(newPrev); - - prev.replace(newPrev); - } - } - } -} - - void NewTabPage::removePreview(int index) { QStringList names = ReKonfig::previewNames(); diff --git a/src/newtabpage.h b/src/newtabpage.h index 40627c6c..b4f3bcd6 100644 --- a/src/newtabpage.h +++ b/src/newtabpage.h @@ -57,12 +57,6 @@ public: */ void generate(const KUrl &url = KUrl("about:home")); - /** - * This method updates thumbs, removing loading previews - * and providing a real picture - */ - void updateThumbs(); - private: // these are the "high-level" functions to build the new tab page. // Basically, you call browsingMenu + one of the *Page methods @@ -84,6 +78,7 @@ private: QWebElement emptyPreview(int index); QWebElement validPreview(int index, const KUrl &url, const QString &title); QWebElement tabPreview(int winIndex, int tabIndex, const KUrl &url, const QString &title); + QWebElement closedTabPreview(int index, const KUrl &url, const QString &title); void removePreview(int index); diff --git a/src/tabbar.cpp b/src/tabbar.cpp index 1634f284..4834095a 100644 --- a/src/tabbar.cpp +++ b/src/tabbar.cpp @@ -3,7 +3,7 @@ * This file is a part of the rekonq project * * Copyright (C) 2008 Benjamin C. Meyer -* Copyright (C) 2008-2011 by Andrea Diamantini +* Copyright (C) 2008-2012 by Andrea Diamantini * Copyright (C) 2009 by Paweł Prażak * Copyright (C) 2009-2011 by Lionel Chauvin * @@ -380,26 +380,28 @@ void TabBar::setupHistoryActions() MainView *mv = qobject_cast(parent()); QAction *openLastClosedTabAction = w->actionByName(QL1S("open_last_closed_tab")); - openLastClosedTabAction->setEnabled(mv->recentlyClosedTabs().size() > 0); + + bool closedTabsAvailable = (mv->recentlyClosedTabs().size() > 0); + openLastClosedTabAction->setEnabled(closedTabsAvailable); // update closed tabs menu KActionMenu *am = qobject_cast(w->actionByName(QL1S("closed_tab_menu"))); if (!am) return; - bool isEnabled = (mv->recentlyClosedTabs().size() > 0); - am->setEnabled(isEnabled); + am->setEnabled(closedTabsAvailable); if (am->menu()) am->menu()->clear(); - if (!isEnabled) + if (!closedTabsAvailable) return; - Q_FOREACH(const TabHistory & item, mv->recentlyClosedTabs()) + 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(item.history); + a->setData(i); connect(a, SIGNAL(triggered()), mv, SLOT(openClosedTab())); am->addAction(a); } diff --git a/src/tabbar.h b/src/tabbar.h index 78d48cdb..c536039b 100644 --- a/src/tabbar.h +++ b/src/tabbar.h @@ -3,7 +3,7 @@ * This file is a part of the rekonq project * * Copyright (C) 2008 Benjamin C. Meyer -* Copyright (C) 2008-2011 by Andrea Diamantini +* Copyright (C) 2008-2012 by Andrea Diamantini * Copyright (C) 2009 by Paweł Prażak * Copyright (C) 2009-2011 by Lionel Chauvin * diff --git a/src/webtab.cpp b/src/webtab.cpp index 0dd2ac44..9516f83c 100644 --- a/src/webtab.cpp +++ b/src/webtab.cpp @@ -2,7 +2,7 @@ * * This file is a part of the rekonq project * -* Copyright (C) 2008-2011 by Andrea Diamantini +* Copyright (C) 2008-2012 by Andrea Diamantini * Copyright (C) 2009-2011 by Lionel Chauvin * * diff --git a/src/webtab.h b/src/webtab.h index 4e13cef9..c3d3099b 100644 --- a/src/webtab.h +++ b/src/webtab.h @@ -2,7 +2,7 @@ * * This file is a part of the rekonq project * -* Copyright (C) 2008-2011 by Andrea Diamantini +* Copyright (C) 2008-2012 by Andrea Diamantini * Copyright (C) 2009-2011 by Lionel Chauvin * * @@ -90,6 +90,7 @@ public: { return m_part; } + void setPart(KParts::ReadOnlyPart *p, const KUrl &u); void showMessageBar(); -- cgit v1.2.1