Types.cc 10.6 KB
Newer Older
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
/*===========================================================================*\
 *                                                                           *
 *                              OpenFlipper                                  *
 *      Copyright (C) 2001-2009 by Computer Graphics Group, RWTH Aachen      *
 *                           www.openflipper.org                             *
 *                                                                           *
 *---------------------------------------------------------------------------*
 *  This file is part of OpenFlipper.                                        *
 *                                                                           *
 *  OpenFlipper is free software: you can redistribute it and/or modify      *
 *  it under the terms of the GNU Lesser General Public License as           *
 *  published by the Free Software Foundation, either version 3 of           *
 *  the License, or (at your option) any later version with the              *
 *  following exceptions:                                                    *
 *                                                                           *
 *  If other files instantiate templates or use macros                       *
 *  or inline functions from this file, or you compile this file and         *
 *  link it with other files to produce an executable, this file does        *
 *  not by itself cause the resulting executable to be covered by the        *
 *  GNU Lesser General Public License. This exception does not however       *
 *  invalidate any other reasons why the executable file might be            *
 *  covered by the GNU Lesser General Public License.                        *
 *                                                                           *
 *  OpenFlipper is distributed in the hope that it will be useful,           *
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of           *
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            *
 *  GNU Lesser General Public License for more details.                      *
 *                                                                           *
 *  You should have received a copy of the GNU LesserGeneral Public          *
 *  License along with OpenFlipper. If not,                                  *
 *  see <http://www.gnu.org/licenses/>.                                      *
 *                                                                           *
\*===========================================================================*/

/*===========================================================================*\
 *                                                                           *
 *   $Revision$                                                         *
 *   $Author$                                                      *
 *   $Date$                   *
 *                                                                           *
\*===========================================================================*/
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61




//=============================================================================
//
//  Types
//
//=============================================================================

/**
 * \file Types.cc
 * This File contains the basic functions to handle datatypes
 */


//== INCLUDES =================================================================

#include "Types.hh"
#include <map>
62
#include <QCoreApplication>
63
64
65
66
67


/** This field defines the start id for custom datatypes. It starts high to avoid conflicts with previously
 * hardcoded versions.
 */
Jan Möbius's avatar
Jan Möbius committed
68
static int nextTypeId_ = 8;
69
70
71
72
73
74

/// Variable used to automatically initialize the maps
static bool initialized_ = false;

/** This map maps an dataType id to an typeName
 */
75
static std::map< unsigned int, QString > typeToString;
76

77
/** This map maps an dataType name to its id in the types vector
78
 */
79
80
81
82
83
static std::map< QString , unsigned int > stringToTypeInfo;

/** This map maps an dataType id to its id in the types vector
 */
static std::map< unsigned int , unsigned int > typeToTypeInfo;
84
85
86
87
88

class TypeInfo {

  public:

89
  TypeInfo(DataType _type, QString _name, QString _iconName, QString _readableName ) :
90
91
    type(_type),
    name(_name),
92
93
94
95
96
97
98
    iconName(_iconName),
    readableName(_readableName)
  {
    // Use internal name if no external name is given
    if ( _readableName == "" )
      readableName = _name;
  }
99
100
101
102
103
104
105
106
107

  /// The id of the datatype
  DataType type;

  /// The name of the datatype
  QString  name;

  /// The icon of the datatype
  QString  iconName;
108

109
  /// Human readable name
110
  QString readableName;
111
112
113
114
115
116
117
118
};

static std::vector< TypeInfo > types;

//== Functions =========================================================

void initialize() {
  if ( !initialized_ ) {
119
    stringToTypeInfo["Unknown"] = types.size();
120
121
    typeToTypeInfo[DATA_UNKNOWN]   = types.size();
    types.push_back( TypeInfo(DATA_UNKNOWN            ,"Unknown"        ,"Unknown.png", QCoreApplication::translate("Types","Unknown")) );
122

123
124
    stringToTypeInfo["Group"]  = types.size();
    typeToTypeInfo[DATA_GROUP] = types.size();
125
    types.push_back( TypeInfo(DATA_GROUP           ,"Group"          ,"Unknown.png", QCoreApplication::translate("Types","Group")) );
126
127
128

    stringToTypeInfo["TriangleMesh"]   = types.size();
    typeToTypeInfo[DATA_TRIANGLE_MESH_CONST_ID] = types.size();
129
    types.push_back( TypeInfo(DATA_TRIANGLE_MESH_CONST_ID   ,"TriangleMesh"   ,"TriangleType.png", QCoreApplication::translate("Types","Triangle Mesh")) );
130
131
132

    stringToTypeInfo["PolyMesh"]   = types.size();
    typeToTypeInfo[DATA_POLY_MESH_CONST_ID] = types.size();
133
    types.push_back( TypeInfo(DATA_POLY_MESH_CONST_ID       ,"PolyMesh"       ,"PolyType.png", QCoreApplication::translate("Types","Poly Mesh")) );
134

135
136
    stringToTypeInfo["All"]  = types.size();
    typeToTypeInfo[DATA_ALL] = types.size();
137
    types.push_back( TypeInfo(DATA_ALL             ,"All"            ,"Unknown.png", QCoreApplication::translate("Types","All")) );
138

139
    typeToString[DATA_UNKNOWN] = "Unknown";
140
    typeToString[DATA_GROUP] = "Group";
141
142
    typeToString[DATA_TRIANGLE_MESH_CONST_ID] = "TriangleMesh";
    typeToString[DATA_POLY_MESH_CONST_ID] = "PolyMesh";
143
144
    typeToString[DATA_ALL] = "All";

145
146
147
148
    initialized_ = true;
  }
}

