~ubuntu-branches/ubuntu/precise/widelands/precise-backports

« back to all changes in this revision

Viewing changes to src/editor/ui_menus/editor_event_menu_choose_trigger.cc

  • Committer: Bazaar Package Importer
  • Author(s): Martin Quinson
  • Date: 2005-02-14 10:41:12 UTC
  • Revision ID: james.westby@ubuntu.com-20050214104112-6v08iux9fptxpva9
Tags: upstream-build9
Import upstream version build9

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (C) 2002-4 by the Widelands Development Team
 
3
 *
 
4
 * This program is free software; you can redistribute it and/or
 
5
 * modify it under the terms of the GNU General Public License
 
6
 * as published by the Free Software Foundation; either version 2
 
7
 * of the License, or (at your option) any later version.
 
8
 *
 
9
 * This program is distributed in the hope that it will be useful,
 
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
12
 * GNU General Public License for more details.
 
13
 *
 
14
 * You should have received a copy of the GNU General Public License
 
15
 * along with this program; if not, write to the Free Software
 
16
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
17
 *
 
18
 */
 
19
 
 
20
#include "editor_event_menu_choose_trigger.h"
 
21
#include "editorinteractive.h"
 
22
#include "ui_unique_window.h"
 
23
#include "ui_textarea.h"
 
24
#include "ui_button.h"
 
25
#include "ui_listselect.h"
 
26
#include "error.h"
 
27
#include "map.h"
 
28
#include "event.h"
 
29
#include "editor_event_menu_new_event.h"
 
30
#include "system.h"
 
31
#include "trigger.h"
 
32
#include "event_factory.h"
 
33
 
 
34
/*
 
35
===============
 
36
Editor_Event_Menu_Choose_Trigger::Editor_Event_Menu_Choose_Trigger
 
37
 
 
38
Create all the buttons etc...
 
39
===============
 
40
*/
 
41
Editor_Event_Menu_Choose_Trigger::Editor_Event_Menu_Choose_Trigger(Editor_Interactive *parent, Event* event)
 
42
        : UIWindow(parent, 0, 0, 380, 270, "Choose Triggers")
 
