00001 /*************************************************************************** 00002 * Copyright (c) 2010 Werner Mayer <wmayer[at]users.sourceforge.net> * 00003 * * 00004 * This file is part of the FreeCAD CAx development system. * 00005 * * 00006 * This library is free software; you can redistribute it and/or * 00007 * modify it under the terms of the GNU Library General Public * 00008 * License as published by the Free Software Foundation; either * 00009 * version 2 of the License, or (at your option) any later version. * 00010 * * 00011 * This library is distributed in the hope that it will be useful, * 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 00014 * GNU Library General Public License for more details. * 00015 * * 00016 * You should have received a copy of the GNU Library General Public * 00017 * License along with this library; see the file COPYING.LIB. If not, * 00018 * write to the Free Software Foundation, Inc., 59 Temple Place, * 00019 * Suite 330, Boston, MA 02111-1307, USA * 00020 * * 00021 ***************************************************************************/ 00022 00023 00024 #include "PreCompiled.h" 00025 00026 #ifndef _PreComp_ 00027 # include <Inventor/nodes/SoMaterial.h> 00028 #endif 00029 00030 #include "ViewProviderBuilder.h" 00031 #include <App/PropertyStandard.h> 00032 00033 using namespace Gui; 00034 00035 std::map<Base::Type, Base::Type> ViewProviderBuilder::_prop_to_view; 00036 00037 ViewProviderBuilder::ViewProviderBuilder() 00038 { 00039 } 00040 00041 ViewProviderBuilder::~ViewProviderBuilder() 00042 { 00043 } 00044 00045 void ViewProviderBuilder::add(const Base::Type& prop, const Base::Type& view) 00046 { 00047 _prop_to_view[prop] = view; 00048 } 00049 00050 ViewProvider* ViewProviderBuilder::create(const Base::Type& type) 00051 { 00052 std::map<Base::Type, Base::Type>::iterator it = _prop_to_view.find(type); 00053 if (it != _prop_to_view.end()) 00054 return reinterpret_cast<ViewProvider*>(it->second.createInstance()); 00055 return 0; 00056 } 00057 00058 // -------------------------------------- 00059 00060 ViewProviderColorBuilder::ViewProviderColorBuilder() 00061 { 00062 } 00063 00064 ViewProviderColorBuilder::~ViewProviderColorBuilder() 00065 { 00066 } 00067 00068 void ViewProviderColorBuilder::buildNodes(const App::Property* prop, std::vector<SoNode*>&) const 00069 { 00070 const App::PropertyColorList* color = static_cast<const App::PropertyColorList*>(prop); 00071 const std::vector<App::Color>& val = color->getValues(); 00072 unsigned long i=0; 00073 00074 SoMaterial* material = new SoMaterial(); 00075 material->enableNotify(false); 00076 material->diffuseColor.deleteValues(0); 00077 material->diffuseColor.setNum(val.size()); 00078 00079 for (std::vector<App::Color>::const_iterator it = val.begin(); it != val.end(); ++it) { 00080 material->diffuseColor.set1Value(i++, SbColor(it->r, it->g, it->b)); 00081 } 00082 00083 material->enableNotify(true); 00084 material->touch(); 00085 }