GUI
App.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017 by Maciej Wiecierzewski
3  */
4 
5 #include "App.h"
6 
7 #include <stdexcpt.h>
8 
9 #include <allegro5/allegro_color.h>
10 #include <allegro5/allegro_font.h>
11 #include <allegro5/allegro_image.h>
12 #include <allegro5/allegro_primitives.h>
13 #include <allegro5/allegro_ttf.h>
14 
15 bool App::initialized = false;
16 
17 App::App(int argc, char **argv) :
18  display(NULL),
19  queue(NULL)
20 {
21  if(initialized)
22  throw std::logic_error("Already initialized.");
23 
24  initialized = true;
25 }
26 
28 {
29  if(queue != NULL)
30  al_destroy_event_queue(queue);
31  if(display != NULL)
32  al_destroy_display(display);
33 }
34 
36 {
37  if(!al_init())
38  throw std::runtime_error("al_init error.");
39 
40  if(!al_init_primitives_addon())
41  throw std::runtime_error("al_init_primitives_addon error.");
42  if(!al_init_image_addon())
43  throw std::runtime_error("al_init_image_addon error.");
44  if(!al_init_font_addon())
45  throw std::runtime_error("al_init_font_addon error.");
46  if(!al_init_ttf_addon())
47  throw std::runtime_error("al_init_ttf_addon error.");
48 
49  if(!al_install_keyboard())
50  throw std::runtime_error("al_install_keyboard error.");
51  if(!al_install_mouse())
52  throw std::runtime_error("al_install_mouse error.");
53 }
54 
55 void App::init()
56 {
57  display = al_create_display(640, 480);
58  if(!display)
59  throw std::runtime_error("al_create_display error.");
60 
61  font = al_load_font("LSANSD.TTF", 30, 0);
62  if(!font)
63  throw std::runtime_error("Font \"LSANSD.TTF\" not loaded.");
64 
65  guiSystem = new GUISystem();
66  renderer = new Renderer();
67 
68  queue = al_create_event_queue();
69  if(!queue)
70  throw std::runtime_error("al_create_event_queue error.");
71 
72  al_register_event_source(queue, al_get_display_event_source(display));
73  al_register_event_source(queue, al_get_mouse_event_source());
74  al_register_event_source(queue, al_get_keyboard_event_source());
75 
77  renderer->setBuffer(al_get_backbuffer(display));
79 
80  editBox = guiSystem->addEditBox(20, 20, 220, 40);
81  textField = guiSystem->addTextField(20, 80, 310, 40, "^ type something");
82  setButton = guiSystem->addButton(260, 20, 70, 40, "set");
83  multilineEdit = guiSystem->addEditBox(20, 170, 300, 150, true);
84  customWidget = guiSystem->addWidget(static_cast<CreateWidget>(
85  std::bind(&App::createWidget, this, std::placeholders::_1)
86  ), true);
87 
88  auto eventListener = std::bind(&App::setButtonOnClick, this, std::placeholders::_1);
89  setButton->addEventListener(EventType::MOUSE_BUTTON_UP, static_cast<EventListener::Function>(eventListener));
90 }
91 
92 bool App::loop(bool waitForEvent)
93 {
94  //rendering
95  guiSystem->render();
96  al_flip_display();
97 
98  if(waitForEvent)
99  al_wait_for_event(queue, NULL);
100 
101  //event loop
102  bool loop = true;
103  ALLEGRO_EVENT event;
104  while(al_get_next_event(queue, &event))
105  {
106  if(event.type == ALLEGRO_EVENT_MOUSE_AXES)
107  {
108  guiSystem->mouseMove(event.mouse.x, event.mouse.y);
109  }
110  else if(event.type == ALLEGRO_EVENT_MOUSE_BUTTON_DOWN)
111  {
113  }
114  else if(event.type == ALLEGRO_EVENT_MOUSE_BUTTON_UP)
115  {
117  }
118  else if(event.type == ALLEGRO_EVENT_KEY_DOWN)
119  {
120  guiSystem->keyDown(event.keyboard.keycode);
121  }
122  else if(event.type == ALLEGRO_EVENT_KEY_UP)
123  {
124  }
125  else if(event.type == ALLEGRO_EVENT_KEY_CHAR)
126  {
127  guiSystem->keyChar(event.keyboard.unichar);
128  }
129  else if(event.type == ALLEGRO_EVENT_MOUSE_ENTER_DISPLAY)
130  {
131  }
132  else if(event.type == ALLEGRO_EVENT_MOUSE_LEAVE_DISPLAY)
133  {
134  }
135  else if(event.type == ALLEGRO_EVENT_DISPLAY_RESIZE)
136  {
137  }
138  else if(event.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
139  {
140  loop = false;
141  break;
142  }
143 
145  }
146 
147  return loop;
148 }
149 
151 {
152  std::string text = editBox->getText();
153  textField->setText(text);
154 }
155 
157 {
158  CustomWidget *widget = new CustomWidget(guiSystem, 400, 20);
159 
160  widget->setText("test");
161 
162  Renderer *renderer = guiSystem->getRenderer();
163  widget->upStateColor = renderer->color(120, 0, 0);
164  widget->hoverStateColor = renderer->color(190, 20, 20);
165  widget->downStateColor = renderer->color(90, 0, 0);
166  widget->textColor = renderer->color(255, 255, 20);
167 
168  return widget;
169 }