diff --git a/src/lib/navigation/locationbar.cpp b/src/lib/navigation/locationbar.cpp index 784003846..808edf71f 100644 --- a/src/lib/navigation/locationbar.cpp +++ b/src/lib/navigation/locationbar.cpp @@ -50,6 +50,7 @@ LocationBar::LocationBar(QupZilla* mainClass) , m_holdingAlt(false) { setObjectName("locationbar"); + setDragEnabled(true); m_bookmarkIcon = new BookmarkIcon(p_QupZilla); m_goIcon = new GoIcon(this); diff --git a/src/lib/navigation/siteicon.cpp b/src/lib/navigation/siteicon.cpp index 1a9e2dc23..9e7426588 100644 --- a/src/lib/navigation/siteicon.cpp +++ b/src/lib/navigation/siteicon.cpp @@ -18,6 +18,7 @@ #include "siteicon.h" #include "locationbar.h" #include "tabbedwebview.h" +#include "globalfunctions.h" #include @@ -41,7 +42,7 @@ void SiteIcon::contextMenuEvent(QContextMenuEvent* e) void SiteIcon::mousePressEvent(QMouseEvent* e) { if (e->buttons() & Qt::LeftButton) { - m_dragStartPosition = mapFromGlobal(e->globalPos()); + m_dragStartPosition = e->pos(); } // Prevent propagating to LocationBar @@ -53,6 +54,7 @@ void SiteIcon::mousePressEvent(QMouseEvent* e) void SiteIcon::mouseMoveEvent(QMouseEvent* e) { if (!m_locationBar || !(e->buttons() & Qt::LeftButton)) { + ToolButton::mouseMoveEvent(e); return; } @@ -62,14 +64,17 @@ void SiteIcon::mouseMoveEvent(QMouseEvent* e) return; } + QUrl url = m_locationBar->webView()->url(); + QString title = m_locationBar->webView()->title(); + QDrag* drag = new QDrag(this); QMimeData* mime = new QMimeData; - mime->setUrls(QList() << m_locationBar->webView()->url()); - mime->setText(m_locationBar->webView()->title()); + mime->setUrls(QList() << url); + mime->setText(title); mime->setImageData(icon().pixmap(16, 16).toImage()); drag->setMimeData(mime); - drag->setPixmap(icon().pixmap(16, 16)); + drag->setPixmap(qz_createPixmapForSite(icon(), title, url.toString())); drag->exec(); } diff --git a/src/lib/navigation/websearchbar.cpp b/src/lib/navigation/websearchbar.cpp index 431b93a84..fdc0db1ff 100644 --- a/src/lib/navigation/websearchbar.cpp +++ b/src/lib/navigation/websearchbar.cpp @@ -56,6 +56,7 @@ WebSearchBar::WebSearchBar(QupZilla* mainClass, QWidget* parent) , m_reloadingEngines(false) { setObjectName("websearchbar"); + setDragEnabled(true); m_buttonSearch = new WebSearchBar_Button(this); diff --git a/src/lib/tools/globalfunctions.cpp b/src/lib/tools/globalfunctions.cpp index d1f66fd01..d2ecff106 100644 --- a/src/lib/tools/globalfunctions.cpp +++ b/src/lib/tools/globalfunctions.cpp @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -261,6 +262,42 @@ QString qz_alignTextToWidth(const QString &string, const QString &text, const QF return returnString; } +QPixmap qz_createPixmapForSite(const QIcon &icon, const QString &title, const QString &url) +{ + const QFontMetrics fontMetrics = QApplication::fontMetrics(); + const int padding = 4; + const int maxWidth = fontMetrics.width(title.length() > url.length() ? title : url) + 3 * padding + 16; + + const int width = qMin(maxWidth, 150); + const int height = fontMetrics.height() * 2 + fontMetrics.leading() + 2 * padding; + + QPixmap pixmap(width, height); + QPainter painter(&pixmap); + + // Draw background + QPen pen(Qt::black); + pen.setWidth(1); + painter.setPen(pen); + + painter.fillRect(QRect(0, 0, width, height), Qt::white); + painter.drawRect(0, 0, width - 1, height - 1); + + // Draw icon + QRect iconRect(0, 0, 16 + 2 * padding, height); + icon.paint(&painter, iconRect); + + // Draw title + QRect titleRect(iconRect.width(), padding, width - padding - iconRect.width(), fontMetrics.height()); + painter.drawText(titleRect, fontMetrics.elidedText(title, Qt::ElideRight, titleRect.width())); + + // Draw url + QRect urlRect(titleRect.x(), titleRect.bottom() + fontMetrics.leading(), titleRect.width(), titleRect.height()); + painter.setPen(QApplication::palette().color(QPalette::Link)); + painter.drawText(urlRect, fontMetrics.elidedText(url, Qt::ElideRight, urlRect.width())); + + return pixmap; +} + QString qz_buildSystem() { #ifdef Q_OS_LINUX diff --git a/src/lib/tools/globalfunctions.h b/src/lib/tools/globalfunctions.h index 9ee17528f..d9fec5842 100644 --- a/src/lib/tools/globalfunctions.h +++ b/src/lib/tools/globalfunctions.h @@ -22,6 +22,7 @@ class QFontMetrics; class QPixmap; +class QIcon; class QWidget; class QUrl; @@ -46,6 +47,8 @@ QString QT_QUPZILLA_EXPORT qz_filterCharsFromFilename(const QString &name); QString QT_QUPZILLA_EXPORT qz_alignTextToWidth(const QString &string, const QString &text, const QFontMetrics &metrics, int width); +QPixmap QT_QUPZILLA_EXPORT qz_createPixmapForSite(const QIcon &icon, const QString &title, const QString &url); + QString QT_QUPZILLA_EXPORT qz_buildSystem(); #endif // GLOBALFUNCTIONS_H