#include <set>
#include <sigc++/sigc++.h>
-#include "3d/track.h"
+#include "libr2c2/object.h"
class Selection
{
+public:
+ sigc::signal<void> signal_changed;
+
private:
- std::set<Marklin::Track *> tracks;
+ std::set<R2C2::Object *> objects;
public:
- sigc::signal<void> signal_changed;
+ const std::set<R2C2::Object *> &get_objects() const { return objects; }
+ R2C2::Object *get_object() const;
+
+ template<typename T>
+ std::set<T *> get_objects() const
+ {
+ std::set<T *> result;
+ for(std::set<R2C2::Object *>::const_iterator i=objects.begin(); i!=objects.end(); ++i)
+ if(T *to = dynamic_cast<T *>(*i))
+ result.insert(to);
+ return result;
+ }
+
+ template<typename T>
+ T *get_object() const
+ {
+ for(std::set<R2C2::Object *>::const_iterator i=objects.begin(); i!=objects.end(); ++i)
+ if(T *to = dynamic_cast<T *>(*i))
+ return to;
+ return 0;
+ }
+
+ unsigned size() const { return objects.size(); }
+ bool empty() const { return objects.empty(); }
- const std::set<Marklin::Track *> &get_tracks() const { return tracks; }
- Marklin::Track *get_track() const;
- unsigned size() const { return tracks.size(); }
void clear();
- void add_track(Marklin::Track *);
- void remove_track(Marklin::Track *);
- void toggle_track(Marklin::Track *);
+
+ template<typename Iter>
+ void replace(Iter begin, Iter end)
+ {
+ objects.clear();
+ objects.insert(begin, end);
+ signal_changed.emit();
+ }
+
+ void add_object(R2C2::Object *);
+ void remove_object(R2C2::Object *);
+ void toggle_object(R2C2::Object *);
+
void select_more();
void select_linked();
+ void select_blocks();
};
#endif