mirror of
https://invent.kde.org/network/falkon.git
synced 2024-12-20 10:46:35 +01:00
Fixed bad behaviour of QWebPage on leaveEvent.
- when leaving web widget, QWebPagePrivate generates fake mouse move event, but unfortunately with bad coordinates. So sometimes it just hovered a link and the link's url got stuck in status bar message.
This commit is contained in:
parent
dbfc09538c
commit
cf973c46fb
2
src/lib/3rdparty/lineedit.cpp
vendored
2
src/lib/3rdparty/lineedit.cpp
vendored
@ -162,7 +162,7 @@ void LineEdit::updateTextMargins()
|
||||
else {
|
||||
left = m_leftMargin;
|
||||
}
|
||||
int right = textMargin(LineEdit::RightSide);
|
||||
int right = textMargin(LineEdit::RightSide) + 3;
|
||||
int top = 0;
|
||||
int bottom = 0;
|
||||
setTextMargins(left, top, right, bottom);
|
||||
|
6
src/lib/3rdparty/lineedit.h
vendored
6
src/lib/3rdparty/lineedit.h
vendored
@ -71,13 +71,13 @@ public:
|
||||
|
||||
void setLeftMargin(int margin);
|
||||
|
||||
public slots:
|
||||
void updateTextMargins();
|
||||
|
||||
protected:
|
||||
void resizeEvent(QResizeEvent* event);
|
||||
bool event(QEvent* event);
|
||||
|
||||
protected slots:
|
||||
void updateTextMargins();
|
||||
|
||||
private:
|
||||
void init();
|
||||
void updateSideWidgetLocations();
|
||||
|
@ -150,6 +150,8 @@ void LocationBar::showGoButton()
|
||||
m_bookmarkIcon->hide();
|
||||
m_rssIcon->hide();
|
||||
m_goIcon->show();
|
||||
|
||||
updateTextMargins();
|
||||
}
|
||||
|
||||
void LocationBar::hideGoButton()
|
||||
@ -161,6 +163,8 @@ void LocationBar::hideGoButton()
|
||||
m_rssIcon->setVisible(m_rssIconVisible);
|
||||
m_bookmarkIcon->show();
|
||||
m_goIcon->hide();
|
||||
|
||||
updateTextMargins();
|
||||
}
|
||||
|
||||
void LocationBar::showMostVisited()
|
||||
@ -172,6 +176,7 @@ void LocationBar::showMostVisited()
|
||||
QKeyEvent event(QEvent::KeyPress, Qt::Key_unknown, Qt::NoModifier, QString(" "));
|
||||
keyPressEvent(&event);
|
||||
}
|
||||
|
||||
m_locationCompleter->showMostVisited();
|
||||
}
|
||||
|
||||
@ -196,6 +201,8 @@ void LocationBar::rssIconClicked()
|
||||
void LocationBar::showRSSIcon(bool state)
|
||||
{
|
||||
m_rssIcon->setVisible(state);
|
||||
|
||||
updateTextMargins();
|
||||
}
|
||||
|
||||
void LocationBar::showUrl(const QUrl &url)
|
||||
|
@ -31,12 +31,12 @@
|
||||
#include <QMessageBox>
|
||||
#include <QInputDialog>
|
||||
#include <QWebFrame>
|
||||
|
||||
#include <QTextEdit>
|
||||
#include <QTimer>
|
||||
|
||||
SourceViewer::SourceViewer(QWebFrame* frame, const QString &selectedHtml)
|
||||
: QWidget(0)
|
||||
, m_frame(frame)
|
||||
, m_selectedHtml(selectedHtml)
|
||||
{
|
||||
setAttribute(Qt::WA_DeleteOnClose);
|
||||
setWindowTitle(tr("Source of ") + frame->url().toString());
|
||||
@ -72,13 +72,12 @@ SourceViewer::SourceViewer(QWebFrame* frame, const QString &selectedHtml)
|
||||
menuBar->addMenu(menuFile);
|
||||
|
||||
QMenu* menuEdit = new QMenu(tr("Edit"));
|
||||
menuEdit->addAction(QIcon::fromTheme("edit-undo"), tr("Undo"), m_sourceEdit, SLOT(undo()))->setShortcut(QKeySequence("Ctrl+Z"));
|
||||
menuEdit->addAction(QIcon::fromTheme("edit-redo"), tr("Redo"), m_sourceEdit, SLOT(redo()))->setShortcut(QKeySequence("Ctrl+Shift+Z"));
|
||||
m_actionUndo = menuEdit->addAction(QIcon::fromTheme("edit-undo"), tr("Undo"), m_sourceEdit, SLOT(undo()));
|
||||
m_actionRedo = menuEdit->addAction(QIcon::fromTheme("edit-redo"), tr("Redo"), m_sourceEdit, SLOT(redo()));
|
||||
menuEdit->addSeparator();
|
||||
menuEdit->addAction(QIcon::fromTheme("edit-cut"), tr("Cut"), m_sourceEdit, SLOT(cut()))->setShortcut(QKeySequence("Ctrl+X"));
|
||||
menuEdit->addAction(QIcon::fromTheme("edit-copy"), tr("Copy"), m_sourceEdit, SLOT(copy()))->setShortcut(QKeySequence("Ctrl+C"));
|
||||
menuEdit->addAction(QIcon::fromTheme("edit-paste"), tr("Paste"), m_sourceEdit, SLOT(paste()))->setShortcut(QKeySequence("Ctrl+V"));
|
||||
menuEdit->addAction(QIcon::fromTheme("edit-delete"), tr("Delete"))->setShortcut(QKeySequence("Del"));
|
||||
m_actionCut = menuEdit->addAction(QIcon::fromTheme("edit-cut"), tr("Cut"), m_sourceEdit, SLOT(cut()));
|
||||
m_actionCopy = menuEdit->addAction(QIcon::fromTheme("edit-copy"), tr("Copy"), m_sourceEdit, SLOT(copy()));
|
||||
m_actionPaste = menuEdit->addAction(QIcon::fromTheme("edit-paste"), tr("Paste"), m_sourceEdit, SLOT(paste()));
|
||||
menuEdit->addSeparator();
|
||||
menuEdit->addAction(QIcon::fromTheme("edit-select-all"), tr("Select All"), m_sourceEdit, SLOT(selectAll()))->setShortcut(QKeySequence("Ctrl+A"));
|
||||
menuEdit->addAction(QIcon::fromTheme("edit-find"), tr("Find"), this, SLOT(findText()))->setShortcut(QKeySequence("Ctrl+F"));
|
||||
@ -86,6 +85,12 @@ SourceViewer::SourceViewer(QWebFrame* frame, const QString &selectedHtml)
|
||||
menuEdit->addAction(QIcon::fromTheme("go-jump"), tr("Go to Line..."), this, SLOT(goToLine()))->setShortcut(QKeySequence("Ctrl+L"));
|
||||
menuBar->addMenu(menuEdit);
|
||||
|
||||
m_actionUndo->setShortcut(QKeySequence("Ctrl+Z"));
|
||||
m_actionRedo->setShortcut(QKeySequence("Ctrl+Shift+Z"));
|
||||
m_actionCut->setShortcut(QKeySequence("Ctrl+X"));
|
||||
m_actionCopy->setShortcut(QKeySequence("Ctrl+C"));
|
||||
m_actionPaste->setShortcut(QKeySequence("Ctrl+V"));
|
||||
|
||||
QMenu* menuView = new QMenu(tr("View"));
|
||||
menuView->addAction(IconProvider::standardIcon(QStyle::SP_BrowserReload), tr("Reload"), this, SLOT(reload()))->setShortcut(QKeySequence("F5"));
|
||||
menuView->addSeparator();
|
||||
@ -96,11 +101,48 @@ SourceViewer::SourceViewer(QWebFrame* frame, const QString &selectedHtml)
|
||||
|
||||
qz_centerWidgetToParent(this, frame->page()->view());
|
||||
|
||||
m_sourceEdit->setPlainText(frame->toHtml());
|
||||
connect(m_sourceEdit, SIGNAL(copyAvailable(bool)), this, SLOT(copyAvailable(bool)));
|
||||
connect(m_sourceEdit, SIGNAL(redoAvailable(bool)), this, SLOT(redoAvailable(bool)));
|
||||
connect(m_sourceEdit, SIGNAL(undoAvailable(bool)), this, SLOT(undoAvailable(bool)));
|
||||
connect(menuEdit, SIGNAL(aboutToShow()), this, SLOT(pasteAvailable()));
|
||||
|
||||
QTimer::singleShot(0, this, SLOT(loadSource()));
|
||||
}
|
||||
|
||||
void SourceViewer::copyAvailable(bool yes)
|
||||
{
|
||||
m_actionCopy->setEnabled(yes);
|
||||
m_actionCut->setEnabled(yes);
|
||||
}
|
||||
|
||||
void SourceViewer::redoAvailable(bool available)
|
||||
{
|
||||
m_actionRedo->setEnabled(available);
|
||||
}
|
||||
|
||||
void SourceViewer::undoAvailable(bool available)
|
||||
{
|
||||
m_actionUndo->setEnabled(available);
|
||||
}
|
||||
|
||||
void SourceViewer::pasteAvailable()
|
||||
{
|
||||
m_actionPaste->setEnabled(m_sourceEdit->canPaste());
|
||||
}
|
||||
|
||||
void SourceViewer::loadSource()
|
||||
{
|
||||
m_actionUndo->setEnabled(false);
|
||||
m_actionRedo->setEnabled(false);
|
||||
m_actionCut->setEnabled(false);
|
||||
m_actionCopy->setEnabled(false);
|
||||
m_actionPaste->setEnabled(false);
|
||||
|
||||
m_sourceEdit->setPlainText(m_frame.data()->toHtml());
|
||||
|
||||
//Highlight selectedHtml
|
||||
if (!selectedHtml.isEmpty()) {
|
||||
m_sourceEdit->find(selectedHtml, QTextDocument::FindWholeWords);
|
||||
if (!m_selectedHtml.isEmpty()) {
|
||||
m_sourceEdit->find(m_selectedHtml, QTextDocument::FindWholeWords);
|
||||
}
|
||||
else {
|
||||
m_sourceEdit->moveCursor(QTextCursor::Start);
|
||||
|
@ -36,11 +36,13 @@ public:
|
||||
explicit SourceViewer(QWebFrame* frame, const QString &selectedHtml);
|
||||
PlainEditWithLines* sourceEdit() { return m_sourceEdit; }
|
||||
|
||||
signals:
|
||||
|
||||
public slots:
|
||||
|
||||
private slots:
|
||||
void copyAvailable(bool yes);
|
||||
void redoAvailable(bool available);
|
||||
void undoAvailable(bool available);
|
||||
void pasteAvailable();
|
||||
|
||||
void loadSource();
|
||||
void save();
|
||||
void findText();
|
||||
void reload();
|
||||
@ -53,6 +55,14 @@ private:
|
||||
PlainEditWithLines* m_sourceEdit;
|
||||
QWeakPointer<QWebFrame> m_frame;
|
||||
QStatusBar* m_statusBar;
|
||||
|
||||
QString m_selectedHtml;
|
||||
|
||||
QAction* m_actionUndo;
|
||||
QAction* m_actionRedo;
|
||||
QAction* m_actionCut;
|
||||
QAction* m_actionCopy;
|
||||
QAction* m_actionPaste;
|
||||
};
|
||||
|
||||
#endif // SOURCEVIEWER_H
|
||||
|
@ -30,7 +30,6 @@
|
||||
|
||||
TipLabel::TipLabel(QWidget* parent)
|
||||
: SqueezeLabelV1(parent)
|
||||
, p_QupZilla(0)
|
||||
, m_connected(false)
|
||||
{
|
||||
setWindowFlags(Qt::ToolTip);
|
||||
@ -44,21 +43,6 @@ TipLabel::TipLabel(QWidget* parent)
|
||||
qApp->installEventFilter(this);
|
||||
}
|
||||
|
||||
void TipLabel::setMainWindow(QupZilla* main)
|
||||
{
|
||||
p_QupZilla = main;
|
||||
}
|
||||
|
||||
void TipLabel::show()
|
||||
{
|
||||
if (p_QupZilla && !m_connected) {
|
||||
connect(p_QupZilla->tabWidget(), SIGNAL(currentChanged(int)), this, SLOT(hide()));
|
||||
m_connected = true;
|
||||
}
|
||||
|
||||
SqueezeLabelV1::show();
|
||||
}
|
||||
|
||||
void TipLabel::paintEvent(QPaintEvent* ev)
|
||||
{
|
||||
QStylePainter p(this);
|
||||
@ -97,7 +81,6 @@ StatusBarMessage::StatusBarMessage(QupZilla* mainClass)
|
||||
: p_QupZilla(mainClass)
|
||||
, m_statusBarText(new TipLabel(mainClass))
|
||||
{
|
||||
m_statusBarText->setMainWindow(p_QupZilla);
|
||||
}
|
||||
|
||||
void StatusBarMessage::showMessage(const QString &message)
|
||||
@ -128,10 +111,8 @@ void StatusBarMessage::showMessage(const QString &message)
|
||||
m_statusBarText->setMaximumWidth(view->width() - verticalScrollSize);
|
||||
m_statusBarText->resize(m_statusBarText->sizeHint());
|
||||
|
||||
QPoint position;
|
||||
position.setY(view->height() - horizontalScrollSize - m_statusBarText->height());
|
||||
|
||||
QRect statusRect = QRect(view->mapToGlobal(QPoint(0, position.y())), m_statusBarText->size());
|
||||
QPoint position(0, view->height() - horizontalScrollSize - m_statusBarText->height());
|
||||
const QRect &statusRect = QRect(view->mapToGlobal(QPoint(0, position.y())), m_statusBarText->size());
|
||||
|
||||
if (statusRect.contains(QCursor::pos())) {
|
||||
position.setY(position.y() - m_statusBarText->height());
|
||||
|
@ -31,10 +31,7 @@ class QT_QUPZILLA_EXPORT TipLabel : public SqueezeLabelV1
|
||||
public:
|
||||
TipLabel(QWidget* parent);
|
||||
|
||||
void setMainWindow(QupZilla* main);
|
||||
|
||||
bool eventFilter(QObject* o, QEvent* e);
|
||||
void show();
|
||||
|
||||
private:
|
||||
void paintEvent(QPaintEvent* ev);
|
||||
|
@ -294,6 +294,30 @@ void WebPage::featurePermissionRequested(QWebFrame* frame, const QWebPage::Featu
|
||||
}
|
||||
#endif
|
||||
|
||||
bool WebPage::event(QEvent *event)
|
||||
{
|
||||
if (event->type() == QEvent::Leave) {
|
||||
// QWebPagePrivate::leaveEvent():
|
||||
// Fake a mouse move event just outside of the widget, since all
|
||||
// the interesting mouse-out behavior like invalidating scrollbars
|
||||
// is handled by the WebKit event handler's mouseMoved function.
|
||||
|
||||
// However, its implementation fake mouse move event on QCursor::pos()
|
||||
// position that is in global screen coordinates. So instead of
|
||||
// really faking it, it just creates mouse move event somewhere in
|
||||
// page. It can for example focus a link, and then link url gets
|
||||
// stuck in status bar message.
|
||||
|
||||
// So we are faking mouse move event with proper coordinates for
|
||||
// so called "just outside of the widget" position
|
||||
|
||||
QMouseEvent fakeEvent(QEvent::MouseMove, QPoint(0, -1), Qt::NoButton, Qt::NoButton, Qt::NoModifier);
|
||||
return QWebPage::event(&fakeEvent);
|
||||
}
|
||||
|
||||
return QWebPage::event(event);
|
||||
}
|
||||
|
||||
void WebPage::setSSLCertificate(const QSslCertificate &cert)
|
||||
{
|
||||
// if (cert != m_SslCert)
|
||||
|
@ -95,6 +95,7 @@ private slots:
|
||||
#endif
|
||||
|
||||
protected:
|
||||
bool event(QEvent* event);
|
||||
QWebPage* createWindow(QWebPage::WebWindowType type);
|
||||
|
||||
private:
|
||||
|
Loading…
Reference in New Issue
Block a user