00001 #include "gui_button.hpp"
00002
00003 #include "gui_frame.hpp"
00004 #include "gui_fontstring.hpp"
00005 #include "gui_texture.hpp"
00006 #include "gui_out.hpp"
00007
00008 #include <luapp_function.hpp>
00009
00010 namespace gui
00011 {
00012 void button::register_glue(utils::wptr<lua::state> pLua)
00013 {
00014 pLua->reg<lua_button>();
00015 }
00016
00017 lua_button::lua_button(lua_State* pLua) : lua_frame(pLua)
00018 {
00019 pButtonParent_ = dynamic_cast<button*>(pParent_);
00020 if (pParent_ && !pButtonParent_)
00021 throw exception("lua_button", "Dynamic cast failed !");
00022 }
00023
00024 int lua_button::_click(lua_State* pLua)
00025 {
00026 if (!check_parent_())
00027 return 0;
00028
00029 lua::function mFunc("Button:click", pLua);
00030
00031 pButtonParent_->on("Click");
00032
00033 return mFunc.on_return();
00034 }
00035
00036 int lua_button::_disable(lua_State* pLua)
00037 {
00038 if (!check_parent_())
00039 return 0;
00040
00041 lua::function mFunc("Button:disable", pLua);
00042
00043 pButtonParent_->disable();
00044
00045 return mFunc.on_return();
00046 }
00047
00048 int lua_button::_enable(lua_State* pLua)
00049 {
00050 if (!check_parent_())
00051 return 0;
00052
00053 lua::function mFunc("Button:enable", pLua);
00054
00055 pButtonParent_->enable();
00056
00057 return mFunc.on_return();
00058 }
00059
00060 int lua_button::_get_button_state(lua_State* pLua)
00061 {
00062 if (!check_parent_())
00063 return 0;
00064
00065 lua::function mFunc("Button:get_button_state", pLua, 1);
00066
00067 switch (pButtonParent_->get_button_state())
00068 {
00069 case button::STATE_UP : mFunc.push(std::string("NORMAL")); break;
00070 case button::STATE_DOWN : mFunc.push(std::string("PUSHED")); break;
00071 case button::STATE_DISABLED : mFunc.push(std::string("DISABLED")); break;
00072 default : mFunc.push_nil(); break;
00073 }
00074
00075 return mFunc.on_return();
00076 }
00077
00078 int lua_button::_get_disabled_font_object(lua_State* pLua)
00079 {
00080 if (!check_parent_())
00081 return 0;
00082
00083 lua::function mFunc("Button:get_disabled_font_object", pLua, 1);
00084
00085 font_string* pFontString = pButtonParent_->get_disabled_text();
00086 if (pFontString)
00087 {
00088 pFontString->push_on_lua(mFunc.get_state());
00089 mFunc.notify_pushed();
00090 }
00091 else
00092 mFunc.push_nil();
00093
00094 return mFunc.on_return();
00095 }
00096
00097 int lua_button::_get_disabled_text_color(lua_State* pLua)
00098 {
00099 if (!check_parent_())
00100 return 0;
00101
00102 lua::function mFunc("Button:get_disabled_text_color", pLua, 4);
00103
00104 font_string* pFontString = pButtonParent_->get_disabled_text();
00105 if (pFontString)
00106 {
00107 const color& mColor = pFontString->get_text_color();
00108 mFunc.push(mColor.r);
00109 mFunc.push(mColor.g);
00110 mFunc.push(mColor.b);
00111 mFunc.push(mColor.a);
00112 }
00113 else
00114 mFunc.push_nil(4);
00115
00116 return mFunc.on_return();
00117 }
00118
00119 int lua_button::_get_disabled_texture(lua_State* pLua)
00120 {
00121 if (!check_parent_())
00122 return 0;
00123
00124 lua::function mFunc("Button:get_disabled_texture", pLua, 1);
00125
00126 texture* pTexture = pButtonParent_->get_disabled_texture();
00127 if (pTexture)
00128 {
00129 pTexture->push_on_lua(mFunc.get_state());
00130 mFunc.notify_pushed();
00131 }
00132 else
00133 mFunc.push_nil();
00134
00135 return mFunc.on_return();
00136 }
00137
00138 int lua_button::_get_highlight_font_object(lua_State* pLua)
00139 {
00140 if (!check_parent_())
00141 return 0;
00142
00143 lua::function mFunc("Button:get_highlight_font_object", pLua, 1);
00144
00145 font_string* pFontString = pButtonParent_->get_highlight_text();
00146 if (pFontString)
00147 {
00148 pFontString->push_on_lua(mFunc.get_state());
00149 mFunc.notify_pushed();
00150 }
00151 else
00152 mFunc.push_nil();
00153
00154 return mFunc.on_return();
00155 }
00156
00157 int lua_button::_get_highlight_text_color(lua_State* pLua)
00158 {
00159 if (!check_parent_())
00160 return 0;
00161
00162 lua::function mFunc("Button:get_highlight_text_color", pLua, 4);
00163
00164 font_string* pFontString = pButtonParent_->get_highlight_text();
00165 if (pFontString)
00166 {
00167 const color& mColor = pFontString->get_text_color();
00168 mFunc.push(mColor.r);
00169 mFunc.push(mColor.g);
00170 mFunc.push(mColor.b);
00171 mFunc.push(mColor.a);
00172 }
00173 else
00174 mFunc.push_nil(4);
00175
00176 return mFunc.on_return();
00177 }
00178
00179 int lua_button::_get_highlight_texture(lua_State* pLua)
00180 {
00181 if (!check_parent_())
00182 return 0;
00183
00184 lua::function mFunc("Button:get_highlight_texture", pLua, 1);
00185
00186 texture* pTexture = pButtonParent_->get_highlight_texture();
00187 if (pTexture)
00188 {
00189 pTexture->push_on_lua(mFunc.get_state());
00190 mFunc.notify_pushed();
00191 }
00192 else
00193 mFunc.push_nil();
00194
00195 return mFunc.on_return();
00196 }
00197
00198 int lua_button::_get_normal_font_object(lua_State* pLua)
00199 {
00200 if (!check_parent_())
00201 return 0;
00202
00203 lua::function mFunc("Button:get_normal_font_object", pLua, 1);
00204
00205 font_string* pFontString = pButtonParent_->get_normal_text();
00206 if (pFontString)
00207 {
00208 pFontString->push_on_lua(mFunc.get_state());
00209 mFunc.notify_pushed();
00210 }
00211 else
00212 mFunc.push_nil();
00213
00214 return mFunc.on_return();
00215 }
00216
00217 int lua_button::_get_normal_texture(lua_State* pLua)
00218 {
00219 if (!check_parent_())
00220 return 0;
00221
00222 lua::function mFunc("Button:get_normal_texture", pLua, 1);
00223
00224 texture* pTexture = pButtonParent_->get_normal_texture();
00225 if (pTexture)
00226 {
00227 pTexture->push_on_lua(mFunc.get_state());
00228 mFunc.notify_pushed();
00229 }
00230 else
00231 mFunc.push_nil();
00232
00233 return mFunc.on_return();
00234 }
00235
00236 int lua_button::_get_pushed_text_offset(lua_State* pLua)
00237 {
00238 if (!check_parent_())
00239 return 0;
00240
00241 lua::function mFunc("Button:get_pushed_text_offset", pLua, 2);
00242
00243 std::array<int,2> lOffset = pButtonParent_->get_pushed_text_offset();
00244
00245 mFunc.push(lOffset[0]);
00246 mFunc.push(lOffset[1]);
00247
00248 return mFunc.on_return();
00249 }
00250
00251 int lua_button::_get_pushed_texture(lua_State* pLua)
00252 {
00253 if (!check_parent_())
00254 return 0;
00255
00256 lua::function mFunc("Button:get_pushed_texture", pLua, 1);
00257
00258 texture* pTexture = pButtonParent_->get_pushed_texture();
00259 if (pTexture)
00260 {
00261 pTexture->push_on_lua(mFunc.get_state());
00262 mFunc.notify_pushed();
00263 }
00264 else
00265 mFunc.push_nil();
00266
00267 return mFunc.on_return();
00268 }
00269
00270 int lua_button::_get_text(lua_State* pLua)
00271 {
00272 if (!check_parent_())
00273 return 0;
00274
00275 lua::function mFunc("Button:get_text", pLua, 1);
00276
00277 mFunc.push(pButtonParent_->get_text());
00278
00279 return mFunc.on_return();
00280 }
00281
00282 int lua_button::_get_text_height(lua_State* pLua)
00283 {
00284 if (!check_parent_())
00285 return 0;
00286
00287 lua::function mFunc("Button:get_text_height", pLua, 1);
00288
00289 font_string* pCurrentFont = pButtonParent_->get_CurrentFontString();
00290 if (pCurrentFont)
00291 mFunc.push(pCurrentFont->get_string_height());
00292 else
00293 mFunc.push_nil();
00294
00295 return mFunc.on_return();
00296 }
00297
00298 int lua_button::_get_text_width(lua_State* pLua)
00299 {
00300 if (!check_parent_())
00301 return 0;
00302
00303 lua::function mFunc("Button:get_text_width", pLua, 1);
00304
00305 font_string* pCurrentFont = pButtonParent_->get_CurrentFontString();
00306 if (pCurrentFont)
00307 mFunc.push(pCurrentFont->get_string_width());
00308 else
00309 mFunc.push_nil();
00310
00311 return mFunc.on_return();
00312 }
00313
00314 int lua_button::_is_enabled(lua_State* pLua)
00315 {
00316 if (!check_parent_())
00317 return 0;
00318
00319 lua::function mFunc("Button:is_enabled", pLua, 1);
00320
00321 mFunc.push(pButtonParent_->is_enabled());
00322
00323 return mFunc.on_return();
00324 }
00325
00326 int lua_button::_lock_highlight(lua_State* pLua)
00327 {
00328 if (!check_parent_())
00329 return 0;
00330
00331 lua::function mFunc("Button:lock_highlight", pLua);
00332
00333 pButtonParent_->lock_highlight();
00334
00335 return mFunc.on_return();
00336 }
00337
00338 int lua_button::_set_button_state(lua_State* pLua)
00339 {
00340 if (!check_parent_())
00341 return 0;
00342
00343 lua::function mFunc("Button:set_button_state", pLua);
00344 mFunc.add(0, "button state", lua::TYPE_STRING);
00345 if (mFunc.check())
00346 {
00347 std::string sState = mFunc.get(0)->get_string();
00348 if (sState == "NORMAL")
00349 {
00350 pButtonParent_->enable();
00351 pButtonParent_->release();
00352 }
00353 else if (sState == "PUSHED")
00354 {
00355 pButtonParent_->enable();
00356 pButtonParent_->push();
00357 }
00358 else if (sState == "DISABLED")
00359 {
00360 pButtonParent_->disable();
00361 pButtonParent_->release();
00362 }
00363 else
00364 gui::out << gui::warning << mFunc.get_name() << " : Unknown button state : \""+sState+"\"." << std::endl;
00365 }
00366
00367 return mFunc.on_return();
00368 }
00369
00370 int lua_button::_set_disabled_font_object(lua_State* pLua)
00371 {
00372 if (!check_parent_())
00373 return 0;
00374
00375 lua::function mFunc("Button:set_disabled_font_object", pLua);
00376 mFunc.add(0, "font object", lua::TYPE_USERDATA);
00377 if (mFunc.check())
00378 {
00379 lua_font_string* plua_font_string = mFunc.get_state()->get<lua_font_string>();
00380 if (plua_font_string)
00381 {
00382 font_string* pFontString = dynamic_cast<font_string*>(plua_font_string->get_parent());
00383 pButtonParent_->set_disabled_text(pFontString);
00384 }
00385 }
00386
00387 return mFunc.on_return();
00388 }
00389
00390 int lua_button::_set_disabled_text_color(lua_State* pLua)
00391 {
00392 if (!check_parent_())
00393 return 0;
00394
00395 lua::function mFunc("Button:set_disabled_text_color", pLua);
00396 mFunc.add(0, "r", lua::TYPE_NUMBER);
00397 mFunc.add(1, "g", lua::TYPE_NUMBER);
00398 mFunc.add(2, "b", lua::TYPE_NUMBER);
00399 mFunc.add(3, "a", lua::TYPE_NUMBER, true);
00400 if (mFunc.check())
00401 {
00402 font_string* pFontString = pButtonParent_->get_disabled_text();
00403 if (pFontString)
00404 {
00405 if (mFunc.is_provided(3))
00406 {
00407 pFontString->set_text_color(color(
00408 mFunc.get(0)->get_number(),
00409 mFunc.get(1)->get_number(),
00410 mFunc.get(2)->get_number(),
00411 mFunc.get(3)->get_number()
00412 ));
00413 }
00414 else
00415 {
00416 pFontString->set_text_color(color(
00417 mFunc.get(0)->get_number(),
00418 mFunc.get(1)->get_number(),
00419 mFunc.get(2)->get_number()
00420 ));
00421 }
00422 }
00423 }
00424
00425 return mFunc.on_return();
00426 }
00427
00428 int lua_button::_set_disabled_texture(lua_State* pLua)
00429 {
00430 if (!check_parent_())
00431 return 0;
00432
00433 lua::function mFunc("Button:set_disabled_texture", pLua);
00434 mFunc.add(0, "texture", lua::TYPE_USERDATA);
00435 if (mFunc.check())
00436 {
00437 lua_texture* pLuaTexture = mFunc.get_state()->get<lua_texture>();
00438 if (pLuaTexture)
00439 {
00440 texture* pTexture = dynamic_cast<texture*>(pLuaTexture->get_parent());
00441 pButtonParent_->set_disabled_texture(pTexture);
00442 }
00443 }
00444
00445 return mFunc.on_return();
00446 }
00447
00448 int lua_button::_set_highlight_font_object(lua_State* pLua)
00449 {
00450 if (!check_parent_())
00451 return 0;
00452
00453 lua::function mFunc("Button:set_highlight_font_object", pLua);
00454 mFunc.add(0, "font object", lua::TYPE_USERDATA);
00455 if (mFunc.check())
00456 {
00457 lua_font_string* plua_font_string = mFunc.get_state()->get<lua_font_string>();
00458 if (plua_font_string)
00459 {
00460 font_string* pFontString = dynamic_cast<font_string*>(plua_font_string->get_parent());
00461 pButtonParent_->set_highlight_text(pFontString);
00462 }
00463 }
00464
00465 return mFunc.on_return();
00466 }
00467
00468 int lua_button::_set_highlight_text_color(lua_State* pLua)
00469 {
00470 if (!check_parent_())
00471 return 0;
00472
00473 lua::function mFunc("Button:set_highlight_text_color", pLua);
00474 mFunc.add(0, "r", lua::TYPE_NUMBER);
00475 mFunc.add(1, "g", lua::TYPE_NUMBER);
00476 mFunc.add(2, "b", lua::TYPE_NUMBER);
00477 mFunc.add(3, "a", lua::TYPE_NUMBER, true);
00478 if (mFunc.check())
00479 {
00480 font_string* pFontString = pButtonParent_->get_highlight_text();
00481 if (pFontString)
00482 {
00483 if (mFunc.is_provided(3))
00484 {
00485 pFontString->set_text_color(color(
00486 mFunc.get(0)->get_number(),
00487 mFunc.get(1)->get_number(),
00488 mFunc.get(2)->get_number(),
00489 mFunc.get(3)->get_number()
00490 ));
00491 }
00492 else
00493 {
00494 pFontString->set_text_color(color(
00495 mFunc.get(0)->get_number(),
00496 mFunc.get(1)->get_number(),
00497 mFunc.get(2)->get_number()
00498 ));
00499 }
00500 }
00501 }
00502
00503 return mFunc.on_return();
00504 }
00505
00506 int lua_button::_set_highlight_texture(lua_State* pLua)
00507 {
00508 if (!check_parent_())
00509 return 0;
00510
00511 lua::function mFunc("Button:set_highlight_texture", pLua);
00512 mFunc.add(0, "texture", lua::TYPE_USERDATA);
00513 if (mFunc.check())
00514 {
00515 lua_texture* pLuaTexture = mFunc.get_state()->get<lua_texture>();
00516 if (pLuaTexture)
00517 {
00518 texture* pTexture = dynamic_cast<texture*>(pLuaTexture->get_parent());
00519 pButtonParent_->set_highlight_texture(pTexture);
00520 }
00521 }
00522
00523 return mFunc.on_return();
00524 }
00525
00526
00527 int lua_button::_set_normal_font_object(lua_State* pLua)
00528 {
00529 if (!check_parent_())
00530 return 0;
00531
00532 lua::function mFunc("Button:set_normal_font_object", pLua);
00533 mFunc.add(0, "font object", lua::TYPE_USERDATA);
00534 if (mFunc.check())
00535 {
00536 lua_font_string* plua_font_string = mFunc.get_state()->get<lua_font_string>();
00537 if (plua_font_string)
00538 {
00539 font_string* pFontString = dynamic_cast<font_string*>(plua_font_string->get_parent());
00540 pButtonParent_->set_normal_text(pFontString);
00541 }
00542 }
00543
00544 return mFunc.on_return();
00545 }
00546
00547 int lua_button::_set_normal_text_color(lua_State* pLua)
00548 {
00549 if (!check_parent_())
00550 return 0;
00551
00552 lua::function mFunc("Button:set_normal_text_color", pLua);
00553 mFunc.add(0, "r", lua::TYPE_NUMBER);
00554 mFunc.add(1, "g", lua::TYPE_NUMBER);
00555 mFunc.add(2, "b", lua::TYPE_NUMBER);
00556 mFunc.add(3, "a", lua::TYPE_NUMBER, true);
00557 if (mFunc.check())
00558 {
00559 font_string* pFontString = pButtonParent_->get_normal_text();
00560 if (pFontString)
00561 {
00562 if (mFunc.is_provided(3))
00563 {
00564 pFontString->set_text_color(color(
00565 mFunc.get(0)->get_number(),
00566 mFunc.get(1)->get_number(),
00567 mFunc.get(2)->get_number(),
00568 mFunc.get(3)->get_number()
00569 ));
00570 }
00571 else
00572 {
00573 pFontString->set_text_color(color(
00574 mFunc.get(0)->get_number(),
00575 mFunc.get(1)->get_number(),
00576 mFunc.get(2)->get_number()
00577 ));
00578 }
00579 }
00580 }
00581
00582 return mFunc.on_return();
00583 }
00584
00585 int lua_button::_set_normal_texture(lua_State* pLua)
00586 {
00587 if (!check_parent_())
00588 return 0;
00589
00590 lua::function mFunc("Button:set_normal_texture", pLua);
00591 mFunc.add(0, "texture", lua::TYPE_USERDATA);
00592 if (mFunc.check())
00593 {
00594 lua_texture* pLuaTexture = mFunc.get_state()->get<lua_texture>();
00595 if (pLuaTexture)
00596 {
00597 texture* pTexture = dynamic_cast<texture*>(pLuaTexture->get_parent());
00598 pButtonParent_->set_normal_texture(pTexture);
00599 }
00600 }
00601
00602 return mFunc.on_return();
00603 }
00604
00605 int lua_button::_set_pushed_text_offset(lua_State* pLua)
00606 {
00607 if (!check_parent_())
00608 return 0;
00609
00610 lua::function mFunc("Button:set_pushed_text_offset", pLua);
00611 mFunc.add(0, "x offset", lua::TYPE_NUMBER);
00612 mFunc.add(1, "y offset", lua::TYPE_NUMBER);
00613 if (mFunc.check())
00614 {
00615 pButtonParent_->set_pushed_text_offset({{
00616 (int)mFunc.get(0)->get_number(), (int)mFunc.get(1)->get_number()
00617 }});
00618 }
00619
00620 return mFunc.on_return();
00621 }
00622
00623 int lua_button::_set_pushed_texture(lua_State* pLua)
00624 {
00625 if (!check_parent_())
00626 return 0;
00627
00628 lua::function mFunc("Button:set_pushed_texture", pLua);
00629 mFunc.add(0, "texture", lua::TYPE_USERDATA);
00630 if (mFunc.check())
00631 {
00632 lua_texture* pLuaTexture = mFunc.get_state()->get<lua_texture>();
00633 if (pLuaTexture)
00634 {
00635 texture* pTexture = dynamic_cast<texture*>(pLuaTexture->get_parent());
00636 pButtonParent_->set_pushed_texture(pTexture);
00637 }
00638 }
00639
00640 return mFunc.on_return();
00641 }
00642
00643 int lua_button::_set_text(lua_State* pLua)
00644 {
00645 if (!check_parent_())
00646 return 0;
00647
00648 lua::function mFunc("Button:set_text", pLua);
00649 mFunc.add(0, "text", lua::TYPE_STRING);
00650 if (mFunc.check())
00651 pButtonParent_->set_text(mFunc.get(0)->get_string());
00652
00653 return mFunc.on_return();
00654 }
00655
00656 int lua_button::_unlock_highlight(lua_State* pLua)
00657 {
00658 if (!check_parent_())
00659 return 0;
00660
00661 lua::function mFunc("Button:unlock_highlight", pLua);
00662
00663 pButtonParent_->unlock_highlight();
00664
00665 return mFunc.on_return();
00666 }
00667 }