summaryrefslogtreecommitdiff
path: root/src/rekonqpage
diff options
context:
space:
mode:
Diffstat (limited to 'src/rekonqpage')
-rw-r--r--src/rekonqpage/newtabpage.cpp240
-rw-r--r--src/rekonqpage/newtabpage.h35
-rw-r--r--src/rekonqpage/previewselectorbar.cpp160
-rw-r--r--src/rekonqpage/previewselectorbar.h60
4 files changed, 450 insertions, 45 deletions
diff --git a/src/rekonqpage/newtabpage.cpp b/src/rekonqpage/newtabpage.cpp
index 66f74b86..19f1686f 100644
--- a/src/rekonqpage/newtabpage.cpp
+++ b/src/rekonqpage/newtabpage.cpp
@@ -26,6 +26,7 @@
// Self Includes
#include "newtabpage.h"
+#include "newtabpage.moc"
// Auto Includes
#include "rekonq.h"
@@ -36,6 +37,8 @@
#include "application.h"
#include "mainwindow.h"
#include "mainview.h"
+#include "websnap.h"
+#include "previewselectorbar.h"
// KDE Includes
#include <KStandardDirs>
@@ -43,6 +46,7 @@
#include <KDebug>
#include <KConfig>
#include <KConfigGroup>
+#include <KDialog>
// Qt Includes
#include <QFile>
@@ -50,6 +54,7 @@
NewTabPage::NewTabPage(QWebFrame *frame)
: m_root(frame->documentElement())
+ , m_url(KUrl())
{
QString htmlFilePath = KStandardDirs::locate("data", "rekonq/htmls/home.html");
@@ -70,8 +75,33 @@ NewTabPage::~NewTabPage()
}
-void NewTabPage::generate(const KUrl &url)
-{
+void NewTabPage::generate(KUrl url)
+{
+ if(KUrl("about:preview").isParentOf(url))
+ {
+ if(url.directory() == QString("preview/remove"))
+ {
+ removePreview(url.fileName().toInt());
+ return;
+ }
+ if(url.directory() == QString("preview/modify"))
+ {
+ int index = url.fileName().toInt();
+ Application::instance()->mainWindow()->findChild<PreviewSelectorBar *>()
+ ->enable(index, qobject_cast< WebPage* >(m_root.webFrame()->page()));
+ return;
+ }
+ }
+
+ if( url != KUrl("about:home")
+ && url != KUrl("about:favorites")
+ && url != KUrl("about:closedTabs")
+ && url != KUrl("about:history")
+ && url != KUrl("about:bookmarks")
+ )
+ return;
+
+
QWebPage *page = m_root.webFrame()->page();
page->mainFrame()->setHtml(m_html);
@@ -80,26 +110,29 @@ void NewTabPage::generate(const KUrl &url)
browsingMenu(url);
QString title;
- if(url == KUrl("about:closedTabs"))
+ if(url == KUrl("about:home") || url == KUrl("about:favorites"))
+ {
+ favoritesPage();
+ title = i18n("Favorites");
+ url = KUrl("about:favorites");
+ }
+ else if(url == KUrl("about:closedTabs"))
{
closedTabsPage();
title = i18n("Closed Tabs");
}
- if(url == KUrl("about:history"))
+ else if(url == KUrl("about:history"))
{
historyPage();
title = i18n("History");
}
- if(url == KUrl("about:bookmarks"))
+ else if(url == KUrl("about:bookmarks"))
{
bookmarksPage();
title = i18n("Bookmarks");
}
- if(url == KUrl("about:home") || url == KUrl("about:favorites"))
- {
- favoritesPage();
- title = i18n("Favorites");
- }
+
+ m_url = url;
m_root.document().findFirst("title").setPlainText(title);
}
@@ -107,41 +140,150 @@ void NewTabPage::generate(const KUrl &url)
void NewTabPage::favoritesPage()
{
+ m_root.addClass("favorites");
+
QStringList names = ReKonfig::previewNames();
QStringList urls = ReKonfig::previewUrls();
-
- m_root.addClass("favorites");
for(int i=0; i<8; ++i)
{
- QWebElement speed = markup(".thumbnail");
- speed.findFirst("object").setAttribute("data" , urls.at(i));
- speed.findFirst("param[name=title]").setAttribute("value", names.at(i));
- speed.findFirst("param[name=index]").setAttribute("value", QString::number(i));
- speed.findFirst("param[name=isFavorite]").setAttribute("value", "true");
- m_root.appendInside(speed);
+ KUrl url = urls.at(i);
+ QWebElement prev;
+
+ if(url.isEmpty())
+ prev = emptyPreview(i);
+ else if(!QFile::exists(WebSnap::fileForUrl(url).toLocalFile()))
+ prev = loadingPreview(i, url);
+ else
+ prev = validPreview(i, url, names.at(i));
+
+ setupPreview(prev, i);
+
+ m_root.appendInside(prev);
}
}
-// FIXME : port to new PreviewImage API to use...
-/*QString NewTabPage::lastVisitedPage()
+QWebElement NewTabPage::emptyPreview(int index)
+{
+ QWebElement prev = markup(".thumbnail");
+
+ prev.findFirst(".preview img").setAttribute("src" , QString("file:///") +
+ KIconLoader::global()->iconPath("insert-image", KIconLoader::Desktop));
+ prev.findFirst("span").appendInside(i18n("Set a Preview..."));
+ prev.findFirst("a").setAttribute("href", QString("about:preview/modify/" + QVariant(index).toString()));
+
+ setupPreview(prev, index);
+ hideControls(prev);
+
+ return prev;
+}
+
+
+QWebElement NewTabPage::loadingPreview(int index, KUrl url)
+{
+ QWebElement prev = markup(".thumbnail");
+
+ prev.findFirst(".preview img").setAttribute("src" ,
+ QString("file:///") + KStandardDirs::locate("appdata", "pics/busywidget.gif"));
+ prev.findFirst("span").appendInside(i18n("Loading Preview..."));
+ prev.findFirst("a").setAttribute("href", url.toMimeDataString());
+
+ setupPreview(prev, index);
+ showControls(prev);
+
+ new WebSnap(url, m_root.webFrame()->page(), index);
+
+ return prev;
+}
+
+QWebElement NewTabPage::validPreview(int index, KUrl url, QString title)
{
- QString last;
- QList<HistoryItem> history = Application::historyManager()->history();
- for (int i = 0; i < 8 && i < history.size(); ++i)
+ QWebElement prev = markup(".thumbnail");
+ KUrl previewPath = WebSnap::fileForUrl(url);
+ QString iString = QVariant(index).toString();
+
+ prev.findFirst(".preview img").setAttribute("src" , previewPath.toMimeDataString());
+ prev.findFirst("a").setAttribute("href", url.toMimeDataString());
+ prev.findFirst("span a").setAttribute("href", url.toMimeDataString());
+ prev.findFirst("span").setPlainText(checkTitle(title));
+
+ setupPreview(prev, index);
+ showControls(prev);
+
+ return prev;
+}
+
+
+void NewTabPage::hideControls(QWebElement e)
+{
+ e.findFirst(".remove").setStyleProperty("visibility", "hidden");
+ e.findFirst(".modify").setStyleProperty("visibility", "hidden");
+}
+void NewTabPage::showControls(QWebElement e)
+{
+ e.findFirst(".remove").setStyleProperty("visibility", "visible");
+ e.findFirst(".modify").setStyleProperty("visibility", "visible");
+}
+
+void NewTabPage::setupPreview(QWebElement e, int index)
+{
+ e.findFirst(".remove img").setAttribute("src", QString("file:///") +
+ KIconLoader::global()->iconPath("edit-delete", KIconLoader::DefaultState));
+ e.findFirst(".remove").setAttribute("title", "Remove favorite");
+ e.findFirst(".modify img").setAttribute("src", QString("file:///") +
+ KIconLoader::global()->iconPath("insert-image", KIconLoader::DefaultState));
+ e.findFirst(".modify").setAttribute("title", "Set new favorite");
+
+ e.findFirst(".modify").setAttribute("href", QString("about:preview/modify/" + QVariant(index).toString()));
+ e.findFirst(".remove").setAttribute("href", QString("about:preview/remove/" + QVariant(index).toString()));
+
+ e.setAttribute("id", "preview" + QVariant(index).toString());
+}
+
+
+void NewTabPage::snapFinished(int index, KUrl url, QString title)
+{
+ // do not try to modify the page if it isn't the newTabPage
+ if(m_root.document().findAll("#rekonq-newtabpage").count() == 0)
+ return;
+
+ QWebElement prev = m_root.findFirst("#preview" + QVariant(index).toString());
+ QWebElement newPrev = validPreview(index, url, title);
+
+ if(m_root.findAll(".closedTabs").count() != 0)
+ hideControls(newPrev);
+
+ prev.replace(newPrev);
+
+ // update title
+ if(m_root.findAll(".favorites").count() != 0)
{
- HistoryItem it = history.at(i);
- last += "<div class=\"thumbnail\">";
- last += "<object type=\"application/image-preview\" data=\"" + it.url + "\" >";
- last += "</object>";
- last += "<br />";
- last += "<a href=\"" + it.url + "\">" + it.title + "</a></div>";
+ QStringList names = ReKonfig::previewNames();
+ names.replace(index, title);
+ ReKonfig::setPreviewNames(names);
+
+ ReKonfig::self()->writeConfig();
}
+}
- return last;
-}*/
+void NewTabPage::removePreview(int index)
+{
+ QStringList names = ReKonfig::previewNames();
+ QStringList urls = ReKonfig::previewUrls();
+
+ urls.replace(index, QString(""));
+ names.replace(index, QString(""));
+
+ ReKonfig::setPreviewNames(names);
+ ReKonfig::setPreviewUrls(urls);
+
+ ReKonfig::self()->writeConfig();
+
+ QWebElement prev = m_root.findFirst("#preview" + QVariant(index).toString());
+ prev.replace(emptyPreview(index));
+}
void NewTabPage::browsingMenu(const KUrl &currentUrl)
@@ -192,6 +334,8 @@ void NewTabPage::browsingMenu(const KUrl &currentUrl)
void NewTabPage::historyPage()
{
+ m_root.addClass("history");
+
HistoryTreeModel *model = Application::historyManager()->historyTreeModel();
int i = 0;
@@ -222,6 +366,8 @@ void NewTabPage::historyPage()
void NewTabPage::bookmarksPage()
{
+ m_root.addClass("bookmarks");
+
KBookmarkGroup bookGroup = Application::bookmarkProvider()->rootGroup();
if (bookGroup.isNull())
{
@@ -268,13 +414,35 @@ void NewTabPage::createBookItem(const KBookmark &bookmark, QWebElement parent)
void NewTabPage::closedTabsPage()
{
+ m_root.addClass("closedTabs");
+
QList<HistoryItem> links = Application::instance()->mainWindow()->mainView()->recentlyClosedTabs();
+
+ for(int i=0; i < links.count(); ++i)
+ {
+ HistoryItem item = links.at(i);
+ QWebElement prev;
+
+ if(item.url.isEmpty())
+ continue;
+ else if(!QFile::exists(WebSnap::fileForUrl(item.url).toLocalFile()))
+ prev = loadingPreview(i, item.url);
+ else
+ prev = validPreview(i, item.url, item.title);
+
+ prev.setAttribute("id", "preview" + QVariant(i).toString());
+ hideControls(prev);
+ m_root.appendInside(prev);
+ }
+}
- foreach(const HistoryItem &item, links)
+
+QString NewTabPage::checkTitle(QString title)
+{
+ if(title.length() > 23)
{
- QWebElement closed = markup(".thumbnail");
- closed.findFirst("object").setAttribute("data" , item.url);
- closed.findFirst("param[name=title]").setAttribute("value", item.title);
- m_root.appendInside(closed);
+ title.truncate(20);
+ title += "...";
}
+ return title;
}
diff --git a/src/rekonqpage/newtabpage.h b/src/rekonqpage/newtabpage.h
index 003aa84e..9d41946e 100644
--- a/src/rekonqpage/newtabpage.h
+++ b/src/rekonqpage/newtabpage.h
@@ -28,24 +28,22 @@
#define REKONQ_NEW_TAB_PAGE
-// rekonq Includes
-#include <webpage.h>
-
// KDE Includes
#include <KUrl>
// Qt Includes
-#include <QtCore/QObject>
-#include <QtCore/QString>
+#include <QObject>
+#include <QString>
#include <QWebElement>
// Forward Includes
class KBookmark;
+class WebPage;
-class NewTabPage
+class NewTabPage : public QObject
{
-
+Q_OBJECT
public:
NewTabPage(QWebFrame *frame);
~NewTabPage();
@@ -55,13 +53,28 @@ public:
* about: url and loads the corresponding part of the
* new tab page
*/
- void generate(const KUrl &url = KUrl("about:home"));
+ void generate(KUrl url = KUrl("about:home"));
+
+public slots:
+ void snapFinished(int index, KUrl url, QString title);
+ void removePreview(int index);
protected: // these are the function to build the new tab page
void browsingMenu(const KUrl &currentUrl);
void favoritesPage();
- //QString lastVisitedPage();
+ QWebElement emptyPreview(int index);
+ QWebElement loadingPreview(int index, KUrl url);
+ QWebElement validPreview(int index, KUrl url, QString title);
+
+ /** This function takes a QwebElement with the .thumbnail structure.
+ It hides the "remove" and "modify" buttons->
+ */
+ void hideControls(QWebElement e);
+ void showControls(QWebElement e);
+ void setupPreview(QWebElement e, int index);
+
+
void historyPage();
void bookmarksPage();
void closedTabsPage();
@@ -77,10 +90,14 @@ private:
{
return m_root.document().findFirst("#models > " + selector).clone();
}
+
+ QString checkTitle(QString title);
QString m_html;
QWebElement m_root;
+
+ KUrl m_url;
};
#endif // REKONQ_NEW_TAB_PAGE
diff --git a/src/rekonqpage/previewselectorbar.cpp b/src/rekonqpage/previewselectorbar.cpp
new file mode 100644
index 00000000..5f3956d7
--- /dev/null
+++ b/src/rekonqpage/previewselectorbar.cpp
@@ -0,0 +1,160 @@
+/*
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ 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/>.
+
+*/
+
+
+// Auto Includes
+#include "previewselectorbar.h"
+
+// Local Include
+#include "rekonq.h"
+#include "websnap.h"
+
+// KDE Includes
+#include <KIcon>
+#include <KLocalizedString>
+
+// Qt Includes
+#include <QToolButton>
+#include <QHBoxLayout>
+#include <QString>
+
+
+PreviewSelectorBar::PreviewSelectorBar(QWidget* parent)
+ : QWidget(parent)
+ , m_button(0)
+ , m_label(0)
+ , m_page(0)
+{
+ hide();
+}
+
+
+void PreviewSelectorBar::setup()
+{
+ if(m_button != 0)
+ return;
+
+ m_label = new QLabel(i18n("Please open up the webpage you want to add as favorite"), this);
+ m_label->setWordWrap(true);
+
+ QToolButton *closeButton = new QToolButton(this);
+ closeButton->setAutoRaise(true);
+ closeButton->setIcon(KIcon("dialog-close"));
+ connect(closeButton, SIGNAL(clicked(bool)), SLOT(hide()));
+
+ m_button = new QPushButton(KIcon("insert-image"), i18n("Set to This Page"), this);
+ m_button->setMaximumWidth(250);
+ connect(m_button, SIGNAL(clicked(bool)), SLOT(clicked()));
+
+ // layout
+ QHBoxLayout *layout = new QHBoxLayout(this);
+ layout->addWidget(closeButton);
+ layout->addWidget(m_label);
+ layout->addWidget(m_button);
+
+ layout->setContentsMargins(2, 0, 2, 0);
+
+ setLayout(layout);
+}
+
+
+void PreviewSelectorBar::setPage(WebPage* page)
+{
+ m_page = page;
+ verifyUrl();
+}
+
+
+void PreviewSelectorBar::verifyUrl()
+{
+ if(m_page->mainFrame()->url().scheme() != "about")
+ {
+ m_button->setEnabled(true);
+ m_button->setToolTip("");
+ }
+ else
+ {
+ m_button->setEnabled(false);
+ m_button->setToolTip(i18n("You can not add this webpage as favorite"));
+ }
+}
+
+
+void PreviewSelectorBar::enable(int previewIndex, WebPage* page)
+{
+ if(m_page != 0)
+ disconnect(m_page, 0, this, 0);
+
+
+ setup();
+ m_previewIndex = previewIndex;
+ m_page = page;
+
+ verifyUrl();
+
+ show();
+
+ connect(page, SIGNAL(loadStarted()), SLOT(loadProgress()));
+ connect(page, SIGNAL(loadProgress(int)), SLOT(loadProgress()));
+ connect(page, SIGNAL(loadFinished(bool)), SLOT(loadFinished()));
+ connect(page->mainFrame(), SIGNAL(urlChanged(QUrl)), SLOT(verifyUrl()));
+}
+
+
+void PreviewSelectorBar::loadProgress()
+{
+ m_button->setEnabled(false);
+ m_button->setToolTip(i18n("Page is loading..."));
+}
+
+
+
+void PreviewSelectorBar::loadFinished()
+{
+ m_button->setEnabled(true);
+ m_button->setToolTip("");
+
+ verifyUrl();
+}
+
+
+void PreviewSelectorBar::clicked()
+{
+ KUrl url = m_page->mainFrame()->url();
+
+ WebSnap::savePreview(WebSnap::renderPreview(*m_page), url);
+
+ QStringList names = ReKonfig::previewNames();
+ QStringList urls = ReKonfig::previewUrls();
+
+ urls.replace(m_previewIndex, url.toMimeDataString());
+ names.replace(m_previewIndex, m_page->mainFrame()->title());
+
+ ReKonfig::setPreviewNames(names);
+ ReKonfig::setPreviewUrls(urls);
+
+ ReKonfig::self()->writeConfig();
+
+
+ m_page->mainFrame()->load(KUrl("about:favorites"));
+
+ hide();
+}
+
+
diff --git a/src/rekonqpage/previewselectorbar.h b/src/rekonqpage/previewselectorbar.h
new file mode 100644
index 00000000..aa011fe4
--- /dev/null
+++ b/src/rekonqpage/previewselectorbar.h
@@ -0,0 +1,60 @@
+/*
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ 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/>.
+
+*/
+
+#ifndef PREVIEWSELECTORBAR_H
+#define PREVIEWSELECTORBAR_H
+
+// Local Includes
+#include "webpage.h"
+
+// Qt Includes
+#include <QWidget>
+#include <QPushButton>
+#include <QLabel>
+
+class PreviewSelectorBar : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ PreviewSelectorBar(QWidget *parent = 0);
+
+ void setPage(WebPage *page);
+
+ public slots:
+ void enable(int previewIndex, WebPage *page);
+ void clicked();
+
+ void loadProgress();
+ void loadFinished();
+
+ void verifyUrl();
+
+ private:
+ void setup();
+
+ QPushButton *m_button;
+ QLabel *m_label;
+
+ int m_previewIndex;
+ WebPage *m_page;
+
+};
+
+#endif // PREVIEWSELECTORBAR_H