2 * This file is part of the PulseView project.
4 * Copyright (C) 2020 Soeren Apel <soeren@apelpie.net>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, see <http://www.gnu.org/licenses/>.
20 #include "metadata_obj.hpp"
25 const char* MetadataObjectNames[MetadataObjectTypeCount] = {
31 const char* MetadataValueNames[MetadataValueTypeCount] = {
38 void MetadataObjObserverInterface::on_metadata_object_created(MetadataObject* obj)
43 void MetadataObjObserverInterface::on_metadata_object_deleted(MetadataObject* obj)
48 void MetadataObjObserverInterface::on_metadata_object_changed(MetadataObject* obj,
49 MetadataValueType value_type)
56 MetadataObject::MetadataObject(MetadataObjManager* obj_manager, uint32_t obj_id,
57 MetadataObjectType obj_type) :
58 obj_manager_(obj_manager),
62 // Make sure we accept all value type indices
63 values_.resize(MetadataValueTypeCount);
66 uint32_t MetadataObject::id() const
71 MetadataObjectType MetadataObject::type() const
76 void MetadataObject::set_value(MetadataValueType value_type, const QVariant& value)
78 values_.at((uint8_t)value_type) = value;
79 obj_manager_->notify_observers(this, value_type);
82 QVariant MetadataObject::value(MetadataValueType value_type) const
84 return values_.at((uint8_t)value_type);
88 MetadataObject* MetadataObjManager::create_object(MetadataObjectType obj_type)
90 // Note: This function is not reentrant as race conditions between
91 // emplace_back() and back() may occur
93 objects_.emplace_back(this, objects_.size(), obj_type);
94 MetadataObject* obj = &(objects_.back());
96 for (MetadataObjObserverInterface *cb : callbacks_)
97 cb->on_metadata_object_created(obj);
102 void MetadataObjManager::delete_object(uint32_t obj_id)
104 for (MetadataObjObserverInterface *cb : callbacks_)
105 cb->on_metadata_object_deleted(&(objects_.at(obj_id)));
107 objects_.erase(std::remove_if(objects_.begin(), objects_.end(),
108 [&](MetadataObject obj) { return obj.id() == obj_id; }),
112 MetadataObject* MetadataObjManager::find_object_by_type(MetadataObjectType obj_type)
114 for (MetadataObject& obj : objects_)
115 if (obj.type() == obj_type)
121 MetadataObject* MetadataObjManager::object(uint32_t obj_id)
123 return &(objects_.at(obj_id));
126 void MetadataObjManager::add_observer(MetadataObjObserverInterface *cb)
128 callbacks_.emplace_back(cb);
131 void MetadataObjManager::remove_observer(MetadataObjObserverInterface *cb)
133 for (auto cb_it = callbacks_.begin(); cb_it != callbacks_.end(); cb_it++)
135 callbacks_.erase(cb_it);
140 void MetadataObjManager::save_objects(QSettings &settings) const
145 void MetadataObjManager::restore_objects(QSettings &settings)
150 void MetadataObjManager::notify_observers(MetadataObject* obj,
151 MetadataValueType changed_value)
153 for (MetadataObjObserverInterface *cb : callbacks_)
154 cb->on_metadata_object_changed(obj, changed_value);