Fawkes API  Fawkes Development Version
laser_drawing_area.h
00001 
00002 /***************************************************************************
00003  *  laser_drawing_area.h - Laser drawing area derived from Gtk::DrawingArea
00004  *
00005  *  Created: Thu Oct 09 18:19:54 2008
00006  *  Copyright  2008  Tim Niemueller [www.niemueller.de]
00007  *
00008  ****************************************************************************/
00009 
00010 /*  This program is free software; you can redistribute it and/or modify
00011  *  it under the terms of the GNU General Public License as published by
00012  *  the Free Software Foundation; either version 2 of the License, or
00013  *  (at your option) any later version.
00014  *
00015  *  This program is distributed in the hope that it will be useful,
00016  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00017  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00018  *  GNU Library General Public License for more details.
00019  *
00020  *  Read the full text in the LICENSE.GPL file in the doc directory.
00021  */
00022 
00023 #ifndef __TOOLS_LASERGUI_LASER_DRAWING_AREA_H_
00024 #define __TOOLS_LASERGUI_LASER_DRAWING_AREA_H_
00025 
00026 #include <gtkmm.h>
00027 #include <list>
00028 #include <interfaces/Position2DTrackInterface.h>
00029 #include <interfaces/SwitchInterface.h>
00030 
00031 namespace fawkes {
00032   class Laser360Interface;
00033   class Laser720Interface;
00034   class ObjectPositionInterface;
00035   class CairoRobotDrawer;
00036   class LegtrackerTrackinterface;
00037   class SwitchInterface;
00038   class VisualDisplay2DInterface;
00039 }
00040 
00041 class VisualDisplay2D;
00042 
00043 class LaserDrawingArea
00044   : public Gtk::DrawingArea
00045 {
00046  public:
00047   /** Draw modes. */
00048   typedef enum {
00049     MODE_LINES,         /**< Draw beams as lines */
00050     MODE_POINTS,        /**< Only draw beam end points */
00051     MODE_HULL           /**< Draw hull of beams */
00052   } draw_mode_t;
00053 
00054   LaserDrawingArea();
00055   LaserDrawingArea(BaseObjectType* cobject,
00056                    const Glib::RefPtr<Gtk::Builder> &builder);
00057   ~LaserDrawingArea();
00058 
00059   void set_laser_ifs(const std::list<fawkes::Interface*>& laser_if);
00060   void reset_laser_ifs();
00061   void set_objpos_if(std::list<fawkes::ObjectPositionInterface*>* l_objpos_if_persons,
00062                      std::list<fawkes::ObjectPositionInterface*>* l_objpos_if_legs,
00063                      std::list<fawkes::ObjectPositionInterface*>* l_objpos_if_misc,
00064                      fawkes::Laser720Interface* laser_segmentation_if,
00065                      std::list<fawkes::Position2DTrackInterface*>* l_track_if,
00066                      fawkes::ObjectPositionInterface* target_if,
00067                      fawkes::SwitchInterface* switch_if);
00068   void set_line_if(fawkes::ObjectPositionInterface *line_if);
00069   void set_visdisp_if(fawkes::VisualDisplay2DInterface *visdisp_if);
00070   void set_robot_drawer(fawkes::CairoRobotDrawer *robot_drawer);
00071   void set_resolution(unsigned int resolution);
00072 
00073   void zoom_in();
00074   void zoom_out();
00075 
00076   void set_rotation(float rot_rad);
00077   void set_draw_mode(draw_mode_t mode);
00078   void set_connected(bool connected);
00079   
00080   void toggle_break_drawing();
00081 
00082  protected:
00083 #if GTK_VERSION_GE(3,0)
00084   virtual bool on_draw(const Cairo::RefPtr<Cairo::Context> &cr);
00085 #else
00086   virtual bool on_expose_event(GdkEventExpose *event);
00087 #endif
00088   virtual bool on_scroll_event(GdkEventScroll *event);
00089   virtual bool on_motion_notify_event(GdkEventMotion *event);
00090   virtual bool on_button_press_event(GdkEventButton *event);
00091 
00092   void draw_beams(const fawkes::Interface* itf,
00093                   Glib::RefPtr<Gdk::Window> &window,
00094                   const Cairo::RefPtr<Cairo::Context> &cr);
00095   void draw_segments(const fawkes::Interface* itf,
00096                      Glib::RefPtr<Gdk::Window> &window,
00097                      const Cairo::RefPtr<Cairo::Context> &cr);
00098   void draw_scalebox(Glib::RefPtr<Gdk::Window> &window,
00099                      const Cairo::RefPtr<Cairo::Context> &cr);
00100   void draw_persons_legs(Glib::RefPtr<Gdk::Window> &window,
00101                          const Cairo::RefPtr<Cairo::Context> &cr);
00102   std::pair<float,float> transform_coords_from_fawkes(float p_x, float p_y);
00103 
00104 
00105  private:
00106   /// @cond INTERNALS
00107   struct Color {
00108     unsigned char r;
00109     unsigned char g;
00110     unsigned char b;
00111   };
00112   /// @endcond
00113   typedef std::pair<fawkes::Interface*, Color> InterfaceColorPair;
00114   typedef std::list<InterfaceColorPair> InterfaceColorPairList;
00115 
00116   bool all_laser_ifs_have_writer() const;
00117 
00118   InterfaceColorPairList               __laser_ifs;
00119   fawkes::Laser720Interface           *__laser_segmentation_if;
00120   fawkes::SwitchInterface             *__switch_if;
00121   fawkes::ObjectPositionInterface     *__target_if;
00122 
00123   fawkes::ObjectPositionInterface *__line_if;
00124 
00125   std::list<fawkes::ObjectPositionInterface*>* __l_objpos_if_persons;
00126   std::list<fawkes::ObjectPositionInterface*>* __l_objpos_if_legs;
00127   std::list<fawkes::ObjectPositionInterface*>* __l_objpos_if_misc;
00128   std::list<fawkes::Position2DTrackInterface*>* __l_track_if;
00129 
00130   bool                       __connected;
00131   draw_mode_t                __draw_mode;
00132 
00133   float                      __zoom_factor;
00134   unsigned int               __resolution;
00135   float                      __rotation;
00136   bool                       __break_drawing;
00137   bool                       __first_draw;
00138   double __last_mouse_x;
00139   double __last_mouse_y;
00140   double __xc;
00141   double __yc;
00142 
00143   fawkes::CairoRobotDrawer  *__robot_drawer;
00144 
00145   VisualDisplay2D           *__visdisp;
00146   fawkes::VisualDisplay2DInterface  *__visdisp_if;
00147 };
00148 
00149 #endif