28#include <QDragEnterEvent>
33#include <QInputDialog>
38 , m_bookmarks(
mApp->bookmarks())
39 , m_clickedBookmark(nullptr)
42 setObjectName(
"bookmarksbar");
44 setContextMenuPolicy(Qt::CustomContextMenu);
46 m_layout =
new QHBoxLayout(
this);
47 auto contentsMargin = style()->pixelMetric(QStyle::PM_ToolBarItemMargin,
nullptr,
this)
48 + style()->pixelMetric(QStyle::PM_ToolBarFrameWidth,
nullptr,
this);
49 m_layout->setContentsMargins(contentsMargin, contentsMargin, contentsMargin, contentsMargin);
50 m_layout->setSpacing(style()->pixelMetric(QStyle::PM_ToolBarItemSpacing,
nullptr,
this));
53 m_updateTimer =
new QTimer(
this);
54 m_updateTimer->setInterval(300);
55 m_updateTimer->setSingleShot(
true);
56 connect(m_updateTimer, &QTimer::timeout,
this, &BookmarksToolbar::refresh);
63 connect(
this, &QWidget::customContextMenuRequested,
this, &BookmarksToolbar::contextMenuRequested);
68void BookmarksToolbar::contextMenuRequested(
const QPoint &pos)
71 m_clickedBookmark = button ? button->
bookmark() :
nullptr;
78 QAction* actNewFolder = menu.addAction(QIcon::fromTheme(
QSL(
"folder-new")), tr(
"New Folder"));
79 QAction* actEdit = menu.addAction(tr(
"Edit"));
80 QAction* actDelete = menu.addAction(QIcon::fromTheme(
QSL(
"edit-delete")), tr(
"Delete"));
82 m_actShowOnlyIcons = menu.addAction(tr(
"Show Only Icons"));
83 m_actShowOnlyIcons->setCheckable(
true);
86 m_actShowOnlyText = menu.addAction(tr(
"Show Only Text"));
87 m_actShowOnlyText->setCheckable(
true);
91 connect(actNewTab, &QAction::triggered,
this, &BookmarksToolbar::openBookmarkInNewTab);
92 connect(actNewWindow, &QAction::triggered,
this, &BookmarksToolbar::openBookmarkInNewWindow);
93 connect(actNewPrivateWindow, &QAction::triggered,
this, &BookmarksToolbar::openBookmarkInNewPrivateWindow);
94 connect(actNewFolder, &QAction::triggered,
this, &BookmarksToolbar::createNewFolder);
95 connect(actEdit, &QAction::triggered,
this, &BookmarksToolbar::editBookmark);
96 connect(actDelete, &QAction::triggered,
this, &BookmarksToolbar::deleteBookmark);
98 actEdit->setEnabled(m_clickedBookmark && m_bookmarks->
canBeModified(m_clickedBookmark));
99 actDelete->setEnabled(m_clickedBookmark && m_bookmarks->
canBeModified(m_clickedBookmark));
100 actNewTab->setEnabled(m_clickedBookmark && m_clickedBookmark->
isUrl());
101 actNewWindow->setEnabled(m_clickedBookmark && m_clickedBookmark->
isUrl());
102 actNewPrivateWindow->setEnabled(m_clickedBookmark && m_clickedBookmark->
isUrl());
104 menu.exec(mapToGlobal(pos));
111 m_clickedBookmark =
nullptr;
112 m_actShowOnlyIcons =
nullptr;
113 m_actShowOnlyText =
nullptr;
116void BookmarksToolbar::refresh()
122 const auto children = folder->
children();
127 m_layout->addStretch();
130void BookmarksToolbar::bookmarksChanged()
132 m_updateTimer->start();
135void BookmarksToolbar::showOnlyIconsChanged(
bool state)
137 if (
state && m_actShowOnlyText) {
138 m_actShowOnlyText->setChecked(
false);
141 for (
int i = 0;
i < m_layout->count(); ++
i) {
142 auto* b = qobject_cast<BookmarksToolbarButton*>(m_layout->itemAt(
i)->widget());
144 b->setShowOnlyIcon(
state);
149void BookmarksToolbar::showOnlyTextChanged(
bool state)
151 if (
state && m_actShowOnlyIcons) {
152 m_actShowOnlyIcons->setChecked(
false);
155 for (
int i = 0;
i < m_layout->count(); ++
i) {
156 auto* b = qobject_cast<BookmarksToolbarButton*>(m_layout->itemAt(
i)->widget());
158 b->setShowOnlyText(
state);
163void BookmarksToolbar::openBookmarkInNewTab()
165 if (m_clickedBookmark) {
170void BookmarksToolbar::openBookmarkInNewWindow()
172 if (m_clickedBookmark) {
177void BookmarksToolbar::openBookmarkInNewPrivateWindow()
179 if (m_clickedBookmark) {
184void BookmarksToolbar::createNewFolder()
186 QString name = QInputDialog::getText(
nullptr, tr(
"New Folder"), tr(
"Enter Folder Name:"));
188 if (!name.isEmpty()) {
191 if (m_clickedBookmark && m_clickedBookmark->
isFolder()) {
192 parent = m_clickedBookmark;
203void BookmarksToolbar::editBookmark()
205 if (m_clickedBookmark) {
211void BookmarksToolbar::deleteBookmark()
213 if (m_clickedBookmark) {
218void BookmarksToolbar::clear()
220 int count = m_layout->count();
222 for (
int i = 0;
i < count; ++
i) {
223 QLayoutItem* item = m_layout->takeAt(0);
224 delete item->widget();
228 Q_ASSERT(m_layout->isEmpty());
239 m_layout->addWidget(button);
244 return qobject_cast<BookmarksToolbarButton*>(QApplication::widgetAt(mapToGlobal(pos)));
247QSize BookmarksToolbar::minimumSizeHint()
const
249 QSize size = QWidget::minimumSizeHint();
250 size.setHeight(qMax(20, size.height()));
254void BookmarksToolbar::dropEvent(QDropEvent* e)
257 clearDropIndicator();
259 const QMimeData* mime = e->mimeData();
262 QWidget::dropEvent(e);
271 bookmark = bookmarkMime->item();
272 const int initialIndex = bookmark->
parent()->
children().indexOf(bookmark);
274 if (initialIndex < m_layout->indexOf(current)) {
278 const QUrl url = mime->urls().at(0);
279 const QString title = mime->hasText() ? mime->text() : QString::fromUtf8(url.toEncoded(QUrl::RemoveScheme));
293void BookmarksToolbar::dragEnterEvent(QDragEnterEvent* e)
295 const QMimeData* mime = e->mimeData();
298 e->acceptProposedAction();
302 QWidget::dragEnterEvent(e);
305void BookmarksToolbar::dragMoveEvent(QDragMoveEvent *e)
307 int eventX = e->position().toPoint().x();
309 m_dropPos = e->position().toPoint();
310 m_dropRow = m_layout->indexOf(button);
312 bool res = eventX - button->x() < button->x() + button->width() -eventX;
313 m_dropRow = res ? m_dropRow : m_dropRow + 1;
321void BookmarksToolbar::dragLeaveEvent(QDragLeaveEvent *e)
324 clearDropIndicator();
327void BookmarksToolbar::clearDropIndicator()
333void BookmarksToolbar::paintEvent(QPaintEvent *p)
335 QWidget::paintEvent(p);
338 if (m_dropRow != -1) {
344 const QRect tr = QRect(button->x(), 0, button->width(), height());
347 if (m_dropRow == m_layout->indexOf(button)) {
348 r = QRect(qMax(0, tr.left() - 2), tr.top(), 3, tr.height());
350 r = QRect(tr.right() + 0, tr.top(), 3, tr.height());
BookmarkItem * parent() const
QList< BookmarkItem * > children() const
void setUrl(const QUrl &url)
void setTitle(const QString &title)
void changeBookmark(BookmarkItem *item)
void bookmarkRemoved(BookmarkItem *item)
void showOnlyIconsInToolbarChanged(bool show)
void addBookmark(BookmarkItem *parent, BookmarkItem *item)
void setShowOnlyTextInToolbar(bool state)
bool showOnlyTextInToolbar() const
bool showOnlyIconsInToolbar() const
void bookmarkAdded(BookmarkItem *item)
void bookmarkChanged(BookmarkItem *item)
bool canBeModified(BookmarkItem *item) const
bool removeBookmark(BookmarkItem *item)
BookmarkItem * toolbarFolder() const
void insertBookmark(BookmarkItem *parent, int row, BookmarkItem *item)
void setShowOnlyIconsInToolbar(bool state)
void showOnlyTextInToolbarChanged(bool show)
static QIcon privateBrowsingIcon()
static QIcon newWindowIcon()
static QIcon newTabIcon()