1 // This file is part of Kig, a KDE program for Interactive Geometry...
2 // SPDX-FileCopyrightText: 2002 Dominique Devriese <devriese@kde.org>
3 // SPDX-FileCopyrightText: 2006 Pino Toscano <toscano.pino@tiscali.it>
4 
5 // SPDX-License-Identifier: GPL-2.0-or-later
6 
7 #ifndef KIG_FILTERS_CABRI_UTILS_H
8 #define KIG_FILTERS_CABRI_UTILS_H
9 
10 #undef CABRI_DEBUG
11 
12 #include <QByteArray>
13 #include <QColor>
14 
15 #include "../misc/rect.h"
16 #include "../objects/object_drawer.h"
17 
18 #include <map>
19 #include <vector>
20 
21 class QFile;
22 class KigFilterCabri;
23 
24 namespace CabriNS
25 {
26   /**
27    * Cabri versions we try to read from.
28    */
29   enum CabriVersion
30   {
31     CV_1_0,
32     CV_1_2
33   };
34 
35   enum CabriGonio
36   {
37     CG_Deg,
38     CG_Rad
39     // TODO
40   };
41 
42   /**
43    * Read a line from a Cabri file, stripping the \\n and \\r characters.
44    */
45   QString readLine( QFile& file );
46 
47   QString readText( QFile& f, const QString& s, const QString& sep = QStringLiteral( "\n" ) );
48 }
49 
50 /**
51  * Base class representing a Cabri object.
52  *
53  * Particular features of a particular version are added in the
54  * inherited classes.
55  */
56 class CabriObject
57 {
58 public:
59   CabriObject();
60 
61   uint id;
62   QByteArray type;
63   int specification;
64   QColor color;
65   QColor fillColor;
66   int thick;
67   int lineSegLength;
68   int lineSegSplit;
69 //  int specialAppearanceSwitch;
70   bool visible;
71   int intersectionId;
72   int ticks;
73   int side;
74 //  bool fixed;
75   std::vector<int> parents;
76   std::vector<double> data;
77   QString name;
78   QString text;
79   Rect textRect;
80   std::vector<int> incs;
81   CabriNS::CabriGonio gonio;
82 };
83 
84 class CabriObject_v10
85   : public CabriObject
86 {
87 public:
88   CabriObject_v10();
89 
90   int specialAppearanceSwitch;
91   bool fixed;
92 };
93 
94 class CabriObject_v12
95   : public CabriObject
96 {
97 public:
98   CabriObject_v12();
99 
100   int pointStyle;
101 };
102 
103 
104 /**
105  * Base reader for a Cabri figure. It basically reads all the things
106  * it can from a Cabri figure, even if they are not used.
107  */
108 class CabriReader
109 {
110 protected:
111   const KigFilterCabri* m_filter;
112 
113   CabriReader( const KigFilterCabri* filter );
114 
115   static void initColorMap();
116   void parseError( const QString& explanation = QString() ) const;
117 
118 public:
119   virtual ~CabriReader();
120 
121   /**
122    * Translate a color from a 1 to 3 character sequence.
123    */
124   static QColor translateColor( const QString& s );
125 
126   virtual bool readWindowMetrics( QFile& f ) = 0;
127   virtual CabriObject* readObject( QFile& f ) = 0;
128   virtual void decodeStyle( CabriObject* obj, Qt::PenStyle& ps, Kig::PointStyle& pointType ) = 0;
129 };
130 
131 class CabriReader_v10
132   : public CabriReader
133 {
134 public:
135   explicit CabriReader_v10( const KigFilterCabri* filter );
136   virtual ~CabriReader_v10();
137 
138   bool readWindowMetrics( QFile& f ) override;
139   CabriObject* readObject( QFile& f ) override;
140   void decodeStyle( CabriObject* obj, Qt::PenStyle& ps, Kig::PointStyle& pointType ) override;
141 };
142 
143 class CabriReader_v12
144   : public CabriReader
145 {
146 private:
147   static void initColorMap();
148   bool readStyles( const QString& s, CabriObject_v12* myobj );
149 
150 public:
151   explicit CabriReader_v12( const KigFilterCabri* filter );
152   virtual ~CabriReader_v12();
153 
154   static QColor translateColor( const QString& s );
155 
156   bool readWindowMetrics( QFile& f ) override;
157   CabriObject* readObject( QFile& f ) override;
158   void decodeStyle( CabriObject* obj, Qt::PenStyle& ps, Kig::PointStyle& pointType ) override;
159 };
160 
161 #endif
162