149
/// Adds a datatype and returns the id for the new type
150
DataType addDataType(QString _name, QString _readableName) {
151
  initialize();
152
153
154
155
156

  int type = nextTypeId_;

  stringToTypeInfo[ _name ] = types.size();
  typeToTypeInfo[ type ] = types.size();
157
  types.push_back( TypeInfo(type, _name, "Unknown.png", _readableName ));
158
159
160

  typeToString[type] = _name;

161
  nextTypeId_ *= 2;
162
  return( type );
163
164
}

165
/// Get the id of a type with given name
166
167
DataType typeId(QString _name) {
  initialize();
168
169
170
171
172

  std::map<QString, unsigned int>::iterator index = stringToTypeInfo.find( _name );

  if ( index != stringToTypeInfo.end() )
    return types[ index->second ].type;
173
  else {
Jan Möbius's avatar
Jan Möbius committed
174
175
176
    #ifdef DEBUG
      std::cerr << "Unknown Data type with name " << _name.toStdString() << std::endl;
    #endif
177
    return DATA_UNKNOWN;
178
  }
179
180
181
182
183
184
185
186
187
188
}

/// Get the name of a type with given id
QString typeName(DataType _id) {
  initialize();

  std::map<unsigned int, QString>::iterator name = typeToString.find(_id);

  if ( name != typeToString.end() )
    return name->second;
189
190
  else {
    std::cerr << "Unable to retrieve typeName for id " << _id << std::endl;
191
    return "Unknown";
192
  }
193
194
}

195
196
197
198
199
/// Return the number of registered types
uint typeCount() {
  return types.size();
}

200
/// Get the icon of a given dataType
201
202
QString typeIcon(QString  _name) {
  initialize();
203
204
205
206
207
208
209

  std::map<QString, unsigned int>::iterator index = stringToTypeInfo.find( _name );

  if ( index != stringToTypeInfo.end() )
    return types[ index->second ].iconName;
  else
    return "Unknown.png";
210
211
}

212
/// get the icon of a given dataType
213
214
QString typeIcon(DataType _id) {
  initialize();
215
216
217
218
219
220
221

  std::map<unsigned int, unsigned int>::iterator index = typeToTypeInfo.find(_id);

  if ( index != typeToTypeInfo.end() )
    return types[ index->second ].iconName;
  else
    return "Unknown.png";
222
223
}

224
/// Set the icon for a given dataType
225
226
227
void setTypeIcon( DataType _id   , QString _icon ) {
  initialize();

228
229
230
231
232
233
  std::map<unsigned int, unsigned int>::iterator index = typeToTypeInfo.find(_id);

  if ( index != typeToTypeInfo.end() )
    types[ index->second ].iconName = _icon;
  else
    std::cerr << "Could not set icon for DataType. Type not found!" << std::endl;
234
235
}

236
/// Set the icon for a given dataType
237
238
239
void setTypeIcon( QString  _name , QString _icon ) {
  initialize();

240
241
242
243
244
245
  std::map<QString, unsigned int>::iterator index = stringToTypeInfo.find( _name );

  if ( index != stringToTypeInfo.end() )
    types[ index->second ].iconName = _icon;
  else
    std::cerr << "Could not set icon for DataType. Type not found!" << std::endl;
246
247
}

248
249
250
251
252
253
254
255
256
257
258
259



/// Get DataType Human readable name ( this name might change. Use the typeName insted! )
QString dataTypeName( DataType _id ) {
  initialize();

  std::map<unsigned int, unsigned int>::iterator index = typeToTypeInfo.find(_id);

  if ( index != typeToTypeInfo.end() )
    return types[ index->second ].readableName ;
  else
260
261
    std::cerr << "Could not get human name for DataType. Type not found!" << std::endl;

262
263
264
265
266
267
268
269
270
271
272
273
  return QString(QCoreApplication::translate("Types","Unknown Type"));
}

/// Get DataType Human readable name ( this name might change. Use the typeName insted! )
QString dataTypeName( QString  _typeName ) {
 initialize();

  std::map<QString, unsigned int>::iterator index = stringToTypeInfo.find( _typeName );

  if ( index != stringToTypeInfo.end() )
    return types[ index->second ].readableName ;
  else
274
275
    std::cerr << "Could not get human name for DataType. Type not found!" << std::endl;

276
277
278
279
280
281
282
283
284
285
286
287
288
289
  return QString(QCoreApplication::translate("Types","Unknown Type"));
}



/// Set the icon for a given dataType
void setDataTypeName( DataType _id   , QString _name ) {
  initialize();

  std::map<unsigned int, unsigned int>::iterator index = typeToTypeInfo.find(_id);

  if ( index != typeToTypeInfo.end() )
    types[ index->second ].readableName = _name;
  else
290
    std::cerr << "Could not set human name for DataType. Type not found!" << std::endl;
291
292
293
294
295
296
297
298
299
300
301
}

/// Set the icon for a given dataType
void setDataTypeName( QString  _typeName , QString _name ) {
  initialize();

  std::map<QString, unsigned int>::iterator index = stringToTypeInfo.find( _typeName );

  if ( index != stringToTypeInfo.end() )
    types[ index->second ].readableName = _name;
  else
302
    std::cerr << "Could not set human name for DataType. Type not found!" << std::endl;
303
304
}

305
306
//=============================================================================
//=============================================================================