From 65c3bc5d993a9d0c6adbb45cdb1b7b1497f39050 Mon Sep 17 00:00:00 2001 From: CrSjimo Date: Mon, 13 Oct 2025 00:31:23 +0800 Subject: [PATCH 001/267] Add dspxmodel library --- src/libs/application/CMakeLists.txt | 4 +- src/libs/application/dspxmodel/CMakeLists.txt | 5 + .../application/dspxmodel/src/CMakeLists.txt | 42 ++++++ .../dspxmodel/src/DspxModelGlobal.h | 12 ++ src/libs/application/dspxmodel/src/Handle.h | 15 ++ .../dspxmodel/src/ModelStrategy.cpp | 9 ++ .../application/dspxmodel/src/ModelStrategy.h | 142 ++++++++++++++++++ .../dspxmodel/tests/CMakeLists.txt | 0 8 files changed, 228 insertions(+), 1 deletion(-) create mode 100644 src/libs/application/dspxmodel/CMakeLists.txt create mode 100644 src/libs/application/dspxmodel/src/CMakeLists.txt create mode 100644 src/libs/application/dspxmodel/src/DspxModelGlobal.h create mode 100644 src/libs/application/dspxmodel/src/Handle.h create mode 100644 src/libs/application/dspxmodel/src/ModelStrategy.cpp create mode 100644 src/libs/application/dspxmodel/src/ModelStrategy.h create mode 100644 src/libs/application/dspxmodel/tests/CMakeLists.txt diff --git a/src/libs/application/CMakeLists.txt b/src/libs/application/CMakeLists.txt index 0ca9e678..23782f35 100644 --- a/src/libs/application/CMakeLists.txt +++ b/src/libs/application/CMakeLists.txt @@ -1,3 +1,5 @@ add_subdirectory(loadapi) -add_subdirectory(uishell) \ No newline at end of file +add_subdirectory(uishell) + +add_subdirectory(dspxmodel) \ No newline at end of file diff --git a/src/libs/application/dspxmodel/CMakeLists.txt b/src/libs/application/dspxmodel/CMakeLists.txt new file mode 100644 index 00000000..03719520 --- /dev/null +++ b/src/libs/application/dspxmodel/CMakeLists.txt @@ -0,0 +1,5 @@ +add_subdirectory(src) + +if(APPLICATION_BUILD_TESTS) + add_subdirectory(tests) +endif() \ No newline at end of file diff --git a/src/libs/application/dspxmodel/src/CMakeLists.txt b/src/libs/application/dspxmodel/src/CMakeLists.txt new file mode 100644 index 00000000..5282cdcc --- /dev/null +++ b/src/libs/application/dspxmodel/src/CMakeLists.txt @@ -0,0 +1,42 @@ +project(dspxmodel VERSION ${APPLICATION_VERSION}) + +qm_import(Qml) + +file(GLOB_RECURSE _src *.h *.cpp) + +ck_add_library(${PROJECT_NAME} SHARED AUTOGEN) + +qm_configure_target(${PROJECT_NAME} + SOURCES ${_src} + LINKS + QT_LINKS Core Gui Qml + QT_INCLUDE_PRIVATE Core Gui Qml + INCLUDE_PRIVATE * + PREFIX DSPX_MODEL +) + +if(QT_KNOWN_POLICY_QTP0001) + qt_policy(SET QTP0001 NEW) +endif() +if(QT_KNOWN_POLICY_QTP0004) + qt_policy(SET QTP0004 NEW) +endif() + +file(GLOB_RECURSE _qml_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.qml *.js *.mjs) + +qt_add_qml_module(${PROJECT_NAME} + URI DiffScope.DspxModel + QML_FILES ${_qml_files} + NAMESPACE dspxmodel + OUTPUT_DIRECTORY ${QMSETUP_BUILD_DIR}/qml/DiffScope/DspxModel +) + +qm_install_qml_modules(${PROJECT_NAME}) + +ck_sync_include(${PROJECT_NAME} FORCE) + +set_target_properties(${PROJECT_NAME} PROPERTIES + CXX_STANDARD 20 + CXX_STANDARD_REQUIRED TRUE +) + diff --git a/src/libs/application/dspxmodel/src/DspxModelGlobal.h b/src/libs/application/dspxmodel/src/DspxModelGlobal.h new file mode 100644 index 00000000..4ac14b72 --- /dev/null +++ b/src/libs/application/dspxmodel/src/DspxModelGlobal.h @@ -0,0 +1,12 @@ +#ifndef DIFFSCOPE_DSPX_MODEL_DSPXMODELGLOBAL_H +#define DIFFSCOPE_DSPX_MODEL_DSPXMODELGLOBAL_H + +#include + +#if defined(DSPXMODEL_LIBRARY) +# define DSPX_MODEL_EXPORT Q_DECL_EXPORT +#else +# define DSPX_MODEL_EXPORT Q_DECL_IMPORT +#endif + +#endif //DIFFSCOPE_DSPX_MODEL_DSPXMODELGLOBAL_H diff --git a/src/libs/application/dspxmodel/src/Handle.h b/src/libs/application/dspxmodel/src/Handle.h new file mode 100644 index 00000000..aa79a633 --- /dev/null +++ b/src/libs/application/dspxmodel/src/Handle.h @@ -0,0 +1,15 @@ +#ifndef DIFFSCOPE_DSPX_MODEL_HANDLE_H +#define DIFFSCOPE_DSPX_MODEL_HANDLE_H + +#include + + +namespace dspxmodel { + + struct Handle { + quintptr d; + }; + +} + +#endif //DIFFSCOPE_DSPX_MODEL_HANDLE_H diff --git a/src/libs/application/dspxmodel/src/ModelStrategy.cpp b/src/libs/application/dspxmodel/src/ModelStrategy.cpp new file mode 100644 index 00000000..131f071d --- /dev/null +++ b/src/libs/application/dspxmodel/src/ModelStrategy.cpp @@ -0,0 +1,9 @@ +#include "ModelStrategy.h" + +namespace dspxmodel { + + ModelStrategy::ModelStrategy(QObject *parent) : QObject(parent) { + } + ModelStrategy::~ModelStrategy() = default; + +} \ No newline at end of file diff --git a/src/libs/application/dspxmodel/src/ModelStrategy.h b/src/libs/application/dspxmodel/src/ModelStrategy.h new file mode 100644 index 00000000..82576df1 --- /dev/null +++ b/src/libs/application/dspxmodel/src/ModelStrategy.h @@ -0,0 +1,142 @@ +#ifndef DIFFSCOPE_DSPX_MODEL_MODELSTRATEGY_H +#define DIFFSCOPE_DSPX_MODEL_MODELSTRATEGY_H + +#include + +#include + +namespace dspxmodel { + + class DSPX_MODEL_EXPORT ModelStrategy : public QObject { + Q_OBJECT + public: + explicit ModelStrategy(QObject *parent = nullptr); + ~ModelStrategy() override; + + enum Entity { + EI_AudioClip, + EI_Global, + EI_Label, + EI_Master, + EI_Note, + EI_Param, + EI_ParamCurveAnchor, + EI_ParamCurveFree, + EI_ParamCurveAnchorNode, + EI_Phoneme, + EI_SingingClip, + EI_Source, + EI_Tempo, + EI_TimeSignature, + EI_Track, + EI_WorkspaceInfo, + + ES_Clips, + ES_Labels, + ES_Notes, + ES_ParamCurveAnchorNodes, + ES_ParamCurves, + ES_Tempos, + ES_TimeSignatures, + + EL_Phonemes, + EL_Tracks, + + ED_ParamCurveFreeItems, + ED_VibratoPoints, + + EM_Params, + EM_Sources, + EM_Workspace, + + }; + + enum Property { + P_Author, + P_CentShift, + P_ClipStart, + P_Color, + P_ControlGain, + P_ControlMute, + P_ControlPan, + P_ControlSolo, + P_Denominator, + P_EditorId, + P_EditorName, + P_JsonObject, + P_KeyNumber, + P_Language, + P_Length, + P_Measure, + P_Name, + P_Numerator, + P_Path, + P_Position, + P_PronunciationEdited, + P_PronunciationOriginal, + P_Text, + P_Type, + P_Value, + P_VibratoAmplitude, + P_VibratoEnd, + P_VibratoFrequency, + P_VibratoOffset, + P_VibratoPhase, + P_VibratoStart, + }; + + enum Relationship { + R_Children, + R_Labels, + R_Master, + R_ParamCurvesEdited, + R_ParamCurvesEnvelop, + R_ParamCurvesOriginal, + R_Params, + R_PhonemesEdited, + R_PhonemesOriginal, + R_Sources, + R_Tempos, + R_TimeSignatures, + R_Tracks, + R_VibratoPoints, + R_Workspace, + }; + + virtual Handle createEntity(Entity entityType) = 0; + virtual void destroyEntity(Handle entity) = 0; + + virtual void insertIntoSequenceContainer(Handle sequenceContainerEntity, Handle entity) = 0; + virtual void insertIntoListContainer(Handle listContainerEntity, const QList &entities, int index) = 0; + virtual void insertIntoMapContainer(Handle mapContainerEntity, Handle entity, const QString &key) = 0; + + virtual void removeFromContainer(Handle entity) = 0; + virtual QList takeFromListContainer(Handle listContainerEntity, const QList &indexes) = 0; + virtual Handle takeFromMapContainer(Handle mapContainerEntity, const QString &key) = 0; + virtual void rotateListContainer(Handle listContainerEntity, int leftIndex, int middleIndex, int rightIndex) = 0; + + virtual void setEntityProperty(Handle entity, Property property, const QVariant &value) = 0; + + virtual Handle getAssociatedSubEntity(Handle entity, Relationship relationship) = 0; + + Q_SIGNALS: + void createEntityNotified(Handle entity, Entity entityType); + void destroyEntityNotified(Handle entity); + + void insertedIntoSequenceContainerNotified(Handle sequenceContainerEntity, Handle entity); + void insertIntoListContainerNotified(Handle listContainerEntity, const QList &entities, int index); + void insertIntoMapContainerNotified(Handle mapContainerEntity, Handle entity, const QString &key); + + void removeFromContainerNotified(Handle entity); + void takeFromListContainerNotified(const QList &takenEntities, Handle listContainerEntity, const QList &indexes); + void takeFromMapContainerNotified(Handle takenEntity, Handle mapContainerEntity, const QString &key); + void rotateListContainerNotified(Handle listContainerEntity, int leftIndex, int middleIndex, int rightIndex); + + void setEntityPropertyNotified(Handle entity, Property property, const QVariant &value); + + + }; + +} + +#endif //DIFFSCOPE_DSPX_MODEL_MODELSTRATEGY_H diff --git a/src/libs/application/dspxmodel/tests/CMakeLists.txt b/src/libs/application/dspxmodel/tests/CMakeLists.txt new file mode 100644 index 00000000..e69de29b From 84a17ee8b3c36ed6804260e3278d2c125141dfc7 Mon Sep 17 00:00:00 2001 From: CrSjimo Date: Mon, 13 Oct 2025 16:25:35 +0800 Subject: [PATCH 002/267] Change namespace to dspx --- src/libs/application/dspxmodel/src/CMakeLists.txt | 2 +- src/libs/application/dspxmodel/src/Handle.h | 2 +- src/libs/application/dspxmodel/src/ModelStrategy.cpp | 2 +- src/libs/application/dspxmodel/src/ModelStrategy.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libs/application/dspxmodel/src/CMakeLists.txt b/src/libs/application/dspxmodel/src/CMakeLists.txt index 5282cdcc..d29d1861 100644 --- a/src/libs/application/dspxmodel/src/CMakeLists.txt +++ b/src/libs/application/dspxmodel/src/CMakeLists.txt @@ -27,7 +27,7 @@ file(GLOB_RECURSE _qml_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.qml *.js *.m qt_add_qml_module(${PROJECT_NAME} URI DiffScope.DspxModel QML_FILES ${_qml_files} - NAMESPACE dspxmodel + NAMESPACE dspx OUTPUT_DIRECTORY ${QMSETUP_BUILD_DIR}/qml/DiffScope/DspxModel ) diff --git a/src/libs/application/dspxmodel/src/Handle.h b/src/libs/application/dspxmodel/src/Handle.h index aa79a633..50346816 100644 --- a/src/libs/application/dspxmodel/src/Handle.h +++ b/src/libs/application/dspxmodel/src/Handle.h @@ -4,7 +4,7 @@ #include -namespace dspxmodel { +namespace dspx { struct Handle { quintptr d; diff --git a/src/libs/application/dspxmodel/src/ModelStrategy.cpp b/src/libs/application/dspxmodel/src/ModelStrategy.cpp index 131f071d..b3260fd8 100644 --- a/src/libs/application/dspxmodel/src/ModelStrategy.cpp +++ b/src/libs/application/dspxmodel/src/ModelStrategy.cpp @@ -1,6 +1,6 @@ #include "ModelStrategy.h" -namespace dspxmodel { +namespace dspx { ModelStrategy::ModelStrategy(QObject *parent) : QObject(parent) { } diff --git a/src/libs/application/dspxmodel/src/ModelStrategy.h b/src/libs/application/dspxmodel/src/ModelStrategy.h index 82576df1..19b5974d 100644 --- a/src/libs/application/dspxmodel/src/ModelStrategy.h +++ b/src/libs/application/dspxmodel/src/ModelStrategy.h @@ -5,7 +5,7 @@ #include -namespace dspxmodel { +namespace dspx { class DSPX_MODEL_EXPORT ModelStrategy : public QObject { Q_OBJECT From d4ee728947744cb308f34232059465be59967a02 Mon Sep 17 00:00:00 2001 From: CrSjimo Date: Mon, 13 Oct 2025 20:32:50 +0800 Subject: [PATCH 003/267] Add entity objects --- .../dspxmodel/src/EntityObject.cpp | 55 +++++++ .../application/dspxmodel/src/EntityObject.h | 50 +++++++ .../dspxmodel/src/EntityObject_p.h | 20 +++ src/libs/application/dspxmodel/src/Global.cpp | 66 +++++++++ src/libs/application/dspxmodel/src/Global.h | 61 ++++++++ src/libs/application/dspxmodel/src/Handle.h | 27 ++++ src/libs/application/dspxmodel/src/Label.cpp | 65 +++++++++ src/libs/application/dspxmodel/src/Label.h | 43 ++++++ src/libs/application/dspxmodel/src/Master.cpp | 50 +++++++ src/libs/application/dspxmodel/src/Master.h | 51 +++++++ src/libs/application/dspxmodel/src/Model.cpp | 134 ++++++++++++++++++ src/libs/application/dspxmodel/src/Model.h | 54 +++++++ .../application/dspxmodel/src/ModelStrategy.h | 5 +- src/libs/application/dspxmodel/src/Model_p.h | 49 +++++++ .../application/dspxmodel/src/Timeline.cpp | 27 ++++ src/libs/application/dspxmodel/src/Timeline.h | 40 ++++++ 16 files changed, 794 insertions(+), 3 deletions(-) create mode 100644 src/libs/application/dspxmodel/src/EntityObject.cpp create mode 100644 src/libs/application/dspxmodel/src/EntityObject.h create mode 100644 src/libs/application/dspxmodel/src/EntityObject_p.h create mode 100644 src/libs/application/dspxmodel/src/Global.cpp create mode 100644 src/libs/application/dspxmodel/src/Global.h create mode 100644 src/libs/application/dspxmodel/src/Label.cpp create mode 100644 src/libs/application/dspxmodel/src/Label.h create mode 100644 src/libs/application/dspxmodel/src/Master.cpp create mode 100644 src/libs/application/dspxmodel/src/Master.h create mode 100644 src/libs/application/dspxmodel/src/Model.cpp create mode 100644 src/libs/application/dspxmodel/src/Model.h create mode 100644 src/libs/application/dspxmodel/src/Model_p.h create mode 100644 src/libs/application/dspxmodel/src/Timeline.cpp create mode 100644 src/libs/application/dspxmodel/src/Timeline.h diff --git a/src/libs/application/dspxmodel/src/EntityObject.cpp b/src/libs/application/dspxmodel/src/EntityObject.cpp new file mode 100644 index 00000000..8d5d3256 --- /dev/null +++ b/src/libs/application/dspxmodel/src/EntityObject.cpp @@ -0,0 +1,55 @@ +#include "EntityObject.h" +#include "EntityObject_p.h" + +#include +#include +#include + +namespace dspx { + + EntityObject::EntityObject(Handle handle, Model *model) : EntityObject(model) { + Q_D(EntityObject); + d->handle = handle; + d->model = model; + auto pModel = ModelPrivate::get(model); + pModel->objectMap.insert(handle, this); + pModel->handleMap.insert(this, handle); + } + EntityObject::EntityObject(QObject *parent) : QObject(parent), d_ptr(new EntityObjectPrivate) { + Q_D(EntityObject); + d->q_ptr = this; + } + EntityObject::~EntityObject() { + Q_D(EntityObject); + if (d->model && d->handle) { + d->model->strategy()->destroyEntity(d->handle); + } + } + + Model *EntityObject::model() const { + Q_D(const EntityObject); + return d->model; + } + + Handle EntityObject::handle() const { + Q_D(const EntityObject); + return d->handle; + } + + void EntityObject::handleInsertIntoSequenceContainer(Handle entity) { + } + void EntityObject::handleInsertIntoListContainer(const QList &entities, int index) { + } + void EntityObject::handleInsertIntoMapContainer(Handle entity, const QString &key) { + } + void EntityObject::handleRemoveFromContainer() { + } + void EntityObject::handleTakeFromListContainer(const QList &takenEntities, const QList &indexes) { + } + void EntityObject::handleTakeFromMapContainer(Handle takenEntity, const QString &key) { + } + void EntityObject::handleRotateListContainer(int leftIndex, int middleIndex, int rightIndex) { + } + void EntityObject::handleSetEntityProperty(int property, const QVariant &value) { + } +} \ No newline at end of file diff --git a/src/libs/application/dspxmodel/src/EntityObject.h b/src/libs/application/dspxmodel/src/EntityObject.h new file mode 100644 index 00000000..64782042 --- /dev/null +++ b/src/libs/application/dspxmodel/src/EntityObject.h @@ -0,0 +1,50 @@ +#ifndef DIFFSCOPE_DSPX_MODEL_ENTITYOBJECT_H +#define DIFFSCOPE_DSPX_MODEL_ENTITYOBJECT_H + +#include + +#include +#include + +namespace dspx { + + class Model; + class ModelPrivate; + + class EntityObjectPrivate; + + class DSPX_MODEL_EXPORT EntityObject : public QObject { + Q_OBJECT + Q_DECLARE_PRIVATE(EntityObject); + public: + ~EntityObject() override; + + Handle handle() const; + + Model *model() const; + + protected: + virtual void handleInsertIntoSequenceContainer(Handle entity); + virtual void handleInsertIntoListContainer(const QList &entities, int index); + virtual void handleInsertIntoMapContainer(Handle entity, const QString &key); + + virtual void handleRemoveFromContainer(); + virtual void handleTakeFromListContainer(const QList &takenEntities, const QList &indexes); + virtual void handleTakeFromMapContainer(Handle takenEntity, const QString &key); + virtual void handleRotateListContainer(int leftIndex, int middleIndex, int rightIndex); + + virtual void handleSetEntityProperty(int property, const QVariant &value); + + explicit EntityObject(Handle handle, Model *model); + + private: + friend class Model; + friend class ModelPrivate; + explicit EntityObject(QObject *parent = nullptr); + QScopedPointer d_ptr; + + }; + +} + +#endif //DIFFSCOPE_DSPX_MODEL_ENTITYOBJECT_H diff --git a/src/libs/application/dspxmodel/src/EntityObject_p.h b/src/libs/application/dspxmodel/src/EntityObject_p.h new file mode 100644 index 00000000..dd2c4783 --- /dev/null +++ b/src/libs/application/dspxmodel/src/EntityObject_p.h @@ -0,0 +1,20 @@ +#ifndef DIFFSCOPE_DSPX_MODEL_ENTITYOBJECT_P_H +#define DIFFSCOPE_DSPX_MODEL_ENTITYOBJECT_P_H + +#include + +#include + +namespace dspx { + + class EntityObjectPrivate { + Q_DECLARE_PUBLIC(EntityObject) + public: + EntityObject *q_ptr; + QPointer model{}; + Handle handle; + }; + +} + +#endif //DIFFSCOPE_DSPX_MODEL_ENTITYOBJECT_P_H diff --git a/src/libs/application/dspxmodel/src/Global.cpp b/src/libs/application/dspxmodel/src/Global.cpp new file mode 100644 index 00000000..8ce6b3ab --- /dev/null +++ b/src/libs/application/dspxmodel/src/Global.cpp @@ -0,0 +1,66 @@ +#include "Global.h" + +#include + +#include +#include +#include + +namespace dspx { + + class GlobalPrivate { + Q_DECLARE_PUBLIC(Global) + public: + Global *q_ptr; + ModelPrivate *pModel; + }; + + Global::Global(Model *model) : QObject(model), d_ptr(new GlobalPrivate) { + Q_D(Global); + d->q_ptr = this; + d->pModel = ModelPrivate::get(model); + } + Global::~Global() = default; + + QString Global::name() const { + Q_D(const Global); + return d->pModel->name; + } + void Global::setName(const QString &name) { + Q_D(Global); + d->pModel->strategy->setEntityProperty(d->pModel->hGlobal, ModelStrategy::P_Name, name); + } + QString Global::author() const { + Q_D(const Global); + return d->pModel->author; + } + void Global::setAuthor(const QString &author) { + Q_D(Global); + d->pModel->strategy->setEntityProperty(d->pModel->hGlobal, ModelStrategy::P_Author, author); + } + int Global::centShift() const { + Q_D(const Global); + return d->pModel->centShift; + } + void Global::setCentShift(int centShift) { + Q_D(Global); + d->pModel->strategy->setEntityProperty(d->pModel->hGlobal, ModelStrategy::P_CentShift, centShift); + } + QString Global::editorId() const { + Q_D(const Global); + return d->pModel->editorId; + } + void Global::setEditorId(const QString &editorId) { + Q_D(Global); + d->pModel->strategy->setEntityProperty(d->pModel->hGlobal, ModelStrategy::P_EditorId, editorId); + } + QString Global::editorName() const { + Q_D(const Global); + return d->pModel->editorName; + } + void Global::setEditorName(const QString &editorName) { + Q_D(Global); + d->pModel->strategy->setEntityProperty(d->pModel->hGlobal, ModelStrategy::P_EditorName, editorName); + } + +} \ No newline at end of file diff --git a/src/libs/application/dspxmodel/src/Global.h b/src/libs/application/dspxmodel/src/Global.h new file mode 100644 index 00000000..e473ce00 --- /dev/null +++ b/src/libs/application/dspxmodel/src/Global.h @@ -0,0 +1,61 @@ +#ifndef DIFFSCOPE_DSPX_MODEL_GLOBAL_H +#define DIFFSCOPE_DSPX_MODEL_GLOBAL_H + +#include +#include + +namespace dspx { + + class Model; + + class ModelPrivate; + + class GlobalPrivate; + + class Global : public QObject { + Q_OBJECT + QML_ELEMENT + QML_UNCREATABLE("") + Q_DECLARE_PRIVATE(Global) + Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) + Q_PROPERTY(QString author READ author WRITE setAuthor NOTIFY authorChanged) + Q_PROPERTY(int centShift READ centShift WRITE setCentShift NOTIFY centShiftChanged) + Q_PROPERTY(QString editorId READ editorId WRITE setEditorId NOTIFY editorIdChanged) + Q_PROPERTY(QString editorName READ editorName WRITE setEditorName NOTIFY editorNameChanged) + + public: + ~Global() override; + + QString name() const; + void setName(const QString &name); + + QString author() const; + void setAuthor(const QString &author); + + int centShift() const; + void setCentShift(int centShift); + + QString editorId() const; + void setEditorId(const QString &editorId); + + QString editorName() const; + void setEditorName(const QString &editorName); + + Q_SIGNALS: + void nameChanged(const QString &name); + void authorChanged(const QString &author); + void centShiftChanged(int centShift); + void editorIdChanged(const QString &editorId); + void editorNameChanged(const QString &editorName); + + private: + friend class ModelPrivate; + explicit Global(Model *model); + + QScopedPointer d_ptr; + + }; + +} + +#endif //DIFFSCOPE_DSPX_MODEL_GLOBAL_H diff --git a/src/libs/application/dspxmodel/src/Handle.h b/src/libs/application/dspxmodel/src/Handle.h index 50346816..71fc3b44 100644 --- a/src/libs/application/dspxmodel/src/Handle.h +++ b/src/libs/application/dspxmodel/src/Handle.h @@ -8,8 +8,35 @@ namespace dspx { struct Handle { quintptr d; + + auto operator<=>(const Handle &) const = default; + bool operator==(const Handle &) const = default; + bool operator!=(const Handle &) const = default; + + friend size_t qHash(const Handle &handle, size_t seed = 0) { + return qHash(handle.d, seed); + } + + friend QDebug operator<<(QDebug debug, const Handle &handle); + + constexpr bool isNull() const { + return !d; + } + constexpr operator bool() const { + return d; + } + }; } +namespace std { + template<> + struct hash { + size_t operator()(const dspx::Handle &handle) const noexcept { + return std::hash{}(handle.d); + } + }; +} + #endif //DIFFSCOPE_DSPX_MODEL_HANDLE_H diff --git a/src/libs/application/dspxmodel/src/Label.cpp b/src/libs/application/dspxmodel/src/Label.cpp new file mode 100644 index 00000000..80ac2eba --- /dev/null +++ b/src/libs/application/dspxmodel/src/Label.cpp @@ -0,0 +1,65 @@ +#include "Label.h" + +#include + +#include +#include + +namespace dspx { + + class LabelPrivate { + Q_DECLARE_PUBLIC(Label) + public: + Label *q_ptr; + int pos; + QString text; + }; + + Label::Label(Handle handle, Model *model) : EntityObject(handle, model), d_ptr(new LabelPrivate) { + Q_D(Label); + d->q_ptr = this; + d->pos = model->strategy()->getEntityProperty(handle, ModelStrategy::P_Position).toInt(); + d->text = model->strategy()->getEntityProperty(handle, ModelStrategy::P_Text).toString(); + } + + Label::~Label() = default; + + int Label::pos() const { + Q_D(const Label); + return d->pos; + } + + void Label::setPos(int pos) { + Q_D(Label); + model()->strategy()->setEntityProperty(handle(), ModelStrategy::P_Position, pos); + } + + QString Label::text() const { + Q_D(const Label); + return d->text; + } + + void Label::setText(const QString &text) { + Q_D(Label); + model()->strategy()->setEntityProperty(handle(), ModelStrategy::P_Text, text); + } + + void Label::handleSetEntityProperty(int property, const QVariant &value) { + Q_D(Label); + switch (property) { + case ModelStrategy::P_Position: { + d->pos = value.toInt(); + Q_EMIT posChanged(d->pos); + break; + } + case ModelStrategy::P_Text: { + d->text = value.toString(); + Q_EMIT textChanged(d->text); + break; + } + default: + Q_UNREACHABLE(); + } + } + +} \ No newline at end of file diff --git a/src/libs/application/dspxmodel/src/Label.h b/src/libs/application/dspxmodel/src/Label.h new file mode 100644 index 00000000..688e0d60 --- /dev/null +++ b/src/libs/application/dspxmodel/src/Label.h @@ -0,0 +1,43 @@ +#ifndef DIFFSCOPE_DSPX_MODEL_LABEL_H +#define DIFFSCOPE_DSPX_MODEL_LABEL_H + +#include +#include + +namespace dspx { + + class LabelPrivate; + + class Label : public EntityObject { + Q_OBJECT + QML_ELEMENT + QML_UNCREATABLE("") + Q_DECLARE_PRIVATE(Label); + Q_PROPERTY(int pos READ pos WRITE setPos NOTIFY posChanged) + Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged) + public: + ~Label() override; + + int pos() const; + void setPos(int pos); + + QString text() const; + void setText(const QString &text); + + Q_SIGNALS: + void posChanged(int pos); + void textChanged(const QString &text); + + protected: + void handleSetEntityProperty(int property, const QVariant &value) override; + + private: + friend class ModelPrivate; + explicit Label(Handle handle, Model *model); + QScopedPointer d_ptr; + + }; + +} + +#endif //DIFFSCOPE_DSPX_MODEL_LABEL_H diff --git a/src/libs/application/dspxmodel/src/Master.cpp b/src/libs/application/dspxmodel/src/Master.cpp new file mode 100644 index 00000000..473d7c9a --- /dev/null +++ b/src/libs/application/dspxmodel/src/Master.cpp @@ -0,0 +1,50 @@ +#include "Master.h" + +#include + +#include +#include +#include + +namespace dspx { + + class MasterPrivate { + Q_DECLARE_PUBLIC(Master) + public: + Master *q_ptr; + ModelPrivate *pModel; + }; + + Master::Master(Model *model) : QObject(model), d_ptr(new MasterPrivate) { + Q_D(Master); + d->q_ptr = this; + d->pModel = ModelPrivate::get(model); + } + Master::~Master() = default; + + double Master::gain() const { + Q_D(const Master); + return d->pModel->gain; + } + void Master::setGain(double gain) { + Q_D(Master); + d->pModel->strategy->setEntityProperty(d->pModel->hGlobal, ModelStrategy::P_ControlGain, gain); + } + double Master::pan() const { + Q_D(const Master); + return d->pModel->pan; + } + void Master::setPan(double pan) { + Q_D(Master); + d->pModel->strategy->setEntityProperty(d->pModel->hGlobal, ModelStrategy::P_ControlPan, pan); + } + bool Master::mute() const { + Q_D(const Master); + return d->pModel->mute; + } + void Master::setMute(bool mute) { + Q_D(Master); + d->pModel->strategy->setEntityProperty(d->pModel->hGlobal, ModelStrategy::P_ControlMute, mute); + } + +} \ No newline at end of file diff --git a/src/libs/application/dspxmodel/src/Master.h b/src/libs/application/dspxmodel/src/Master.h new file mode 100644 index 00000000..b1d0ffa0 --- /dev/null +++ b/src/libs/application/dspxmodel/src/Master.h @@ -0,0 +1,51 @@ +#ifndef DIFFSCOPE_DSPX_MODEL_MASTER_H +#define DIFFSCOPE_DSPX_MODEL_MASTER_H + +#include +#include + +namespace dspx { + + class Model; + + class ModelPrivate; + + class MasterPrivate; + + class Master : public QObject { + Q_OBJECT + QML_ELEMENT + QML_UNCREATABLE("") + Q_DECLARE_PRIVATE(Master) + Q_PROPERTY(double gain READ gain WRITE setGain NOTIFY gainChanged) + Q_PROPERTY(double pan READ pan WRITE setPan NOTIFY panChanged) + Q_PROPERTY(bool mute READ mute WRITE setMute NOTIFY muteChanged) + + public: + ~Master() override; + + double gain() const; + void setGain(double gain); + + double pan() const; + void setPan(double pan); + + bool mute() const; + void setMute(bool mute); + + Q_SIGNALS: + void gainChanged(double gain); + void panChanged(double pan); + void muteChanged(bool mute); + + private: + friend class ModelPrivate; + explicit Master(Model *model); + + QScopedPointer d_ptr; + + }; + +} + +#endif //DIFFSCOPE_DSPX_MODEL_MASTER_H \ No newline at end of file diff --git a/src/libs/application/dspxmodel/src/Model.cpp b/src/libs/application/dspxmodel/src/Model.cpp new file mode 100644 index 00000000..2a183166 --- /dev/null +++ b/src/libs/application/dspxmodel/src/Model.cpp @@ -0,0 +1,134 @@ +#include "Model.h" +#include "Model_p.h" + +#include + +#include +#include +#include +#include + +namespace dspx { + + void ModelPrivate::handleEntityDestroyed(Handle handle) { + auto object = objectMap.value(handle); + if (object) { + object->deleteLater(); + object->d_func()->handle = {}; + objectMap.remove(handle); + handleMap.remove(object); + } + } + + void ModelPrivate::init() { + Q_Q(Model); + auto handle = strategy->createEntity(ModelStrategy::EI_Global); + q->EntityObject::d_func()->model = q; + q->EntityObject::d_func()->handle = handle; + objectMap.insert(handle, q); + handleMap.insert(q, handle); + + name = strategy->getEntityProperty(handle, ModelStrategy::P_Name).toString(); + author = strategy->getEntityProperty(handle, ModelStrategy::P_Author).toString(); + centShift = strategy->getEntityProperty(handle, ModelStrategy::P_CentShift).toInt(); + editorId = strategy->getEntityProperty(handle, ModelStrategy::P_EditorId).toString(); + editorName = strategy->getEntityProperty(handle, ModelStrategy::P_EditorName).toString(); + gain = strategy->getEntityProperty(handle, ModelStrategy::P_ControlGain).toDouble(); + pan = strategy->getEntityProperty(handle, ModelStrategy::P_ControlPan).toDouble(); + mute = strategy->getEntityProperty(handle, ModelStrategy::P_ControlMute).toBool(); + + global = new Global(q); + master = new Master(q); + } + + Model::Model(ModelStrategy *strategy, QObject *parent) : EntityObject(parent), d_ptr(new ModelPrivate) { + Q_D(Model); + d->strategy = strategy; + d->init(); + } + + Model::~Model() { + Q_D(Model); + d->strategy->destroyEntity(handle()); + EntityObject::d_func()->model = nullptr; + } + + ModelStrategy *Model::strategy() const { + Q_D(const Model); + return d->strategy; + } + + Global *Model::global() const { + Q_D(const Model); + return d->global; + } + + Master *Model::master() const { + Q_D(const Model); + return d->master; + } + + Timeline *Model::timeline() const { + Q_D(const Model); + return d->timeline; + } + + TrackList *Model::trackList() const { + Q_D(const Model); + return d->trackList; + } + + Workspace *Model::workspace() const { + Q_D(const Model); + return d->workspace; + } + + void Model::handleSetEntityProperty(int property, const QVariant &value) { + Q_D(Model); + switch (property) { + case ModelStrategy::P_Name: { + d->name = value.toString(); + Q_EMIT d->global->nameChanged(d->name); + break; + } + case ModelStrategy::P_Author: { + d->author = value.toString(); + Q_EMIT d->global->authorChanged(d->author); + break; + } + case ModelStrategy::P_CentShift: { + d->centShift = value.toInt(); + Q_EMIT d->global->centShiftChanged(d->centShift); + break; + } + case ModelStrategy::P_EditorId: { + d->editorId = value.toString(); + Q_EMIT d->global->editorIdChanged(d->editorId); + break; + } + case ModelStrategy::P_EditorName: { + d->editorName = value.toString(); + Q_EMIT d->global->editorNameChanged(d->editorName); + break; + } + case ModelStrategy::P_ControlGain: { + d->gain = value.toDouble(); + Q_EMIT d->master->gainChanged(d->gain); + break; + } + case ModelStrategy::P_ControlPan: { + d->pan = value.toDouble(); + Q_EMIT d->master->panChanged(d->pan); + break; + } + case ModelStrategy::P_ControlMute: { + d->mute = value.toBool(); + Q_EMIT d->master->muteChanged(d->mute); + break; + } + default: + Q_UNREACHABLE(); + } + } + +} \ No newline at end of file diff --git a/src/libs/application/dspxmodel/src/Model.h b/src/libs/application/dspxmodel/src/Model.h new file mode 100644 index 00000000..0df176b5 --- /dev/null +++ b/src/libs/application/dspxmodel/src/Model.h @@ -0,0 +1,54 @@ +#ifndef DIFFSCOPE_DSPX_MODEL_MODEL_H +#define DIFFSCOPE_DSPX_MODEL_MODEL_H + +#include + +#include + +namespace dspx { + + class ModelStrategy; + + class ModelPrivate; + + class Global; + class Master; + class Timeline; + class TrackList; + class Workspace; + + class DSPX_MODEL_EXPORT Model : public EntityObject { + Q_OBJECT + QML_ELEMENT + QML_UNCREATABLE("") + Q_DECLARE_PRIVATE(Model) + + Q_PROPERTY(Global *global READ global CONSTANT) + Q_PROPERTY(Master *master READ master CONSTANT) + Q_PROPERTY(Timeline *timeline READ timeline CONSTANT) + Q_PROPERTY(TrackList *trackList READ trackList CONSTANT) + Q_PROPERTY(Workspace *workspace READ workspace CONSTANT) + + public: + explicit Model(ModelStrategy *strategy, QObject *parent = nullptr); + ~Model() override; + + ModelStrategy *strategy() const; + + Global *global() const; + Master *master() const; + Timeline *timeline() const; + TrackList *trackList() const; + Workspace *workspace() const; + + protected: + void handleSetEntityProperty(int property, const QVariant &value) override; + + private: + QScopedPointer d_ptr; + + }; + +} + +#endif //DIFFSCOPE_DSPX_MODEL_MODEL_H diff --git a/src/libs/application/dspxmodel/src/ModelStrategy.h b/src/libs/application/dspxmodel/src/ModelStrategy.h index 19b5974d..bd95df2c 100644 --- a/src/libs/application/dspxmodel/src/ModelStrategy.h +++ b/src/libs/application/dspxmodel/src/ModelStrategy.h @@ -17,7 +17,6 @@ namespace dspx { EI_AudioClip, EI_Global, EI_Label, - EI_Master, EI_Note, EI_Param, EI_ParamCurveAnchor, @@ -88,7 +87,6 @@ namespace dspx { enum Relationship { R_Children, R_Labels, - R_Master, R_ParamCurvesEdited, R_ParamCurvesEnvelop, R_ParamCurvesOriginal, @@ -116,6 +114,7 @@ namespace dspx { virtual void rotateListContainer(Handle listContainerEntity, int leftIndex, int middleIndex, int rightIndex) = 0; virtual void setEntityProperty(Handle entity, Property property, const QVariant &value) = 0; + virtual QVariant getEntityProperty(Handle entity, Property property) = 0; virtual Handle getAssociatedSubEntity(Handle entity, Relationship relationship) = 0; @@ -123,7 +122,7 @@ namespace dspx { void createEntityNotified(Handle entity, Entity entityType); void destroyEntityNotified(Handle entity); - void insertedIntoSequenceContainerNotified(Handle sequenceContainerEntity, Handle entity); + void insertIntoSequenceContainerNotified(Handle sequenceContainerEntity, Handle entity); void insertIntoListContainerNotified(Handle listContainerEntity, const QList &entities, int index); void insertIntoMapContainerNotified(Handle mapContainerEntity, Handle entity, const QString &key); diff --git a/src/libs/application/dspxmodel/src/Model_p.h b/src/libs/application/dspxmodel/src/Model_p.h new file mode 100644 index 00000000..47fd291b --- /dev/null +++ b/src/libs/application/dspxmodel/src/Model_p.h @@ -0,0 +1,49 @@ +#ifndef DIFFSCOPE_DSPX_MODEL_MODEL_P_H +#define DIFFSCOPE_DSPX_MODEL_MODEL_P_H + +#include + +#include + +namespace dspx { + + class LabelSequence; + + class ModelPrivate { + Q_DECLARE_PUBLIC(Model) + public: + Model *q_ptr; + + ModelStrategy *strategy; + Global *global; + Master *master; + Timeline *timeline; + TrackList *trackList; + Workspace *workspace; + + QHash objectMap; + QHash handleMap; + + QString name; + QString author; + int centShift; + QString editorId; + QString editorName; + + double gain; + double pan; + bool mute; + + LabelSequence *labelSequence; + + static ModelPrivate *get(Model *model) { + return model->d_func(); + } + + void handleEntityDestroyed(Handle handle); + void init(); + }; + +} + +#endif //DIFFSCOPE_DSPX_MODEL_MODEL_P_H diff --git a/src/libs/application/dspxmodel/src/Timeline.cpp b/src/libs/application/dspxmodel/src/Timeline.cpp new file mode 100644 index 00000000..086364d3 --- /dev/null +++ b/src/libs/application/dspxmodel/src/Timeline.cpp @@ -0,0 +1,27 @@ +#include "Timeline.h" + +#include + +namespace dspx { + + class TimelinePrivate { + Q_DECLARE_PUBLIC(Timeline) + public: + Timeline *q_ptr; + ModelPrivate *pModel; + }; + + Timeline::Timeline(Model *model) : QObject(model), d_ptr(new TimelinePrivate) { + Q_D(Timeline); + d->q_ptr = this; + d->pModel = ModelPrivate::get(model); + } + + Timeline::~Timeline() = default; + + LabelSequence * Timeline::labelSequence() const { + Q_D(const Timeline); + return d->pModel->labelSequence; + } + +} \ No newline at end of file diff --git a/src/libs/application/dspxmodel/src/Timeline.h b/src/libs/application/dspxmodel/src/Timeline.h new file mode 100644 index 00000000..8a7676ee --- /dev/null +++ b/src/libs/application/dspxmodel/src/Timeline.h @@ -0,0 +1,40 @@ +#ifndef DIFFSCOPE_DSPX_MODEL_TIMELINE_H +#define DIFFSCOPE_DSPX_MODEL_TIMELINE_H + +#include +#include + +#include + +namespace dspx { + + class Model; + + class LabelSequence; + class TempoSequence; + class TimeSignatureSequence; + + class TimelinePrivate; + + class DSPX_MODEL_EXPORT Timeline : public QObject { + Q_OBJECT + QML_ELEMENT + QML_UNCREATABLE("") + Q_DECLARE_PRIVATE(Timeline) + Q_PROPERTY(LabelSequence *labelSequence READ labelSequence CONSTANT) + public: + ~Timeline() override; + + LabelSequence *labelSequence() const; + + private: + friend class ModelPrivate; + explicit Timeline(Model *model); + + QScopedPointer d_ptr; + + }; + +} + +#endif //DIFFSCOPE_DSPX_MODEL_TIMELINE_H From bd1ad76238940533243803780bc0a35df9e59f93 Mon Sep 17 00:00:00 2001 From: CrSjimo Date: Tue, 14 Oct 2025 09:31:03 +0800 Subject: [PATCH 004/267] Update --- .../dspxmodel/src/EntityObject.cpp | 10 ++- .../application/dspxmodel/src/EntityObject.h | 2 +- .../dspxmodel/src/LabelSequence.cpp | 69 +++++++++++++++ .../application/dspxmodel/src/LabelSequence.h | 32 +++++++ src/libs/application/dspxmodel/src/Model.cpp | 22 ++++- src/libs/application/dspxmodel/src/Model.h | 3 + .../application/dspxmodel/src/ModelStrategy.h | 4 +- src/libs/application/dspxmodel/src/Model_p.h | 7 +- .../dspxmodel/src/PointSequenceContainer_p.h | 87 +++++++++++++++++++ .../application/dspxmodel/src/Timeline.cpp | 4 +- src/libs/application/dspxmodel/src/Timeline.h | 4 +- 11 files changed, 234 insertions(+), 10 deletions(-) create mode 100644 src/libs/application/dspxmodel/src/LabelSequence.cpp create mode 100644 src/libs/application/dspxmodel/src/LabelSequence.h create mode 100644 src/libs/application/dspxmodel/src/PointSequenceContainer_p.h diff --git a/src/libs/application/dspxmodel/src/EntityObject.cpp b/src/libs/application/dspxmodel/src/EntityObject.cpp index 8d5d3256..8c3711cd 100644 --- a/src/libs/application/dspxmodel/src/EntityObject.cpp +++ b/src/libs/application/dspxmodel/src/EntityObject.cpp @@ -37,19 +37,27 @@ namespace dspx { } void EntityObject::handleInsertIntoSequenceContainer(Handle entity) { + Q_UNREACHABLE(); } void EntityObject::handleInsertIntoListContainer(const QList &entities, int index) { + Q_UNREACHABLE(); } void EntityObject::handleInsertIntoMapContainer(Handle entity, const QString &key) { + Q_UNREACHABLE(); } - void EntityObject::handleRemoveFromContainer() { + void EntityObject::handleTakeFromSequenceContainer(Handle takenEntity, Handle entity) { + Q_UNREACHABLE(); } void EntityObject::handleTakeFromListContainer(const QList &takenEntities, const QList &indexes) { + Q_UNREACHABLE(); } void EntityObject::handleTakeFromMapContainer(Handle takenEntity, const QString &key) { + Q_UNREACHABLE(); } void EntityObject::handleRotateListContainer(int leftIndex, int middleIndex, int rightIndex) { + Q_UNREACHABLE(); } void EntityObject::handleSetEntityProperty(int property, const QVariant &value) { + Q_UNREACHABLE(); } } \ No newline at end of file diff --git a/src/libs/application/dspxmodel/src/EntityObject.h b/src/libs/application/dspxmodel/src/EntityObject.h index 64782042..4d1d9f73 100644 --- a/src/libs/application/dspxmodel/src/EntityObject.h +++ b/src/libs/application/dspxmodel/src/EntityObject.h @@ -28,7 +28,7 @@ namespace dspx { virtual void handleInsertIntoListContainer(const QList &entities, int index); virtual void handleInsertIntoMapContainer(Handle entity, const QString &key); - virtual void handleRemoveFromContainer(); + virtual void handleTakeFromSequenceContainer(Handle takenEntity, Handle entity); virtual void handleTakeFromListContainer(const QList &takenEntities, const QList &indexes); virtual void handleTakeFromMapContainer(Handle takenEntity, const QString &key); virtual void handleRotateListContainer(int leftIndex, int middleIndex, int rightIndex); diff --git a/src/libs/application/dspxmodel/src/LabelSequence.cpp b/src/libs/application/dspxmodel/src/LabelSequence.cpp new file mode 100644 index 00000000..53c5257a --- /dev/null +++ b/src/libs/application/dspxmodel/src/LabelSequence.cpp @@ -0,0 +1,69 @@ +#include "LabelSequence.h" + +#include +#include +#include + +namespace dspx { + + class LabelSequencePrivate { + Q_DECLARE_PUBLIC(LabelSequence) + public: + LabelSequence *q_ptr; + ModelPrivate *pModel; + PointSequenceContainer