]> git.tdb.fi Git - r2c2.git/blob - source/designer/tool.cpp
Don't bother with creating intermediate steps for state updates
[r2c2.git] / source / designer / tool.cpp
1 #include <sigc++/bind.h>
2 #include <msp/input/keys.h>
3 #include "designer.h"
4 #include "tool.h"
5
6 using namespace Msp;
7
8 Tool::Tool(Designer &d, Input::Keyboard &keyboard, Input::Mouse &mouse):
9         designer(d),
10         shift_held(false),
11         ctrl_held(false),
12         done(false),
13         accepted(false)
14 {
15         keyboard.signal_button_press.connect(sigc::bind_return(sigc::mem_fun(this, &Tool::key_press), false));
16         keyboard.signal_button_release.connect(sigc::bind_return(sigc::mem_fun(this, &Tool::key_release), false));
17         mouse.signal_button_press.connect(sigc::bind_return(sigc::mem_fun(this, &Tool::button_press), false));
18         mouse.signal_button_release.connect(sigc::bind_return(sigc::mem_fun(this, &Tool::button_release), false));
19         mouse.signal_axis_motion.connect(sigc::bind_return(sigc::mem_fun(this, &Tool::axis_motion), false));
20
21         pointer.x = mouse.get_axis_value(0);
22         pointer.y = mouse.get_axis_value(1);
23         ground_pointer = designer.map_pointer_to_ground(pointer);
24 }
25
26 void Tool::set_status(const std::string &s)
27 {
28         status = s;
29         signal_status.emit(status);
30 }
31
32 void Tool::set_done(bool a)
33 {
34         accepted = a;
35         done = true;
36         signal_done.emit();
37 }
38
39 void Tool::key_press(unsigned key)
40 {
41         if(key==Input::KEY_ESC)
42                 set_done(false);
43         else if(key==Input::KEY_SHIFT_L || key==Input::KEY_SHIFT_R)
44                 shift_held = true;
45         else if(key==Input::KEY_CTRL_L || key==Input::KEY_CTRL_R)
46                 ctrl_held = true;
47 }
48
49 void Tool::key_release(unsigned key)
50 {
51         if(key==Input::KEY_SHIFT_L || key==Input::KEY_SHIFT_R)
52                 shift_held = false;
53         else if(key==Input::KEY_CTRL_L || key==Input::KEY_CTRL_R)
54                 ctrl_held = false;
55 }
56
57 void Tool::button_press(unsigned btn)
58 {
59         if(btn==1)
60         {
61                 finish();
62                 set_done(true);
63         }
64         else if(btn==3)
65                 set_done(false);
66 }
67
68 void Tool::axis_motion(unsigned axis, float value, float)
69 {
70         if(axis==0)
71                 pointer.x = value;
72         else if(axis==1)
73                 pointer.y = value;
74         ground_pointer = designer.map_pointer_to_ground(pointer);
75
76         pointer_motion();
77 }