//=============================================================================
//  MuseScore
//  Music Composition & Notation
//
//  Copyright (C) 2010-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 __FRET_H__
#define __FRET_H__
 
#include "element.h"
 
namespace Ms {
 
class StringData;
class Chord;
class Harmony;
 
static const int DEFAULT_STRINGS = 6;
static const int DEFAULT_FRETS = 5;
 
//---------------------------------------------------------
//   @@ FretDiagram
///    Fretboard diagram
//
//   @P userMag    qreal
//   @P strings    int  number of strings
//   @P frets      int  number of frets
//   @P barre      int  barre
//   @P fretOffset int
//---------------------------------------------------------
 
class FretDiagram : public Element {
 
#ifdef SCRIPT_INTERFACE
      Q_GADGET
 
      Q_PROPERTY(qreal userMag  READ userMag    WRITE undoSetUserMag)
      Q_PROPERTY(int strings    READ strings    WRITE undoSetStrings)
      Q_PROPERTY(int frets      READ frets      WRITE undoSetFrets)
      Q_PROPERTY(int barre      READ barre      WRITE undoSetBarre)
      Q_PROPERTY(int fretOffset READ fretOffset WRITE undoSetFretOffset)
 
   public:
      void undoSetUserMag(qreal val);
      void undoSetStrings(int val);
      void undoSetFrets(int val);
      void undoSetBarre(int val);
      void undoSetFretOffset(int val);
 
   private:
#endif
 
      int _strings       { DEFAULT_STRINGS };
      int maxStrings     { 0 };
      int _frets         { DEFAULT_FRETS };
      int _fretOffset    { 0  };
      int _maxFrets      { 24 };
      int _barre         { 0 };
 
      char* _dots        { 0 };
      char* _marker      { 0 };
      char* _fingering   { 0 };
 
      Harmony* _harmony  { 0 };
 
      qreal lw1;
      qreal lw2;             // top line
      qreal stringDist;
      qreal fretDist;
      QFont font;
      qreal _userMag     { 1.0   };             // allowed 0.1 - 10.0
 
   public:
      FretDiagram(Score* s);
      FretDiagram(const FretDiagram&);
      ~FretDiagram();
      virtual void draw(QPainter*) const override;
      virtual FretDiagram* clone() const override { return new FretDiagram(*this); }
 
      static FretDiagram* fromString(Score* score, const QString &s);
 
      virtual ElementType type() const override { return ElementType::FRET_DIAGRAM; }
      virtual void layout() override;
      virtual void write(XmlWriter& xml) const override;
      virtual void read(XmlReader&) override;
      virtual QLineF dragAnchor() const override;
      virtual QPointF pagePos() const override;
 
      // read / write MusicXML
      void readMusicXML(XmlReader& de);
      void writeMusicXML(XmlWriter& xml) const;
 
      int strings() const    { return _strings; }
      int frets()   const    { return _frets; }
      void setOffset(int offset);
      void setStrings(int n);
      void setFrets(int n)        { _frets = n; }
      void setDot(int string, int fret);
      void setBarre(int fret)     { _barre = fret; }
      void setMarker(int string, int marker);
      void setFingering(int string, int finger);
      int fretOffset() const      { return _fretOffset; }
      void setFretOffset(int val) { _fretOffset = val;  }
      int maxFrets() const        { return _maxFrets;   }
      void setMaxFrets(int val)   { _maxFrets = val;    }
 
      char dot(int s) const       { return _dots      ? _dots[s]      : 0; }
      char marker(int s) const    { return _marker    ? _marker[s]    : 0; }
      char fingering(int s) const { return _fingering ? _fingering[s] : 0; }
      int barre() const           { return _barre; }
 
      Harmony* harmony() const { return _harmony; }
 
      void init(Ms::StringData *, Chord*);
 
      virtual void add(Element*) override;
      virtual void remove(Element*) override;
 
      virtual bool acceptDrop(EditData&) const override;
      virtual Element* drop(EditData&) override;
 
      virtual void scanElements(void* data, void (*func)(void*, Element*), bool all=true) override;
 
      virtual QVariant getProperty(P_ID propertyId) const override;
      virtual bool setProperty(P_ID propertyId, const QVariant&) override;
      virtual QVariant propertyDefault(P_ID) const override;
 
      qreal userMag() const         { return _userMag;   }
      void setUserMag(qreal m)      { _userMag = m;      }
      };
 
 
}     // namespace Ms
#endif

V690 The 'FretDiagram' class implements a copy constructor, but lacks the '=' operator. It is dangerous to use such a class.