Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  

worldview_insert_tool.cxx

Go to the documentation of this file.
00001 //  $Id: worldview_insert_tool.cxx,v 1.9 2003/01/11 16:11:36 grumbel Exp $
00002 //
00003 //  Construo - A wire-frame construction gamee
00004 //  Copyright (C) 2002 Ingo Ruhnke <[email protected]>
00005 //
00006 //  This program is free software; you can redistribute it and/or
00007 //  modify it under the terms of the GNU General Public License
00008 //  as published by the Free Software Foundation; either version 2
00009 //  of the License, or (at your option) any later version.
00010 //
00011 //  This program is distributed in the hope that it will be useful,
00012 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014 //  GNU General Public License for more details.
00015 //
00016 //  You should have received a copy of the GNU General Public License
00017 //  along with this program; if not, write to the Free Software
00018 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00019 
00020 #include "colors.hxx"
00021 #include "particle_factory.hxx"
00022 #include "input_context.hxx"
00023 #include "graphic_context.hxx"
00024 #include "world.hxx"
00025 #include "controller.hxx"
00026 #include "worldview_component.hxx"
00027 #include "worldview_insert_tool.hxx"
00028 #include "world_gui_manager.hxx"
00029 
00030 WorldViewInsertTool::WorldViewInsertTool ()
00031 {
00032   current_particle = 0;
00033   particle_mass = 0.1f;
00034 }
00035 
00036 WorldViewInsertTool::~WorldViewInsertTool () 
00037 {
00038 }
00039 
00040 void
00041 WorldViewInsertTool::draw_background (ZoomGraphicContext* gc) 
00042 {
00043   float x = WorldViewComponent::instance()->get_gc()->screen_to_world_x (input_context->get_mouse_x ());
00044   float y = WorldViewComponent::instance()->get_gc()->screen_to_world_y (input_context->get_mouse_y ());
00045 
00046   World& world = *Controller::instance()->get_world();
00047 
00048   Particle* selected_particle = world.get_particle (x, y);
00049   if (selected_particle)
00050     {
00051       selected_particle->draw_highlight (gc);
00052     }
00053 }
00054 
00055 void
00056 WorldViewInsertTool::draw_foreground (ZoomGraphicContext* gc) 
00057 {
00058   World& world = *Controller::instance()->get_world();
00059 
00060   Vector2d click_pos = WorldViewComponent::instance()->get_gc()->screen_to_world (input_context->get_mouse_pos ());
00061   
00062   Spring* selected_spring = world.get_spring (click_pos.x, click_pos.y);
00063   if (selected_spring)
00064     {
00065       selected_spring->draw_highlight (gc);
00066     }
00067       
00068   if (current_particle)
00069     {
00070       gc->GraphicContext::draw_line (current_particle->pos, click_pos,
00071                                      Colors::new_spring, 2);
00072     }
00073 
00074   float x = WorldViewComponent::instance()->get_gc()->screen_to_world_x (input_context->get_mouse_x ());
00075   float y = WorldViewComponent::instance()->get_gc()->screen_to_world_y (input_context->get_mouse_y ());
00076 
00077   Particle* selected_particle = world.get_particle (x, y);
00078   if (selected_particle)
00079     {
00080       selected_particle->draw_infos (gc);
00081     }
00082 }
00083 
00084 void
00085 WorldViewInsertTool::on_primary_button_press (int screen_x, int screen_y) 
00086 {
00087   World& world = *Controller::instance()->get_world ();
00088   float x = WorldViewComponent::instance()->get_gc()->screen_to_world_x (screen_x);
00089   float y = WorldViewComponent::instance()->get_gc()->screen_to_world_y (screen_y);
00090 
00091   if (current_particle)
00092     {
00093       Particle* new_current_particle = world.get_particle (x, y);
00094       if (new_current_particle != current_particle)
00095         {
00096           if (new_current_particle) // connect to particles
00097             {
00098               world.add_spring (current_particle, new_current_particle);
00099             }
00100           else // add a new particle and connect it with the current one
00101             {
00102               new_current_particle = world.get_particle_mgr()->add_particle (Vector2d(x, y), Vector2d(), particle_mass);
00103               world.add_spring (current_particle, new_current_particle);
00104             }
00105           current_particle = 0;
00106         }
00107       WorldGUIManager::instance()->ungrab_mouse (WorldViewComponent::instance());
00108     }
00109   else
00110     {
00111       current_particle = world.get_particle (x, y);
00112       if (!current_particle)
00113         {
00114           Particle* p = world.get_particle_mgr()->add_particle (Vector2d(x, y), Vector2d(), 
00115                                                                 particle_mass);
00116           current_particle = p;
00117           WorldGUIManager::instance()->grab_mouse (WorldViewComponent::instance());
00118         }
00119     }
00120 }
00121 
00122 void
00123 WorldViewInsertTool::on_primary_button_release (int x, int y) 
00124 {
00125 }
00126 
00127 void
00128 WorldViewInsertTool::on_secondary_button_press (int screen_x, int screen_y)
00129 {
00130   on_delete_press (screen_x, screen_y);
00131 }
00132 
00133 void
00134 WorldViewInsertTool::on_secondary_button_release (int screen_x, int screen_y) 
00135 {
00136 }
00137 
00138 void
00139 WorldViewInsertTool::on_delete_press (int screen_x, int screen_y) 
00140 {
00141   World& world = *Controller::instance()->get_world ();
00142 
00143   float x = WorldViewComponent::instance()->get_gc()->screen_to_world_x (screen_x);
00144   float y = WorldViewComponent::instance()->get_gc()->screen_to_world_y (screen_y);
00145 
00146   if (current_particle) 
00147     { // We are currently creating a new spring, abort that
00148       current_particle = 0;
00149       WorldGUIManager::instance()->ungrab_mouse (WorldViewComponent::instance());
00150     }
00151   else
00152     {
00153       Spring*   spring   = world.get_spring (x, y);
00154       Particle* particle = world.get_particle (x, y);
00155 
00156       if (particle)
00157         {
00158           Controller::instance()->push_undo();
00159           world.remove_particle (particle);
00160         }
00161       else if (spring)
00162         {
00163           Controller::instance()->push_undo();
00164           world.remove_spring(spring);
00165         }
00166     }
00167 }
00168 
00169 void
00170 WorldViewInsertTool::on_fix_press (int screen_x, int screen_y) 
00171 {
00172   float x = WorldViewComponent::instance()->get_gc()->screen_to_world_x (screen_x);
00173   float y = WorldViewComponent::instance()->get_gc()->screen_to_world_y (screen_y);
00174 
00175   Particle* particle = Controller::instance()->get_world ()->get_particle (x, y);
00176   if (particle)
00177     {
00178       particle->set_fixed (!particle->get_fixed ());
00179     }
00180 }
00181 
00182 /* EOF */

Generated on Thu Jul 24 10:24:31 2003 for Construo by doxygen1.3-rc3