merge help branch

This commit is contained in:
ws 2015-02-06 17:47:50 +01:00
commit 6dbc5fa409
17 changed files with 225 additions and 92 deletions

2
all.h
View file

@ -160,6 +160,6 @@
#include <QHelpEngine>
#include <QWidgetAction>
#include <QHelpIndexModel>
#include <QTextBrowser>
#endif

View file

@ -15,7 +15,7 @@
namespace Ms {
static QHelpEngineCore* help;
QHelpEngine* helpEngine;
//---------------------------------------------------------
// HelpQuery
@ -24,14 +24,18 @@ static QHelpEngineCore* help;
HelpQuery::HelpQuery(QWidget* parent)
: QWidgetAction(parent)
{
if (!help) {
QString s = getSharePath() + "manual/doc.qhc";
printf("====<%s>\n", qPrintable(s));
help = new QHelpEngineCore(s);
if (!help->setupData()) {
delete help;
help = 0;
printf("cannot setup data for help engine\n");
if (!helpEngine) {
QString lang = mscore->getLocaleISOCode();
if (lang == "en_US") // HACK
lang = "en";
QString s = getSharePath() + "manual/doc_" + lang + ".qhc";
qDebug("init Help from: <%s>", qPrintable(s));
helpEngine = new QHelpEngine(s, this);
if (!helpEngine->setupData()) {
qDebug("cannot setup data for help engine: %s", qPrintable(helpEngine->error()));
delete helpEngine;
helpEngine = 0;
}
}
@ -88,18 +92,14 @@ void HelpQuery::textChanged(const QString& s)
if (a != this)
menu->removeAction(a);
}
for (const QChar& c : s) {
QAction* action = new QAction(QString(c), this);
action->setData(QString(c));
menu->addAction(action);
}
emptyState = false;
QMap<QString,QUrl>list = help->linksForIdentifier(s);
printf("=====links %d\n", list.size());
for (const QUrl& s : list)
printf(" %s\n", qPrintable(s.toString()));
QMap<QString,QUrl>list = helpEngine->linksForIdentifier(s);
for (const QUrl& s : list) {
QAction* action = new QAction(s.toString(), this);
action->setData(s);
menu->addAction(action);
}
}
//---------------------------------------------------------
@ -110,7 +110,11 @@ void HelpQuery::actionTriggered(QAction* action)
{
if (action->data().isNull())
return;
printf("action <%s>\n", qPrintable(action->data().toString()));
QUrl url = action->data().toUrl();
if (url.isValid()) {
printf("actionTriggered <%s>\n", qPrintable(url.toString()));
mscore->showHelp(url);
}
}

View file

@ -15,6 +15,8 @@
namespace Ms {
class HelpEngine;
//---------------------------------------------------------
// HelpQuery
//---------------------------------------------------------
@ -35,7 +37,11 @@ class HelpQuery : public QWidgetAction {
HelpQuery(QWidget* parent);
};
extern QHelpEngine* helpEngine;
} // end namespace Ms
#endif

View file

@ -12,9 +12,11 @@
#include "helpBrowser.h"
#include "icons.h"
#include "help.h"
namespace Ms {
//---------------------------------------------------------
// HelpBrowser
//---------------------------------------------------------
@ -22,7 +24,7 @@ namespace Ms {
HelpBrowser::HelpBrowser(QWidget* parent)
: QWidget(parent)
{
view = new WebView;
view = new HelpView(helpEngine);
toolbar = new QWidget;
toolbar->setSizePolicy(QSizePolicy::Expanding,
QSizePolicy::Fixed);
@ -40,23 +42,25 @@ HelpBrowser::HelpBrowser(QWidget* parent)
bl->addStretch(2);
QToolButton* previous = new QToolButton;
previous->setDefaultAction(view->pageAction(QWebPage::Back));
previous->setIcon(QIcon(*icons[int(Icons::goPrevious_ICON)]));
bl->addWidget(previous);
connect(previous, SIGNAL(clicked()), view, SLOT(backward()));
connect(view, SIGNAL(backwardAvailable(bool)), previous, SLOT(setEnabled(bool)));
QToolButton* next = new QToolButton;
next->setDefaultAction(view->pageAction(QWebPage::Forward));
next->setIcon(QIcon(*icons[int(Icons::goNext_ICON)]));
bl->addWidget(next);
connect(next, SIGNAL(clicked()), view, SLOT(forward()));
connect(view, SIGNAL(forwardAvailable(bool)), next, SLOT(setEnabled(bool)));
bl->addStretch(10);
QToolButton* reload = new QToolButton;
QAction * reloadAction = view->pageAction(QWebPage::Reload);
// QToolButton* reload = new QToolButton;
// QAction * reloadAction = view->pageAction(QWebPage::Reload);
//for an unknown reason setting icon on the QToolButton doesn't work here...
reloadAction->setIcon(QIcon(*icons[int(Icons::viewRefresh_ICON)]));
reload->setDefaultAction(reloadAction);
bl->addWidget(reload);
// reloadAction->setIcon(QIcon(*icons[int(Icons::viewRefresh_ICON)]));
// reload->setDefaultAction(reloadAction);
// bl->addWidget(reload);
toolbar->setLayout(bl);
}
@ -68,13 +72,14 @@ HelpBrowser::HelpBrowser(QWidget* parent)
void HelpBrowser::setContent(const QString& path)
{
homePath = QUrl::fromLocalFile(path);
view->setUrl(homePath);
view->setSource(homePath);
}
void HelpBrowser::setContent(const QUrl& url)
{
homePath = url;
view->setUrl(url);
printf("HelpBroser::setContent: <%s>\n", qPrintable(url.toString()));
view->setSource(url);
}
//---------------------------------------------------------
@ -83,37 +88,19 @@ void HelpBrowser::setContent(const QUrl& url)
void HelpBrowser::homeClicked()
{
view->setUrl(homePath);
view->setSource(homePath);
}
//---------------------------------------------------------
// wheelEvent
// loadResource
//---------------------------------------------------------
void WebView::wheelEvent(QWheelEvent* event)
QVariant HelpView::loadResource(int type, const QUrl& name)
{
static int deltaSum = 0;
deltaSum += event->delta();
int step = deltaSum / 120;
deltaSum %= 120;
if (event->modifiers() & Qt::ControlModifier) {
qreal _mag = zoomFactor();
if (step > 0) {
for (int i = 0; i < step; ++i)
_mag *= 1.1;
}
else {
for (int i = 0; i < -step; ++i)
_mag /= 1.1;
}
setZoomFactor(_mag);
event->accept();
}
else
event->ignore();
QWebView::wheelEvent(event);
if (name.scheme() == "qthelp")
return QVariant(helpEngine->fileData(name));
return QTextBrowser::loadResource(type, name);
}
}

View file

@ -16,15 +16,16 @@
namespace Ms {
//---------------------------------------------------------
// WebView
// HelpView
//---------------------------------------------------------
class WebView : public QWebView {
class HelpView : public QTextBrowser {
Q_OBJECT
virtual void wheelEvent(QWheelEvent*);
QHelpEngine* helpEngine;
public:
WebView(QWidget* parent = 0) :QWebView(parent) {}
HelpView(QHelpEngine* he, QWidget* parent = 0) : QTextBrowser(parent), helpEngine(he) {}
QVariant loadResource(int type, const QUrl& name);
};
//---------------------------------------------------------
@ -33,7 +34,7 @@ class WebView : public QWebView {
class HelpBrowser : public QWidget {
Q_OBJECT
WebView* view;
HelpView* view;
QWidget* toolbar;
QUrl homePath;

View file

@ -893,8 +893,7 @@ MuseScore::MuseScore()
HelpQuery* hw = new HelpQuery(menuHelp);
menuHelp->addAction(hw);
if (enableExperimental)
menuHelp->addAction(getAction("local-help"));
menuHelp->addAction(getAction("local-help"));
menuHelp->addAction(tr("&Online Handbook"), this, SLOT(helpBrowser1()));
menuHelp->addSeparator();
@ -1011,34 +1010,45 @@ QString MuseScore::getLocaleISOCode() const
}
//---------------------------------------------------------
// helpBrowser
// showHelp
// show local help
//---------------------------------------------------------
void MuseScore::helpBrowser(QString tag) const
void MuseScore::showHelp(const QUrl& url)
{
QString lang = getLocaleISOCode();
qDebug("showHelp <%s>", qPrintable(url.toString()));
if (lang == "en_US") // HACK
lang = "en";
if (!helpEngine)
return;
if (MScore::debugMode)
qDebug("open handbook for language <%s>", qPrintable(lang));
QAction* a = getAction("local-help");
a->blockSignals(true);
a->setChecked(true);
a->blockSignals(false);
QString path(mscoreGlobalShare + "manual/reference-" + lang + ".pdf");
if (!QFile::exists(path))
path = mscoreGlobalShare + "manual/reference-en" + ".pdf";
qDebug("helpBrowser::load <%s>", qPrintable(path));
QUrl url(QUrl::fromLocalFile(path));
if (!tag.isEmpty())
url.setFragment(tag);
if (enableExperimental)
helpBrowser(url);
if (!helpBrowser) {
helpBrowser = new HelpBrowser;
manualDock = new QDockWidget(tr("Manual"), 0);
manualDock->setObjectName("Manual");
manualDock->setWidget(helpBrowser);
Qt::DockWidgetArea area = Qt::RightDockWidgetArea;
addDockWidget(area, manualDock);
}
manualDock->show();
helpBrowser->setContent(url);
}
void MuseScore::helpBrowser(const QUrl& url) const
void MuseScore::showHelp(QString s)
{
QDesktopServices::openUrl(url);
if (s.isEmpty())
s = "manual";
qDebug("showHelp <%s>", qPrintable(s));
QMap<QString,QUrl>list = helpEngine->linksForIdentifier(s);
if (!list.isEmpty())
showHelp(*list.begin());
else
qDebug("help for <%s> not found", qPrintable(s));
}
//---------------------------------------------------------
@ -1080,7 +1090,7 @@ void MuseScore::helpBrowser1() const
//track visits. see: http://www.google.com/support/googleanalytics/bin/answer.py?answer=55578
help += QString("?utm_source=software&utm_medium=menu&utm_content=r%1&utm_campaign=MuseScore%2").arg(rev.trimmed()).arg(QString(VERSION));
helpBrowser(QUrl(help));
QDesktopServices::openUrl(QUrl(help));
}
//---------------------------------------------------------
@ -4061,8 +4071,15 @@ void MuseScore::cmd(QAction* a, const QString& cmd)
// transportTools->setVisible(!transportTools->isVisible());
// else if (cmd == "toggle-noteinput")
// entryTools->setVisible(!entryTools->isVisible());
else if (cmd == "local-help")
helpBrowser();
else if (cmd == "local-help") {
if (!a->isChecked()) {
if (manualDock)
manualDock->hide();
a->setChecked(false);
}
else
showHelp("manual");
}
else if (cmd == "follow")
preferences.followSong = a->isChecked();
else if (cmd == "split-h")

View file

@ -90,6 +90,7 @@ class Driver;
class Seq;
class ImportMidiPanel;
class Startcenter;
class HelpBrowser;
struct PluginDescription;
enum class SelState : char;
@ -287,6 +288,8 @@ class MuseScore : public QMainWindow, public MuseScoreCore {
QLabel* _modeText;
QLabel* _positionLabel;
NewWizard* newWizard { 0 };
HelpBrowser* helpBrowser { 0 };
QDockWidget* manualDock { 0 };
PaletteBox* paletteBox { 0 };
Inspector* _inspector { 0 };
@ -397,7 +400,6 @@ class MuseScore : public QMainWindow, public MuseScoreCore {
void showSynthControl(bool);
void showSelectionWindow(bool);
void showSearchDialog();
void helpBrowser(const QUrl&) const;
void splitWindow(bool horizontal);
void removeSessionFile();
void editChordStyle();
@ -664,7 +666,8 @@ class MuseScore : public QMainWindow, public MuseScoreCore {
PluginCreator* pluginCreator() { return _pluginCreator; }
ScoreView* currentScoreView() const { return cv; }
void showMessage(const QString& s, int timeout);
void helpBrowser(const QString = QString()) const;
void showHelp(QString);
void showHelp(const QUrl&);
void registerPlugin(PluginDescription*);
void unregisterPlugin(PluginDescription*);

View file

@ -1057,7 +1057,7 @@ void ScoreView::objectPopup(const QPoint& pos, Element* obj)
if (cmd == "list")
mscore->showElementContext(obj);
else if (cmd == "help")
mscore->helpBrowser(obj->name());
mscore->showHelp(obj->name());
else if (cmd == "edit-element") {
if (obj->isEditable()) {
startEdit(obj);

View file

@ -37,7 +37,7 @@ Shortcut Shortcut::_sc[] = {
QT_TRANSLATE_NOOP("action","Show local handbook"), // Appears if you use Help > What's This?
Icons::Invalid_ICON,
Qt::WindowShortcut,
ShortcutFlags::NONE
ShortcutFlags::NONE | ShortcutFlags::A_CHECKABLE
},
{
MsWidget::MAIN_WINDOW,

2
rdoc/.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
*.qch

View file

@ -1,7 +1,6 @@
#=============================================================================
# MuseScore
# Music Composition & Notation
# $Id:$
#
# Copyright (C) 2011 Werner Schweer
#
@ -13,13 +12,17 @@
add_custom_target(referenceDocumentation
ALL
DEPENDS doc.html doc.qhp
DEPENDS en/doc.html de/doc.html en/doc.qhp de/doc.qhp
)
add_custom_command(TARGET referenceDocumentation
POST_BUILD
COMMAND qcollectiongenerator ${PROJECT_SOURCE_DIR}/rdoc/doc.qhcp -o doc.qhc
COMMAND qcollectiongenerator ${PROJECT_SOURCE_DIR}/rdoc/en/doc.qhcp -o doc_en.qhc
COMMAND qcollectiongenerator ${PROJECT_SOURCE_DIR}/rdoc/de/doc.qhcp -o doc_de.qhc
)
install(FILES ${PROJECT_BINARY_DIR}/rdoc/doc.qhc DESTINATION ${Mscore_SHARE_NAME}${Mscore_INSTALL_NAME}manual)
install(FILES
${PROJECT_BINARY_DIR}/rdoc/doc_en.qhc
${PROJECT_BINARY_DIR}/rdoc/doc_de.qhc
DESTINATION ${Mscore_SHARE_NAME}${Mscore_INSTALL_NAME}manual)

9
rdoc/de/doc.html Normal file
View file

@ -0,0 +1,9 @@
<html>
<body>
Hallo MuseScore!
</body>
</html>

15
rdoc/de/doc.qhcp Normal file
View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8" ?>
<QHelpCollectionProject version="1.0">
<docFiles>
<generate>
<file>
<input>doc.qhp</input>
<output>doc.qch</output>
</file>
</generate>
<register>
<file>doc.qch</file>
</register>
</docFiles>
</QHelpCollectionProject>

31
rdoc/de/doc.qhp Normal file
View file

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<QtHelpProject version="1.0">
<namespace>musescore.com.musescore.2.0</namespace>
<virtualFolder>doc</virtualFolder>
<customFilter name="de">
<filterAttribute>MuseScore</filterAttribute>
</customFilter>
<filterSection>
<filterAttribute>MuseScore</filterAttribute>
<toc>
<section title="My Application Manual" ref="index.html">
<section title="Chapter 1" ref="doc.html#chapter1"/>
<section title="Chapter 2" ref="doc.html#chapter2"/>
<section title="Chapter 3" ref="doc.html#chapter3"/>
</section>
</toc>
<keywords>
<keyword id="manual" ref="doc.html"/>
<keyword name="bar" ref="doc.html#bar"/>
<keyword id="MuseScore::foobar" ref="doc.html#foobar"/>
<keyword id="mops" ref="doc.html#foobar"/>
<keyword id="klops" ref="doc.html#foobar"/>
</keywords>
<files>
<file>../classic.css</file>
<file>doc.html</file>
</files>
</filterSection>
</QtHelpProject>

9
rdoc/en/doc.html Normal file
View file

@ -0,0 +1,9 @@
<html>
<body>
Hello MuseScore!
</body>
</html>

15
rdoc/en/doc.qhcp Normal file
View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8" ?>
<QHelpCollectionProject version="1.0">
<docFiles>
<generate>
<file>
<input>doc.qhp</input>
<output>doc.qch</output>
</file>
</generate>
<register>
<file>doc.qch</file>
</register>
</docFiles>
</QHelpCollectionProject>

31
rdoc/en/doc.qhp Normal file
View file

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<QtHelpProject version="1.0">
<namespace>musescore.com.musescore.2.0</namespace>
<virtualFolder>doc</virtualFolder>
<customFilter name="en">
<filterAttribute>MuseScore</filterAttribute>
</customFilter>
<filterSection>
<filterAttribute>MuseScore</filterAttribute>
<toc>
<section title="My Application Manual" ref="index.html">
<section title="Chapter 1" ref="doc.html#chapter1"/>
<section title="Chapter 2" ref="doc.html#chapter2"/>
<section title="Chapter 3" ref="doc.html#chapter3"/>
</section>
</toc>
<keywords>
<keyword id="manual" ref="doc.html"/>
<keyword name="bar" ref="doc.html#bar"/>
<keyword id="MuseScore::foobar" ref="doc.html#foobar"/>
<keyword id="mops" ref="doc.html#foobar"/>
<keyword id="klops" ref="doc.html#foobar"/>
</keywords>
<files>
<file>../classic.css</file>
<file>doc.html</file>
</files>
</filterSection>
</QtHelpProject>