Skip to content
Snippets Groups Projects
Commit b0a636fb authored by SeeLook's avatar SeeLook
Browse files

Create object helper with C++ logic for main score. Actions are created there...

Create object helper with C++ logic for main score. Actions are created there and it provides score actions list for a menu
parent a2bf9a86
Branches
No related tags found
No related merge requests found
......@@ -83,6 +83,7 @@ set(NOOTKA_SRC
main/thelpdialogbase.cpp
main/texamhelp.cpp
main/ttiphandler.cpp
main/tmainscoreobject.cpp
dialogs/tdialogloaderobject.cpp
dialogs/tlevelcreatoritem.cpp
......
......@@ -33,6 +33,7 @@
#include <tnootkaqml.h>
#include <tsound.h>
#include "main/tnameitem.h"
#include "main/tmainscoreobject.h"
#include "dialogs/tdialogloaderobject.h"
#if defined (Q_OS_ANDROID)
......@@ -147,11 +148,12 @@ int main(int argc, char *argv[])
GLOB->isFirstRun = false;
}
qmlRegisterType<TnameItem>("Nootka.Main", 1, 0, "TnameItem");
qmlRegisterType<TmainScoreObject>("Nootka.Main", 1, 0, "TmainScoreObject");
qmlRegisterType<TdialogLoaderObject>("Nootka.Dialogs", 1, 0, "TdialogObject");
e->load(QUrl(QStringLiteral("qrc:/MainWindow.qml")));
// #if defined (Q_OS_ANDROID)
// w->showFullScreen(); // TODO
// w->showFullScreen(); // TODO seems to be not necessary
// #endif
if (firstTime) {
......
/***************************************************************************
* Copyright (C) 2017 by Tomasz Bojczuk *
* seelook@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
***************************************************************************/
#include "tmainscoreobject.h"
#include <score/tscoreobject.h>
#include <taction.h>
#include <tglobals.h>
#include <qtr.h>
#include <tnootkaqml.h>
#include <tsound.h>
#include <QtCore/qdebug.h>
TmainScoreObject* TmainScoreObject::m_instance = nullptr;
TmainScoreObject::TmainScoreObject(QObject* parent) :
QObject(parent)
{
if (m_instance) {
qDebug() << "TmainScoreObject instance already exists!";
return;
}
m_instance = this;
m_playAct = new Taction(qTR("QShortcut", "Play"), QStringLiteral("playMelody"), this);
m_recModeAct = new Taction(QString(), QString(), this);
m_showNamesAct = new Taction(tr("Show note names"), QString(), this);
m_showNamesAct->setCheckable(true);
m_showNamesAct->setChecked(GLOB->namesOnScore());
m_extraAccidsAct = new Taction(tr("Additional accidentals"), QString(), this);
m_extraAccidsAct->setCheckable(true);
// m_showNamesAct->setChecked(GLOB->????);
m_deleteLastAct = new Taction(tr("Delete note"), QStringLiteral("delete"), this);
m_clearScoreAct = new Taction(tr("Delete all notes"), QStringLiteral("clear-score"), this);
m_zoomOutAct = new Taction(tr("Zoom score out"), QStringLiteral("zoom-out"), this);
m_zoomInAct = new Taction(tr("Zoom score in"), QStringLiteral("zoom-in"), this);
m_openXmlAct = new Taction(qTR("QShortcut", "Open"), QStringLiteral("open"), this);
connect(m_openXmlAct, &Taction::triggered, this, &TmainScoreObject::openXmlActSlot);
m_saveXmlAct = new Taction(qTR("QShortcut", "Save"), QStringLiteral("save"), this);
connect(m_saveXmlAct, &Taction::triggered, this, &TmainScoreObject::saveXmlActSlot);
isExamChangedSlot();
}
TmainScoreObject::~TmainScoreObject()
{
m_instance = nullptr;
}
void TmainScoreObject::setScoreObject(TscoreObject* scoreObj) {
if (m_scoreObject) {
qDebug() << "[TmainScoreObject] score object was already set. FIX IT!";
return;
}
m_scoreObject = scoreObj;
connect(m_showNamesAct, &Taction::triggered, [=]{ m_scoreObject->setShowNoteNames(m_showNamesAct->checked()); });
// connect(m_extraAccidsAct);
connect(m_deleteLastAct, &Taction::triggered, [=]{ m_scoreObject->deleteLastNote(); });
connect(m_clearScoreAct, &Taction::triggered, [=]{ m_scoreObject->clearScore(); });
connect(m_playAct, &Taction::triggered, SOUND, &Tsound::playScore);
connect(m_recModeAct, &Taction::triggered, [=]{ m_scoreObject->setRecordMode(!m_scoreObject->recordMode()); });
connect(m_zoomOutAct, &Taction::triggered, [=]{ m_scoreObject->setScaleFactor(qMax(0.4, m_scoreObject->scaleFactor() - 0.2)); });
connect(m_zoomInAct, &Taction::triggered, [=]{ m_scoreObject->setScaleFactor(qMin(m_scoreObject->scaleFactor() + 0.2, 1.4)); });
connect(GLOB, &Tglobals::isExamChanged, this, &TmainScoreObject::isExamChangedSlot);
}
//#################################################################################################
//################### PROTECTED ############################################
//#################################################################################################
void TmainScoreObject::openXmlActSlot() {
SOUND->stopListen();
m_scoreObject->openMusicXml(NOO->getXmlToOpen());
SOUND->startListen();
}
void TmainScoreObject::saveXmlActSlot() {
SOUND->stopListen();
m_scoreObject->saveMusicXml(NOO->getXmlToSave());
SOUND->startListen();
}
void TmainScoreObject::isExamChangedSlot() {
m_scoreActions.clear();
if (GLOB->isExam())
m_scoreActions << m_zoomOutAct << m_zoomInAct << m_deleteLastAct << m_clearScoreAct;
else
m_scoreActions << m_playAct << m_recModeAct << m_openXmlAct << m_saveXmlAct << m_showNamesAct << m_extraAccidsAct
<< m_zoomOutAct << m_zoomInAct << m_deleteLastAct << m_clearScoreAct;
emit scoreActionsChanged();
}
/***************************************************************************
* Copyright (C) 2017 by Tomasz Bojczuk *
* seelook@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
***************************************************************************/
#ifndef TMAINSCOREOBJECT_H
#define TMAINSCOREOBJECT_H
#include <QtCore/qobject.h>
class Taction;
class TscoreObject;
#define MAIN_SCORE TmainScoreObject::instance()
/**
* @p TmainScoreObject is yet another helper to divide score implementation and move its logic to C++
* It manages all score actions, but their shortcuts have to be set on QML side.
* @p scoreActions() is the list of currently available actions used by @p ScoreMenuContent.qml as a model.
* The list changes during exam.
* IT HAS TO HAVE @p TscoreObject set through @p scoreObject QML property
*/
class TmainScoreObject : public QObject
{
Q_OBJECT
Q_PROPERTY(TscoreObject* scoreObject READ scoreObject WRITE setScoreObject)
Q_PROPERTY(Taction* playAct READ playAct)
Q_PROPERTY(Taction* recModeAct READ recModeAct)
Q_PROPERTY(Taction* showNamesAct READ showNamesAct)
Q_PROPERTY(Taction* extraAccidsAct READ extraAccidsAct)
Q_PROPERTY(Taction* deleteLastAct READ deleteLastAct)
Q_PROPERTY(Taction* clearScoreAct READ clearScoreAct)
Q_PROPERTY(Taction* openXmlAct READ openXmlAct)
Q_PROPERTY(Taction* saveXmlAct READ saveXmlAct)
Q_PROPERTY(Taction* zoomOutAct READ zoomOutAct)
Q_PROPERTY(Taction* zoomInAct READ zoomInAct)
Q_PROPERTY(QList<QObject*> scoreActions READ scoreActions NOTIFY scoreActionsChanged)
public:
explicit TmainScoreObject(QObject* parent = nullptr);
~TmainScoreObject() override;
static TmainScoreObject* instance() { return m_instance; }
TscoreObject* scoreObject() { return m_scoreObject; }
void setScoreObject(TscoreObject* scoreObj);
Taction* playAct() { return m_playAct; }
Taction* recModeAct() { return m_recModeAct; }
Taction* showNamesAct() { return m_showNamesAct; }
Taction* extraAccidsAct() { return m_extraAccidsAct; }
Taction* deleteLastAct() { return m_deleteLastAct; }
Taction* clearScoreAct() { return m_clearScoreAct; }
Taction* openXmlAct() { return m_openXmlAct; }
Taction* saveXmlAct() { return m_saveXmlAct; }
Taction* zoomOutAct() { return m_zoomOutAct; }
Taction* zoomInAct() { return m_zoomInAct; }
QList<QObject*> scoreActions() { return m_scoreActions; }
signals:
void scoreActionsChanged();
protected:
void openXmlActSlot();
void saveXmlActSlot();
void isExamChangedSlot();
private:
TscoreObject *m_scoreObject = nullptr;
Taction *m_playAct, *m_recModeAct;
Taction *m_showNamesAct, *m_extraAccidsAct;
Taction *m_zoomOutAct, *m_zoomInAct;
Taction *m_deleteLastAct, *m_clearScoreAct;
Taction *m_openXmlAct, *m_saveXmlAct;
QList<QObject*> m_scoreActions;
static TmainScoreObject *m_instance;
};
#endif // TMAINSCOREOBJECT_H
......@@ -7,6 +7,7 @@ import QtQuick.Controls 2.2
import Score 1.0
import Nootka 1.0
import Nootka.Main 1.0
Score {
......@@ -14,16 +15,17 @@ Score {
width: parent.width
property alias showNamesAct: showNamesAct
property alias extraAccidsAct: extraAccidsAct
property alias zoomInAct: zoomInAct
property alias zoomOutAct: zoomOutAct
property alias openXmlAct: openXmlAct
property alias saveXmlAct: saveXmlAct
property alias deleteLastAct: deleteLastAct
property alias clearScoreAct: clearScoreAct
property alias recModeAct: recModeAct
property alias playAct: playAct
property alias showNamesAct: mainObj.showNamesAct
property alias extraAccidsAct: mainObj.extraAccidsAct
property alias zoomInAct: mainObj.zoomInAct
property alias zoomOutAct: mainObj.zoomOutAct
property alias openXmlAct: mainObj.openXmlAct
property alias saveXmlAct: mainObj.saveXmlAct
property alias deleteLastAct: mainObj.deleteLastAct
property alias clearScoreAct: mainObj.clearScoreAct
property alias recModeAct: mainObj.recModeAct
property alias playAct: mainObj.playAct
property alias scoreActions: mainObj.scoreActions
scoreObj.meter: GLOB.rhythmsEnabled && !GLOB.singleNoteMode ? Tmeter.Meter_4_4 : Tmeter.NoMeter
focus: true
......@@ -42,6 +44,19 @@ Score {
scoreObj.nameStyle: GLOB.noteNameStyle
scoreObj.enableDoubleAccidentals: GLOB.enableDoubleAccids
TmainScoreObject {
id: mainObj
scoreObject: scoreObj
deleteLastAct.shortcut: Shortcut { sequence: "Del"; onActivated: deleteLastAct.triggered(); enabled: !GLOB.singleNoteMode }
clearScoreAct.shortcut: Shortcut { sequence: "Shift+Del"; onActivated: clearScoreAct.triggered(); enabled: !GLOB.singleNoteMode }
openXmlAct.shortcut: Shortcut { sequence: StandardKey.Open; onActivated: openXmlAct.triggered(); enabled: !GLOB.singleNoteMode }
saveXmlAct.shortcut: Shortcut { sequence: StandardKey.Save; onActivated: saveXmlAct.triggered(); enabled: !GLOB.singleNoteMode }
zoomOutAct.shortcut: Shortcut { sequence: StandardKey.ZoomOut; onActivated: zoomOutAct.triggered(); enabled: !GLOB.singleNoteMode }
zoomInAct.shortcut: Shortcut { sequence: StandardKey.ZoomIn; onActivated: zoomInAct.triggered(); enabled: !GLOB.singleNoteMode }
recModeAct.text: recordMode ? qsTr("Note by note") : qsTr("Edit")
recModeAct.icon: recordMode ? "record" : "stopMelody"
}
Timer { id: zoomTimer; interval: 500 }
MouseArea {
anchors.fill: parent
......@@ -127,94 +142,11 @@ Score {
height: currentNote ? Math.min(12.0, currentNote.notePosY + 6.0) : 0
x: currentNote ? -width * 0.25 : 0
y: currentNote ? Math.min(currentNote.height - height, Math.max(0.0, currentNote.notePosY - height / 2.0)) : 0
color: Qt.rgba(activPal.highlight.r, activPal.highlight.g, activPal.highlight.b, 0.3)
color: Noo.alpha(activPal.highlight, 75)
z: -1
radius: width / 3.0
}
Taction {
id: playAct
text: Noo.TR("QShortcut", "Play")
icon: "playMelody"
onTriggered: SOUND.playScore()
// shortcut: Shortcut { sequence: "Space"; onActivated: recModeAct.triggered() }
}
Taction {
id: recModeAct
text: recordMode ? qsTr("Note by note") : qsTr("Edit")
icon: recordMode ? "record" : "stopMelody"
onTriggered: recordMode = !recordMode
// shortcut: Shortcut { sequence: "Ctrl+Space"; onActivated: recModeAct.triggered() }
}
Taction {
id: openXmlAct
text: Noo.TR("QShortcut", "Open")
icon: "open"
onTriggered: {
SOUND.stopListen()
var xmlFle = Noo.getXmlToOpen()
scoreObj.openMusicXml(xmlFle)
SOUND.startListen()
}
shortcut: Shortcut { sequence: StandardKey.Open; onActivated: openXmlAct.triggered() }
}
Taction {
id: saveXmlAct
text: Noo.TR("QShortcut", "Save")
icon: "save"
onTriggered: {
var xmlFle = Noo.getXmlToSave()
scoreObj.saveMusicXml(xmlFle)
}
shortcut: Shortcut { sequence: StandardKey.Save; onActivated: saveXmlAct.triggered() }
}
Taction {
id: extraAccidsAct
enabled: !GLOB.singleNoteMode
text: qsTr("Additional accidentals")
checkable: true
}
Taction {
id: showNamesAct
enabled: !GLOB.singleNoteMode
text: qsTr("Show note names")
checkable: true
checked: GLOB.namesOnScore
onTriggered: { scoreObj.showNoteNames = checked }
}
Taction {
id: zoomOutAct
enabled: !GLOB.singleNoteMode
icon: "zoom-out"
text: qsTr("Zoom score out")
onTriggered: scaleFactor = Math.max(0.4, scaleFactor - 0.2)
shortcut: Shortcut { sequence: StandardKey.ZoomOut; onActivated: zoomOutAct.triggered() }
}
Taction {
id: zoomInAct
enabled: !GLOB.singleNoteMode
icon: "zoom-in"
text: qsTr("Zoom score in")
onTriggered: scaleFactor = scaleFactor = Math.min(scaleFactor + 0.2, 1.4)
shortcut: Shortcut { sequence: StandardKey.ZoomIn; onActivated: zoomInAct.triggered() }
}
Taction {
id: deleteLastAct
enabled: !GLOB.singleNoteMode
icon: "delete"
text: qsTr("Delete note")
onTriggered: scoreObj.deleteLastNote()
shortcut: Shortcut { sequence: "Del"; onActivated: deleteLastAct.triggered() }
}
Taction {
id: clearScoreAct
enabled: !GLOB.singleNoteMode
icon: "clear-score"
text: qsTr("Delete all notes")
onTriggered: clearScore()
shortcut: Shortcut { sequence: "Shift+Del"; onActivated: clearScoreAct.triggered() }
}
Shortcut {
enabled: !GLOB.singleNoteMode
sequence: StandardKey.MoveToNextChar;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment