MUSX Document Model
Loading...
Searching...
No Matches
Document.h
1/*
2 * Copyright (C) 2024, Robert Patterson
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
5 * of this software and associated documentation files (the "Software"), to deal
6 * in the Software without restriction, including without limitation the rights
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 * copies of the Software, and to permit persons to whom the Software is
9 * furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 * THE SOFTWARE.
21 */
22#pragma once
23
24#include <memory>
25#include <unordered_map>
26#include <vector>
27
28#include "Header.h"
29#include "ObjectPool.h"
30
35namespace musx {
36
37namespace factory {
38class DocumentFactory;
39} // namespace factory
40
45namespace dom {
46
47using namespace header;
48
53{
54 std::unordered_map<StaffCmper, size_t> staves;
57
59 std::vector<StaffCmper> getSequentialStaves() const;
60};
61using InstrumentMap = std::unordered_map<StaffCmper, InstrumentInfo>;
62
67{
68public:
70 HeaderPtr& getHeader() { return m_header; }
72 const HeaderPtr& getHeader() const { return m_header; }
73
75 OptionsPoolPtr& getOptions() { return m_options; }
77 const OptionsPoolPtr& getOptions() const { return m_options; }
78
80 OthersPoolPtr& getOthers() { return m_others; }
82 const OthersPoolPtr& getOthers() const { return m_others; }
83
85 DetailsPoolPtr& getDetails() { return m_details; }
87 const DetailsPoolPtr& getDetails() const { return m_details; }
88
90 EntryPoolPtr& getEntries() { return m_entries; }
92 const EntryPoolPtr& getEntries() const { return m_entries; }
93
95 TextsPoolPtr& getTexts() { return m_texts; }
97 const TextsPoolPtr& getTexts() const { return m_texts; }
98
103
108
110 int getMaxBlankPages() const { return m_maxBlankPages; }
111
113 const InstrumentMap& getInstruments() const { return m_instruments; }
114
117 const InstrumentInfo& getInstrumentForStaff(StaffCmper staffId) const;
118
132 InstrumentMap createInstrumentMap(Cmper forPartId) const;
133
136 bool calcHasVaryingSystemStaves(Cmper forPartId) const;
137
138private:
140 explicit Document() = default;
141
142 HeaderPtr m_header;
143 OptionsPoolPtr m_options;
144 OthersPoolPtr m_others;
145 DetailsPoolPtr m_details;
146 EntryPoolPtr m_entries;
147 TextsPoolPtr m_texts;
148
149 int m_maxBlankPages{};
150
151 InstrumentMap m_instruments;
153
154 // Grant the factory class access to the private constructor
156};
157
158} // namespace dom
159} // namespace musx
Represents a document object that encapsulates the entire EnigmaXML structure.
Definition Document.h:67
const TextsPoolPtr & getTexts() const
Retrieves the const texts pool.
Definition Document.h:97
OthersPoolPtr & getOthers()
Retrieves the others pool.
Definition Document.h:80
const HeaderPtr & getHeader() const
Retrieves the const header.
Definition Document.h:72
MusxInstance< others::Page > calculatePageFromMeasure(Cmper partId, MeasCmper measureId) const
Searches pages to find the page that contains the measure.
Definition Document.cpp:36
const InstrumentInfo & getInstrumentForStaff(StaffCmper staffId) const
Get the instrument info for the given staffId.
Definition Document.cpp:183
int getMaxBlankPages() const
Returns the maximum number of blank pages in any part. This is calculated by factory::DocumentFactory...
Definition Document.h:110
const InstrumentMap & getInstruments() const
Returns the instrument map for this document. It is computed by the factory.
Definition Document.h:113
MusxInstance< others::StaffSystem > calculateSystemFromMeasure(Cmper partId, MeasCmper measureId) const
Searches systems to find the page that contains the measure.
Definition Document.cpp:54
const DetailsPoolPtr & getDetails() const
Retrieves the const others pool.
Definition Document.h:87
HeaderPtr & getHeader()
Retrieves the header.
Definition Document.h:70
bool calcHasVaryingSystemStaves(Cmper forPartId) const
Calculate if the current score/part has staves that differ from system to system.
Definition Document.cpp:199
const OptionsPoolPtr & getOptions() const
Retrieves the const options pool.
Definition Document.h:77
TextsPoolPtr & getTexts()
Retrieves the texts pool.
Definition Document.h:95
const OthersPoolPtr & getOthers() const
Retrieves the const others pool.
Definition Document.h:82
InstrumentMap createInstrumentMap(Cmper forPartId) const
Builds an instrument map for the specified linked part ID.
Definition Document.cpp:71
const EntryPoolPtr & getEntries() const
Retrieves the entry others pool.
Definition Document.h:92
DetailsPoolPtr & getDetails()
Retrieves the details pool.
Definition Document.h:85
OptionsPoolPtr & getOptions()
Retrieves the options pool.
Definition Document.h:75
EntryPoolPtr & getEntries()
Retrieves the entry pool.
Definition Document.h:90
Factory class for creating Document objects from XML.
Definition DocumentFactory.h:38
std::shared_ptr< Header > HeaderPtr
Shared Header pointer.
Definition Header.h:106
std::shared_ptr< OthersPool > OthersPoolPtr
Shared OthersPool pointer.
Definition ObjectPool.h:447
int16_t MeasCmper
Enigma meas Cmper (may be negative when not applicable)
Definition Fundamentals.h:64
std::shared_ptr< const T > MusxInstance
Defines the type of a musx instance stored in a pool.
Definition MusxInstance.h:35
std::shared_ptr< DetailsPool > DetailsPoolPtr
Shared DetailsPool pointer.
Definition ObjectPool.h:534
uint16_t Cmper
Enigma "comperator" key type.
Definition Fundamentals.h:55
std::shared_ptr< TextsPool > TextsPoolPtr
Shared OthersPool pointer.
Definition ObjectPool.h:606
std::shared_ptr< OptionsPool > OptionsPoolPtr
Shared OptionsPool pointer.
Definition ObjectPool.h:393
int16_t StaffCmper
Enigma staff (staffId) Cmper (may be negative when not applicable)
Definition Fundamentals.h:65
std::shared_ptr< EntryPool > EntryPoolPtr
Shared EntryPool pointer.
Definition ObjectPool.h:567
std::unordered_map< StaffCmper, InstrumentInfo > InstrumentMap
A list of instruments, which may be single- or multi-staff.
Definition Document.h:61
object model for musx file (enigmaxml)
Definition BaseClasses.h:36
Represents information about each instrument in the document. This is calculated from the staves,...
Definition Document.h:53
std::vector< StaffCmper > getSequentialStaves() const
Returns the staffIds in sequence as they appear in Scroll View in the score.
Definition Document.cpp:221
Cmper multistaffGroupId
The others::MultiStaffInstrumentGroup that defines the instrument. (May be zero.)
Definition Document.h:56
Cmper staffGroupId
The details::StaffGroup that visually represents the instrument. (May be zero.)
Definition Document.h:55
std::unordered_map< StaffCmper, size_t > staves
List of each staffId with its sequence index from top to bottom.
Definition Document.h:54