]> git.tdb.fi Git - r2c2.git/blobdiff - source/designer/selection.h
Don't crash if a train has no router
[r2c2.git] / source / designer / selection.h
index 1c0d267f1618044271f7672c967c61d8cb118db6..89f7100e3e6e854945219bf074ad7f4ff3388e4f 100644 (file)
@@ -3,25 +3,59 @@
 
 #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