1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
|
//=============================================================================
// MuseScore
// Music Composition & Notation
//
// Copyright (C) 2002-2011 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
//=============================================================================
#ifndef __PAGE_H__
#define __PAGE_H__
#include "config.h"
#include "element.h"
#include "bsp.h"
namespace Ms {
class System;
class Text;
class Measure;
class Xml;
class Score;
class MeasureBase;
//---------------------------------------------------------
// PaperSize
//---------------------------------------------------------
struct PaperSize {
const char* name;
qreal w, h; // size in inch
PaperSize(const char* n, qreal wi, qreal hi)
: name(n), w(wi), h(hi) {}
};
extern const PaperSize* getPaperSize(const QString&);
extern const PaperSize* getPaperSize(const qreal wi, const qreal hi);
//---------------------------------------------------------
// @@ PageFormat
// @P evenBottomMargin float
// @P evenLeftMargin float
// @P eventTopMargin float
// @P oddBottomMargin float
// @P oddLeftMargin float
// @P oddTopMargin float
// @P printableWidth float
// @P size size paper size in inch
// @P twosided bool
//---------------------------------------------------------
#ifdef SCRIPT_INTERFACE
class PageFormat : public QObject {
Q_OBJECT
Q_PROPERTY(qreal evenBottomMargin READ evenBottomMargin WRITE setEvenBottomMargin)
Q_PROPERTY(qreal evenLeftMargin READ evenLeftMargin WRITE setEvenLeftMargin )
Q_PROPERTY(qreal evenTopMargin READ evenTopMargin WRITE setEvenTopMargin )
Q_PROPERTY(qreal oddBottomMargin READ oddBottomMargin WRITE setOddBottomMargin )
Q_PROPERTY(qreal oddLeftMargin READ oddLeftMargin WRITE setOddLeftMargin )
Q_PROPERTY(qreal oddTopMargin READ oddTopMargin WRITE setOddTopMargin )
Q_PROPERTY(qreal printableWidth READ printableWidth WRITE setPrintableWidth )
Q_PROPERTY(QSizeF size READ size WRITE setSize)
Q_PROPERTY(bool twosided READ twosided WRITE setTwosided )
#else
class PageFormat {
#endif
QSizeF _size;
qreal _printableWidth; // _width - left margin - right margin
qreal _evenLeftMargin; // values in inch
qreal _oddLeftMargin;
qreal _evenTopMargin;
qreal _evenBottomMargin;
qreal _oddTopMargin;
qreal _oddBottomMargin;
bool _twosided;
public:
PageFormat();
const QSizeF& size() const { return _size; } // size in inch
qreal width() const { return _size.width(); }
qreal height() const { return _size.height(); }
void setSize(const QSizeF& s) { _size = s; }
void copy(const PageFormat&);
QString name() const;
void read(XmlReader&, Score* s = 0);
void write(Xml&) const;
qreal evenLeftMargin() const { return _evenLeftMargin; }
qreal oddLeftMargin() const { return _oddLeftMargin; }
qreal evenTopMargin() const { return _evenTopMargin; }
qreal evenBottomMargin() const { return _evenBottomMargin; }
qreal oddTopMargin() const { return _oddTopMargin; }
qreal oddBottomMargin() const { return _oddBottomMargin; }
qreal printableWidth() const { return _printableWidth; }
void setEvenLeftMargin(qreal val) { _evenLeftMargin = val; }
void setOddLeftMargin(qreal val) { _oddLeftMargin = val; }
void setEvenTopMargin(qreal val) { _evenTopMargin = val; }
void setEvenBottomMargin(qreal val) { _evenBottomMargin = val; }
void setOddTopMargin(qreal val) { _oddTopMargin = val; }
void setOddBottomMargin(qreal val) { _oddBottomMargin = val; }
void setPrintableWidth(qreal val) { _printableWidth = val; }
bool twosided() const { return _twosided; }
void setTwosided(bool val) { _twosided = val; }
// convenience functions
qreal evenRightMargin() const { return _size.width() - _printableWidth - _evenLeftMargin; }
qreal oddRightMargin() const { return _size.width() - _printableWidth - _oddLeftMargin; }
const PaperSize* paperSize() const { return getPaperSize(_size.width(), _size.height()); }
void setSize(const PaperSize* size);
};
//---------------------------------------------------------
// @@ Page
// @P pagenumber int (read only)
//---------------------------------------------------------
class Page : public Element {
Q_OBJECT
Q_PROPERTY(int pagenumber READ no)
QList<System*> _systems;
int _no; // page number
#ifdef USE_BSP
BspTree bspTree;
void doRebuildBspTree();
#endif
bool bspTreeValid;
QString replaceTextMacros(const QString&) const;
void drawHeaderFooter(QPainter*, int area, const QString&) const;
public:
Page(Score*);
~Page();
virtual Page* clone() const { return new Page(*this); }
virtual Element::Type type() const { return Element::Type::PAGE; }
const QList<System*>* systems() const { return &_systems; }
QList<System*>* systems() { return &_systems; }
virtual void layout();
virtual void write(Xml&) const;
virtual void read(XmlReader&);
void appendSystem(System* s);
int no() const { return _no; }
void setNo(int n);
bool isOdd() const;
qreal tm() const; // margins in pixel
qreal bm() const;
qreal lm() const;
qreal rm() const;
virtual void draw(QPainter*) const;
virtual void scanElements(void* data, void (*func)(void*, Element*), bool all=true);
QList<Element*> items(const QRectF& r);
QList<Element*> items(const QPointF& p);
void rebuildBspTree() { bspTreeValid = false; }
QPointF pagePos() const { return QPointF(); } ///< position in page coordinates
QList<System*> searchSystem(const QPointF& pos) const;
Measure* searchMeasure(const QPointF& p) const;
MeasureBase* pos2measure(const QPointF&, int* staffIdx, int* pitch,
Segment**, QPointF* offset) const;
QList<const Element*> elements(); ///< list of visible elements
QRectF tbbox(); // tight bounding box, excluding white space
};
extern const PaperSize paperSizes[];
} // namespace Ms
#endif
|