From 120a5f7c6d31a3bc5acdb54b19326516f8399767 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Wed, 11 Jan 2017 10:18:08 +0100 Subject: Initial commit --- .gitignore | 5 +++ src/browser.cpp | 55 +++++++++++++++++++++++++++++++ src/browser.h | 32 ++++++++++++++++++ src/main.cpp | 26 +++++++++++++++ src/mainwindow.cpp | 76 +++++++++++++++++++++++++++++++++++++++++++ src/mainwindow.h | 39 ++++++++++++++++++++++ src/mainwindow.ui | 52 +++++++++++++++++++++++++++++ src/qt-simplebrowser.pro | 23 +++++++++++++ src/widgets/webviewtabbar.cpp | 50 ++++++++++++++++++++++++++++ src/widgets/webviewtabbar.h | 31 ++++++++++++++++++ test/config.ini | 5 +++ 11 files changed, 394 insertions(+) create mode 100644 .gitignore create mode 100644 src/browser.cpp create mode 100644 src/browser.h create mode 100644 src/main.cpp create mode 100644 src/mainwindow.cpp create mode 100644 src/mainwindow.h create mode 100644 src/mainwindow.ui create mode 100644 src/qt-simplebrowser.pro create mode 100644 src/widgets/webviewtabbar.cpp create mode 100644 src/widgets/webviewtabbar.h create mode 100644 test/config.ini diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..09aa797 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +# build folders +build* + +# QtCreator .pro.user settings +*.user diff --git a/src/browser.cpp b/src/browser.cpp new file mode 100644 index 0000000..7ccd13a --- /dev/null +++ b/src/browser.cpp @@ -0,0 +1,55 @@ +#include "browser.h" +#include "mainwindow.h" +#include + +Browser::Browser(QString configPath, QObject *parent) : QObject(parent) +{ + // TODO Read Profile + m_settings = new QSettings(configPath, QSettings::IniFormat, this); + + // TODO Restore previous session + + QtWebEngine::initialize(); +} + +Browser::~Browser() +{ + // TODO Save Profile + m_settings->sync(); + + // TODO Save session + + // cleanup + qDeleteAll(m_windows); + m_windows.clear(); +} + + +QSettings* Browser::settings() +{ + return m_settings; +} + +QVector Browser::windows() +{ + return m_windows; +} + +void Browser::addWindow(MainWindow *window) +{ + if(m_windows.contains(window)) { + return; + } + + m_windows.append(window); + connect(window, &QObject::destroyed, [this, window]() { + this->removeWindow(window); + }); + + window->show(); +} + +void Browser::removeWindow(MainWindow *window) +{ + m_windows.removeOne(window); +} diff --git a/src/browser.h b/src/browser.h new file mode 100644 index 0000000..c63d56f --- /dev/null +++ b/src/browser.h @@ -0,0 +1,32 @@ +#ifndef BROWSER_H +#define BROWSER_H + +#include +#include +#include + +class MainWindow; +class Browser : public QObject +{ + Q_OBJECT + +public: + explicit Browser(QString configPath, QObject *parent = 0); + ~Browser(); + + QSettings* settings(); + + // what is windows() useful for? + QVector windows(); + void addWindow(MainWindow* window); + +public slots: + void removeWindow(MainWindow* window); + +private: + QSettings *m_settings; + QVector m_windows; + +}; + +#endif // BROWSER_H diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..94ad981 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,26 @@ +#include "browser.h" +#include "mainwindow.h" +#include +#include + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + app.setApplicationName("qtwebenginebrowser"); + app.setApplicationVersion("0.0.0"); + + QCommandLineParser parser; + parser.setApplicationDescription("Test browser using QtWebEngine"); + parser.addHelpOption(); + parser.addVersionOption(); + + QCommandLineOption configOption(QStringList() << "c" << "config", "Set configuration file.", "PATH", "config.ini"); + parser.addOption(configOption); + + parser.process(app); + + Browser instance(parser.value(configOption)); + instance.addWindow(new MainWindow(instance.settings())); + + return app.exec(); +} diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp new file mode 100644 index 0000000..7987a87 --- /dev/null +++ b/src/mainwindow.cpp @@ -0,0 +1,76 @@ +#include "mainwindow.h" +#include "ui_mainwindow.h" + +#include + +MainWindow::MainWindow(QSettings *settings, QUrl defaultUrl, QWidget *parent) : + QMainWindow(parent), + ui(new Ui::MainWindow), + navigationToolBar(new QToolBar(this)), + tabToolBar(new QToolBar(this)), + tabBar(new WebViewTabBar(this)), + urlLineEdit(new QLineEdit(navigationToolBar)) +{ + settings->beginGroup("defaults"); + + ui->setupUi(this); + resize(settings->value("width", 800).toInt(), settings->value("height", 600).toInt()); + + // Populate the menu bar + // Browser menu - with new window, new tab, open and quit + QMenu *browserMenu = new QMenu(tr("Browser"), ui->menuBar); + browserMenu->addAction(tr("Quit"), qApp, SLOT(quit()), QKeySequence(tr("Ctrl+Q"))); + browserMenu->addAction(tr("New Tab"), this, SLOT(createNewTab()), QKeySequence(tr("Ctrl+T"))); + ui->menuBar->addMenu(browserMenu); + // View menu - fullscreen + // Page menu - what page actions? + // Help menu - help contents, about, about qt + + this->addToolBar(Qt::TopToolBarArea, navigationToolBar); + this->addToolBarBreak(Qt::TopToolBarArea); + this->addToolBar(Qt::TopToolBarArea, tabToolBar); + + navigationToolBar->addWidget(urlLineEdit); + connect(urlLineEdit, SIGNAL(returnPressed()), this, SLOT(handleUrlChanged())); + + tabToolBar->addWidget(tabBar); + connect(tabBar, SIGNAL(currentTabChanged(QWebEngineView*)), this, SLOT(handleTabChanged(QWebEngineView*))); + + if(!defaultUrl.isEmpty()) + createNewTab(defaultUrl); + else + createNewTab(settings->value("url", QUrl("http://duckduckgo.com")).toUrl()); + + settings->endGroup(); // "defaults" +} + +MainWindow::~MainWindow() +{ + delete ui; +} + +void MainWindow::createNewTab(const QUrl &url) +{ + QWebEngineView *view = new QWebEngineView(0); + view->load(url); + tabBar->addTab(view); +} + +void MainWindow::handleTabChanged(QWebEngineView *view) +{ + centralWidget()->setParent(0); + disconnect(centralWidget()); + setCentralWidget(view); + connect(view, SIGNAL(urlChanged(QUrl)), this, SLOT(handleUrlUpdated(QUrl))); + this->handleUrlUpdated(view->url()); +} + +void MainWindow::handleUrlChanged() +{ + tabBar->currentView()->load(QUrl::fromUserInput(urlLineEdit->text())); +} + +void MainWindow::handleUrlUpdated(const QUrl &url) +{ + urlLineEdit->setText(url.toString()); +} diff --git a/src/mainwindow.h b/src/mainwindow.h new file mode 100644 index 0000000..a130087 --- /dev/null +++ b/src/mainwindow.h @@ -0,0 +1,39 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include +#include +#include +#include +#include +#include "widgets/webviewtabbar.h" +#include + +namespace Ui { +class MainWindow; +} + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + explicit MainWindow(QSettings *settings, QUrl defaultUrl = QUrl(""), QWidget *parent = 0); + ~MainWindow(); + +public slots: + void createNewTab(const QUrl &url = QUrl("")); + +private slots: + void handleTabChanged(QWebEngineView *view); + void handleUrlChanged(); + void handleUrlUpdated(const QUrl &url); + +private: + Ui::MainWindow *ui; + QToolBar *navigationToolBar, *tabToolBar; + WebViewTabBar *tabBar; + QLineEdit *urlLineEdit; +}; + +#endif // MAINWINDOW_H diff --git a/src/mainwindow.ui b/src/mainwindow.ui new file mode 100644 index 0000000..5a9c403 --- /dev/null +++ b/src/mainwindow.ui @@ -0,0 +1,52 @@ + + + MainWindow + + + + 0 + 0 + 400 + 300 + + + + MainWindow + + + + + + 0 + 0 + 400 + 26 + + + + + + + New Window + + + + + New Tab + + + + + Open + + + + + Quit + + + + + + + diff --git a/src/qt-simplebrowser.pro b/src/qt-simplebrowser.pro new file mode 100644 index 0000000..65dcca6 --- /dev/null +++ b/src/qt-simplebrowser.pro @@ -0,0 +1,23 @@ +#------------------------------------------------- +# +# +# +#------------------------------------------------- + +QT += core gui widgets \ + webengine webenginewidgets + +TARGET = qtbrowser +TEMPLATE = app + + +SOURCES += main.cpp \ + mainwindow.cpp \ + browser.cpp \ + widgets/webviewtabbar.cpp + +HEADERS += mainwindow.h \ + browser.h \ + widgets/webviewtabbar.h + +FORMS += mainwindow.ui diff --git a/src/widgets/webviewtabbar.cpp b/src/widgets/webviewtabbar.cpp new file mode 100644 index 0000000..59e5c69 --- /dev/null +++ b/src/widgets/webviewtabbar.cpp @@ -0,0 +1,50 @@ +#include "webviewtabbar.h" + +WebViewTabBar::WebViewTabBar(QWidget *parent) : + QTabBar(parent) +{ + setTabsClosable(true); + connect(this, SIGNAL(tabCloseRequested(int)), this, SLOT(handleTabClose(int))); + connect(this, SIGNAL(currentChanged(int)), this, SLOT(handleCurrentChanged(int))); +} + +WebViewTabBar::~WebViewTabBar() +{ + // cleanup + qDeleteAll(m_views); + m_views.clear(); +} + +int WebViewTabBar::addTab(QWebEngineView *view) +{ + 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); + }); + return QTabBar::addTab("New Tab"); +} + +QWebEngineView *WebViewTabBar::currentView() +{ + return m_views.at(currentIndex()); +} + +void WebViewTabBar::handleCurrentChanged(int index) +{ + emit(currentTabChanged(m_views.at(index))); +} + +void WebViewTabBar::handleTabClose(int index) +{ + removeTab(index); + m_views.at(index)->deleteLater(); + m_views.remove(index); +} + +void WebViewTabBar::updateTabText(QWebEngineView *view, const QString &text) +{ + int index = m_views.indexOf(view); + setTabText(index, text); +} diff --git a/src/widgets/webviewtabbar.h b/src/widgets/webviewtabbar.h new file mode 100644 index 0000000..28a9a18 --- /dev/null +++ b/src/widgets/webviewtabbar.h @@ -0,0 +1,31 @@ +#ifndef WEBVIEWTABBAR_H +#define WEBVIEWTABBAR_H + +#include +#include + +class WebViewTabBar : public QTabBar +{ + Q_OBJECT + +public: + WebViewTabBar(QWidget *parent = 0); + ~WebViewTabBar(); + + int addTab(QWebEngineView *view); + QWebEngineView *currentView(); + +signals: + void currentTabChanged(QWebEngineView *view); + +private slots: + void handleCurrentChanged(int index); + void handleTabClose(int index); + + void updateTabText(QWebEngineView *view, const QString &text); + +private: + QVector m_views; +}; + +#endif // WEBVIEWTABBAR_H diff --git a/test/config.ini b/test/config.ini new file mode 100644 index 0000000..e65e15c --- /dev/null +++ b/test/config.ini @@ -0,0 +1,5 @@ +[defaults] +title=quill +url=https://duckduckgo.com +width=1280 +height=720 -- cgit v1.2.1