1
mirror of https://invent.kde.org/network/falkon.git synced 2024-12-20 02:36:34 +01:00
This commit is contained in:
stuarch 2012-03-08 18:01:35 +08:00
commit 3dc43b18a3
127 changed files with 12992 additions and 10772 deletions

Binary file not shown.

View File

@ -171,8 +171,7 @@
#bookmarksbar QToolButton
{
border-image: url(images/transp.png);
border-width: 1px;
padding-right: -5px;
border-width: 0px;
height: 15px;
}

View File

@ -209,8 +209,7 @@
#bookmarksbar QToolButton
{
border-image: url(images/transp.png);
border-width: 1px;
padding-right: -5px;
border-width: 0px;
height: 15px;
}

View File

@ -117,6 +117,7 @@
#locationbar[secured="true"]
{
color: black;
background-color: #ffffbc;
}
@ -161,8 +162,7 @@
#bookmarksbar QToolButton
{
border-image: url(images/transp.png);
border-width: 1px;
padding-right: -5px;
border-width: 0px;
height: 15px;
}

View File

@ -165,8 +165,7 @@
#bookmarksbar QToolButton
{
border-image: url(images/transp.png);
border-width: 1px;
padding-right: -5px;
border-width: 0px;
height: 15px;
}

View File

@ -175,8 +175,7 @@
#bookmarksbar QToolButton
{
border-image: url(images/transp.png);
border-width: 1px;
padding-right: -5px;
border-width: 0px;
height: 15px;
}

View File

@ -4,5 +4,7 @@ lupdate ../src/plugins/TestPlugin/TestPlugin.pro -no-obsolete
lupdate ../src/plugins/MouseGestures/MouseGestures.pro -no-obsolete
lupdate ../src/plugins/AccessKeysNavigation/AccessKeysNavigation.pro -no-obsolete
read -p "Press [ENTER] to close terminal"
exit

View File

@ -9,7 +9,7 @@ qtsingleapplication-uselib:!qtsingleapplication-buildlib {
HEADERS += $$PWD/qtsingleapplication.h $$PWD/qtlocalpeer.h
}
win32 {
os2|win32 {
contains(TEMPLATE, lib):contains(CONFIG, shared):DEFINES += QT_QTSINGLEAPPLICATION_EXPORT
else:qtsingleapplication-uselib:DEFINES += QT_QTSINGLEAPPLICATION_IMPORT
}

View File

@ -57,8 +57,10 @@ AdBlockNetwork::AdBlockNetwork(QObject* parent)
QNetworkReply* AdBlockNetwork::block(const QNetworkRequest &request)
{
QUrl url = request.url();
if (url.scheme() == "data" || url.scheme() == "qrc" || url.scheme() == "file" || url.scheme() == "qupzilla") {
const QString &urlString = request.url().toEncoded();
const QString &urlScheme = request.url().scheme();
if (urlScheme == "data" || urlScheme == "qrc" || urlScheme == "file" || urlScheme == "qupzilla") {
return 0;
}
@ -67,7 +69,6 @@ QNetworkReply* AdBlockNetwork::block(const QNetworkRequest &request)
return 0;
}
QString urlString = url.toEncoded();
const AdBlockRule* blockedRule = 0;
AdBlockSubscription* subscription = manager->subscription();

View File

@ -624,7 +624,6 @@ void MainApplication::saveSettings()
}
m_searchEnginesManager->saveSettings();
m_cookiejar->saveCookies();
m_networkmanager->saveCertificates();
m_plugins->c2f_saveSettings();
m_plugins->speedDial()->saveSettings();
@ -803,6 +802,9 @@ bool MainApplication::saveStateSlot()
qupzilla_->tabWidget()->savePinnedTabs();
}
// Saving cookies
m_cookiejar->saveCookies();
return true;
}

View File

