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