2.12.2021, 9:00 - 11:00: Due to updates GitLab may be unavailable for some minutes between 09:00 and 11:00.

propertywidgetfactory.cpp 3.72 KB
Newer Older
1
2
// ================================================================================================
// 
schultezub's avatar
schultezub committed
3
// This file is part of the CAMPVis Software Framework.
4
// 
5
// If not explicitly stated otherwise: Copyright (C) 2012-2014, all rights reserved,
schultezub's avatar
schultezub committed
6
//      Christian Schulte zu Berge <christian.szb@in.tum.de>
7
//      Chair for Computer Aided Medical Procedures
8
9
//      Technische Universitaet Muenchen
//      Boltzmannstr. 3, 85748 Garching b. Muenchen, Germany
10
// 
schultezub's avatar
schultezub committed
11
// For a full list of authors and contributors, please refer to the file "AUTHORS.txt".
12
// 
13
14
15
16
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 
// except in compliance with the License. You may obtain a copy of the License at
// 
// http://www.apache.org/licenses/LICENSE-2.0
17
// 
18
19
20
21
// Unless required by applicable law or agreed to in writing, software distributed under the 
// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 
// either express or implied. See the License for the specific language governing permissions 
// and limitations under the License.
22
23
24
// 
// ================================================================================================

schultezub's avatar
schultezub committed
25
26
#include "propertywidgetfactory.h"

27
#include <functional>
schultezub's avatar
schultezub committed
28

29
30
#include "core/properties/abstractproperty.h"

schultezub's avatar
schultezub committed
31
namespace campvis {
schultezub's avatar
schultezub committed
32

33
    tbb::atomic<PropertyWidgetFactory*> PropertyWidgetFactory::_singleton;
schultezub's avatar
schultezub committed
34

35
36
37
38
39
40
41
    PropertyWidgetFactory& PropertyWidgetFactory::getRef() {
        if (_singleton == 0) {
            std::cout << "creating PropertyWidgetFactory...\n";
            PropertyWidgetFactory* tmp = new PropertyWidgetFactory();
            if (_singleton.compare_and_swap(tmp, 0) != 0) {
                delete tmp;
            }
schultezub's avatar
schultezub committed
42
        }
schultezub's avatar
schultezub committed
43

44
45
        return *_singleton;
    }
46

47
48
49
50
    void PropertyWidgetFactory::deinit() {
        delete _singleton;
        _singleton = nullptr;
    }
schultezub's avatar
schultezub committed
51

52
53
54
    size_t PropertyWidgetFactory::registerPropertyWidget(const std::type_info& type, PropertyWidgetCreateFunctionPointer ptr, FallbackPropertyWidgetCreateFunctionPointer fallbackPtr, int priority) {
        tbb::spin_mutex::scoped_lock lock(_mutex);
        std::type_index typeIndex(type);
schultezub's avatar
schultezub committed
55

56
57
58
        if (ptr != nullptr) {
            PropertyWidgetMapType::iterator it = _propertyWidgetMap.lower_bound(typeIndex);
            if (it == _propertyWidgetMap.end() || it->first != typeIndex) {
59
                _propertyWidgetMap.insert(it, std::make_pair(typeIndex, ptr));
60
61
62
63
            }
            else {
                tgtAssert(false, "Double-registered a property widget for the same type.");
            }
64
        }
65
66
        if (fallbackPtr != nullptr) {
            _fallbackCreatorMap.insert(std::make_pair(-priority, fallbackPtr));
schultezub's avatar
schultezub committed
67
68
        }

69
70
        return _propertyWidgetMap.size() + _fallbackCreatorMap.size();
    }
schultezub's avatar
schultezub committed
71

72
    AbstractPropertyWidget* PropertyWidgetFactory::createWidget(AbstractProperty* prop, DataContainer* dc /*= 0*/, QWidget* parent /*= 0*/) {
73
        // look if we find a direct a direct match
74
75
76
77
        PropertyWidgetMapType::iterator it = _propertyWidgetMap.find(std::type_index(typeid(*prop)));
        if (it != _propertyWidgetMap.end()) {
            return it->second(prop, dc, parent);
        }
schultezub's avatar
schultezub committed
78

79
80
81
        // otherwise we have to do this kind of slow search
        for (std::multimap<int, FallbackPropertyWidgetCreateFunctionPointer>::iterator it = _fallbackCreatorMap.begin(); it != _fallbackCreatorMap.end(); ++it) {
            // let each registered widget try to create a widget for the property
82
            AbstractPropertyWidget* toReturn = it->second(prop, dc, parent);
83
84
            if (toReturn != nullptr)
                return toReturn;
85
86
        }

87
        return nullptr;
schultezub's avatar
schultezub committed
88
89
90
    }

}