MuseScore/mscore/help.cpp
2016-08-08 11:12:32 +02:00

229 lines
7.1 KiB
C++

//=============================================================================
// MuseScore
// Music Composition & Notation
//
// Copyright (C) 2015 Werner Schweer
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2
// as published by the Free Software Foundation and appearing in
// the file LICENCE.GPL
//=============================================================================
#include "help.h"
#include "helpBrowser.h"
#include "musescore.h"
#include "scoreview.h"
namespace Ms {
//---------------------------------------------------------
// HelpQuery
//---------------------------------------------------------
HelpQuery::HelpQuery(QWidget* parent)
: QWidgetAction(parent)
{
mapper = new QSignalMapper(this);
w = new QWidget(parent);
QHBoxLayout* layout = new QHBoxLayout;
QLabel* label = new QLabel;
label->setText(tr("Search for: "));
layout->addWidget(label);
entry = new QLineEdit;
layout->addWidget(entry);
QToolButton* button = new QToolButton;
button->setText("x");
layout->addWidget(button);
w->setLayout(layout);
setDefaultWidget(w);
emptyState = true;
connect(button, SIGNAL(clicked()), entry, SLOT(clear()));
connect(entry, SIGNAL(textChanged(const QString&)), SLOT(textChanged(const QString&)));
connect(entry, SIGNAL(returnPressed()), SLOT(returnPressed()));
connect(mapper, SIGNAL(mapped(QObject*)), SLOT(actionTriggered(QObject*)));
}
//---------------------------------------------------------
// setFocus
//---------------------------------------------------------
void HelpQuery::setFocus()
{
entry->clear();
entry->setFocus();
}
//---------------------------------------------------------
// textChanged
//---------------------------------------------------------
void HelpQuery::textChanged(const QString& ss)
{
QString s = ss.toLower();
QWidget* menu = static_cast<QWidget*>(parent());
if (s.isEmpty()) {
if (!emptyState) { // restore old menu entries
QList<QAction*> al = menu->actions();
for (QAction* a : al) {
if (a != this)
menu->removeAction(a);
}
for (QAction* a : actions) {
if (a != this)
menu->addAction(a);
}
}
emptyState = true;
return;
}
if (emptyState)
actions = menu->actions();
for (QAction* a : menu->actions()) {
if (a != this)
menu->removeAction(a);
}
emptyState = false;
if (!mscore->helpEngine())
return;
QMap<QString,QUrl>list = mscore->helpEngine()->linksForIdentifier(s);
// QMap<QString,QUrl>list = mscore->helpEngine()->indexModel()->linksForKeyword(s);
int k = 0;
for (auto i = list.begin(); i != list.end(); ++i) {
QAction* action = new QAction(i.key(), this);
action->setData(i.value());
// printf("add action <%s> <%s>\n", qPrintable(i.key()), qPrintable(i.value().toString()));
menu->addAction(action);
connect(action, SIGNAL(triggered()), mapper, SLOT(map()));
mapper->setMapping(action, action);
if (++k > 10)
break;
}
}
//---------------------------------------------------------
// actionTriggered
//---------------------------------------------------------
void HelpQuery::actionTriggered(QObject* obj)
{
QAction* action = static_cast<QAction*>(obj);
if (action->data().isNull())
return;
QUrl url = action->data().toUrl();
if (url.isValid())
mscore->showHelp(url);
else
qDebug("actionTriggered: bad url");
entry->clear();
}
//---------------------------------------------------------
// return pressed
//---------------------------------------------------------
void HelpQuery::returnPressed()
{
QHelpEngine* he = mscore->helpEngine();
if (!he)
return;
QMap<QString,QUrl>list = he->linksForIdentifier(entry->text().toLower());
if (!list.isEmpty()) {
mscore->showHelp(list.begin().value());
}
entry->clear();
}
//---------------------------------------------------------
// showHelp
// show local help
//---------------------------------------------------------
void MuseScore::showHelp(const QUrl& url)
{
qDebug("showHelp <%s>", qPrintable(url.toString()));
if (!_helpEngine)
return;
QAction* a = getAction("help");
a->blockSignals(true);
a->setChecked(true);
a->blockSignals(false);
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::showHelp(QString s)
{
qDebug("showHelp <%s>", qPrintable(s));
s = s.toLower();
if (!s.isEmpty()) {
QString help = QString("https://musescore.org/redirect/help?tag=%1&locale=%2").arg(s).arg(getLocaleISOCode());
help += QString("&utm_source=desktop&utm_medium=contextual&utm_content=%1&utm_term=%2&utm_campaign=MuseScore%3").arg(rev.trimmed()).arg(s).arg(QString(VERSION));
QDesktopServices::openUrl(QUrl(help));
}
#if 0
if (!_helpEngine) {
qDebug("no help available");
return;
}
s = s.toLower();
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));
QMap<QString,QUrl>list = _helpEngine->linksForIdentifier("manual");
if (!list.isEmpty())
showHelp(*list.begin());
}
#endif
}
//---------------------------------------------------------
// showContextHelp
//---------------------------------------------------------
void MuseScore::showContextHelp()
{
QString s;
QWidget* w = qApp->widgetAt(globalX, globalY);
while (w) {
if (!w->statusTip().isEmpty()) {
s = w->statusTip();
break;
}
w = w->parentWidget();
}
if (w && s == "scoreview") {
ScoreView* canvas = static_cast<ScoreView*>(w);
QPoint pt = w->mapFromGlobal(QPoint(globalX, globalY));
QPointF p = canvas->toLogical(pt);
Element* e = canvas->elementNear(p);
if (e)
s = QString("element:%1").arg(e->name());
}
showHelp(s);
}
} // end namespace Ms