[PATCH 2/3] Extract user manual web view into a separate class

Sergey Starosek sergey.starosek at gmail.com
Thu Jan 9 09:21:29 UTC 2014


Provide search functionality which addresses ticket #391

Signed-off-by: Sergey Starosek <sergey.starosek at gmail.com>
---
 qt-ui/usermanual.cpp |  93 +++++++++++++++++++++++++++++
 qt-ui/usermanual.h   |  32 ++++++++++
 qt-ui/usermanual.ui  | 165 +++++++++++++++++++++++++++++++++++++++++++++++++++
 subsurface.pro       |   9 ++-
 4 files changed, 296 insertions(+), 3 deletions(-)
 create mode 100644 qt-ui/usermanual.cpp
 create mode 100644 qt-ui/usermanual.h
 create mode 100644 qt-ui/usermanual.ui

diff --git a/qt-ui/usermanual.cpp b/qt-ui/usermanual.cpp
new file mode 100644
index 0000000..56f0fe1
--- /dev/null
+++ b/qt-ui/usermanual.cpp
@@ -0,0 +1,93 @@
+#include <QDesktopServices>
+
+#include "usermanual.h"
+#include "ui_usermanual.h"
+
+#include "../helpers.h"
+
+UserManual::UserManual(QWidget *parent) :
+	QWidget(parent),
+	ui(new Ui::UserManual)
+{
+	ui->setupUi(this);
+
+	QAction *actionShowSearch = new QAction(this);
+	actionShowSearch->setShortcut(Qt::CTRL + Qt::Key_F);
+	actionShowSearch->setShortcutContext(Qt::WindowShortcut);
+	addAction(actionShowSearch);
+
+	QAction *actionHideSearch = new QAction(this);
+	actionHideSearch->setShortcut(Qt::Key_Escape);
+	actionHideSearch->setShortcutContext(Qt::WindowShortcut);
+	addAction(actionHideSearch);
+
+	ui->webView->page()->setLinkDelegationPolicy(QWebPage::DelegateExternalLinks);
+	QString searchPath = getSubsurfaceDataPath("Documentation");
+	if (searchPath != "") {
+		QUrl url(searchPath.append("/user-manual.html"));
+		ui->webView->setWindowTitle(tr("User Manual"));
+		ui->webView->setWindowIcon(QIcon(":/subsurface-icon"));
+		ui->webView->setUrl(url);
+	} else {
+		ui->webView->setHtml(tr("Cannot find the Subsurface manual"));
+	}
+	ui->searchPanel->setParent(this);
+	ui->searchPanel->hide();
+
+	connect(actionShowSearch, SIGNAL(triggered(bool)), this, SLOT(showSearchPanel()));
+	connect(actionHideSearch, SIGNAL(triggered(bool)), this, SLOT(hideSearchPanel()));
+	connect(ui->webView, SIGNAL(linkClicked(QUrl)), this, SLOT(linkClickedSlot(QUrl)));
+	connect(ui->searchEdit, SIGNAL(textChanged(QString)), this, SLOT(searchTextChanged(QString)));
+	connect(ui->findNext, SIGNAL(clicked()), this, SLOT(searchNext()));
+	connect(ui->findPrev, SIGNAL(clicked()), this, SLOT(searchPrev()));
+}
+
+void UserManual::showSearchPanel()
+{
+	ui->searchPanel->show();
+	ui->searchEdit->setFocus();
+	ui->searchEdit->selectAll();
+}
+
+void UserManual::hideSearchPanel()
+{
+	ui->searchPanel->hide();
+}
+
+void UserManual::search(QString text, QWebPage::FindFlags flags = 0)
+{
+	if (ui->webView->findText(text, flags) || text.length() == 0) {
+		ui->searchEdit->setStyleSheet("");
+	} else {
+		ui->searchEdit->setStyleSheet("QLineEdit{background: red;}");
+	}
+}
+
+void UserManual::searchTextChanged(QString text) {
+	bool hasText = text.length() > 0;
+
+	ui->findPrev->setEnabled(hasText);
+	ui->findNext->setEnabled(hasText);
+
+	search(text);
+}
+
+void UserManual::searchNext()
+{
+	search(ui->searchEdit->text());
+}
+
+void UserManual::searchPrev()
+{
+	search(ui->searchEdit->text(), QWebPage::FindBackward);
+}
+
+void UserManual::linkClickedSlot(QUrl url)
+{
+	QDesktopServices::openUrl(url);
+}
+
+UserManual::~UserManual()
+{
+	delete ui;
+}
diff --git a/qt-ui/usermanual.h b/qt-ui/usermanual.h
new file mode 100644
index 0000000..f915f4c
--- /dev/null
+++ b/qt-ui/usermanual.h
@@ -0,0 +1,32 @@
+#ifndef USERMANUAL_H
+#define USERMANUAL_H
+
+#include <QMainWindow>
+#include <QWebPage>
+
+namespace Ui {
+class UserManual;
+}
+
+class UserManual : public QWidget
+{
+	Q_OBJECT
+
+public:
+	explicit UserManual(QWidget *parent = 0);
+	~UserManual();
+
+private slots:
+	void showSearchPanel();
+	void hideSearchPanel();
+	void searchTextChanged(QString);
+	void searchNext();
+	void searchPrev();
+	void linkClickedSlot(QUrl url);
+
+private:
+	Ui::UserManual *ui;
+	void search(QString, QWebPage::FindFlags);
+};
+
+#endif // USERMANUAL_H
diff --git a/qt-ui/usermanual.ui b/qt-ui/usermanual.ui
new file mode 100644
index 0000000..de0784f
--- /dev/null
+++ b/qt-ui/usermanual.ui
@@ -0,0 +1,165 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>UserManual</class>
+ <widget class="QWidget" name="UserManual">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>834</width>
+    <height>599</height>
+   </rect>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout_2">
+   <item>
+    <widget class="QFrame" name="searchPanel">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="minimumSize">
+      <size>
+       <width>230</width>
+       <height>40</height>
+      </size>
+     </property>
+     <property name="autoFillBackground">
+      <bool>true</bool>
+     </property>
+     <property name="frameShape">
+      <enum>QFrame::NoFrame</enum>
+     </property>
+     <layout class="QHBoxLayout" name="horizontalLayout">
+      <property name="spacing">
+       <number>0</number>
+      </property>
+      <property name="leftMargin">
+       <number>9</number>
+      </property>
+      <property name="topMargin">
+       <number>9</number>
+      </property>
+      <property name="rightMargin">
+       <number>0</number>
+      </property>
+      <property name="bottomMargin">
+       <number>0</number>
+      </property>
+      <item>
+       <widget class="QLineEdit" name="searchEdit">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="minimumSize">
+         <size>
+          <width>100</width>
+          <height>0</height>
+         </size>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="findPrev">
+        <property name="enabled">
+         <bool>false</bool>
+        </property>
+        <property name="text">
+         <string/>
+        </property>
+        <property name="icon">
+         <iconset theme="go-previous">
+          <normaloff/>
+         </iconset>
+        </property>
+        <property name="flat">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="findNext">
+        <property name="enabled">
+         <bool>false</bool>
+        </property>
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="text">
+         <string/>
+        </property>
+        <property name="icon">
+         <iconset theme="go-next">
+          <normaloff/>
+         </iconset>
+        </property>
+        <property name="flat">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="findClose">
+        <property name="text">
+         <string/>
+        </property>
+        <property name="icon">
+         <iconset theme="window-close">
+          <normaloff/>
+         </iconset>
+        </property>
+        <property name="flat">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <widget class="QWebView" name="webView" native="true">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+       <horstretch>1</horstretch>
+       <verstretch>1</verstretch>
+      </sizepolicy>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <customwidgets>
+  <customwidget>
+   <class>QWebView</class>
+   <extends>QWidget</extends>
+   <header>qwebview.h</header>
+  </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>findClose</sender>
+   <signal>clicked()</signal>
+   <receiver>searchPanel</receiver>
+   <slot>hide()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>261</x>
+     <y>568</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>192</x>
+     <y>554</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/subsurface.pro b/subsurface.pro
index e40de09..5b56e4f 100644
--- a/subsurface.pro
+++ b/subsurface.pro
@@ -56,7 +56,8 @@ HEADERS = \
 	webservice.h \
 	qt-ui/divelogimportdialog.h \
 	qt-ui/tagwidget.h \
-	qt-ui/groupedlineedit.h
+	qt-ui/groupedlineedit.h \
+	qt-ui/usermanual.h
 
 SOURCES =  \
 	deco.c \
@@ -105,7 +106,8 @@ SOURCES =  \
 	uemis-downloader.c \
 	qt-ui/divelogimportdialog.cpp \
 	qt-ui/tagwidget.cpp \
-	qt-ui/groupedlineedit.cpp
+	qt-ui/groupedlineedit.cpp \
+	qt-ui/usermanual.cpp
 
 linux*: SOURCES += linux.c
 mac: SOURCES += macos.c
@@ -124,7 +126,8 @@ FORMS = \
 	qt-ui/shifttimes.ui \
 	qt-ui/webservices.ui \
 	qt-ui/tableview.ui \
-	qt-ui/divelogimportdialog.ui
+	qt-ui/divelogimportdialog.ui \
+	qt-ui/usermanual.ui
 
 RESOURCES = subsurface.qrc
 
-- 
1.8.3.2



More information about the subsurface mailing list