43
{
 
44
   m_parent=parent;
 
45
   m_event=event;
 
46
 
 
47
   // Caption
 
48
   UITextarea* tt=new UITextarea(this, 0, 0, "Choose Triggers for Event", Align_Left);
 
49
   tt->set_pos((get_inner_w()-tt->get_w())/2, 5);
 
50
 
 
51
   const int offsx=5;
 
52
   const int offsy=25;
 
53
   const int spacing=5;
 
54
   int posx=offsx;
 
55
   int posy=offsy;
 
56
 
 
57
   // Event List
 
58
   new UITextarea(this, spacing, offsy, "Registered Triggers: ", Align_Left);
 
59
   m_selected=new UIListselect(this, spacing, offsy+20, (get_inner_w()/2)-2*spacing-20, get_inner_h()-offsy-85);
 
60
   m_selected->selected.set(this, &Editor_Event_Menu_Choose_Trigger::selected_list_selected);
 
61
   m_selected->double_clicked.set(this, &Editor_Event_Menu_Choose_Trigger::selected_list_double_clicked);
 
62
   
 
63
   // Trigger List
 
64
   new UITextarea(this, (get_inner_w()/2)+spacing, offsy, "Available Triggers", Align_Left);
 
65
   m_available=new UIListselect(this, (get_inner_w()/2)+spacing+20, offsy+20, (get_inner_w()/2)-2*spacing-20, get_inner_h()-offsy-85);
 
66
   m_available->selected.set(this, &Editor_Event_Menu_Choose_Trigger::available_list_selected);
 
67
   m_available->double_clicked.set(this, &Editor_Event_Menu_Choose_Trigger::available_list_double_clicked);
 
68
 
 
69
   // Toggle when to run button
 
70
   new UITextarea(this, spacing, get_inner_h()-60+spacing, 200, 20, "Event runs when trigger is: ", Align_Center);
 
71
 
 
72
   m_btn_toggle_event=new UIButton(this, spacing+200,  get_inner_h()-60+spacing, 60, 20, 1, 5);
 
73
   m_btn_toggle_event->set_title("---");
 
74
   m_btn_toggle_event->clickedid.set(this, &Editor_Event_Menu_Choose_Trigger::clicked);
 
75
 
 
76
   // OK button
 
77
   posy=get_inner_h()-30;
 
78
   posx=(get_inner_w()/2)-120-spacing;
 
79
   UIButton* b=new UIButton(this, posx, posy, 80, 20, 0, 1);
 
80
   b->set_title("OK");
 
81
   b->clickedid.set(this, &Editor_Event_Menu_Choose_Trigger::clicked);
 
82
 
 
83
   // Cancel button
 
84
   posx=(get_inner_w()/2)+40+spacing;
 
85
   b=new UIButton(this, posx, posy, 80, 20, 1, 0);
 
86
   b->set_title("Cancel");
 
87
   b->clickedid.set(this, &Editor_Event_Menu_Choose_Trigger::clicked);
 
88
   posx+=80+spacing;
 
89
 
 
90
   // Event options
 
91
   posx=(get_inner_w()/2)-40;
 
92
   b=new UIButton(this, posx, posy, 80, 20, 1, 4);
 
93
   b->set_title("Options");
 
94
   b->clickedid.set(this, &Editor_Event_Menu_Choose_Trigger::clicked);
 
95
 
 
96
   // Left to right button
 
97
   posx=get_inner_w()/2-20;
 
98
   posy=offsy+50;
 
99
   m_btn_ltor=new UIButton(this, posx, posy, 40, 20, 1, 2);
 
100
   m_btn_ltor->set_title("->");
 
101
   m_btn_ltor->clickedid.set(this, &Editor_Event_Menu_Choose_Trigger::clicked);
 
102
 
 
103
   // Right to left button
 
104
   posx=get_inner_w()/2-20;
 
105
   posy=offsy+70+spacing;
 
106
   m_btn_rtol=new UIButton(this, posx, posy, 40, 20, 1, 3);
 
107
   m_btn_rtol->set_title("<-");
 
108
   m_btn_rtol->clickedid.set(this, &Editor_Event_Menu_Choose_Trigger::clicked);
 
109
 
 
110
   center_to_parent();
 
111
 
 
112
   // Fill the list boxes, construct our data
 
113
   int i;
 
114
   Map* map=m_parent->get_map();
 
115
   for(i=0; i<map->get_number_of_triggers(); i++) {
 
116
      Trigger_Data* data=new Trigger_Data();
 
117
      data->trig=map->get_trigger(i);
 
118
      data->run_enabled=true;
 
119
      if(m_event->trigger_exists(data->trig)) {
 
120
         data->run_enabled=m_event->reacts_when_trigger_is_set(data->trig);
 
121
         m_selected->add_entry(data->trig->get_name(), data);
 
122
      } else {
 
123
         m_available->add_entry(data->trig->get_name(), data);
 
124
      }
 
125
   }
 
126
 
 
127
   update();
 
128
}
 
129
 
 
130
/*
 
131
===============
 
132
Editor_Event_Menu_Choose_Trigger::~Editor_Event_Menu_Choose_Trigger
 
133
 
 
134
Unregister from the registry pointer
 
135
===============
 
136
*/
 
137
Editor_Event_Menu_Choose_Trigger::~Editor_Event_Menu_Choose_Trigger()
 
138
{
 
139
   m_available->selected.unset();
 
140
   m_selected->selected.unset();
 
141
   int i=0;
 
142
   for(i=0; i<m_selected->get_nr_entries(); i++) {
 
143
      m_selected->select(i);
 
144
      delete static_cast<Trigger_Data*>(m_selected->get_selection());
 
145
   }
 
146
   for(i=0; i<m_available->get_nr_entries(); i++) {
 
147
      m_available->select(i);
 
148
      delete static_cast<Trigger_Data*>(m_available->get_selection());
 
149
   }
 
150
}
 
151
 
 
152
/*
 
153
 * update all user interface stuff
 
154
 */
 
155
void Editor_Event_Menu_Choose_Trigger::update(void) {
 
156
 
 
157
   m_available->sort();
 
158
   m_selected->sort();
 
159
 
 
160
   if(m_available->get_selection()==0)
 
161
      m_btn_rtol->set_enabled(false);
 
162
   if(m_selected->get_selection()==0) {
 
163
      m_btn_ltor->set_enabled(false);
 
164
      m_btn_toggle_event->set_enabled(false);
 
165
      m_btn_toggle_event->set_title("---");
 
166
   } else {
 
167
      Trigger_Data* t=static_cast<Trigger_Data*>(m_selected->get_selection());
 
168
      if(t->run_enabled)
 
169
         m_btn_toggle_event->set_title("set");
 
170
      else
 
171
         m_btn_toggle_event->set_title("unset");
 
172
   }
 
173
}
 
