Made changes to web browser + several new classes.

This commit is contained in:
Martin Rotter 2013-07-17 20:42:42 +02:00
parent b5922526e0
commit b525d64592
11 changed files with 220 additions and 12 deletions

View File

@ -170,6 +170,8 @@ set(APP_SOURCES
src/gui/webbrowser.cpp
src/gui/basewebview.cpp
src/gui/basewebpage.cpp
src/gui/baselineedit.cpp
src/gui/locationlineedit.cpp
# CORE sources.
src/core/debugging.cpp
@ -205,6 +207,8 @@ set(APP_HEADERS
src/gui/webbrowser.h
src/gui/basewebview.h
src/gui/basewebpage.h
src/gui/baselineedit.h
src/gui/locationlineedit.h
# CORE headers.
src/core/basenetworkaccessmanager.h

19
src/gui/baselineedit.cpp Normal file
View File

@ -0,0 +1,19 @@
#include <QKeyEvent>
#include "gui/baselineedit.h"
BaseLineEdit::BaseLineEdit(QWidget *parent) : QLineEdit(parent) {
}
BaseLineEdit::~BaseLineEdit() {
}
void BaseLineEdit::keyPressEvent(QKeyEvent *event) {
if (event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return) {
emit submitted(text());
event->accept();
}
QLineEdit::keyPressEvent(event);
}

23
src/gui/baselineedit.h Normal file
View File

@ -0,0 +1,23 @@
#ifndef BASELINEEDIT_H
#define BASELINEEDIT_H
#include <QLineEdit>
class BaseLineEdit : public QLineEdit {
Q_OBJECT
public:
explicit BaseLineEdit(QWidget *parent = 0);
virtual ~BaseLineEdit();
protected:
void keyPressEvent(QKeyEvent *event);
signals:
void submitted(const QString &text);
public slots:
};
#endif // BASELINEEDIT_H

View File

@ -12,5 +12,18 @@ BaseWebView::BaseWebView(QWidget *parent)
void BaseWebView::paintEvent(QPaintEvent *event) {
QWebView::paintEvent(event);
// TODO: Add frame, inspire from QFrame source code - paint event.
// Draw additional frame.
QPainter painter(this);
QStyleOptionFrameV3 style_option;
int frame_shape = QFrame::Sunken & QFrame::Shape_Mask;
style_option.init(this);
style_option.frameShape = QFrame::Shape(int(style_option.frameShape) |
QFrame::StyledPanel |
frame_shape);
style_option.rect = rect();
style_option.lineWidth = 1;
style_option.midLineWidth = 0;
style()->drawControl(QStyle::CE_ShapedFrame, &style_option, &painter, this);
}

View File

@ -39,6 +39,8 @@ FormSettings::FormSettings(QWidget *parent) : QDialog(parent), m_ui(new Ui::Form
connect(this, &FormSettings::accepted, this, &FormSettings::saveSettings);
connect(m_ui->m_cmbProxyType, static_cast<void (QComboBox::*)(int index)>(&QComboBox::currentIndexChanged),
this, &FormSettings::onProxyTypeChanged);
connect(m_ui->m_checkShowPassword, &QCheckBox::stateChanged,
this, &FormSettings::displayProxyPassword);
// Load all settings.
loadGeneral();
@ -52,6 +54,15 @@ FormSettings::~FormSettings() {
delete m_ui;
}
void FormSettings::displayProxyPassword(int state) {
if (state == Qt::Checked) {
m_ui->m_txtProxyPassword->setEchoMode(QLineEdit::Normal);
}
else {
m_ui->m_txtProxyPassword->setEchoMode(QLineEdit::PasswordEchoOnEdit);
}
}
void FormSettings::saveSettings() {
// Save all settings.
saveGeneral();
@ -78,10 +89,33 @@ void FormSettings::loadProxy() {
m_ui->m_cmbProxyType->addItem(tr("No proxy"), QNetworkProxy::NoProxy);
m_ui->m_cmbProxyType->addItem(tr("Socks5"), QNetworkProxy::Socks5Proxy);
m_ui->m_cmbProxyType->addItem(tr("Http"), QNetworkProxy::HttpProxy);
// Load the settings.
QNetworkProxy::ProxyType selected_proxy_type = static_cast<QNetworkProxy::ProxyType>(Settings::getInstance()->value(APP_CFG_PROXY,
"proxy_type",
QNetworkProxy::NoProxy).toInt());
m_ui->m_cmbProxyType->setCurrentIndex(m_ui->m_cmbProxyType->findData(selected_proxy_type));
m_ui->m_txtProxyHost->setText(Settings::getInstance()->value(APP_CFG_PROXY,
"host").toString());
m_ui->m_txtProxyUsername->setText(Settings::getInstance()->value(APP_CFG_PROXY,
"username").toString());
m_ui->m_txtProxyPassword->setText(Settings::getInstance()->value(APP_CFG_PROXY,
"password").toString());
m_ui->m_spinProxyPort->setValue(Settings::getInstance()->value(APP_CFG_PROXY,
"port", 80).toInt());
}
void FormSettings::saveProxy() {
Settings::getInstance()->setValue(APP_CFG_PROXY, "proxy_type",
m_ui->m_cmbProxyType->itemData(m_ui->m_cmbProxyType->currentIndex()));
Settings::getInstance()->setValue(APP_CFG_PROXY, "host",
m_ui->m_txtProxyHost->text());
Settings::getInstance()->setValue(APP_CFG_PROXY, "username",
m_ui->m_txtProxyUsername->text());
Settings::getInstance()->setValue(APP_CFG_PROXY, "password",
m_ui->m_txtProxyPassword->text());
Settings::getInstance()->setValue(APP_CFG_PROXY, "port",
m_ui->m_spinProxyPort->value());
}
void FormSettings::loadLanguage() {

View File

@ -36,6 +36,7 @@ class FormSettings : public QDialog {
void loadProxy();
void saveProxy();
void displayProxyPassword(int state);
void onProxyTypeChanged(int index);

View File

@ -117,8 +117,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>506</width>
<height>368</height>
<width>100</width>
<height>30</height>
</rect>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_4">
@ -423,7 +423,7 @@
<bool>true</bool>
</property>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
<enum>QLineEdit::PasswordEchoOnEdit</enum>
</property>
<property name="placeholderText">
<string>Your password for proxy server authentication</string>

View File

@ -0,0 +1,40 @@
#include <QPaintEvent>
#include "gui/locationlineedit.h"
LocationLineEdit::LocationLineEdit(QWidget *parent)
: BaseLineEdit(parent), m_progress(0), m_mouseSelectsAllText(true) {
}
LocationLineEdit::~LocationLineEdit() {
}
void LocationLineEdit::setProgress(int progress) {
m_progress = progress;
}
void LocationLineEdit::focusOutEvent(QFocusEvent *event) {
BaseLineEdit::focusOutEvent(event);
// User now left text box, when he enters it again and clicks,
// then all text should be selected.
m_mouseSelectsAllText = true;
}
void LocationLineEdit::mousePressEvent(QMouseEvent *event) {
if (m_mouseSelectsAllText) {
event->ignore();
selectAll();
// User clicked and all text was selected.
m_mouseSelectsAllText = false;
}
else {
BaseLineEdit::mousePressEvent(event);
}
}
void LocationLineEdit::paintEvent(QPaintEvent *event) {
BaseLineEdit::paintEvent(event);
}

View File

@ -0,0 +1,29 @@
#ifndef LOCATIONLINEEDIT_H
#define LOCATIONLINEEDIT_H
#include "gui/baselineedit.h"
class WebBrowser;
class LocationLineEdit : public BaseLineEdit {
public:
explicit LocationLineEdit(QWidget *parent = 0);
virtual ~LocationLineEdit();
public slots:
// Sets percentual value of web page loading action.
// NOTE: Number ranging from 0 to 100 is expected.
void setProgress(int progress);
protected:
void focusOutEvent(QFocusEvent *event);
void mousePressEvent(QMouseEvent *event);
void paintEvent(QPaintEvent *event);
private:
int m_progress;
bool m_mouseSelectsAllText;
};
#endif // LOCATIONLINEEDIT_H

View File

@ -2,11 +2,13 @@
#include <QToolBar>
#include <QAction>
#include <QPointer>
#include <QLineEdit>
#include <QMessageBox>
#include "core/basenetworkaccessmanager.h"
#include "gui/basewebview.h"
#include "gui/webbrowser.h"
#include "gui/locationlineedit.h"
#include "gui/themefactory.h"
@ -17,6 +19,7 @@ WebBrowser::WebBrowser(QWidget *parent)
: QWidget(parent), m_layout(new QVBoxLayout(this)),
m_toolBar(new QToolBar(tr("Navigation panel"), this)),
m_webView(new BaseWebView(this)),
m_txtLocation(new LocationLineEdit(this)),
m_actionBack(m_webView->pageAction(QWebPage::Back)),
m_actionForward(m_webView->pageAction(QWebPage::Forward)),
m_actionReload(m_webView->pageAction(QWebPage::Reload)),
@ -31,27 +34,60 @@ WebBrowser::WebBrowser(QWidget *parent)
// and main window will be responsible for reloading
// icons on all web browsers.
// Set toolbar properties.
// Set properties of some components.
m_toolBar->layout()->setMargin(0);
m_toolBar->setFloatable(false);
m_toolBar->setMovable(false);
// Modify action texts.
m_actionBack->setText(tr("Back"));
m_actionBack->setToolTip(tr("Go back"));
m_actionForward->setText(tr("Forward"));
m_actionForward->setToolTip(tr("Go forward"));
m_actionReload->setText(tr("Reload"));
m_actionReload->setToolTip(tr("Reload current web page"));
m_actionStop->setText(tr("Stop"));
m_actionStop->setToolTip(tr("Stop web page loading"));
// Add needed actions into toolbar.
m_toolBar->addAction(m_actionBack);
m_toolBar->addAction(m_actionForward);
m_toolBar->addSeparator();
m_toolBar->addAction(m_actionReload);
m_toolBar->addAction(m_actionStop);
QLineEdit *ed = new QLineEdit(this);
m_toolBar->addWidget(ed);
m_toolBar->addWidget(m_txtLocation);
// Setup layout.
m_layout->addWidget(m_toolBar);
m_layout->addWidget(m_webView);
m_layout->setMargin(0);
m_webView->load(QUrl("http://www.seznam.cz"));
createConnections();
}
void WebBrowser::createConnections() {
// When user confirms new url, then redirect to it.
connect(m_txtLocation, &LocationLineEdit::submitted,
this, &WebBrowser::navigateToUrl);
// If new page loads, then update current url.
connect(m_webView, &BaseWebView::urlChanged,
this, &WebBrowser::updateUrl);
// Change location textbox status according to webpage status.
connect(m_webView, &BaseWebView::loadProgress,
m_txtLocation, &LocationLineEdit::setProgress);
}
void WebBrowser::updateUrl(const QUrl &url) {
m_txtLocation->setText(url.toString());
}
void WebBrowser::navigateToUrl(const QString &textual_url) {
QUrl extracted_url = QUrl::fromUserInput(textual_url);
if (extracted_url.isValid()) {
m_webView->setUrl(extracted_url);
}
}
WebBrowser::~WebBrowser() {

View File

@ -6,6 +6,7 @@
class QToolBar;
class QVBoxLayout;
class LocationLineEdit;
class BaseWebView;
class BaseNetworkAccessManager;
@ -21,10 +22,18 @@ class WebBrowser : public QWidget {
static BaseNetworkAccessManager *globalNetworkManager();
static QList<WebBrowser*> runningWebBrowsers();
protected:
void createConnections();
protected slots:
void updateUrl(const QUrl &url);
void navigateToUrl(const QString &url);
private:
QToolBar *m_toolBar;
QVBoxLayout *m_layout;
QToolBar *m_toolBar;
BaseWebView *m_webView;
LocationLineEdit *m_txtLocation;
QAction *m_actionBack;
QAction *m_actionForward;