@ -198,9 +198,10 @@ void QupZilla::postLaunch()
}
aboutToHideEditMenu();
setUpdatesEnabled(true);
mApp->plugins()->emitMainWindowCreated(this);
emit startingCompleted();
}
@ -1416,7 +1417,13 @@ void QupZilla::searchOnPage()
void QupZilla::openFile()
{
const QString &filePath = QFileDialog::getOpenFileName(this, tr("Open file..."), QDir::homePath(), "(*.html *.htm *.jpg *.png)");
const QString &fileTypes = QString("%1(*.html *.htm *.shtml *.shtm);;"
"%2(*.txt);;"
"%3(*.png *.jpg *.jpeg *.bmp *.gif *.svg);;"
"%4(*.*)").arg(tr("HTML files"), tr("Image files"), tr("Text files"), tr("All files"));
const QString &filePath = QFileDialog::getOpenFileName(this, tr("Open file..."), QDir::homePath(), fileTypes);
if (!filePath.isEmpty()) {
loadAddress(QUrl::fromLocalFile(filePath));
}
@ -1542,6 +1549,7 @@ void QupZilla::startPrivate(bool state)
QMessageBox::StandardButton button = QMessageBox::question(this, tr("Start Private Browsing"),
message, QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
if (button != QMessageBox::Yes) {
m_actionPrivateBrowsing->setChecked(false);
return;
}
@ -1560,6 +1568,10 @@ void QupZilla::resizeEvent(QResizeEvent* event)
void QupZilla::keyPressEvent(QKeyEvent* event)
{
if (mApp->plugins()->processKeyPress(Qz::ON_QupZilla, this, event)) {
return;
}
int number = -1;
switch (event->key()) {
@ -1688,6 +1700,15 @@ void QupZilla::keyPressEvent(QKeyEvent* event)
QMainWindow::keyPressEvent(event);
}
void QupZilla::keyReleaseEvent(QKeyEvent* event)
{
if (mApp->plugins()->processKeyRelease(Qz::ON_QupZilla, this, event)) {
return;
}
QMainWindow::keyReleaseEvent(event);
}
void QupZilla::closeEvent(QCloseEvent* event)
{
if (mApp->isClosing()) {
@ -1744,6 +1765,8 @@ void QupZilla::disconnectObjects()
pointer.data()->deleteLater();
}
}
mApp->plugins()->emitMainWindowDeleted(this);
}
void QupZilla::closeWindow()

View File

@ -194,6 +194,7 @@ private slots:
private:
void resizeEvent(QResizeEvent* event);
void keyPressEvent(QKeyEvent* event);
void keyReleaseEvent(QKeyEvent* event);
void closeEvent(QCloseEvent* event);
void setupUi();

View File

@ -41,7 +41,6 @@ enum CommandLineAction {
enum ObjectName {
ON_WebView,
ON_TabWidget,
ON_TabBar,
ON_QupZilla
};

View File

@ -102,6 +102,12 @@ void BookmarkIcon::setBookmarkDisabled()
setToolTip(tr("Bookmark this Page"));
}
void BookmarkIcon::contextMenuEvent(QContextMenuEvent* ev)
{
// Prevent propagating to LocationBar
ev->accept();
}
void BookmarkIcon::mousePressEvent(QMouseEvent* ev)
{
ClickableLabel::mousePressEvent(ev);

View File

@ -41,6 +41,7 @@ private slots:
void speedDialChanged();
private:
void contextMenuEvent(QContextMenuEvent* ev);
void mousePressEvent(QMouseEvent* ev);
void setBookmarkSaved();

View File

@ -63,6 +63,16 @@ void BookmarksModel::setShowingOnlyIconsInToolbar(bool state)
m_showOnlyIconsInToolbar = state;
}
bool BookmarksModel::isFolder(const QString &name)
{
QSqlQuery query;
query.prepare("SELECT name FROM folders WHERE name = ?");
query.bindValue(0, name);
query.exec();
return query.next();
}
void BookmarksModel::setLastFolder(const QString &folder)
{
Settings settings;
@ -154,6 +164,10 @@ bool BookmarksModel::saveBookmark(const QUrl &url, const QString &title, const Q
image = QWebSettings::webGraphic(QWebSettings::DefaultFrameIconGraphic).toImage();
}
if (!isFolder(folder)) {
createFolder(folder);
}
QSqlQuery query;
query.prepare("INSERT INTO bookmarks (url, title, folder, icon) VALUES (?,?,?,?)");
query.bindValue(0, url.toString());
@ -292,14 +306,11 @@ bool BookmarksModel::editBookmark(int id, const QString &title, const QUrl &url,
bool BookmarksModel::createFolder(const QString &name)
{
QSqlQuery query;
query.prepare("SELECT name FROM folders WHERE name = ?");
query.bindValue(0, name);
query.exec();
if (query.next()) {
if (isFolder(name)) {
return false;
}
QSqlQuery query;
query.prepare("INSERT INTO folders (name, subfolder) VALUES (?, 'no')");
query.bindValue(0, name);
if (!query.exec()) {
@ -397,14 +408,11 @@ QList<Bookmark> BookmarksModel::folderBookmarks(const QString &name)
bool BookmarksModel::createSubfolder(const QString &name)
{
QSqlQuery query;
query.prepare("SELECT name FROM folders WHERE name = ?");
query.bindValue(0, name);
query.exec();
if (query.next()) {
if (isFolder(name)) {
return false;
}
QSqlQuery query;
query.prepare("INSERT INTO folders (name, subfolder) VALUES (?, 'yes')");
query.bindValue(0, name);
if (!query.exec()) {

View File

@ -68,6 +68,7 @@ public:
bool isShowingOnlyIconsInToolbar() { return m_showOnlyIconsInToolbar; }
void setShowingOnlyIconsInToolbar(bool state);
bool isFolder(const QString &name);
QString lastFolder() { return m_lastFolder; }
void setLastFolder(const QString &folder);

View File

@ -44,7 +44,7 @@ BookmarksToolbar::BookmarksToolbar(QupZilla* mainClass, QWidget* parent)
{
setObjectName("bookmarksbar");
m_layout = new QHBoxLayout();
m_layout->setContentsMargins(9, 3, 9, 3);
m_layout->setMargin(3);
m_layout->setSpacing(0);
setLayout(m_layout);
@ -339,7 +339,7 @@ void BookmarksToolbar::subfolderAdded(const QString &name)
{
ToolButton* b = new ToolButton(this);
b->setPopupMode(QToolButton::InstantPopup);
b->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
b->setToolButtonStyle(m_toolButtonStyle);
b->setIcon(style()->standardIcon(QStyle::SP_DirIcon));
b->setText(name);
connect(b, SIGNAL(middleMouseClicked()), this, SLOT(loadFolderBookmarksInTabs()));
@ -404,7 +404,7 @@ void BookmarksToolbar::addBookmark(const BookmarksModel::Bookmark &bookmark)
button->setText(title);
button->setData(v);
button->setIcon(IconProvider::iconFromImage(bookmark.image));
button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
button->setToolButtonStyle(m_toolButtonStyle);
button->setToolTip(bookmark.url.toEncoded());
button->setAutoRaise(true);
button->setWhatsThis(bookmark.title);
@ -504,7 +504,7 @@ void BookmarksToolbar::refreshBookmarks()
button->setText(title);
button->setData(v);
button->setIcon(IconProvider::iconFromImage(bookmark.image));
button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
button->setToolButtonStyle(m_toolButtonStyle);
button->setToolTip(bookmark.url.toEncoded());
button->setWhatsThis(bookmark.title);
button->setAutoRaise(true);
@ -521,7 +521,7 @@ void BookmarksToolbar::refreshBookmarks()
while (query.next()) {
ToolButton* b = new ToolButton(this);
b->setPopupMode(QToolButton::InstantPopup);
b->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
b->setToolButtonStyle(m_toolButtonStyle);
b->setIcon(style()->standardIcon(QStyle::SP_DirIcon));
b->setText(query.value(0).toString());
connect(b, SIGNAL(middleMouseClicked()), this, SLOT(loadFolderBookmarksInTabs()));
@ -535,7 +535,7 @@ void BookmarksToolbar::refreshBookmarks()
m_mostVis = new ToolButton(this);
m_mostVis->setPopupMode(QToolButton::InstantPopup);
m_mostVis->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
m_mostVis->setToolButtonStyle(m_toolButtonStyle);
m_mostVis->setIcon(style()->standardIcon(QStyle::SP_DirIcon));
m_mostVis->setText(tr("Most visited"));
m_mostVis->setToolTip(tr("Sites you visited the most"));
@ -579,35 +579,6 @@ void BookmarksToolbar::aboutToShowFolderMenu()
}
}
void BookmarksToolbar::dragEnterEvent(QDragEnterEvent* e)
{
const QMimeData* mime = e->mimeData();
if (mime->hasUrls() || mime->hasText()) {
e->acceptProposedAction();
return;
}
QWidget::dropEvent(e);
}
void BookmarksToolbar::showOnlyIconsChanged()
{
Qt::ToolButtonStyle iconStyle = Qt::ToolButtonTextBesideIcon;
if (m_bookmarksModel->isShowingOnlyIconsInToolbar()) {
iconStyle = Qt::ToolButtonIconOnly;
}
for (int i = 0; i < m_layout->count(); ++i) {
ToolButton* button = qobject_cast<ToolButton*>(m_layout->itemAt(i)->widget());
if (!button) {
continue;
}
button->setToolButtonStyle(iconStyle);
}
}
void BookmarksToolbar::dropEvent(QDropEvent* e)
{
const QMimeData* mime = e->mimeData();
@ -624,6 +595,35 @@ void BookmarksToolbar::dropEvent(QDropEvent* e)
m_bookmarksModel->saveBookmark(url, title, icon, "bookmarksToolbar");
}
void BookmarksToolbar::dragEnterEvent(QDragEnterEvent* e)
{
const QMimeData* mime = e->mimeData();
if (mime->hasUrls() && mime->hasText()) {
e->acceptProposedAction();
return;
}
QWidget::dragEnterEvent(e);
}
void BookmarksToolbar::showOnlyIconsChanged()
{
m_toolButtonStyle = Qt::ToolButtonTextBesideIcon;
if (m_bookmarksModel->isShowingOnlyIconsInToolbar()) {
m_toolButtonStyle = Qt::ToolButtonIconOnly;
}
for (int i = 0; i < m_layout->count(); ++i) {
ToolButton* button = qobject_cast<ToolButton*>(m_layout->itemAt(i)->widget());
if (!button) {
continue;
}
button->setToolButtonStyle(m_toolButtonStyle);
}
}
void BookmarksToolbar::refreshMostVisited()
{
m_menuMostVisited->clear();

View File

@ -81,6 +81,8 @@ private:
Menu* m_menuMostVisited;
ToolButton* m_mostVis;
QHBoxLayout* m_layout;
Qt::ToolButtonStyle m_toolButtonStyle;
};
#endif // BOOKMARKSTOOLBAR_H

View File

@ -22,18 +22,21 @@
#include "operaimporter.h"
#include "htmlimporter.h"
#include "mainapplication.h"
#include "iconfetcher.h"
#include "bookmarksimporticonfetcher.h"
#include "iconprovider.h"
#include "networkmanager.h"
#include <QWebSettings>
#include <QMessageBox>
#include <QFileDialog>
#include <QThread>
BookmarksImportDialog::BookmarksImportDialog(QWidget* parent)
: QDialog(parent)
, ui(new Ui::BookmarksImportDialog)
, m_currentPage(0)
, m_fetcher(0)
, m_fetcherThread(0)
{
setAttribute(Qt::WA_DeleteOnClose);
ui->setupUi(this);
@ -96,28 +99,53 @@ void BookmarksImportDialog::startFetchingIcons()
ui->progressBar->setValue(0);
ui->progressBar->setMaximum(m_exportedBookmarks.count());
int i = 0;
m_fetcherThread = new QThread();
m_fetcher = new BookmarksImportIconFetcher();
m_fetcher->moveToThread(m_fetcherThread);
QIcon defaultIcon = QIcon(QWebSettings::globalSettings()->webGraphic(QWebSettings::DefaultFrameIconGraphic));
QIcon folderIcon = style()->standardIcon(QStyle::SP_DirIcon);
QHash<QString, QTreeWidgetItem*> hash;
foreach(const Bookmark & b, m_exportedBookmarks) {
QTreeWidgetItem* item = new QTreeWidgetItem();
QTreeWidgetItem* item;
QTreeWidgetItem* findParent = hash[b.folder];
if (findParent) {
item = new QTreeWidgetItem(findParent);
}
else {
QTreeWidgetItem* newParent = new QTreeWidgetItem(ui->treeWidget);
newParent->setText(0, b.folder);
newParent->setIcon(0, folderIcon);
ui->treeWidget->addTopLevelItem(newParent);
hash[b.folder] = newParent;
item = new QTreeWidgetItem(newParent);
}
QVariant bookmarkVariant = qVariantFromValue(b);
item->setText(0, b.title);
item->setIcon(0, QWebSettings::globalSettings()->webGraphic(QWebSettings::DefaultFrameIconGraphic));
if (b.image.isNull()) {
item->setIcon(0, defaultIcon);
}
else {
item->setIcon(0, QIcon(QPixmap::fromImage(b.image)));
}
item->setText(1, b.url.toString());
item->setWhatsThis(0, QString::number(i));
item->setData(0, Qt::UserRole + 10, bookmarkVariant);
ui->treeWidget->addTopLevelItem(item);
i++;
IconFetcher* fetcher = new IconFetcher(this);
fetcher->setNetworkAccessManager(mApp->networkManager());
connect(fetcher, SIGNAL(finished()), this, SLOT(loadFinished()));
connect(fetcher, SIGNAL(iconFetched(QIcon)), this, SLOT(iconFetched(QIcon)));
fetcher->fetchIcon(b.url);
QPair<IconFetcher*, QUrl> pair;
pair.first = fetcher;
pair.second = b.url;
m_fetchers.append(pair);
m_fetcher->addEntry(b.url, item);
}
ui->treeWidget->expandAll();
connect(m_fetcher, SIGNAL(iconFetched(QImage, QTreeWidgetItem*)), this, SLOT(iconFetched(QImage, QTreeWidgetItem*)));
connect(m_fetcher, SIGNAL(oneFinished()), this, SLOT(loadFinished()));
m_fetcherThread->start();
m_fetcher->startFetching();
}
void BookmarksImportDialog::stopDownloading()
@ -139,42 +167,15 @@ void BookmarksImportDialog::loadFinished()
}
}
void BookmarksImportDialog::iconFetched(const QIcon &icon)
void BookmarksImportDialog::iconFetched(const QImage &image, QTreeWidgetItem* item)
{
IconFetcher* fetcher = qobject_cast<IconFetcher*>(sender());
if (!fetcher) {
return;
}
item->setIcon(0, QIcon(QPixmap::fromImage(image)));
QUrl url;
for (int i = 0; i < m_fetchers.count(); i++) {
QPair<IconFetcher*, QUrl> pair = m_fetchers.at(i);
if (pair.first == fetcher) {
url = pair.second;
break;
}
}
Bookmark b = item->data(0, Qt::UserRole + 10).value<Bookmark>();
if (url.isEmpty()) {
return;
}
QList<QTreeWidgetItem*> items = ui->treeWidget->findItems(url.toString(), Qt::MatchExactly, 1);
if (items.count() == 0) {
return;
}
foreach(QTreeWidgetItem * item, items) {
item->setIcon(0, icon);
foreach(Bookmark b, m_exportedBookmarks) {
if (b.url == url) {
m_exportedBookmarks.removeOne(b);
b.image = icon.pixmap(16, 16).toImage();
m_exportedBookmarks.append(b);
break;
}
}
int index = m_exportedBookmarks.indexOf(b);
if (index != -1) {
m_exportedBookmarks[index].image = image;
}
}
@ -263,10 +264,6 @@ void BookmarksImportDialog::addExportedBookmarks()
BookmarksModel* model = mApp->bookmarksModel();
if (m_exportedBookmarks.count() > 0) {
model->createFolder(m_exportedBookmarks.at(0).folder);
}
foreach(const Bookmark & b, m_exportedBookmarks) {
model->saveBookmark(b.url, b.title, IconProvider::iconFromImage(b.image), b.folder);
}
@ -349,13 +346,13 @@ void BookmarksImportDialog::setupBrowser(Browser browser)
BookmarksImportDialog::~BookmarksImportDialog()
{
if (m_fetchers.count() > 0) {
for (int i = 0; i < m_fetchers.count(); i++) {
tr("");
IconFetcher* fetcher = m_fetchers.at(i).first;
fetcher->deleteLater();
}
}
delete ui;
if (m_fetcherThread) {
m_fetcherThread->exit();
m_fetcherThread->wait();
m_fetcherThread->deleteLater();
m_fetcher->deleteLater();
}
}

View File

@ -29,7 +29,11 @@ namespace Ui
class BookmarksImportDialog;
}
class IconFetcher;
class QTreeWidgetItem;
class QThread;
class BookmarksImportIconFetcher;
class QT_QUPZILLA_EXPORT BookmarksImportDialog : public QDialog
{
Q_OBJECT
@ -43,7 +47,7 @@ private slots:
void setFile();
void stopDownloading();
void iconFetched(const QIcon &icon);
void iconFetched(const QImage &image, QTreeWidgetItem* item);
void loadFinished();
private:
@ -68,7 +72,8 @@ private:
QList<BookmarksModel::Bookmark> m_exportedBookmarks;
QList<QPair<IconFetcher*, QUrl> > m_fetchers;
BookmarksImportIconFetcher* m_fetcher;
QThread* m_fetcherThread;
};
#endif // BOOKMARKSIMPORTDIALOG_H

View File

@ -0,0 +1,84 @@
/* ============================================================
* QupZilla - WebKit based browser
* Copyright (C) 2010-2012 David Rosca <nowrep@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 "bookmarksimporticonfetcher.h"
#include "iconfetcher.h"
#include <QTimer>
#include <QNetworkAccessManager>
BookmarksImportIconFetcher::BookmarksImportIconFetcher(QObject* parent)
: QObject(parent)
{
}
void BookmarksImportIconFetcher::addEntry(const QUrl &url, QTreeWidgetItem* item)
{
Pair pair;
pair.url = url;
pair.item = item;
m_pairs.append(pair);
}
void BookmarksImportIconFetcher::startFetching()
{
QTimer::singleShot(0, this, SLOT(slotStartFetching()));
}
void BookmarksImportIconFetcher::slotIconFetched(const QImage &image)
{
IconFetcher* fetcher = qobject_cast<IconFetcher*>(sender());
if (!fetcher) {
return;
}
QTreeWidgetItem* itemPointer = static_cast<QTreeWidgetItem*>(fetcher->data().value<void*>());
emit iconFetched(image, itemPointer);
}
void BookmarksImportIconFetcher::slotFetcherFinished()
{
IconFetcher* fetcher = qobject_cast<IconFetcher*>(sender());
if (!fetcher) {
return;
}
m_fetchers.removeOne(fetcher);
emit oneFinished();
}
void BookmarksImportIconFetcher::slotStartFetching()
{
QNetworkAccessManager* manager = new QNetworkAccessManager(this);
foreach(const Pair & pair, m_pairs) {
QVariant itemPointer = qVariantFromValue((void*) pair.item);
IconFetcher* fetcher = new IconFetcher(this);
fetcher->setNetworkAccessManager(manager);
fetcher->setData(itemPointer);
fetcher->fetchIcon(pair.url);
connect(fetcher, SIGNAL(iconFetched(QImage)), this, SLOT(slotIconFetched(QImage)));
connect(fetcher, SIGNAL(finished()), this, SLOT(slotFetcherFinished()));
m_fetchers.append(fetcher);
}
}

View File

@ -0,0 +1,63 @@
/* ============================================================
* QupZilla - WebKit based browser
* Copyright (C) 2010-2012 David Rosca <nowrep@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/>.
* ============================================================ */
#ifndef BOOKMARKSIMPORTICONFETCHER_H
#define BOOKMARKSIMPORTICONFETCHER_H
#include <QObject>
#include <QUrl>
#include <QList>
#include "qz_namespace.h"
class QNetworkAccessManager;
class QTreeWidgetItem;
class QImage;
class IconFetcher;
class QT_QUPZILLA_EXPORT BookmarksImportIconFetcher : public QObject
{
Q_OBJECT
public:
struct Pair {
QUrl url;
QTreeWidgetItem* item;
};
explicit BookmarksImportIconFetcher(QObject* parent = 0);
void addEntry(const QUrl &url, QTreeWidgetItem* item);
void startFetching();
signals:
void iconFetched(const QImage &image, QTreeWidgetItem* item);
void oneFinished();
private slots:
void slotStartFetching();
void slotIconFetched(const QImage &image);
void slotFetcherFinished();
private:
QList<Pair> m_pairs;
QList<IconFetcher*> m_fetchers;
};
#endif // BOOKMARKSIMPORTICONFETCHER_H

View File

@ -53,7 +53,7 @@ QList<BookmarksModel::Bookmark> ChromeImporter::exportBookmarks()
{
QList<BookmarksModel::Bookmark> list;
QString bookmarks = m_file.readAll();
QString bookmarks = QString::fromUtf8(m_file.readAll());
m_file.close();
QStringList parsedBookmarks;

View File

@ -45,40 +45,91 @@ bool HtmlImporter::openFile()
return true;
}
int qzMin(int a, int b)
{
if (a > -1 && b > -1) {
return qMin(a, b);
}
if (a > -1) {
return a;
}
else {
return b;
}
}
QList<BookmarksModel::Bookmark> HtmlImporter::exportBookmarks()
{
QList<BookmarksModel::Bookmark> list;
QString bookmarks = m_file.readAll();
QString bookmarks = QString::fromUtf8(m_file.readAll());
m_file.close();
QRegExp rx("<a (.*)</a>", Qt::CaseInsensitive);
rx.setMinimal(true);
bookmarks = bookmarks.mid(0, bookmarks.lastIndexOf("</DL><p>"));
int start = bookmarks.indexOf("<DL><p>", Qt::CaseInsensitive);
int pos = 0;
while ((pos = rx.indexIn(bookmarks, pos)) != -1) {
QString string = rx.cap(0);
pos += rx.matchedLength();
QStringList folders("Html Import");
QRegExp rx2(">(.*)</a>", Qt::CaseInsensitive);
rx2.setMinimal(true);
rx2.indexIn(string);
QString name = rx2.cap(1);
while (start > 0) {
QString string = bookmarks.mid(start);
rx2.setPattern("href=\"(.*)\"");
rx2.indexIn(string);
QUrl url = QUrl::fromEncoded(rx2.cap(1).toUtf8());
int posOfFolder = string.indexOf("<DT><H3", Qt::CaseInsensitive);
int posOfEndFolder = string.indexOf("</DL><p>", Qt::CaseInsensitive);
int posOfLink = string.indexOf("<DT><A", Qt::CaseInsensitive);
if (name.isEmpty() || url.isEmpty() || url.scheme() == "place" || url.scheme() == "about") {
continue;
int nearest = qzMin(posOfLink, qzMin(posOfFolder, posOfEndFolder));
if (nearest == -1) {
break;
}
BookmarksModel::Bookmark b;
b.folder = "Html Import";
b.title = name;
b.url = url;
if (nearest == posOfFolder) {
// Next is folder
QRegExp rx("<DT><H3(.*)>(.*)</H3>", Qt::CaseInsensitive);
rx.setMinimal(true);
rx.indexIn(string);
list.append(b);
// QString arguments = rx.cap(1);
QString folderName = rx.cap(2);
folders.append(folderName);
start += posOfFolder + rx.cap(0).size();
}
else if (nearest == posOfEndFolder) {
// Next is end of folder
folders.removeLast();
start += posOfEndFolder + 8;
}
else {
// Next is link
QRegExp rx("<DT><A(.*)>(.*)</A>", Qt::CaseInsensitive);
rx.setMinimal(true);
rx.indexIn(string);
QString arguments = rx.cap(1);
QString linkName = rx.cap(2);
QRegExp rx2("HREF=\"(.*)\"", Qt::CaseInsensitive);
rx2.setMinimal(true);
rx2.indexIn(arguments);
QUrl url = QUrl::fromEncoded(rx2.cap(1).toUtf8());
start += posOfLink + rx.cap(0).size();
if (linkName.isEmpty() || url.isEmpty() || url.scheme() == "place" || url.scheme() == "about") {
continue;
}
BookmarksModel::Bookmark b;
b.folder = folders.last();
b.title = linkName;
b.url = url;
list.append(b);
}
}
return list;

View File

@ -47,7 +47,7 @@ QList<BookmarksModel::Bookmark> OperaImporter::exportBookmarks()
{
QList<BookmarksModel::Bookmark> list;
QString bookmarks = m_file.readAll();
QString bookmarks = QString::fromUtf8(m_file.readAll());
m_file.close();
QRegExp rx("#URL(.*)CREATED", Qt::CaseSensitive);

View File

@ -163,7 +163,9 @@ SOURCES += \
webview/webview.cpp \
webview/webviewsettings.cpp \
preferences/pluginlistdelegate.cpp \
popupwindow/popupstatusbarmessage.cpp
popupwindow/popupstatusbarmessage.cpp \
other/licenseviewer.cpp \
bookmarksimport/bookmarksimporticonfetcher.cpp
HEADERS += \
3rdparty/qtwin.h \
@ -298,7 +300,9 @@ HEADERS += \
app/qz_namespace.h \
webview/webviewsettings.h \
preferences/pluginlistdelegate.h \
popupwindow/popupstatusbarmessage.h
popupwindow/popupstatusbarmessage.h \
other/licenseviewer.h \
bookmarksimport/bookmarksimporticonfetcher.h
FORMS += \
preferences/autofillmanager.ui \

View File

@ -26,6 +26,12 @@ DownIcon::DownIcon(QWidget* parent)
setCursor(Qt::ArrowCursor);
}
void DownIcon::contextMenuEvent(QContextMenuEvent* ev)
{
// Prevent propagating to LocationBar
ev->accept();
}
void DownIcon::mousePressEvent(QMouseEvent* ev)
{
ClickableLabel::mousePressEvent(ev);

View File

@ -27,6 +27,7 @@ public:
explicit DownIcon(QWidget* parent = 0);
private:
void contextMenuEvent(QContextMenuEvent* ev);
void mousePressEvent(QMouseEvent* ev);
};

View File

@ -27,6 +27,13 @@ GoIcon::GoIcon(QWidget* parent)
setHidden(true);
}
void GoIcon::contextMenuEvent(QContextMenuEvent* ev)
{
// Prevent propagating to LocationBar
ev->accept();
}
void GoIcon::mousePressEvent(QMouseEvent* ev)
{
ClickableLabel::mousePressEvent(ev);

View File

@ -27,6 +27,7 @@ public:
explicit GoIcon(QWidget* parent = 0);
private:
void contextMenuEvent(QContextMenuEvent* ev);
void mousePressEvent(QMouseEvent* ev);
};

View File

@ -54,7 +54,8 @@ NavigationBar::NavigationBar(QupZilla* mainClass, QWidget* parent)
{
setObjectName("navigationbar");
m_layout = new QHBoxLayout(this);
m_layout->setContentsMargins(9, 3, 9, 3);
m_layout->setMargin(3);
m_layout->setSpacing(3);
setLayout(m_layout);
m_buttonBack = new ToolButton(this);

View File

@ -32,21 +32,27 @@ SiteIcon::SiteIcon(LocationBar* parent)
setFocusPolicy(Qt::ClickFocus);
}
void SiteIcon::contextMenuEvent(QContextMenuEvent* e)
{
// Prevent propagating to LocationBar
e->accept();
}
void SiteIcon::mousePressEvent(QMouseEvent* e)
{
if (e->buttons() & Qt::LeftButton) {
m_dragStartPosition = mapFromGlobal(e->globalPos());
}
ToolButton::mousePressEvent(e);
// Prevent propagating to LocationBar
e->accept();
ToolButton::mousePressEvent(e);
}
void SiteIcon::mouseMoveEvent(QMouseEvent* e)
{
if (!m_locationBar) {
if (!m_locationBar || !(e->buttons() & Qt::LeftButton)) {
return;
}

View File

@ -29,6 +29,7 @@ public:
explicit SiteIcon(LocationBar* parent);
private:
void contextMenuEvent(QContextMenuEvent* e);
void mousePressEvent(QMouseEvent* e);
void mouseMoveEvent(QMouseEvent* e);

View File

@ -34,6 +34,19 @@
#include <QWebFrame>
#include <QClipboard>
WebSearchBar_Button::WebSearchBar_Button(QWidget* parent)
: ClickableLabel(parent)
{
setObjectName("websearchbar-searchbutton");
setCursor(QCursor(Qt::PointingHandCursor));
setFocusPolicy(Qt::ClickFocus);
}
void WebSearchBar_Button::contextMenuEvent(QContextMenuEvent* event)
{
event->accept();
}
WebSearchBar::WebSearchBar(QupZilla* mainClass, QWidget* parent)
: LineEdit(parent)
, p_QupZilla(mainClass)
@ -42,10 +55,8 @@ WebSearchBar::WebSearchBar(QupZilla* mainClass, QWidget* parent)
, m_clearAction(0)
{
setObjectName("websearchbar");
m_buttonSearch = new ClickableLabel(this);
m_buttonSearch->setObjectName("websearchbar-searchbutton");
m_buttonSearch->setCursor(QCursor(Qt::PointingHandCursor));
m_buttonSearch->setFocusPolicy(Qt::ClickFocus);
m_buttonSearch = new WebSearchBar_Button(this);
m_boxSearchType = new ButtonWithMenu(this);
m_boxSearchType->setObjectName("websearchbar-searchprovider-comobobox");

View File

@ -24,6 +24,7 @@
#include "lineedit.h"
#include "buttonwithmenu.h"
#include "searchenginesmanager.h"
#include "clickablelabel.h"
class QStringListModel;
@ -34,6 +35,15 @@ class SearchEnginesManager;
class SearchEnginesDialog;
class OpenSearchEngine;
class QT_QUPZILLA_EXPORT WebSearchBar_Button : public ClickableLabel
{
public:
explicit WebSearchBar_Button(QWidget* parent = 0);
private:
void contextMenuEvent(QContextMenuEvent* event);
};
class QT_QUPZILLA_EXPORT WebSearchBar : public LineEdit
{
Q_OBJECT
@ -76,7 +86,7 @@ private:
QupZilla* p_QupZilla;
ClickableLabel* m_buttonSearch;
WebSearchBar_Button* m_buttonSearch;
ButtonWithMenu* m_boxSearchType;
SearchEnginesManager* m_searchManager;
QWeakPointer<SearchEnginesDialog> m_searchDialog;

View File

@ -323,11 +323,11 @@ QNetworkReply* NetworkManager::createRequest(QNetworkAccessManager::Operation op
QNetworkReply* reply = 0;
if (m_doNotTrack) {
req.setRawHeader("DNT", "1");
req.setRawHeader("DNT", QByteArray("1"));
}
if (!m_sendReferer) {
req.setRawHeader("Referer", "");
req.setRawHeader("Referer", QByteArray());
}
req.setRawHeader("Accept-Language", m_acceptLanguage);

View File

@ -159,15 +159,16 @@ void SearchEnginesManager::engineChangedImage()
foreach(Engine e, m_allEngines) {
if (e.name == engine->name() && e.url.contains(engine->searchUrl("%s").toString())
&& !engine->image().isNull()) {
e.icon = QIcon(QPixmap::fromImage(engine->image()));
m_allEngines.removeOne(e);
m_allEngines.append(e);
int index = m_allEngines.indexOf(e);
if (index != -1) {
m_allEngines[index].icon = QIcon(QPixmap::fromImage(engine->image()));
emit enginesChanged();
emit enginesChanged();
delete engine;
break;
delete engine;
break;
}
}
}
}

View File

@ -0,0 +1,35 @@
/* ============================================================
* QupZilla - WebKit based browser
* Copyright (C) 2010-2012 David Rosca <nowrep@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 "licenseviewer.h"
#include "globalfunctions.h"
LicenseViewer::LicenseViewer(QWidget* parent)
: QTextBrowser()
{
setAttribute(Qt::WA_DeleteOnClose);
setWindowTitle(tr("License Viewer"));
resize(450, 500);
qz_centerWidgetToParent(this, parent);
}
void LicenseViewer::setLicenseFile(const QString &fileName)
{
setText(qz_readAllFileContents(fileName));
}

View File

@ -0,0 +1,35 @@
/* ============================================================
* QupZilla - WebKit based browser
* Copyright (C) 2010-2012 David Rosca <nowrep@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/>.
* ============================================================ */
#ifndef LICENSEVIEWER_H
#define LICENSEVIEWER_H
#include <QTextBrowser>
#include "qz_namespace.h"
class QT_QUPZILLA_EXPORT LicenseViewer : public QTextBrowser
{
Q_OBJECT
public:
explicit LicenseViewer(QWidget* parent = 0);
void setLicenseFile(const QString &fileName);
};
#endif // LICENSEVIEWER_H

View File

@ -22,57 +22,86 @@
#include <QFileDialog>
#include <QWebFrame>
#include <QTimer>
#include <QMovie>
#include <QtConcurrentRun>
#include <QPushButton>
PageScreen::PageScreen(WebView* view, QWidget* parent)
: QDialog(parent)
, ui(new Ui::PageScreen)
, m_view(view)
, m_imageScaling(0)
, m_horizontalScrollbarSize(0)
, m_verticalScrollbarSize(0)
{
setAttribute(Qt::WA_DeleteOnClose);
ui->setupUi(this);
createPixmap();
ui->label->setPixmap(m_pagePixmap);
QMovie* mov = new QMovie(":html/loading.gif");
ui->label->setMovie(mov);
mov->start();
connect(ui->buttonBox, SIGNAL(clicked(QAbstractButton*)), this, SLOT(buttonClicked(QAbstractButton*)));
m_pageTitle = m_view->title();
connect(ui->buttonBox->button(QDialogButtonBox::Save), SIGNAL(clicked()), this, SLOT(dialogAccepted()));
connect(ui->buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), this, SLOT(close()));
QTimer::singleShot(200, this, SLOT(createThumbnail()));
}
void PageScreen::buttonClicked(QAbstractButton* b)
void PageScreen::dialogAccepted()
{
QString path;
const QString &path = QFileDialog::getSaveFileName(this, tr("Save Page Screen..."),
QDir::homePath() + "/" + QString("%1.png").arg(qz_filterCharsFromFilename(m_pageTitle)));
switch (ui->buttonBox->standardButton(b)) {
case QDialogButtonBox::Cancel:
close();
break;
if (!path.isEmpty()) {
m_pageImage.save(path);
case QDialogButtonBox::Save:
path = QFileDialog::getSaveFileName(this, tr("Save Page Screen..."), tr("screen.png"));
if (!path.isEmpty()) {
m_pagePixmap.save(path);
close();
}
break;
default:
break;
QTimer::singleShot(0, this, SLOT(close()));
}
}
void PageScreen::createPixmap()
void PageScreen::createThumbnail()
{
QWebPage* page = m_view->page();
QSize originalSize = page->viewportSize();
page->setViewportSize(page->mainFrame()->contentsSize());
QImage image(page->viewportSize(), QImage::Format_ARGB32);
QPainter painter(&image);
m_pageImage = QImage(page->viewportSize(), QImage::Format_ARGB32_Premultiplied);
QPainter painter(&m_pageImage);
page->mainFrame()->render(&painter);
painter.end();
m_pagePixmap = QPixmap::fromImage(image);
m_verticalScrollbarSize = page->mainFrame()->scrollBarGeometry(Qt::Vertical).width();
m_horizontalScrollbarSize = page->mainFrame()->scrollBarGeometry(Qt::Horizontal).height();
page->setViewportSize(originalSize);
m_imageScaling = new QFutureWatcher<QImage>(this);
connect(m_imageScaling, SIGNAL(finished()), SLOT(showImage()));
m_imageScaling->setFuture(QtConcurrent::run(this, &PageScreen::scaleImage));
}
QImage PageScreen::scaleImage()
{
if (m_verticalScrollbarSize > 0 || m_horizontalScrollbarSize > 0) {
QRect newRect = m_pageImage.rect();
newRect.setWidth(newRect.width() - m_verticalScrollbarSize);
newRect.setHeight(newRect.height() - m_horizontalScrollbarSize);
m_pageImage = m_pageImage.copy(newRect);
}
return m_pageImage.scaledToWidth(450, Qt::SmoothTransformation);
}
void PageScreen::showImage()
{
delete ui->label->movie();
ui->label->setPixmap(QPixmap::fromImage(m_imageScaling->result()));
}
PageScreen::~PageScreen()

View File

@ -19,6 +19,7 @@
#define PAGESCREEN_H
#include <QDialog>
#include <QFutureWatcher>
#include "qz_namespace.h"
@ -39,15 +40,25 @@ public:
explicit PageScreen(WebView* view, QWidget* parent);
~PageScreen();
QImage scaleImage();
private slots:
void buttonClicked(QAbstractButton* b);
void createThumbnail();
void showImage();
void dialogAccepted();
private:
void createPixmap();
Ui::PageScreen* ui;
WebView* m_view;
QPixmap m_pagePixmap;
QImage m_pageImage;
QString m_pageTitle;
QFutureWatcher<QImage>* m_imageScaling;
int m_horizontalScrollbarSize;
int m_verticalScrollbarSize;
};
#endif // PAGESCREEN_H

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>470</width>
<height>425</height>
<width>562</width>
<height>421</height>
</rect>
</property>
<property name="windowTitle">
@ -18,7 +18,7 @@
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
<number>6</number>
</property>
<property name="rightMargin">
<number>0</number>
@ -28,12 +28,6 @@
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="lineWidth">
<number>0</number>
</property>
<property name="widgetResizable">
<bool>true</bool>
</property>
@ -42,11 +36,11 @@
<rect>
<x>0</x>
<y>0</y>
<width>470</width>
<height>376</height>
<width>562</width>
<height>366</height>
</rect>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="spacing">
<number>0</number>
</property>
@ -56,7 +50,7 @@
<item>
<widget class="QLabel" name="label">
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>

View File

@ -67,10 +67,13 @@ public:
virtual void populateWebViewMenu(QMenu* menu, WebView* view, const QWebHitTestResult &r) { Q_UNUSED(menu) Q_UNUSED(view) Q_UNUSED(r) }
virtual bool mouseDoubleClick(const Qz::ObjectName &type, QObject* obj, QMouseEvent* event) { Q_UNUSED(type) Q_UNUSED(obj) Q_UNUSED(event) return false; }
virtual bool mousePress(const Qz::ObjectName &type, QObject* obj, QMouseEvent* event) { Q_UNUSED(type) Q_UNUSED(obj) Q_UNUSED(event) return false; }
virtual bool mouseRelease(const Qz::ObjectName &type, QObject* obj, QMouseEvent* event) { Q_UNUSED(type) Q_UNUSED(obj) Q_UNUSED(event) return false; }
virtual bool mouseMove(const Qz::ObjectName &type, QObject* obj, QMouseEvent* event) { Q_UNUSED(type) Q_UNUSED(obj) Q_UNUSED(event) return false; }
virtual bool wheelEvent(const Qz::ObjectName &type, QObject* obj, QWheelEvent* event) { Q_UNUSED(type) Q_UNUSED(obj) Q_UNUSED(event) return false; }
virtual bool keyPress(const Qz::ObjectName &type, QObject* obj, QKeyEvent* event) { Q_UNUSED(type) Q_UNUSED(obj) Q_UNUSED(event) return false; }
virtual bool keyRelease(const Qz::ObjectName &type, QObject* obj, QKeyEvent* event) { Q_UNUSED(type) Q_UNUSED(obj) Q_UNUSED(event) return false; }
};

View File

@ -42,6 +42,12 @@ void PluginProxy::unloadPlugin(Plugins::Plugin* plugin)
void PluginProxy::registerAppEventHandler(const PluginProxy::EventHandlerType &type, PluginInterface* obj)
{
switch (type) {
case MouseDoubleClickHandler:
if (!m_mouseDoubleClickHandlers.contains(obj)) {
m_mouseDoubleClickHandlers.append(obj);
}
break;
case MousePressHandler:
if (!m_mousePressHandlers.contains(obj)) {
m_mousePressHandlers.append(obj);
@ -72,6 +78,12 @@ void PluginProxy::registerAppEventHandler(const PluginProxy::EventHandlerType &t
}
break;
case WheelEventHandler:
if (!m_wheelEventHandlers.contains(obj)) {
m_wheelEventHandlers.append(obj);
}
break;
default:
qWarning("PluginProxy::registerAppEventHandler registering unknown event handler type");
break;
@ -96,6 +108,19 @@ void PluginProxy::populateWebViewMenu(QMenu* menu, WebView* view, const QWebHitT
}
}
bool PluginProxy::processMouseDoubleClick(const Qz::ObjectName &type, QObject* obj, QMouseEvent* event)
{
bool accepted = false;
foreach(PluginInterface * iPlugin, m_mouseDoubleClickHandlers) {
if (iPlugin->mouseDoubleClick(type, obj, event)) {
accepted = true;
}
}
return accepted;
}
bool PluginProxy::processMousePress(const Qz::ObjectName &type, QObject* obj, QMouseEvent* event)
{
bool accepted = false;
@ -135,6 +160,19 @@ bool PluginProxy::processMouseMove(const Qz::ObjectName &type, QObject* obj, QMo
return accepted;
}
bool PluginProxy::processWheelEvent(const Qz::ObjectName &type, QObject* obj, QWheelEvent* event)
{
bool accepted = false;
foreach(PluginInterface * iPlugin, m_wheelEventHandlers) {
if (iPlugin->wheelEvent(type, obj, event)) {
accepted = true;
}
}
return accepted;
}
bool PluginProxy::processKeyPress(const Qz::ObjectName &type, QObject* obj, QKeyEvent* event)
{
bool accepted = false;
@ -161,3 +199,23 @@ bool PluginProxy::processKeyRelease(const Qz::ObjectName &type, QObject* obj, QK
return accepted;
}
void PluginProxy::emitWebViewCreated(WebView* view)
{
emit webViewCreated(view);
}
void PluginProxy::emitWebViewDeleted(WebView* view)
{
emit webViewDeleted(view);
}
void PluginProxy::emitMainWindowCreated(QupZilla* window)
{
emit mainWindowCreated(window);
}
void PluginProxy::emitMainWindowDeleted(QupZilla* window)
{
emit mainWindowDeleted(window);
}

View File

@ -24,8 +24,12 @@
class QT_QUPZILLA_EXPORT PluginProxy : public Plugins
{
Q_OBJECT
public:
enum EventHandlerType { MousePressHandler, MouseReleaseHandler, MouseMoveHandler, KeyPressHandler, KeyReleaseHandler };
enum EventHandlerType { MouseDoubleClickHandler, MousePressHandler, MouseReleaseHandler,
MouseMoveHandler, KeyPressHandler, KeyReleaseHandler,
WheelEventHandler
};
explicit PluginProxy();
@ -34,21 +38,39 @@ public:
void populateWebViewMenu(QMenu* menu, WebView* view, const QWebHitTestResult &r);
bool processMouseDoubleClick(const Qz::ObjectName &type, QObject* obj, QMouseEvent* event);
bool processMousePress(const Qz::ObjectName &type, QObject* obj, QMouseEvent* event);
bool processMouseRelease(const Qz::ObjectName &object, QObject* obj, QMouseEvent* event);
bool processMouseMove(const Qz::ObjectName &object, QObject* obj, QMouseEvent* event);
bool processMouseRelease(const Qz::ObjectName &type, QObject* obj, QMouseEvent* event);
bool processMouseMove(const Qz::ObjectName &type, QObject* obj, QMouseEvent* event);
bool processKeyPress(const Qz::ObjectName &object, QObject* obj, QKeyEvent* event);
bool processKeyRelease(const Qz::ObjectName &object, QObject* obj, QKeyEvent* event);
bool processWheelEvent(const Qz::ObjectName &type, QObject* obj, QWheelEvent* event);
bool processKeyPress(const Qz::ObjectName &type, QObject* obj, QKeyEvent* event);
bool processKeyRelease(const Qz::ObjectName &type, QObject* obj, QKeyEvent* event);
void emitWebViewCreated(WebView* view);
void emitWebViewDeleted(WebView* view);
void emitMainWindowCreated(QupZilla* window);
void emitMainWindowDeleted(QupZilla* window);
signals:
void webViewCreated(WebView* view);
void webViewDeleted(WebView* view);
void mainWindowCreated(QupZilla* window);
void mainWindowDeleted(QupZilla* window);
private:
QList<PluginInterface*> m_mouseDoubleClickHandlers;
QList<PluginInterface*> m_mousePressHandlers;
QList<PluginInterface*> m_mouseReleaseHandlers;
QList<PluginInterface*> m_mouseMoveHandlers;
QList<PluginInterface*> m_wheelEventHandlers;
QList<PluginInterface*> m_keyPressHandlers;
QList<PluginInterface*> m_keyReleaseHandlers;
};
#define QZ_REGISTER_EVENT_HANDLER(Type) mApp->plugins()->registerAppEventHandler(Type, this);

View File

@ -56,7 +56,7 @@ void SpeedDial::loadSettings()
"url:\"http://www.qupzilla.com\"|title:\"QupZilla\";"
"url:\"http://blog.qupzilla.com\"|title:\"QupZilla Blog\";"
"url:\"https://github.com/nowrep/QupZilla\"|title:\"QupZilla GitHub\";"
"url:\"http://facebook.com\"|title:\"Facebook\";";
"url:\"https://facebook.com\"|title:\"Facebook\";";
}
changed(allPages);

View File

@ -125,8 +125,7 @@ void PopupWebPage::checkBehaviour()
TabbedWebView* view = p_QupZilla->weView(index);
view->setWebPage(this);
if (m_isLoading) {
view->slotLoadStarted();
view->loadingProgress(m_progress);
view->fakePageLoading(m_progress);
}
}
}

View File

@ -17,6 +17,7 @@
* ============================================================ */
#include "pluginlistdelegate.h"
#include <QPainter>
#include <QListWidget>
#include <QTextLayout>
#include <QTextDocument>
@ -31,6 +32,20 @@ PluginListDelegate::PluginListDelegate(QListWidget* parent)
void PluginListDelegate::drawDisplay(QPainter* painter, const QStyleOptionViewItem &option, const QRect &rect, const QString &text) const
{
QPalette::ColorGroup cg = option.state & QStyle::State_Enabled ? QPalette::Normal : QPalette::Disabled;
if (cg == QPalette::Normal && !(option.state & QStyle::State_Active)) {
cg = QPalette::Inactive;
}
if (option.state & QStyle::State_Selected) {
painter->fillRect(rect, option.palette.brush(cg, QPalette::Highlight));
painter->setPen(option.palette.color(cg, QPalette::HighlightedText));
}
else {
painter->setPen(option.palette.color(cg, QPalette::Text));
}
QTextDocument textDocument;
textDocument.setHtml(text);
@ -42,27 +57,32 @@ void PluginListDelegate::drawDisplay(QPainter* painter, const QStyleOptionViewIt
textLayout.beginLayout();
qreal height = 0;
while (1) {
QTextLine line = textLayout.createLine();
if (!line.isValid()) {
break;
}
QTextLine line = textLayout.createLine();
while (line.isValid()) {
line.setLineWidth(textRect.width());
height += 3;
line.setPosition(QPoint(0, height));
height += line.height();
}
textLayout.endLayout();
line = textLayout.createLine();
}
textLayout.endLayout();
textLayout.draw(painter, QPointF(textRect.left(), textRect.top()));
}
QSize PluginListDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QSize size = QItemDelegate::sizeHint(option, index);
size.setWidth(m_listWidget->width() - 5);
size.setHeight(option.fontMetrics.height() * 4);
Q_UNUSED(index)
const int textMargin = QApplication::style()->pixelMetric(QStyle::PM_FocusFrameHMargin, 0) + 1;
QSize size;
size.setWidth(m_listWidget->width() - 10);
// ( height of font * 3 = 3 lines ) + ( text margins ) + ( 2 free lines = every line is 3px )
size.setHeight((option.fontMetrics.height() * 3) + (textMargin * 2) + (2 * 3));
return size;
}

View File

@ -50,7 +50,7 @@ PluginsList::PluginsList(QWidget* parent)
connect(ui->list, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(itemChanged(QListWidgetItem*)));
connect(ui->allowAppPlugins, SIGNAL(clicked(bool)), this, SLOT(allowAppPluginsChanged(bool)));
ui->list->setItemDelegateForColumn(0, new PluginListDelegate(ui->list));
ui->list->setItemDelegate(new PluginListDelegate(ui->list));
//WebKit Plugins
connect(ui->add, SIGNAL(clicked()), this, SLOT(addWhitelist()));
@ -154,7 +154,7 @@ void PluginsList::refresh()
PluginSpec spec = plugin.pluginSpec;
QListWidgetItem* item = new QListWidgetItem(ui->list);
QString pluginInfo = QString("<b>%1</b> %2 (%3)<br/>%4<br/>%5").arg(spec.name, spec.version, spec.author, spec.info, spec.description);
QString pluginInfo = QString("<b>%1</b> %2 (%3)<br/>\n%4<br/>\n%5\n").arg(spec.name, spec.version, spec.author, spec.info, spec.description);
item->setText(pluginInfo);

View File

@ -146,7 +146,7 @@ Preferences::Preferences(QupZilla* mainClass, QWidget* parent)
startProfileIndexChanged(ui->startProfile->currentText());
//APPEREANCE
m_themesManager = new ThemeManager(ui->themesWidget);
m_themesManager = new ThemeManager(ui->themesWidget, this);
settings.beginGroup("Browser-View-Settings");
ui->showStatusbar->setChecked(settings.value("showStatusBar", true).toBool());
ui->showBookmarksToolbar->setChecked(p_QupZilla->bookmarksToolbar()->isVisible());

View File

@ -20,6 +20,8 @@
#include "mainapplication.h"
#include "globalfunctions.h"
#include "settings.h"
#include "licenseviewer.h"
#include "preferences.h"
#include <QTextBrowser>
#include <QDir>
@ -30,9 +32,10 @@
#define DEFAULT_THEME_NAME "linux"
#endif
ThemeManager::ThemeManager(QWidget* parent)
ThemeManager::ThemeManager(QWidget* parent, Preferences* preferences)
: QWidget()
, ui(new Ui::ThemeManager)
, m_preferences(preferences)
{
ui->setupUi(parent);
ui->license->hide();
@ -78,14 +81,9 @@ void ThemeManager::showLicense()
Theme currentTheme = m_themeHash[currentItem->data(Qt::UserRole).toString()];
QTextBrowser* b = new QTextBrowser();
b->setAttribute(Qt::WA_DeleteOnClose);
b->setWindowTitle(tr("License Viewer"));
// b->move(mapToGlobal(parent()->pos()));
b->resize(450, 500);
b->setText(currentTheme.license);
qz_centerWidgetOnScreen(b);
b->show();
LicenseViewer* v = new LicenseViewer(m_preferences);
v->setText(currentTheme.license);
v->show();
}
void ThemeManager::currentChanged()

View File

@ -30,12 +30,14 @@ namespace Ui
class ThemeManager;
}
class Preferences;
class QT_QUPZILLA_EXPORT ThemeManager : public QWidget
{
Q_OBJECT
public:
explicit ThemeManager(QWidget* parent);
explicit ThemeManager(QWidget* parent, Preferences* preferences);
~ThemeManager();
void save();
@ -58,6 +60,8 @@ private:
Theme parseTheme(const QString &name);
Ui::ThemeManager* ui;
Preferences* m_preferences;
QString m_activeTheme;
QHash<QString, Theme> m_themeHash;
};

View File

@ -28,6 +28,12 @@ RssIcon::RssIcon(QWidget* parent)
setVisible(false);
}
void RssIcon::contextMenuEvent(QContextMenuEvent* ev)
{
// Prevent propagating to LocationBar
ev->accept();
}
void RssIcon::mousePressEvent(QMouseEvent* ev)
{
ClickableLabel::mousePressEvent(ev);

View File

@ -28,6 +28,7 @@ public:
explicit RssIcon(QWidget* parent = 0);
private:
void contextMenuEvent(QContextMenuEvent* ev);
void mousePressEvent(QMouseEvent* ev);
};

View File

@ -207,7 +207,8 @@ QString qz_getFileNameFromUrl(const QUrl &url)
fileName = fileName.mid(pos);
fileName.remove("/");
}
return fileName;
return qz_filterCharsFromFilename(fileName);
}
QString qz_filterCharsFromFilename(const QString &name)

View File

@ -33,6 +33,8 @@ void IconFetcher::fetchIcon(const QUrl &url)
FollowRedirectReply* reply = new FollowRedirectReply(url, m_manager);
connect(reply, SIGNAL(finished()), this, SLOT(pageDownloaded()));
m_url = url;
}
void IconFetcher::pageDownloaded()
@ -95,9 +97,8 @@ void IconFetcher::iconDownloaded()
if (!response.isEmpty()) {
QImage image;
image.loadFromData(response);
QIcon icon = QIcon(QPixmap::fromImage(image));
if (!icon.isNull()) {
emit iconFetched(icon);
if (!image.isNull()) {
emit iconFetched(image);
}
}

View File

@ -22,6 +22,8 @@
#include <QObject>
#include <QIcon>
#include <QVariant>
#include <QUrl>
class QNetworkAccessManager;
class QUrl;
@ -36,8 +38,13 @@ public:
void setNetworkAccessManager(QNetworkAccessManager* manager) { m_manager = manager; }
void fetchIcon(const QUrl &url);
void setData(const QVariant &data) { m_data = data; }
QVariant data() { return m_data; }
QUrl url() { return m_url; }
signals:
void iconFetched(QIcon);
void iconFetched(QImage);
void finished();
public slots:
@ -49,6 +56,9 @@ private slots:
private:
QNetworkAccessManager* m_manager;
QVariant m_data;
QUrl m_url;
};
#endif // ICONFETCHER_H

View File

@ -118,7 +118,7 @@ void PageThumbnailer::createThumbnail(bool status)
m_title = m_page->mainFrame()->title();
QImage image(m_page->viewportSize(), QImage::Format_ARGB32);
QImage image(m_page->viewportSize(), QImage::Format_ARGB32_Premultiplied);
QPainter painter(&image);
m_page->mainFrame()->render(&painter);
painter.end();

View File

@ -138,9 +138,12 @@ SiteInfo::SiteInfo(WebView* view, QWidget* parent)
connect(ui->listWidget, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(itemChanged(QListWidgetItem*)));
connect(ui->secDetailsButton, SIGNAL(clicked()), this, SLOT(securityDetailsClicked()));
connect(ui->saveButton, SIGNAL(clicked(QAbstractButton*)), this, SLOT(downloadImage()));
connect(ui->treeImages, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(showImagePreview(QTreeWidgetItem*)));
ui->treeImages->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->treeImages, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(imagesCustomContextMenuRequested(const QPoint &)));
ui->treeImages->setContextMenuPolicy(Qt::CustomContextMenu);
}
void SiteInfo::imagesCustomContextMenuRequested(const QPoint &p)
@ -154,7 +157,7 @@ void SiteInfo::imagesCustomContextMenuRequested(const QPoint &p)
menu.addAction(QIcon::fromTheme("edit-copy"), tr("Copy Image Location"), this, SLOT(copyActionData()))->setData(item->text(1));
menu.addAction(tr("Copy Image Name"), this, SLOT(copyActionData()))->setData(item->text(0));
menu.addSeparator();
menu.addAction(QIcon::fromTheme("document-save"), tr("Save Image to Disk"), this, SLOT(downloadImage()))->setData(ui->treeImages->indexOfTopLevelItem(item));
menu.addAction(QIcon::fromTheme("document-save"), tr("Save Image to Disk"), this, SLOT(downloadImage()));
menu.exec(QCursor::pos());
}
@ -167,28 +170,26 @@ void SiteInfo::copyActionData()
void SiteInfo::downloadImage()
{
if (QAction* action = qobject_cast<QAction*>(sender())) {
QTreeWidgetItem* item = ui->treeImages->topLevelItem(action->data().toInt());
if (!item) {
return;
}
QTreeWidgetItem* item = ui->treeImages->currentItem();
if (!item) {
return;
}
if (m_activePixmap.isNull()) {
QMessageBox::warning(this, tr("Error!"), tr("This preview is not available!"));
return;
}
if (m_activePixmap.isNull()) {
QMessageBox::warning(this, tr("Error!"), tr("This preview is not available!"));
return;
}
QString imageFileName = qz_getFileNameFromUrl(QUrl(item->text(1)));
QString imageFileName = qz_getFileNameFromUrl(QUrl(item->text(1)));
QString filePath = QFileDialog::getSaveFileName(this, tr("Save image..."), QDir::homePath() + "/" + imageFileName);
if (filePath.isEmpty()) {
return;
}
QString filePath = QFileDialog::getSaveFileName(this, tr("Save image..."), QDir::homePath() + "/" + imageFileName);
if (filePath.isEmpty()) {
return;
}
if (!m_activePixmap.save(filePath)) {
QMessageBox::critical(this, tr("Error!"), tr("Cannot write to file!"));
return;
}
if (!m_activePixmap.save(filePath)) {
QMessageBox::critical(this, tr("Error!"), tr("Cannot write to file!"));
return;
}
}

View File

@ -7,40 +7,14 @@
<x>0</x>
<y>0</y>
<width>590</width>
<height>455</height>
<height>492</height>
</rect>
</property>
<property name="windowTitle">
<string>Site Info</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="6" column="1">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="SqueezeLabelV2" name="heading">
<property name="maximumSize">
<size>
<width>550</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="0" column="1">
<item row="0" column="0">
<widget class="QListWidget" name="listWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
@ -101,7 +75,23 @@
</item>
</widget>
</item>
<item row="4" column="1">
<item row="1" column="0">
<widget class="SqueezeLabelV2" name="heading">
<property name="maximumSize">
<size>
<width>550</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QStackedWidget" name="stackedWidget">
<property name="currentIndex">
<number>0</number>
@ -279,35 +269,48 @@
</layout>
</widget>
<widget class="QWidget" name="page_3">
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QSplitter" name="splitter">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<widget class="QTreeWidget" name="treeImages">
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="itemsExpandable">
<bool>false</bool>
</property>
<attribute name="headerMinimumSectionSize">
<number>200</number>
</attribute>
<column>
<property name="text">
<string>Image</string>
</property>
</column>
<column>
<property name="text">
<string>Image address</string>
</property>
</column>
<widget class="QWidget" name="verticalLayoutWidget">
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QTreeWidget" name="treeImages">
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="itemsExpandable">
<bool>false</bool>
</property>
<attribute name="headerMinimumSectionSize">
<number>200</number>
</attribute>
<column>
<property name="text">
<string>Image</string>
</property>
</column>
<column>
<property name="text">
<string>Image address</string>
</property>
</column>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="saveButton">
<property name="standardButtons">
<set>QDialogButtonBox::Save</set>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="layoutWidget">
<layout class="QVBoxLayout" name="verticalLayout">
@ -371,6 +374,16 @@
</widget>
</widget>
</item>
<item row="3" column="0">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>

View File

@ -23,6 +23,8 @@
#include "toolbutton.h"
#include "settings.h"
#include "tabbedwebview.h"
#include "mainapplication.h"
#include "pluginproxy.h"
#include <QMenu>
#include <QApplication>
@ -57,6 +59,8 @@ TabBar::TabBar(QupZilla* mainClass, TabWidget* tabWidget)
setFocusPolicy(Qt::NoFocus);
loadSettings();
setAcceptDrops(true);
connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(contextMenuRequested(const QPoint &)));
connect(m_tabWidget, SIGNAL(pinnedTabClosed()), this, SLOT(pinnedTabClosed()));
connect(m_tabWidget, SIGNAL(pinnedTabAdded()), this, SLOT(pinnedTabAdded()));
@ -328,8 +332,26 @@ int TabBar::normalTabsCount()
return count() - m_pinnedTabsCount;
}
void TabBar::mouseDoubleClickEvent(QMouseEvent* event)
{
if (mApp->plugins()->processMouseDoubleClick(Qz::ON_TabBar, this, event)) {
return;
}
if (event->button() == Qt::LeftButton && tabAt(event->pos()) == -1) {
m_tabWidget->addView(QUrl(), Qz::NT_SelectedTabAtTheEnd, true);
return;
}
QTabBar::mouseDoubleClickEvent(event);
}
void TabBar::mousePressEvent(QMouseEvent* event)
{
if (mApp->plugins()->processMousePress(Qz::ON_TabBar, this, event)) {
return;
}
if (event->buttons() & Qt::LeftButton && tabAt(event->pos()) != -1) {
m_dragStartPosition = mapFromGlobal(event->globalPos());
}
@ -342,6 +364,10 @@ void TabBar::mousePressEvent(QMouseEvent* event)
void TabBar::mouseMoveEvent(QMouseEvent* event)
{
if (mApp->plugins()->processMouseMove(Qz::ON_TabBar, this, event)) {
return;
}
if (!m_dragStartPosition.isNull() && m_tabWidget->buttonAddTab()->isVisible()) {
int manhattanLength = (event->pos() - m_dragStartPosition).manhattanLength();
if (manhattanLength > QApplication::startDragDistance()) {
@ -352,18 +378,12 @@ void TabBar::mouseMoveEvent(QMouseEvent* event)
QTabBar::mouseMoveEvent(event);
}
void TabBar::mouseDoubleClickEvent(QMouseEvent* event)
void TabBar::mouseReleaseEvent(QMouseEvent* event)
{
if (event->button() == Qt::LeftButton && tabAt(event->pos()) == -1) {
m_tabWidget->addView(QUrl(), Qz::NT_SelectedTabAtTheEnd, true);
if (mApp->plugins()->processMouseRelease(Qz::ON_TabBar, this, event)) {
return;
}
QTabBar::mouseDoubleClickEvent(event);
}
void TabBar::mouseReleaseEvent(QMouseEvent* event)
{
if (m_tabWidget->buttonAddTab()->isHidden()) {
QTimer::singleShot(500, m_tabWidget->buttonAddTab(), SLOT(show()));
}
@ -386,6 +406,38 @@ void TabBar::mouseReleaseEvent(QMouseEvent* event)
QTabBar::mouseReleaseEvent(event);
}
void TabBar::dragEnterEvent(QDragEnterEvent* event)
{
const QMimeData* mime = event->mimeData();
if (mime->hasUrls()) {
event->acceptProposedAction();
return;
}
QTabBar::dragEnterEvent(event);
}
void TabBar::dropEvent(QDropEvent* event)
{
const QMimeData* mime = event->mimeData();
if (!mime->hasUrls()) {
QTabBar::dropEvent(event);
return;
}
int index = tabAt(event->pos());
if (index == -1) {
foreach(const QUrl & url, mime->urls()) {
m_tabWidget->addView(url, Qz::NT_SelectedTabAtTheEnd);
}
}
else {
p_QupZilla->weView(index)->load(mime->urls().first());
}
}
void TabBar::disconnectObjects()
{
disconnect(this);

View File

@ -79,10 +79,14 @@ private slots:
void closeCurrentTab();
private:
void mouseDoubleClickEvent(QMouseEvent* event);
void mousePressEvent(QMouseEvent* event);
void mouseMoveEvent(QMouseEvent* event);
void mouseDoubleClickEvent(QMouseEvent* event);
void mouseReleaseEvent(QMouseEvent* event);
void dragEnterEvent(QDragEnterEvent* event);
void dropEvent(QDropEvent* event);
QSize tabSizeHint(int index) const;
// void tabInserted(int index);

View File

@ -374,6 +374,7 @@ void TabbedWebView::mouseMoveEvent(QMouseEvent* event)
p_QupZilla->showNavigationWithFullscreen();
}
}
WebView::mouseMoveEvent(event);
}
@ -381,6 +382,15 @@ void TabbedWebView::disconnectObjects()
{
disconnect(this);
disconnect(p_QupZilla->statusBar());
WebView::disconnectObjects();
}
void TabbedWebView::fakePageLoading(int progress)
{
WebView::slotLoadStarted();
slotLoadStarted();
loadingProgress(progress);
}
TabbedWebView::~TabbedWebView()

View File

@ -50,9 +50,10 @@ public:
bool hasRss() { return m_hasRss; }
QWidget* overlayForJsAlert();
void disconnectObjects();
void fakePageLoading(int progress);
signals:
void wantsCloseTab(int);
void ipChanged(QString);

View File

@ -15,11 +15,11 @@
* 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 "tabwidget.h"
#include "tabbar.h"
#include "tabbedwebview.h"
#include "webpage.h"
#include "qupzilla.h"
#include "tabwidget.h"
#include "tabbar.h"
#include "iconprovider.h"
#include "mainapplication.h"
#include "webtab.h"
@ -27,7 +27,6 @@
#include "closedtabsmanager.h"
#include "progressbar.h"
#include "navigationbar.h"
#include "toolbutton.h"
#include "locationbar.h"
#include "websearchbar.h"
#include "settings.h"
@ -37,71 +36,45 @@
#include <QMenu>
#include <QStackedWidget>
#include <QWebHistory>
#include <QFile>
class QT_QUPZILLA_EXPORT NewTabButton : public QToolButton
AddTabButton::AddTabButton(TabWidget* tabWidget, TabBar* tabBar)
: ToolButton(tabWidget)
, m_tabBar(tabBar)
, m_tabWidget(tabWidget)
{
public:
explicit NewTabButton(QWidget* parent) : QToolButton(parent) {
#ifndef Q_WS_WIN
setIcon(QIcon::fromTheme("list-add"));
setIconSize(QSize(16, 16));
setAutoRaise(true);
#endif
}
QSize sizeHint() const {
QSize siz = QToolButton::sizeHint();
siz.setWidth(26);
return siz;
}
setObjectName("tabwidget-button-addtab");
setAutoRaise(true);
setFocusPolicy(Qt::NoFocus);
setAcceptDrops(true);
setToolTip(TabWidget::tr("New Tab"));
}
#ifdef Q_WS_WIN
private:
void paintEvent(QPaintEvent*) {
QPainter p(this);
QStyleOptionTabV3 opt;
opt.init(this);
style()->drawControl(QStyle::CE_TabBarTab, &opt, &p, this);
QPixmap pix(":/icons/other/list-add.png");
QRect r = this->rect();
r.setHeight(r.height() + 3);
r.setWidth(r.width() + 3);
style()->drawItemPixmap(&p, r, Qt::AlignCenter, pix);
}
#endif
};
class QT_QUPZILLA_EXPORT TabListButton : public QToolButton
void AddTabButton::dragEnterEvent(QDragEnterEvent* event)
{
public:
explicit TabListButton(QWidget* parent) : QToolButton(parent) {
const QMimeData* mime = event->mimeData();
if (mime->hasUrls()) {
event->acceptProposedAction();
return;
}
QSize sizeHint() const {
QSize siz = QToolButton::sizeHint();
siz.setWidth(20);
return siz;
ToolButton::dragEnterEvent(event);
}
void AddTabButton::dropEvent(QDropEvent* event)
{
const QMimeData* mime = event->mimeData();
if (!mime->hasUrls()) {
ToolButton::dropEvent(event);
return;
}
private:
void paintEvent(QPaintEvent*) {
QPainter p(this);
QStyleOptionToolButton opt;
opt.init(this);
if (isDown()) {
opt.state |= QStyle::State_On;
}
if (opt.state & QStyle::State_MouseOver) {
opt.activeSubControls = QStyle::SC_ToolButton;
}
if (!isChecked() && !isDown()) {
opt.state |= QStyle::State_Raised;
}
opt.state |= QStyle::State_AutoRaise;
style()->drawComplexControl(QStyle::CC_ToolButton, &opt, &p, this);
foreach(const QUrl & url, mime->urls()) {
m_tabWidget->addView(url, Qz::NT_SelectedTabAtTheEnd);
}
};
}
TabWidget::TabWidget(QupZilla* mainClass, QWidget* parent)
: QTabWidget(parent)
@ -142,11 +115,7 @@ TabWidget::TabWidget(QupZilla* mainClass, QWidget* parent)
m_buttonListTabs->setAutoRaise(true);
m_buttonListTabs->setFocusPolicy(Qt::NoFocus);
m_buttonAddTab = new ToolButton(this);
m_buttonAddTab->setObjectName("tabwidget-button-addtab");
m_buttonAddTab->setAutoRaise(true);
m_buttonAddTab->setToolTip(tr("New Tab"));
m_buttonAddTab->setFocusPolicy(Qt::NoFocus);
m_buttonAddTab = new AddTabButton(this, m_tabBar);
connect(m_buttonAddTab, SIGNAL(clicked()), p_QupZilla, SLOT(addTab()));
connect(m_menuTabs, SIGNAL(aboutToShow()), this, SLOT(aboutToShowClosedTabsMenu()));
@ -755,8 +724,8 @@ bool TabWidget::restoreState(const QByteArray &state)
void TabWidget::disconnectObjects()
{
disconnect(this);
disconnect(p_QupZilla);
disconnect(mApp);
disconnect(p_QupZilla);
disconnect(p_QupZilla->ipLabel());
}

View File

@ -21,6 +21,7 @@
#include <QTabWidget>
#include <QUrl>
#include "toolbutton.h"
#include "qz_namespace.h"
class QStackedWidget;
@ -29,11 +30,22 @@ class QMenu;
class QupZilla;
class TabbedWebView;
class TabBar;
class TabWidget;
class WebTab;
class TabListButton;
class NewTabButton;
class ClosedTabsManager;
class ToolButton;
class QT_QUPZILLA_EXPORT AddTabButton : public ToolButton
{
public:
explicit AddTabButton(TabWidget* tabWidget, TabBar* tabBar);
private:
void dragEnterEvent(QDragEnterEvent* event);
void dropEvent(QDropEvent* event);
TabBar* m_tabBar;
TabWidget* m_tabWidget;
};
class QT_QUPZILLA_EXPORT TabWidget : public QTabWidget
{
@ -56,7 +68,7 @@ public:
QList<WebTab*> allTabs(bool withPinned = true);
QStackedWidget* locationBars() { return m_locationBars; }
ToolButton* buttonListTabs() { return m_buttonListTabs; }
ToolButton* buttonAddTab() { return m_buttonAddTab; }
AddTabButton* buttonAddTab() { return m_buttonAddTab; }
void createKeyPressEvent(QKeyEvent* event);
void showTabBar();
@ -114,7 +126,7 @@ private:
QMenu* m_menuTabs;
ToolButton* m_buttonListTabs;
ToolButton* m_buttonAddTab;
AddTabButton* m_buttonAddTab;
ClosedTabsManager* m_closedTabsManager;
QStackedWidget* m_locationBars;

View File

@ -60,6 +60,8 @@ WebView::WebView(QWidget* parent)
m_zoomLevels << 30 << 50 << 67 << 80 << 90 << 100 << 110 << 120 << 133 << 150 << 170 << 200 << 240 << 300;
qApp->installEventFilter(this);
mApp->plugins()->emitWebViewCreated(this);
}
QIcon WebView::icon() const
@ -778,6 +780,10 @@ void WebView::muteMedia()
void WebView::wheelEvent(QWheelEvent* event)
{
if (mApp->plugins()->processWheelEvent(Qz::ON_WebView, this, event)) {
return;
}
if (event->modifiers() & Qt::ControlModifier) {
int numDegrees = event->delta() / 8;
int numSteps = numDegrees / 15;
@ -1019,3 +1025,9 @@ bool WebView::eventFilter(QObject* obj, QEvent* event)
return QWebView::eventFilter(obj, event);
}
void WebView::disconnectObjects()
{
disconnect(this);
mApp->plugins()->emitWebViewDeleted(this);
}

View File

@ -43,6 +43,7 @@ public:
bool eventFilter(QObject* obj, QEvent* event);
virtual QWidget* overlayForJsAlert() = 0;
virtual void disconnectObjects();
static bool isUrlValid(const QUrl &url);
static QUrl guessUrlFromString(const QString &string);

View File

@ -16,8 +16,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* ============================================================ */
#include <QtGui/QApplication>
#include <QTextCodec>
#include <iostream>
#include "commandlineoptions.h"

View File

@ -0,0 +1,23 @@
QT += webkit
TARGET = AccessKeysNavigation
SOURCES = \
akn_plugin.cpp \
akn_handler.cpp \
akn_settings.cpp
HEADERS = \
akn_plugin.h \
akn_handler.h \
akn_settings.h
FORMS += \
akn_settings.ui
RESOURCES = akn_res.qrc
TRANSLATIONS = translations/cs_CZ.ts \
translations/sr_BA.ts \
translations/sr_RS.ts \
include(../../plugins.pri)

View File

@ -0,0 +1,337 @@
/* ============================================================
* Access Keys Navigation plugin for QupZilla
* Copyright (C) 2012 David Rosca <nowrep@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/>.
* ============================================================ */
/*
* Copyright 2008-2009 Benjamin C. Meyer <ben@meyerhome.net>
*
* 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) 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, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
#include "akn_handler.h"
#include "webview.h"
#include <QApplication>
#include <QSettings>
#include <QWebPage>
#include <QWebFrame>
#include <QLabel>
#include <QTimer>
#include <QToolTip>
Qt::Key keyFromCode(int code)
{
switch (code) {
case 0:
return Qt::Key_Control;
case 1:
return Qt::Key_Alt;
case 2:
return Qt::Key_Shift;
default:
// Using default shortcut
return Qt::Key_Control;
}
}
AKN_Handler::AKN_Handler(const QString &sPath, QObject* parent)
: QObject(parent)
, m_view(0)
, m_settingsPath(sPath)
{
loadSettings();
}
QString AKN_Handler::settingsPath()
{
return m_settingsPath;
}
void AKN_Handler::loadSettings()
{
QSettings settings(m_settingsPath, QSettings::IniFormat);
settings.beginGroup("AccessKeysNavigation");
m_key = keyFromCode(settings.value("Key", 0).toInt());
m_isDoublePress = settings.value("DoublePress", true).toBool();
settings.endGroup();
}
bool AKN_Handler::handleKeyPress(QObject* obj, QKeyEvent* event)
{
WebView* view = qobject_cast<WebView*>(obj);
if (!view) {
return false;
}
if (m_accessKeysVisible) {
handleAccessKey(event);
return true;
}
if (event->key() != m_key) {
return false;
}
m_view = view;
if (!m_isDoublePress) {
triggerShowAccessKeys();
}
else {
if (!m_lastKeyPressTime.isValid()) {
// It is the first press of our button
m_lastKeyPressTime = QTime::currentTime();
}
else {
// It is the second press of our button
if (QTime(m_lastKeyPressTime).addMSecs(500) >= QTime::currentTime()) {
triggerShowAccessKeys();
}
else {
m_lastKeyPressTime = QTime::currentTime();
}
}
}
return false;
}
bool AKN_Handler::eventFilter(QObject* obj, QEvent* event)
{
if (obj != m_view) {
return false;
}
switch (event->type()) {
case QEvent::Resize:
case QEvent::FocusOut:
case QEvent::Wheel:
hideAccessKeys();
break;
default:
break;
}
return false;
}
void AKN_Handler::triggerShowAccessKeys()
{
if (m_accessKeysVisible) {
hideAccessKeys();
}
else {
QTimer::singleShot(0, this, SLOT(showAccessKeys()));
}
}
void AKN_Handler::handleAccessKey(QKeyEvent* event)
{
if (event->key() == m_key) {
hideAccessKeys();
return;
}
QString text = event->text();
if (text.isEmpty()) {
return;
}
if (!m_view) {
return;
}
QChar key = text.at(0);
if (m_accessKeyNodes.contains(key)) {
QWebElement element = m_accessKeyNodes[key];
QPoint p = element.geometry().center();
QWebFrame* frame = element.webFrame();
if (!frame) {
return;
}
do {
p -= frame->scrollPosition();
frame = frame->parentFrame();
}
while (frame && frame != m_view->page()->mainFrame());
QMouseEvent pevent(QEvent::MouseButtonPress, p, Qt::LeftButton, 0, 0);
qApp->sendEvent(m_view, &pevent);
QMouseEvent revent(QEvent::MouseButtonRelease, p, Qt::LeftButton, 0, 0);
qApp->sendEvent(m_view, &revent);
hideAccessKeys();
}
}
void AKN_Handler::showAccessKeys()
{
if (!m_view) {
return;
}
QWebPage* page = m_view->page();
// Install event filter and connect loadStarted
m_accessKeysVisible = true;
qApp->installEventFilter(this);
connect(m_view, SIGNAL(loadStarted()), this, SLOT(hideAccessKeys()));
QStringList supportedElement;
supportedElement << QLatin1String("input")
<< QLatin1String("a")
<< QLatin1String("area")
<< QLatin1String("button")
<< QLatin1String("label")
<< QLatin1String("legend")
<< QLatin1String("textarea");
QList<QChar> unusedKeys;
for (char c = 'A'; c <= 'Z'; ++c) {
unusedKeys << QLatin1Char(c);
}
for (char c = '0'; c <= '9'; ++c) {
unusedKeys << QLatin1Char(c);
}
for (char c = 'a'; c <= 'z'; ++c) {
unusedKeys << QLatin1Char(c);
}
QRect viewport = QRect(page->mainFrame()->scrollPosition(), page->viewportSize());
// Priority first goes to elements with accesskey attributes
QList<QWebElement> alreadyLabeled;
foreach(const QString & elementType, supportedElement) {
QList<QWebElement> result = page->mainFrame()->findAllElements(elementType).toList();
foreach(const QWebElement & element, result) {
const QRect geometry = element.geometry();
if (geometry.size().isEmpty()
|| !viewport.contains(geometry.topLeft())) {
continue;
}
QString accessKeyAttribute = element.attribute(QLatin1String("accesskey")).toUpper();
if (accessKeyAttribute.isEmpty()) {
continue;
}
QChar accessKey;
for (int i = 0; i < accessKeyAttribute.count(); i += 2) {
const QChar &possibleAccessKey = accessKeyAttribute[i];
if (unusedKeys.contains(possibleAccessKey)) {
accessKey = possibleAccessKey;
break;
}
}
if (accessKey.isNull()) {
continue;
}
unusedKeys.removeOne(accessKey);
makeAccessKeyLabel(accessKey, element);
alreadyLabeled.append(element);
}
}
// Pick an access key first from the letters in the text and then from the
// list of unused access keys
foreach(const QString & elementType, supportedElement) {
QWebElementCollection result = page->mainFrame()->findAllElements(elementType);
foreach(const QWebElement & element, result) {
const QRect geometry = element.geometry();
if (unusedKeys.isEmpty()
|| alreadyLabeled.contains(element)
|| geometry.size().isEmpty()
|| !viewport.contains(geometry.topLeft())) {
continue;
}
QChar accessKey;
QString text = element.toPlainText().toUpper();
for (int i = 0; i < text.count(); ++i) {
const QChar &c = text.at(i);
if (unusedKeys.contains(c)) {
accessKey = c;
break;
}
}
if (accessKey.isNull()) {
accessKey = unusedKeys.takeFirst();
}
unusedKeys.removeOne(accessKey);
makeAccessKeyLabel(accessKey, element);
}
}
}
void AKN_Handler::hideAccessKeys()
{
if (!m_accessKeyLabels.isEmpty() && m_view) {
for (int i = 0; i < m_accessKeyLabels.count(); ++i) {
QLabel* label = m_accessKeyLabels[i];
label->hide();
label->deleteLater();
}
m_accessKeyLabels.clear();
m_accessKeyNodes.clear();
m_view->update();
// Uninstall event filter and disconnect loadStarted
qApp->removeEventFilter(this);
disconnect(m_view, SIGNAL(loadStarted()), this, SLOT(hideAccessKeys()));
}
m_accessKeysVisible = false;
}
void AKN_Handler::makeAccessKeyLabel(const QChar &accessKey, const QWebElement &element)
{
QLabel* label = new QLabel(m_view);
label->setText(QString(QLatin1String("<b>%1</b>")).arg(accessKey));
QPalette p = QToolTip::palette();
QColor color = QColor(220, 243, 253);
color.setAlpha(175);
p.setColor(QPalette::Window, color);
label->setPalette(p);
label->setAutoFillBackground(true);
label->setFrameStyle(QFrame::Box | QFrame::Plain);
QPoint point = element.geometry().center();
point -= m_view->page()->mainFrame()->scrollPosition();
label->move(point);
label->show();
point.setX(point.x() - label->width() / 2);
label->move(point);
m_accessKeyLabels.append(label);
m_accessKeyNodes[accessKey] = element;
}

View File

@ -0,0 +1,71 @@
/* ============================================================
* Access Keys Navigation plugin for QupZilla
* Copyright (C) 2012 David Rosca <nowrep@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/>.
* ============================================================ */
#ifndef AKN_HANDLER_H
#define AKN_HANDLER_H
#include <QObject>
#include <QTime>
#include <QHash>
#include <QWebElement>
class QKeyEvent;
class QWebElement;
class QTime;
class QLabel;
class WebView;
class AKN_Handler : public QObject
{
Q_OBJECT
public:
explicit AKN_Handler(const QString &sPath, QObject* parent = 0);
QString settingsPath();
void loadSettings();
bool handleKeyPress(QObject* obj, QKeyEvent* event);
bool eventFilter(QObject* obj, QEvent* event);
signals:
public slots:
private slots:
void showAccessKeys();
void hideAccessKeys();
private:
void triggerShowAccessKeys();
void makeAccessKeyLabel(const QChar &accessKey, const QWebElement &element);
void handleAccessKey(QKeyEvent* event);
WebView* m_view;
QList<QLabel*> m_accessKeyLabels;
QHash<QChar, QWebElement> m_accessKeyNodes;
bool m_accessKeysVisible;
Qt::Key m_key;
bool m_isDoublePress;
QTime m_lastKeyPressTime;
QString m_settingsPath;
};
#endif // AKN_HANDLER_H

View File

@ -0,0 +1,89 @@
/* ============================================================
* Access Keys Navigation plugin for QupZilla
* Copyright (C) 2012 David Rosca <nowrep@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 "akn_plugin.h"
#include "akn_handler.h"
#include "akn_settings.h"
#include "pluginproxy.h"
#include "qupzilla.h"
#include <QTranslator>
AKN_Plugin::AKN_Plugin()
: QObject()
, m_handler(0)
{
}
PluginSpec AKN_Plugin::pluginSpec()
{
PluginSpec spec;
spec.name = "Access Keys Navigation";
spec.info = "Access keys navigation for QupZilla";
spec.description = "Provides support for navigating in webpages by keyboard shortcuts";
spec.version = "0.1.0";
spec.author = "David Rosca <nowrep@gmail.com>";
spec.icon = QPixmap(":/accesskeysnavigation/data/icon.png");
spec.hasSettings = true;
return spec;
}
void AKN_Plugin::init(const QString &sPath)
{
m_handler = new AKN_Handler(sPath, this);
QZ_REGISTER_EVENT_HANDLER(PluginProxy::KeyPressHandler);
}
void AKN_Plugin::unload()
{
m_handler->deleteLater();
}
bool AKN_Plugin::testPlugin()
{
// Let's be sure, require latest version of QupZilla
return (QupZilla::VERSION == "1.1.8");
}
QTranslator* AKN_Plugin::getTranslator(const QString &locale)
{
QTranslator* translator = new QTranslator();
translator->load(":/accesskeysnavigation/locale/" + locale);
return translator;
}
void AKN_Plugin::showSettings(QWidget* parent)
{
AKN_Settings* settings = new AKN_Settings(m_handler, parent);
settings->setAttribute(Qt::WA_DeleteOnClose);
settings->show();
}
bool AKN_Plugin::keyPress(const Qz::ObjectName &type, QObject* obj, QKeyEvent* event)
{
if (type == Qz::ON_WebView) {
return m_handler->handleKeyPress(obj, event);
}
return false;
}
Q_EXPORT_PLUGIN2(AccessKeysNavigation, AKN_Plugin)

View File

@ -0,0 +1,47 @@
/* ============================================================
* Access Keys Navigation plugin for QupZilla
* Copyright (C) 2012 David Rosca <nowrep@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/>.
* ============================================================ */
#ifndef AKN_PLUGIN_H
#define AKN_PLUGIN_H
#include "plugininterface.h"
class AKN_Handler;
class AKN_Plugin : public QObject, public PluginInterface
{
Q_OBJECT
Q_INTERFACES(PluginInterface)
public:
AKN_Plugin();
PluginSpec pluginSpec();
void init(const QString &sPath);
void unload();
bool testPlugin();
QTranslator* getTranslator(const QString &locale);
void showSettings(QWidget* parent = 0);
bool keyPress(const Qz::ObjectName &type, QObject* obj, QKeyEvent* event);
private:
AKN_Handler* m_handler;
};
#endif // AKN_PLUGIN_H

View File

@ -0,0 +1,9 @@
<RCC>
<qresource prefix="/accesskeysnavigation">
<file>data/icon.png</file>
<file>data/copyright</file>
<file>locale/cs_CZ.qm</file>
<file>locale/sr_BA.qm</file>
<file>locale/sr_RS.qm</file>
</qresource>
</RCC>

View File

@ -0,0 +1,66 @@
/* ============================================================
* Access Keys Navigation plugin for QupZilla
* Copyright (C) 2012 David Rosca <nowrep@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 "akn_settings.h"
#include "ui_akn_settings.h"
#include "akn_handler.h"
#include "licenseviewer.h"
#include <QSettings>
#include <QTextBrowser>
AKN_Settings::AKN_Settings(AKN_Handler* handler, QWidget* parent)
: QDialog(parent)
, ui(new Ui::AKN_Settings)
, m_handler(handler)
, m_settingsPath(handler->settingsPath())
{
ui->setupUi(this);
QSettings settings(m_settingsPath, QSettings::IniFormat);
settings.beginGroup("AccessKeysNavigation");
ui->key->setCurrentIndex(settings.value("Key", 0).toInt());
ui->doubleClick->setChecked(settings.value("DoublePress", true).toBool());
settings.endGroup();
connect(ui->licence, SIGNAL(clicked()), this, SLOT(showLicence()));
connect(this, SIGNAL(accepted()), this, SLOT(dialogAccepted()));
}
void AKN_Settings::dialogAccepted()
{
QSettings settings(m_settingsPath, QSettings::IniFormat);
settings.beginGroup("AccessKeysNavigation");
settings.setValue("Key", ui->key->currentIndex());
settings.setValue("DoublePress", ui->doubleClick->isChecked());
settings.endGroup();
m_handler->loadSettings();
}
void AKN_Settings::showLicence()
{
LicenseViewer* v = new LicenseViewer(this);
v->setLicenseFile(":accesskeysnavigation/data/copyright");
v->show();
}
AKN_Settings::~AKN_Settings()
{
delete ui;
}

View File

@ -0,0 +1,49 @@
/* ============================================================
* Access Keys Navigation plugin for QupZilla
* Copyright (C) 2012 David Rosca <nowrep@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/>.
* ============================================================ */
#ifndef AKN_SETTINGS_H
#define AKN_SETTINGS_H
#include <QDialog>
namespace Ui
{
class AKN_Settings;
}
class AKN_Handler;
class AKN_Settings : public QDialog
{
Q_OBJECT
public:
explicit AKN_Settings(AKN_Handler* handler, QWidget* parent = 0);
~AKN_Settings();
private slots:
void dialogAccepted();
void showLicence();
private:
Ui::AKN_Settings* ui;
AKN_Handler* m_handler;
QString m_settingsPath;
};
#endif // AKN_SETTINGS_H

View File

@ -0,0 +1,144 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>AKN_Settings</class>
<widget class="QDialog" name="AKN_Settings">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>470</width>
<height>146</height>
</rect>
</property>
<property name="windowTitle">
<string>Access Keys Navigation</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="label">
<property name="text">
<string>&lt;h1&gt;Access Keys Navigation&lt;/h1&gt;</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="2">
<widget class="QComboBox" name="key">
<item>
<property name="text">
<string>Ctrl</string>
</property>
</item>
<item>
<property name="text">
<string>Alt</string>
</property>
</item>
<item>
<property name="text">
<string>Shift</string>
</property>
</item>
</widget>
</item>
<item row="1" column="2">
<widget class="QCheckBox" name="doubleClick">
<property name="text">
<string>Double press</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Key for showing access keys:</string>
</property>
</widget>
</item>
<item row="0" column="0">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="3">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="2" column="1">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QPushButton" name="licence">
<property name="text">
<string>Licence</string>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>AKN_Settings</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>AKN_Settings</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -0,0 +1,20 @@
Access Keys showing function is under following license:
/*
* Copyright 2008-2009 Benjamin C. Meyer <ben@meyerhome.net>
*
* 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) 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, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA
*/

Binary file not shown.

After

Width:  |  Height:  |  Size: 656 B

View File

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="cs_CZ">
<context>
<name>AKN_Settings</name>
<message>
<location filename="../akn_settings.ui" line="14"/>
<source>Access Keys Navigation</source>
<translation>Klávesové zkratky</translation>
</message>
<message>
<location filename="../akn_settings.ui" line="20"/>
<source>&lt;h1&gt;Access Keys Navigation&lt;/h1&gt;</source>
<translation>&lt;h1&gt;Klávesové zkratky&lt;/h1&gt;</translation>
</message>
<message>
<location filename="../akn_settings.ui" line="33"/>
<source>Ctrl</source>
<translation>Ctrl</translation>
</message>
<message>
<location filename="../akn_settings.ui" line="38"/>
<source>Alt</source>
<translation>Alt</translation>
</message>
<message>
<location filename="../akn_settings.ui" line="43"/>
<source>Shift</source>
<translation>Shift</translation>
</message>
<message>
<location filename="../akn_settings.ui" line="51"/>
<source>Double press</source>
<translation>Dvojitý stisk</translation>
</message>
<message>
<location filename="../akn_settings.ui" line="58"/>
<source>Key for showing access keys:</source>
<translation>Klávesa pro zobrazení zkratek:</translation>
</message>
<message>
<location filename="../akn_settings.ui" line="103"/>
<source>Licence</source>
<translation>Licence</translation>
</message>
</context>
</TS>

View File

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="de">
<context>
<name>AKN_Settings</name>
<message>
<location filename="../akn_settings.ui" line="14"/>
<source>Access Keys Navigation</source>
<translation>Tastennavigation</translation>
</message>
<message>
<location filename="../akn_settings.ui" line="20"/>
<source>&lt;h1&gt;Access Keys Navigation&lt;/h1&gt;</source>
<translation>&lt;h1&gt;Tastennavigation&lt;/h1&gt;</translation>
</message>
<message>
<location filename="../akn_settings.ui" line="33"/>
<source>Ctrl</source>
<translation>Strg</translation>
</message>
<message>
<location filename="../akn_settings.ui" line="38"/>
<source>Alt</source>
<translation>Alt</translation>
</message>
<message>
<location filename="../akn_settings.ui" line="43"/>
<source>Shift</source>
<translation>Umschalt</translation>
</message>
<message>
<location filename="../akn_settings.ui" line="51"/>
<source>Double press</source>
<translation>Doppelter Tastendruck</translation>
</message>
<message>
<location filename="../akn_settings.ui" line="58"/>
<source>Key for showing access keys:</source>
<translation>Anzeige der Tastennavigation mit:</translation>
</message>
<message>
<location filename="../akn_settings.ui" line="103"/>
<source>Licence</source>
<translation>Lizenz</translation>
</message>
</context>
</TS>

View File

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="sr_BA">
<context>
<name>AKN_Settings</name>
<message>
<location filename="../akn_settings.ui" line="14"/>
<source>Access Keys Navigation</source>
<translation>Навигација помоћу тастера приступа</translation>
</message>
<message>
<location filename="../akn_settings.ui" line="20"/>
<source>&lt;h1&gt;Access Keys Navigation&lt;/h1&gt;</source>
<translation>&lt;h1&gt;Навигација помоћу тастера приступа&lt;/h1&gt;</translation>
</message>
<message>
<location filename="../akn_settings.ui" line="33"/>
<source>Ctrl</source>
<translation>Ctrl</translation>
</message>
<message>
<location filename="../akn_settings.ui" line="38"/>
<source>Alt</source>
<translation>Alt</translation>
</message>
<message>
<location filename="../akn_settings.ui" line="43"/>
<source>Shift</source>
<translation>Shift</translation>
</message>
<message>
<location filename="../akn_settings.ui" line="51"/>
<source>Double press</source>
<translation>Двоструко</translation>
</message>
<message>
<location filename="../akn_settings.ui" line="58"/>
<source>Key for showing access keys:</source>
<translation>Активација приказа тастера приступа:</translation>
</message>
<message>
<location filename="../akn_settings.ui" line="103"/>
<source>Licence</source>
<translation>Лиценца</translation>
</message>
</context>
</TS>

View File

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="sr_RS">
<context>
<name>AKN_Settings</name>
<message>
<location filename="../akn_settings.ui" line="14"/>
<source>Access Keys Navigation</source>
<translation>Навигација помоћу тастера приступа</translation>
</message>
<message>
<location filename="../akn_settings.ui" line="20"/>
<source>&lt;h1&gt;Access Keys Navigation&lt;/h1&gt;</source>
<translation>&lt;h1&gt;Навигација помоћу тастера приступа&lt;/h1&gt;</translation>
</message>
<message>
<location filename="../akn_settings.ui" line="33"/>
<source>Ctrl</source>
<translation>Ctrl</translation>
</message>
<message>
<location filename="../akn_settings.ui" line="38"/>
<source>Alt</source>
<translation>Alt</translation>
</message>
<message>
<location filename="../akn_settings.ui" line="43"/>
<source>Shift</source>
<translation>Shift</translation>
</message>
<message>
<location filename="../akn_settings.ui" line="51"/>
<source>Double press</source>
<translation>Двоструко</translation>
</message>
<message>
<location filename="../akn_settings.ui" line="58"/>
<source>Key for showing access keys:</source>
<translation>Активација приказа тастера приступа:</translation>
</message>
<message>
<location filename="../akn_settings.ui" line="103"/>
<source>Licence</source>
<translation>Лиценца</translation>
</message>
</context>
</TS>

View File

@ -19,6 +19,9 @@ HEADERS = \
mousegesturesplugin.h \
mousegesturessettingsdialog.h
FORMS += \
mousegesturessettingsdialog.ui
RESOURCES = mousegestures.qrc
TRANSLATIONS = translations/cs_CZ.ts \
@ -28,6 +31,3 @@ TRANSLATIONS = translations/cs_CZ.ts \
translations/zh_TW.ts \
include(../../plugins.pri)
FORMS += \
mousegesturessettingsdialog.ui

View File

@ -1,11 +1,29 @@
/* ============================================================
* Mouse Gestures plugin for QupZilla
* Copyright (C) 2012 David Rosca <nowrep@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 "mousegestures.h"
#include "QjtMouseGestureFilter.h"
#include "QjtMouseGesture.h"
#include "webview.h"
#include "mainapplication.h"
#include "qupzilla.h"
#include "mousegesturessettingsdialog.h"
#include "QjtMouseGestureFilter.h"
#include "QjtMouseGesture.h"
MouseGestures::MouseGestures(QObject* parent) :
QObject(parent)
{

View File

@ -1,7 +1,23 @@
/* ============================================================
* Mouse Gestures plugin for QupZilla
* Copyright (C) 2012 David Rosca <nowrep@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/>.
* ============================================================ */
#ifndef MOUSEGESTURES_H
#define MOUSEGESTURES_H
#include <QDebug>
#include <QObject>
#include <QMouseEvent>

View File

@ -1,3 +1,20 @@
/* ============================================================
* Mouse Gestures plugin for QupZilla
* Copyright (C) 2012 David Rosca <nowrep@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 "mousegesturesplugin.h"
#include "pluginproxy.h"
#include "mousegestures.h"
@ -16,7 +33,7 @@ PluginSpec MouseGesturesPlugin::pluginSpec()
PluginSpec spec;
spec.name = "Mouse Gestures";
spec.info = "Mouse gestures for QupZilla";
spec.description = "Provides support for navigating by mouse gestures through webpages";
spec.description = "Provides support for navigating in webpages by mouse gestures";
spec.version = "0.1.0";
spec.author = "David Rosca <nowrep@gmail.com>";
spec.icon = QPixmap(":/mousegestures/data/icon.png");

View File

@ -1,3 +1,20 @@
/* ============================================================
* Mouse Gestures plugin for QupZilla
* Copyright (C) 2012 David Rosca <nowrep@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/>.
* ============================================================ */
#ifndef MOUSEGESTURESPLUGIN_H
#define MOUSEGESTURESPLUGIN_H

View File

@ -1,6 +1,23 @@
/* ============================================================
* Mouse Gestures plugin for QupZilla
* Copyright (C) 2012 David Rosca <nowrep@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 "mousegesturessettingsdialog.h"
#include "ui_mousegesturessettingsdialog.h"
#include "globalfunctions.h"
#include "licenseviewer.h"
MouseGesturesSettingsDialog::MouseGesturesSettingsDialog(QWidget* parent)
: QDialog(parent)
@ -19,11 +36,8 @@ MouseGesturesSettingsDialog::~MouseGesturesSettingsDialog()
void MouseGesturesSettingsDialog::showLicense()
{
QTextBrowser* b = new QTextBrowser();
b->setAttribute(Qt::WA_DeleteOnClose);
b->setWindowTitle(tr("License Viewer"));
b->resize(450, 500);
b->setText(qz_readAllFileContents(":mousegestures/data/copyright"));
qz_centerWidgetOnScreen(b);
b->show();
LicenseViewer* v = new LicenseViewer(this);
v->setLicenseFile(":mousegestures/data/copyright");
v->show();
}

View File

@ -1,3 +1,20 @@
/* ============================================================
* Mouse Gestures plugin for QupZilla
* Copyright (C) 2012 David Rosca <nowrep@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/>.
* ============================================================ */
#ifndef MOUSEGESTURESSETTINGSDIALOG_H
#define MOUSEGESTURESSETTINGSDIALOG_H

View File

@ -58,10 +58,5 @@
<source>License</source>
<translation>Licence</translation>
</message>
<message>
<location filename="../mousegesturessettingsdialog.cpp" line="24"/>
<source>License Viewer</source>
<translation>Prohlížeč licence</translation>
</message>
</context>
</TS>

View File

@ -58,10 +58,5 @@
<source>License</source>
<translation>Lizenz</translation>
</message>
<message>
<location filename="../mousegesturessettingsdialog.cpp" line="24"/>
<source>License Viewer</source>
<translation>Lizenz anzeigen</translation>
</message>
</context>
</TS>

View File

@ -58,10 +58,5 @@
<source>License</source>
<translation>Лиценца</translation>
</message>
<message>
<location filename="../mousegesturessettingsdialog.cpp" line="24"/>
<source>License Viewer</source>
<translation>Преглед лиценце</translation>
</message>
</context>
</TS>

View File

@ -58,10 +58,5 @@
<source>License</source>
<translation>Лиценца</translation>
</message>
<message>
<location filename="../mousegesturessettingsdialog.cpp" line="24"/>
<source>License Viewer</source>
<translation>Преглед лиценце</translation>
</message>
</context>
</TS>

View File

@ -58,10 +58,5 @@
<source>License</source>
<translation></translation>
</message>
<message>
<location filename="../mousegesturessettingsdialog.cpp" line="24"/>
<source>License Viewer</source>
<translation></translation>
</message>
</context>
</TS>

View File

@ -4,27 +4,27 @@
<context>
<name>TestPlugin</name>
<message>
<location filename="../testplugin.cpp" line="70"/>
<location filename="../testplugin.cpp" line="92"/>
<source>Close</source>
<translation>Zavřít</translation>
</message>
<message>
<location filename="../testplugin.cpp" line="81"/>
<location filename="../testplugin.cpp" line="103"/>
<source>Example Plugin Settings</source>
<translation>Nastavení ukázkového doplňku</translation>
</message>
<message>
<location filename="../testplugin.cpp" line="105"/>
<location filename="../testplugin.cpp" line="127"/>
<source>My first plugin action</source>
<translation>Moje první akce z doplňku</translation>
</message>
<message>
<location filename="../testplugin.cpp" line="117"/>
<location filename="../testplugin.cpp" line="139"/>
<source>Hello</source>
<translation>Ahoj</translation>
</message>
<message>
<location filename="../testplugin.cpp" line="117"/>
<location filename="../testplugin.cpp" line="139"/>
<source>First plugin action works :-)</source>
<translation>První akce funguje :-)</translation>
</message>

View File

@ -4,27 +4,27 @@
<context>
<name>TestPlugin</name>
<message>
<location filename="../testplugin.cpp" line="70"/>
<location filename="../testplugin.cpp" line="92"/>
<source>Close</source>
<translation>Schließen</translation>
</message>
<message>
<location filename="../testplugin.cpp" line="81"/>
<location filename="../testplugin.cpp" line="103"/>
<source>Example Plugin Settings</source>
<translation>Einstellungen des Beispiel-Plugins</translation>
</message>
<message>
<location filename="../testplugin.cpp" line="105"/>
<location filename="../testplugin.cpp" line="127"/>
<source>My first plugin action</source>
<translation>Meine erste Aktion</translation>
</message>
<message>
<location filename="../testplugin.cpp" line="117"/>
<location filename="../testplugin.cpp" line="139"/>
<source>Hello</source>
<translation>Hallo</translation>
</message>
<message>
<location filename="../testplugin.cpp" line="117"/>
<location filename="../testplugin.cpp" line="139"/>
<source>First plugin action works :-)</source>
<translation>Meine erste Aktion funktioniert :-)</translation>
</message>

View File

@ -4,27 +4,27 @@
<context>
<name>TestPlugin</name>
<message>
<location filename="../testplugin.cpp" line="70"/>
<location filename="../testplugin.cpp" line="92"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../testplugin.cpp" line="81"/>
<location filename="../testplugin.cpp" line="103"/>
<source>Example Plugin Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../testplugin.cpp" line="105"/>
<location filename="../testplugin.cpp" line="127"/>
<source>My first plugin action</source>
<translation>Η ενέργεια του πρώτου μου προσθέτου</translation>
</message>
<message>
<location filename="../testplugin.cpp" line="117"/>
<location filename="../testplugin.cpp" line="139"/>
<source>Hello</source>
<translation>Γεια</translation>
</message>
<message>
<location filename="../testplugin.cpp" line="117"/>
<location filename="../testplugin.cpp" line="139"/>
<source>First plugin action works :-)</source>
<translation>Η ενέργεια του πρώτου προσθέτου δουλεύει :-)</translation>
</message>

Some files were not shown because too many files have changed in this diff Show More