mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-28 21:20:19 +00:00
5649086d61
When the help dialog appears, remove the shortcuts for filter and close from the main window so that the identical keys for the help window work. This is not necessary on other platforms, but on Mac it appears to be required. [Dirk Hohndel: Tomaz had a slightly different approach of removing the actions, instead I changed this to just modify the shortcuts] Signed-off-by: Tomaz Canabrava <tomaz.canabrava@intel.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
148 lines
4.8 KiB
C++
148 lines
4.8 KiB
C++
#include <QDesktopServices>
|
|
#include <QShortcut>
|
|
#include <QFile>
|
|
|
|
#include "usermanual.h"
|
|
#include "mainwindow.h"
|
|
#include "helpers.h"
|
|
|
|
SearchBar::SearchBar(QWidget *parent): QWidget(parent)
|
|
{
|
|
ui.setupUi(this);
|
|
#if defined(Q_OS_MAC) || defined(Q_OS_WIN)
|
|
ui.findNext->setIcon(QIcon(":icons/subsurface/32x32/actions/go-down.png"));
|
|
ui.findPrev->setIcon(QIcon(":icons/subsurface/32x32/actions/go-up.png"));
|
|
ui.findClose->setIcon(QIcon(":icons/subsurface/32x32/actions/window-close.png"));
|
|
#endif
|
|
|
|
connect(ui.findNext, SIGNAL(pressed()), this, SIGNAL(searchNext()));
|
|
connect(ui.findPrev, SIGNAL(pressed()), this, SIGNAL(searchPrev()));
|
|
connect(ui.searchEdit, SIGNAL(textChanged(QString)), this, SIGNAL(searchTextChanged(QString)));
|
|
connect(ui.searchEdit, SIGNAL(textChanged(QString)), this, SLOT(enableButtons(QString)));
|
|
connect(ui.findClose, SIGNAL(pressed()), this, SLOT(hide()));
|
|
}
|
|
|
|
void SearchBar::setVisible(bool visible)
|
|
{
|
|
QWidget::setVisible(visible);
|
|
ui.searchEdit->setFocus();
|
|
}
|
|
|
|
void SearchBar::enableButtons(const QString &s)
|
|
{
|
|
ui.findPrev->setEnabled(s.length());
|
|
ui.findNext->setEnabled(s.length());
|
|
}
|
|
|
|
UserManual::UserManual(QWidget *parent) : QWidget(parent)
|
|
{
|
|
QShortcut *closeKey = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_W), this);
|
|
connect(closeKey, SIGNAL(activated()), this, SLOT(close()));
|
|
QShortcut *quitKey = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Q), this);
|
|
connect(quitKey, SIGNAL(activated()), qApp, SLOT(quit()));
|
|
|
|
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);
|
|
|
|
setWindowTitle(tr("User manual"));
|
|
setWindowIcon(QIcon(":/subsurface-icon"));
|
|
|
|
|
|
userManual = new QWebView(this);
|
|
userManual->page()->setLinkDelegationPolicy(QWebPage::DelegateExternalLinks);
|
|
QString searchPath = getSubsurfaceDataPath("Documentation");
|
|
if (searchPath.size()) {
|
|
// look for localized versions of the manual first
|
|
QString lang = uiLanguage(NULL);
|
|
QString prefix = searchPath.append("/user-manual");
|
|
QFile manual(prefix + "_" + lang + ".html");
|
|
if (!manual.exists())
|
|
manual.setFileName(prefix + "_" + lang.left(2) + ".html");
|
|
if (!manual.exists())
|
|
manual.setFileName(prefix + ".html");
|
|
if (!manual.exists()) {
|
|
userManual->setHtml(tr("Cannot find the Subsurface manual"));
|
|
} else {
|
|
QString urlString = QString("file:///") + manual.fileName();
|
|
userManual->setUrl(QUrl(urlString, QUrl::TolerantMode));
|
|
}
|
|
} else {
|
|
userManual->setHtml(tr("Cannot find the Subsurface manual"));
|
|
}
|
|
|
|
searchBar = new SearchBar(this);
|
|
searchBar->hide();
|
|
connect(actionShowSearch, SIGNAL(triggered(bool)), searchBar, SLOT(show()));
|
|
connect(actionHideSearch, SIGNAL(triggered(bool)), searchBar, SLOT(hide()));
|
|
connect(userManual, SIGNAL(linkClicked(QUrl)), this, SLOT(linkClickedSlot(QUrl)));
|
|
connect(searchBar, SIGNAL(searchTextChanged(QString)), this, SLOT(searchTextChanged(QString)));
|
|
connect(searchBar, SIGNAL(searchNext()), this, SLOT(searchNext()));
|
|
connect(searchBar, SIGNAL(searchPrev()), this, SLOT(searchPrev()));
|
|
|
|
QVBoxLayout *vboxLayout = new QVBoxLayout();
|
|
userManual->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding);
|
|
vboxLayout->addWidget(userManual);
|
|
vboxLayout->addWidget(searchBar);
|
|
setLayout(vboxLayout);
|
|
}
|
|
|
|
void UserManual::search(QString text, QWebPage::FindFlags flags = 0)
|
|
{
|
|
if (userManual->findText(text, QWebPage::FindWrapsAroundDocument | flags) || text.length() == 0) {
|
|
searchBar->setStyleSheet("");
|
|
} else {
|
|
searchBar->setStyleSheet("QLineEdit{background: red;}");
|
|
}
|
|
}
|
|
|
|
void UserManual::searchTextChanged(const QString& text)
|
|
{
|
|
mLastText = text;
|
|
search(text);
|
|
}
|
|
|
|
void UserManual::searchNext()
|
|
{
|
|
search(mLastText);
|
|
}
|
|
|
|
void UserManual::searchPrev()
|
|
{
|
|
search(mLastText, QWebPage::FindBackward);
|
|
}
|
|
|
|
void UserManual::linkClickedSlot(const QUrl& url)
|
|
{
|
|
QDesktopServices::openUrl(url);
|
|
}
|
|
|
|
#ifdef Q_OS_MAC
|
|
void UserManual::showEvent(QShowEvent *e) {
|
|
filterAction = NULL;
|
|
closeAction = NULL;
|
|
MainWindow *m = MainWindow::instance();
|
|
Q_FOREACH (QObject *o, m->children()) {
|
|
if (o->objectName() == "actionFilterTags") {
|
|
filterAction = qobject_cast<QAction*>(o);
|
|
filterAction->setShortcut(QKeySequence());
|
|
} else if (o->objectName() == "actionClose") {
|
|
closeAction = qobject_cast<QAction*>(o);
|
|
closeAction->setShortcut(QKeySequence());
|
|
}
|
|
}
|
|
}
|
|
void UserManual::hideEvent(QHideEvent *e) {
|
|
if (closeAction != NULL)
|
|
closeAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_W));
|
|
if (filterAction != NULL)
|
|
filterAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_F));
|
|
closeAction = filterAction = NULL;
|
|
}
|
|
#endif
|