29#include <QStyleOptionButton>
32#include <QtGuiVersion>
35#define SEPARATOR_WIDTH 8
40 , m_bookmark(bookmark)
42 , m_showOnlyIcon(false)
63 return m_showOnlyIcon;
68 m_showOnlyIcon = show;
75 return m_showOnlyText;
80 m_showOnlyText = show;
88 if (!m_showOnlyText) {
95 else if (!m_showOnlyIcon) {
96 width +=
PADDING * 2 + fontMetrics().horizontalAdvance(m_bookmark->
title());
103 QSize s = QPushButton::sizeHint();
111 if (!m_showOnlyText) {
118 else if (!m_showOnlyIcon && menu()) {
122 QSize s = QPushButton::minimumSizeHint();
127void BookmarksToolbarButton::createMenu()
129 if (!menu()->isEmpty()) {
133 Menu* m = qobject_cast<Menu*>(menu());
139void BookmarksToolbarButton::menuAboutToShow()
141 Q_ASSERT(qobject_cast<Menu*>(sender()));
142 Menu *menu =
static_cast<Menu*
>(sender());
144 const auto menuActions = menu->actions();
145 for (QAction *action : menuActions) {
153void BookmarksToolbarButton::menuMiddleClicked(
Menu* menu)
160void BookmarksToolbarButton::bookmarkActivated(
BookmarkItem* item)
162 if (
auto* action = qobject_cast<QAction*>(sender())) {
163 item =
static_cast<BookmarkItem*
>(action->data().value<
void*>());
170void BookmarksToolbarButton::bookmarkCtrlActivated(
BookmarkItem* item)
172 if (
auto* action = qobject_cast<QAction*>(sender())) {
173 item =
static_cast<BookmarkItem*
>(action->data().value<
void*>());
177 openBookmarkInNewTab(item);
180void BookmarksToolbarButton::bookmarkShiftActivated(
BookmarkItem* item)
182 if (
auto* action = qobject_cast<QAction*>(sender())) {
183 item =
static_cast<BookmarkItem*
>(action->data().value<
void*>());
187 openBookmarkInNewWindow(item);
190void BookmarksToolbarButton::openFolder(
BookmarkItem* item)
199void BookmarksToolbarButton::openBookmark(
BookmarkItem* item)
201 Q_ASSERT(item->
isUrl());
208void BookmarksToolbarButton::openBookmarkInNewTab(
BookmarkItem* item)
210 Q_ASSERT(item->
isUrl());
217void BookmarksToolbarButton::openBookmarkInNewWindow(
BookmarkItem* item)
219 Q_ASSERT(item->
isUrl());
224void BookmarksToolbarButton::init()
226 Q_ASSERT(m_bookmark);
228 setFocusPolicy(Qt::NoFocus);
229 setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred);
230 setToolTip(createTooltip());
239QString BookmarksToolbarButton::createTooltip()
const
242 if (!m_bookmark->
urlString().isEmpty()) {
248 if (!m_bookmark->
title().isEmpty() && !m_bookmark->
url().isEmpty()) {
252 if (!m_bookmark->
title().isEmpty()) {
253 return m_bookmark->
title();
259void BookmarksToolbarButton::enterEvent(QEnterEvent* event)
261 QPushButton::enterEvent(event);
266void BookmarksToolbarButton::leaveEvent(QEvent* event)
268 QPushButton::leaveEvent(event);
273void BookmarksToolbarButton::mousePressEvent(QMouseEvent* event)
275 if (m_bookmark && m_bookmark->
isFolder()) {
276 if (event->buttons() == Qt::LeftButton && event->modifiers() == Qt::ControlModifier) {
277 openFolder(m_bookmark);
282 m_dragStartPosition =
event->position().toPoint();
284 QPushButton::mousePressEvent(event);
287void BookmarksToolbarButton::mouseReleaseEvent(QMouseEvent* event)
289 if (m_bookmark && rect().contains(event->position().toPoint())) {
290 Qt::MouseButton button =
event->button();
291 Qt::KeyboardModifiers modifiers =
event->modifiers();
293 if (m_bookmark->
isUrl()) {
294 if (button == Qt::LeftButton && modifiers == Qt::NoModifier) {
295 bookmarkActivated(m_bookmark);
297 else if (button == Qt::LeftButton && modifiers == Qt::ShiftModifier) {
298 bookmarkShiftActivated(m_bookmark);
300 else if (button == Qt::MiddleButton || modifiers == Qt::ControlModifier) {
301 bookmarkCtrlActivated(m_bookmark);
304 else if (m_bookmark->
isFolder() && button == Qt::MiddleButton) {
305 openFolder(m_bookmark);
309 QPushButton::mouseReleaseEvent(event);
312void BookmarksToolbarButton::mouseMoveEvent(QMouseEvent *event)
314 if ((event->position().toPoint() - m_dragStartPosition).manhattanLength() < QApplication::startDragDistance()) {
315 QPushButton::mouseMoveEvent(event);
321 auto *drag =
new QDrag(
this);
324 drag->setMimeData(mime);
325 drag->setPixmap(grab());
329void BookmarksToolbarButton::paintEvent(QPaintEvent* event)
339 opt.state |= QStyle::State_Horizontal;
340 style()->drawPrimitive(QStyle::PE_IndicatorToolBarSeparator, &opt, &p);
344 QStyleOptionButton option;
345 initStyleOption(&option);
348 option.features &= ~QStyleOptionButton::HasMenu;
351 if (isDown() || hitButton(mapFromGlobal(QCursor::pos()))) {
352 option.state |= QStyle::State_AutoRaise | QStyle::State_Raised;
353 style()->drawPrimitive(QStyle::PE_PanelButtonTool, &option, &p,
this);
356 const int shiftX = isDown() ? style()->pixelMetric(QStyle::PM_ButtonShiftHorizontal, &option,
this) : 0;
357 const int shiftY = isDown() ? style()->pixelMetric(QStyle::PM_ButtonShiftVertical, &option,
this) : 0;
359 const int height = option.rect.height();
360 const int center = height / 2 + option.rect.top() + shiftY;
362 const int iconSize = 16;
363 const int iconYPos = center - iconSize / 2;
365 int leftPosition =
PADDING + shiftX;
366 int rightPosition = option.rect.right() -
PADDING;
369 if (!m_showOnlyText) {
370 QRect iconRect(leftPosition, iconYPos, iconSize, iconSize);
371 p.drawPixmap(QStyle::visualRect(option.direction, option.rect, iconRect), m_bookmark->
icon().pixmap(iconSize));
372 leftPosition = iconRect.right() +
PADDING;
376 if (!m_showOnlyIcon && menu()) {
377 const int arrowSize = 8;
380 const QRect rect = QRect(rightPosition - 8, center - arrowSize / 2, arrowSize, arrowSize);
381 opt.rect = QStyle::visualRect(option.direction, option.rect, rect);
382 opt.state &= ~QStyle::State_MouseOver;
383 style()->drawPrimitive(QStyle::PE_IndicatorArrowDown, &opt, &p,
this);
384 rightPosition = rect.left() -
PADDING;
388 if (!m_showOnlyIcon) {
389 const int textWidth = rightPosition - leftPosition;
390 const int textYPos = center - fontMetrics().height() / 2;
391 const QString txt = fontMetrics().elidedText(m_bookmark->
title(), Qt::ElideRight, textWidth);
392 QRect textRect(leftPosition, textYPos, textWidth, fontMetrics().height());
393 style()->drawItemText(&p, QStyle::visualRect(option.direction, option.rect, textRect),
394 Qt::TextSingleLine | Qt::AlignCenter, option.palette,
true, txt);
398void BookmarksToolbarButton::dragEnterEvent(QDragEnterEvent *event)
400 const QMimeData* mime =
event->mimeData();
402 event->acceptProposedAction();
407 QPushButton::dragEnterEvent(event);
410void BookmarksToolbarButton::dragLeaveEvent(QDragLeaveEvent *event)
416void BookmarksToolbarButton::dropEvent(QDropEvent *event)
420 const QMimeData* mime =
event->mimeData();
422 QPushButton::dropEvent(event);
436 const QUrl url = mime->urls().at(0);
437 const QString title = mime->hasText() ? mime->text() : QString::fromUtf8(url.toEncoded(QUrl::RemoveScheme));
QString urlString() const
QString description() const
void setIcon(const QIcon &icon)
void setUrl(const QUrl &url)
void setTitle(const QString &title)