/* * This file is part of smolbote. It's copyrighted by the contributors recorded * in the version control history of the file, available from its original * location: git://neueland.iserlohn-fortress.net/smolbote.git * * SPDX-License-Identifier: GPL-3.0 */ #include "navigationbutton.h" #include #include NavigationButton::NavigationButton(Type type, QWidget *parent) : QToolButton(parent) { m_type = type; menu = new QMenu(this); switch (type) { case BackButton: setIcon(style()->standardIcon(QStyle::SP_ArrowBack)); setMenu(menu); connect(menu, &QMenu::aboutToShow, this, &NavigationButton::prepareMenu); break; case ForwardButton: setIcon(style()->standardIcon(QStyle::SP_ArrowForward)); setMenu(menu); connect(menu, &QMenu::aboutToShow, this, &NavigationButton::prepareMenu); break; case ReloadButton: setIcon(style()->standardIcon(QStyle::SP_BrowserReload)); break; case StopButton: setIcon(style()->standardIcon(QStyle::SP_BrowserStop)); break; } connect(this, &NavigationButton::clicked, this, &NavigationButton::doAction); } void NavigationButton::setView(WebView *view) { disconnect(loadStartedConnection); disconnect(loadFinishedConnection); m_view = view; if(m_type == BackButton || m_type == ForwardButton) { updateOnLoadFinished(); } loadStartedConnection = connect(view, &WebView::loadStarted, this, &NavigationButton::updateOnLoadStarted); loadFinishedConnection = connect(view, &WebView::loadFinished, this, &NavigationButton::updateOnLoadFinished); } void NavigationButton::updateOnLoadStarted() { switch (m_type) { case BackButton: break; case ForwardButton: break; case ReloadButton: m_type = StopButton; setIcon(style()->standardIcon(QStyle::SP_BrowserStop)); break; case StopButton: break; } } void NavigationButton::updateOnLoadFinished() { switch (m_type) { case BackButton: if(m_view->history()->canGoBack()) { setEnabled(true); } else { setEnabled(false); } break; case ForwardButton: if(m_view->history()->canGoForward()) { setEnabled(true); } else { setEnabled(false); } break; case ReloadButton: break; case StopButton: m_type = ReloadButton; setIcon(style()->standardIcon(QStyle::SP_BrowserReload)); break; } } void NavigationButton::doAction() { switch (m_type) { case BackButton: m_view->history()->back(); break; case ForwardButton: m_view->history()->forward(); break; case ReloadButton: m_view->reload(); break; case StopButton: m_view->stop(); break; } } void NavigationButton::prepareMenu() { menu->clear(); QList items; switch (m_type) { case BackButton: items = m_view->history()->backItems(10); break; case ForwardButton: items = m_view->history()->forwardItems(10); break; default: break; } for(const QWebEngineHistoryItem &i : qAsConst(items)) { QAction *a = menu->addAction(i.title()); connect(a, &QAction::triggered, this, [i, this]() { m_view->history()->goToItem(i); }); } }