aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAqua-sama <aqua@iserlohn-fortress.net>2017-06-11 16:00:31 +0200
committerAqua-sama <aqua@iserlohn-fortress.net>2017-06-11 16:00:31 +0200
commit765f33e796dbc1e8c5fefd77c9cf4cdf58a99a83 (patch)
tree48dfd56b366d96d4bb06b8cda4ba2776622815cc
parentAdded new profile button (diff)
downloadsmolbote-765f33e796dbc1e8c5fefd77c9cf4cdf58a99a83.tar.xz
Fixed crash when closing last tab
-rw-r--r--docs/Design Notes.md25
-rw-r--r--src/mainwindow.cpp18
-rw-r--r--src/widgets/webviewtabbar.cpp30
-rw-r--r--src/widgets/webviewtabbar.h6
4 files changed, 58 insertions, 21 deletions
diff --git a/docs/Design Notes.md b/docs/Design Notes.md
index abb5362..62bb44f 100644
--- a/docs/Design Notes.md
+++ b/docs/Design Notes.md
@@ -4,14 +4,23 @@ The aim of this project is to provide a small and fast web browser.
### General
* Use generic formats
-### To do
-* Proper application-level profile manager
-* Reorganize Profile menu
-* System-level and user-level profile config, with per-profile overrides
-* Default system-level config and user-level overrides
-* Cookie filter list similar to the URL filter list
-* Moving tabs between windows
-* Tab context menu
+### Version 1.0
+* Profiles
+ - Application-level profile manager
+ - System-level and user-level profile config, with per-profile overrides [todo]
+* Configuration
+ - Default system-level config and user-level overrides [todo]
+* Cookies
+ - Filter list similar to the URL filter list [todo]
+* Tabs
+ - Moving tabs between windows [todo]
+ - Tab context menu [todo]
+* Page actions
+ - Search [todo]
+ - Zoom [todo]
+ - Print [todo]
+* Navigation toolbar
+ - Back and Forward history [todo]
## Dependencies
* Qt, over 5.7 (up-to-date Qt version recommended)
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 851ee9e..861f7cf 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -35,7 +35,7 @@ MainWindow::MainWindow(QUrl defaultUrl, QWidget *parent) :
ui(new Ui::MainWindow),
navigationToolBar(new QToolBar(tr("Navigation"), this)),
tabToolBar(new QToolBar(tr("Tab bar"), this)),
- tabBar(new WebViewTabBar(this)),
+ tabBar(new WebViewTabBar(nullptr, this)),
urlLineEdit(new UrlLineEdit(navigationToolBar)),
progressBar(new LoadingBar(this))
{
@@ -91,6 +91,7 @@ MainWindow::MainWindow(QUrl defaultUrl, QWidget *parent) :
// Load profile
m_profile = qApp->profile(sSettings->value("browser.profile.default").toString());
+ tabBar->setProfile(m_profile);
// loading bar
ui->statusBar->addPermanentWidget(progressBar);
@@ -148,9 +149,9 @@ void MainWindow::addTabbedDock(Qt::DockWidgetArea area, QDockWidget *widget)
void MainWindow::newTab(const QUrl &url)
{
if(!url.isEmpty()) {
- tabBar->addTab(m_profile, url);
+ tabBar->addTab(url);
} else {
- tabBar->addTab(m_profile, sSettings->value("general.newtab").toUrl());
+ tabBar->addTab(sSettings->value("general.newtab").toUrl());
}
}
@@ -202,11 +203,14 @@ void MainWindow::handleTabChanged(WebView *view)
{
Q_ASSERT(view);
- // clear the parent of the central widget so it doesn't get deleted
- centralWidget()->setParent(0);
+ // centralWidget can be a nullptr
+ if(centralWidget()) {
+ // clear the parent of the central widget so it doesn't get deleted
+ centralWidget()->setParent(0);
- // disconnect signals
- disconnect(centralWidget());
+ // disconnect signals
+ disconnect(centralWidget());
+ }
// set new central widget
setCentralWidget(view);
diff --git a/src/widgets/webviewtabbar.cpp b/src/widgets/webviewtabbar.cpp
index 429b103..d57e095 100644
--- a/src/widgets/webviewtabbar.cpp
+++ b/src/widgets/webviewtabbar.cpp
@@ -22,12 +22,15 @@
#include "browser.h"
#include <QAction>
-WebViewTabBar::WebViewTabBar(QWidget *parent) :
+WebViewTabBar::WebViewTabBar(QWebEngineProfile *profile, QWidget *parent) :
QTabBar(parent)
{
+ m_profile = profile;
+
setElideMode(Qt::ElideRight);
setTabsClosable(true);
setMovable(true);
+ setContextMenuPolicy(Qt::DefaultContextMenu);
connect(this, SIGNAL(tabCloseRequested(int)), this, SLOT(removeTab(int)));
connect(this, SIGNAL(currentChanged(int)), this, SLOT(handleCurrentChanged(int)));
connect(this, SIGNAL(tabMoved(int,int)), this, SLOT(updateVectorArrangement(int,int)));
@@ -73,15 +76,14 @@ QSignalMapper *WebViewTabBar::signalMapper()
return m_signalMapper;
}
-int WebViewTabBar::addTab(QWebEngineProfile *profile, const QUrl &url)
+int WebViewTabBar::addTab(const QUrl &url)
{
WebView *view = new WebView(0);
- QWebEnginePage *page = new QWebEnginePage(profile);
+ QWebEnginePage *page = new QWebEnginePage(m_profile);
view->setPage(page);
page->load(url);
m_views.append(view);
- //connect(view, SIGNAL(titleChanged()), this, SLOT(updateTabText()));
connect(view, &QWebEngineView::titleChanged, [this, view](const QString &title) {
int index = m_views.indexOf(view);
setTabText(index, title);
@@ -96,6 +98,7 @@ int WebViewTabBar::addTab(QWebEngineProfile *profile, const QUrl &url)
void WebViewTabBar::setProfile(QWebEngineProfile *profile)
{
+ m_profile = profile;
for(auto view : qAsConst(m_views)) {
QWebEnginePage *page = new QWebEnginePage(profile);
page->load(view->url());
@@ -108,6 +111,21 @@ WebView *WebViewTabBar::currentView()
return m_views.at(currentIndex());
}
+void WebViewTabBar::contextMenuEvent(QContextMenuEvent *event)
+{
+ int tabIndex = tabAt(event->pos());
+ if(tabIndex < 0) {
+ return;
+ }
+
+ QMenu menu(this);
+ QAction* closeAction = menu.addAction(tr("Close tab"));
+ connect(closeAction, &QAction::triggered, this, [tabIndex, this]() {
+ removeTab(tabIndex);
+ });
+ menu.exec(event->globalPos());
+}
+
QSize WebViewTabBar::tabSizeHint(int index) const
{
Q_UNUSED(index)
@@ -116,6 +134,10 @@ QSize WebViewTabBar::tabSizeHint(int index) const
void WebViewTabBar::handleCurrentChanged(int index)
{
+ if(index < 0) {
+ addTab(QUrl::fromUserInput(sSettings->value("general.newtab").toString()));
+ return;
+ }
emit currentTabChanged(m_views.at(index));
}
diff --git a/src/widgets/webviewtabbar.h b/src/widgets/webviewtabbar.h
index bf39efe..d1ccf81 100644
--- a/src/widgets/webviewtabbar.h
+++ b/src/widgets/webviewtabbar.h
@@ -30,7 +30,7 @@ class WebViewTabBar : public QTabBar
Q_OBJECT
public:
- explicit WebViewTabBar(QWidget *parent = 0);
+ explicit WebViewTabBar(QWebEngineProfile *profile, QWidget *parent = 0);
~WebViewTabBar();
void setProfile(QWebEngineProfile *profile);
@@ -42,12 +42,13 @@ signals:
void currentTabChanged(WebView *view);
public slots:
- int addTab(QWebEngineProfile *profile, const QUrl &url);
+ int addTab(const QUrl &url);
void removeTab(int index);
void webAction(int action);
protected:
+ void contextMenuEvent(QContextMenuEvent *event);
QSize tabSizeHint(int index) const;
private slots:
@@ -61,6 +62,7 @@ private:
QVector<WebView*> m_views;
QSignalMapper *m_signalMapper;
+ QWebEngineProfile *m_profile;
};
#endif // WEBVIEWTABBAR_H