/*===========================================================================*\ * * * OpenFlipper * * Copyright (C) 2001-2014 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 . * * * \*===========================================================================*/ /*===========================================================================*\ * * * $Revision$ * * $LastChangedBy$ * * $Date$ * * * \*===========================================================================*/ #ifndef UTILS_H #define UTILS_H #include #include #include #include #include #include /*! \class TypeInfoWrapper * \brief Wraps the information of a type. * * This class is used to handle different property types. It provides a human readable * string representation of the type and can also be used to find out which type a * property has. */ class TypeInfoWrapper { public: TypeInfoWrapper(const std::type_info & ti, const char *friendlyName) : ti(&ti), friendlyName(friendlyName) {} TypeInfoWrapper(const std::type_info & ti) : ti(&ti),friendlyName("") {} operator const std::type_info *() const { return ti; } operator const std::type_info &() const { return *ti; } operator const char *() const { return friendlyName; } const std::type_info *operator->() const { return ti; } const std::type_info &get() const { return *ti; } const char *getName() const { return friendlyName; } bool operator==(const TypeInfoWrapper & other) const { /* * We compare name strings, not the type ids themselves because * the same type from different SOs will give different type ids. */ return strcmp(ti->name(), other.ti->name()) == 0; } bool operator<(const TypeInfoWrapper & other) const { return strcmp(ti->name(), other.ti->name()) < 0; } private: const std::type_info *ti; const char *friendlyName; }; /*! \class PropertyInfo * \brief Cellection of information about a property. * * This class combines all the interesting information about a property. It stores * the entity type (Vertex, Edge, ...), the properties name and its type. */ class PropertyInfo { public: enum ENTITY_FILTER { EF_ANY = 0xFF, EF_FACE = 0x01, EF_EDGE = 0x02, EF_HALFEDGE = 0x04, EF_VERTEX = 0x08, EF_HALFFACE = 0x10, EF_CELL = 0x20 }; /// Returns a symbol representation for an entity static const char* entity2str(ENTITY_FILTER entity); PropertyInfo(const std::string &propName, const TypeInfoWrapper &typeinfo, ENTITY_FILTER entity) : propName_(propName), typeinfo_(typeinfo), entity(entity) {} QString toString() const { return QObject::tr("%3 %1 : %2").arg(propName_.c_str()).arg(friendlyTypeName()).arg(QString::fromUtf8(entity2str(entity))); } bool operator==(const PropertyInfo &rhs) const { return propName_ == rhs.propName_ && typeinfo_ == rhs.typeinfo_ && entity == rhs.entity; } bool operator<(const PropertyInfo &rhs) const { if (entity != rhs.entity) return entity < rhs.entity; int result = propName_.compare(rhs.propName_); if (result) return result < 0; return typeinfo_ < rhs.typeinfo_; } inline bool isCellProp() const { return entity == EF_CELL; } inline bool isFaceProp() const { return entity == EF_FACE; } inline bool isHalffaceProp() const { return entity == EF_HALFFACE; } inline bool isEdgeProp() const { return entity == EF_EDGE; } inline bool isHalfedgeProp() const { return entity == EF_HALFEDGE; } inline bool isVertexProp() const { return entity == EF_VERTEX; } inline const std::string &propName() const { return propName_; } inline const char *friendlyTypeName() const { return typeinfo_.getName(); } inline const TypeInfoWrapper &typeinfo() const { return typeinfo_; } inline ENTITY_FILTER entityType() const { return entity; } private: std::string propName_; TypeInfoWrapper typeinfo_; ENTITY_FILTER entity; }; /*! \class NewNameMessageBox * \brief Asks the user how to proceed after a name clash. * * When loading a property the provided name can already be in use. This message box is * used to ask the user how to proceed. Cancel loading, set a new name or replace the * old property by the new one? */ class NewNameMessageBox: public QMessageBox { Q_OBJECT public: NewNameMessageBox(QString propName); private slots: void slotReplace() { replace = true; } void slotRename() { rename = true; } void slotCancel() { cancel = true; } private: QLabel* problemDescription; QPushButton* buttonRename; QPushButton* buttonReplace; QPushButton* buttonCancel; QString propName; public: bool replace; bool rename; bool cancel; }; #endif /* UTILS_H */