]> 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 a3d8b307c9c7e27dda9804531e711ae9db58bfba..89f7100e3e6e854945219bf074ad7f4ff3388e4f 100644 (file)
@@ -1,16 +1,9 @@
-/* $Id$
-
-This file is part of R²C²
-Copyright © 2006-2008 Mikkosoft Productions, Mikko Rasa
-Distributed under the GPL
-*/
-
 #ifndef SELECTION_H_
 #define SELECTION_H_
 
 #include <set>
 #include <sigc++/sigc++.h>
-#include "3d/track.h"
+#include "libr2c2/object.h"
 
 class Selection
 {
@@ -18,27 +11,47 @@ public:
        sigc::signal<void> signal_changed;
 
 private:
-       std::set<R2C2::Track *> tracks;
+       std::set<R2C2::Object *> objects;
 
 public:
-       const std::set<R2C2::Track *> &get_tracks() const { return tracks; }
-       R2C2::Track *get_track() const;
-       unsigned size() const { return tracks.size(); }
-       bool empty() const { return tracks.empty(); }
+       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(); }
 
        void clear();
 
        template<typename Iter>
        void replace(Iter begin, Iter end)
        {
-               tracks.clear();
-               tracks.insert(begin, end);
+               objects.clear();
+               objects.insert(begin, end);
                signal_changed.emit();
        }
 
-       void add_track(R2C2::Track *);
-       void remove_track(R2C2::Track *);
-       void toggle_track(R2C2::Track *);
+       void add_object(R2C2::Object *);
+       void remove_object(R2C2::Object *);
+       void toggle_object(R2C2::Object *);
 
        void select_more();
        void select_linked();