174
 
 
175
/*
 
176
 * handle mouseclick, so that we can be run as
 
177
 * a modal
 
178
 */
 
179
bool Editor_Event_Menu_Choose_Trigger::handle_mouseclick(uint btn, bool down, int mx, int my) {
 
180
   if(btn == MOUSE_RIGHT && down) {
 
181
      clicked(0);
 
182
      return true;
 
183
   } else
 
184
      return false; // we're not dragable
 
185
}
 
186
 
 
187
/*
 
188
 * a button has been clicked
 
189
 */
 
190
void Editor_Event_Menu_Choose_Trigger::clicked(int id) {
 
191
   switch(id) {
 
192
      case 0:
 
193
         {
 
194
            end_modal(0);
 
195
            return;
 
196
         }
 
197
 
 
198
   case 1:
 
199
      {
 
200
         // OK Button
 
201
         int i;
 
202
         for(i=0; i<m_selected->get_nr_entries(); i++) {
 
203
            m_selected->select(i);
 
204
            Trigger_Data* t=static_cast<Trigger_Data*>(m_selected->get_selection());
 
205
            if(!m_event->trigger_exists(t->trig))
 
206
                  m_event->register_trigger(t->trig, m_parent->get_map(), t->run_enabled);
 
207
            m_event->set_reacts_when_trigger_is_set(t->trig, t->run_enabled);
 
208
         }
 
209
         for(i=0; i<m_available->get_nr_entries(); i++) {
 
210
            m_available->select(i);
 
211
            Trigger_Data* t=static_cast<Trigger_Data*>(m_available->get_selection());
 
212
            if(m_event->trigger_exists(t->trig))
 
213
                  m_event->unregister_trigger(t->trig, m_parent->get_map());
 
214
         }
 
215
         end_modal(1);
 
216
         return;
 
217
      }
 
218
      break;
 
219
 
 
220
   case 2:
 
221
      {
 
222
         // Left to right button
 
223
         Trigger_Data* t=static_cast<Trigger_Data*>(m_selected->get_selection());
 
224
         m_selected->remove_entry(m_selected->get_selection_index());
 
225
         m_available->add_entry(t->trig->get_name(), t);
 
226
         update();
 
227
      }
 
228
      break;
 
229
 
 
230
   case 3:
 
231
      {
 
232
         // Right to left button
 
233
         Trigger_Data* t=static_cast<Trigger_Data*>(m_available->get_selection());
 
234
         m_available->remove_entry(m_available->get_selection_index());
 
235
         m_selected->add_entry(t->trig->get_name(), t);
 
236
         update();
 
237
      }
 
238
      break;
 
239
 
 
240
   case 4:
 
241
      {
 
242
         // Option Button
 
243
         Event_Factory::make_event_with_option_dialog(m_event->get_id(), m_parent, m_event);
 
244
      }
 
245
      break;
 
246
 
 
247
   case 5:
 
248
      {
 
249
         // Toggle button
 
250
         Trigger_Data* t=static_cast<Trigger_Data*>(m_selected->get_selection());
 
251
         t->run_enabled=!t->run_enabled;
 
252
         update();
 
253
      }
 
254
   }
 
255
}
 
256
 
 
257
/*
 
258
 * listbox was selected
 
259
 */
 
260
void Editor_Event_Menu_Choose_Trigger::available_list_selected(int i) {
 
261
   m_btn_rtol->set_enabled(true);
 
262
   update();
 
263
}
 
264
void Editor_Event_Menu_Choose_Trigger::selected_list_selected(int i) {
 
265
   m_btn_toggle_event->set_enabled(true);
 
266
   m_btn_ltor->set_enabled(true);
 
267
   update();
 
268
}
 
269
 
 
270
/*
 
271
 * listbox was double clicked
 
272
 */
 
273
void Editor_Event_Menu_Choose_Trigger::available_list_double_clicked(int i) {
 
274
   // click right to left button
 
275
   clicked(3);
 
276
}
 
277
void Editor_Event_Menu_Choose_Trigger::selected_list_double_clicked(int i) {
 
278
   // click left to right button
 
279
   clicked(2);
 
280
}