PolyUIMenuBar.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. #include "PolyUIMenuBar.h"
  2. #include "PolyLabel.h"
  3. #include <PolyCoreServices.h>
  4. #include <PolyCore.h>
  5. using namespace Polycode;
  6. UIMenuBarEntryItem::UIMenuBarEntryItem(String name, String code, PolyKEY shortCut1, PolyKEY shortCut2) {
  7. this->name = name;
  8. this->code = code;
  9. this->shortCut1 = shortCut1;
  10. this->shortCut2 = shortCut2;
  11. }
  12. bool UIMenuBarEntryItem::checkShortCut(PolyKEY shortCut) {
  13. if(shortCut1 == KEY_UNKNOWN && shortCut2 == KEY_UNKNOWN)
  14. return false;
  15. if(CoreServices::getInstance()->getCore()->getInput()->getKeyState(KEY_RCTRL) || CoreServices::getInstance()->getCore()->getInput()->getKeyState(KEY_LCTRL)) {
  16. if(shortCut1 != KEY_UNKNOWN && shortCut2 != KEY_UNKNOWN) {
  17. if(shortCut == shortCut1 && CoreServices::getInstance()->getCore()->getInput()->getKeyState(shortCut2)) {
  18. return true;
  19. }
  20. if(shortCut == shortCut2 && CoreServices::getInstance()->getCore()->getInput()->getKeyState(shortCut1)) {
  21. return true;
  22. }
  23. } else {
  24. if(shortCut == shortCut1) {
  25. return true;
  26. }
  27. }
  28. }
  29. return false;
  30. }
  31. UIMenuBarEntry::UIMenuBarEntry(String name): UIElement() {
  32. label = new ScreenLabel(name, 14, "sans");
  33. setWidth(label->getLabel()->getTextWidth() + 20);
  34. bg = new ScreenShape(ScreenShape::SHAPE_RECT, width, 25);
  35. bg->setPositionMode(ScreenEntity::POSITION_TOPLEFT);
  36. addChild(bg);
  37. bg->color.setColorHex(0xce5a1600);
  38. bg->processInputEvents = true;
  39. addChild(label);
  40. label->setPosition(10, 5);
  41. }
  42. void UIMenuBarEntry::Select() {
  43. bg->color.setColorHex(0xce5a16ff);
  44. }
  45. void UIMenuBarEntry::Deselect() {
  46. bg->color.setColorHex(0xce5a1600);
  47. }
  48. void UIMenuBarEntry::addItem(String name, String code, PolyKEY shortCut1, PolyKEY shortCut2) {
  49. items.push_back(UIMenuBarEntryItem(name,code, shortCut1, shortCut2));
  50. }
  51. UIMenuBarEntry::~UIMenuBarEntry() {
  52. delete bg;
  53. delete label;
  54. }
  55. UIMenuBar::UIMenuBar(int width, UIGlobalMenu *globalMenu) : UIElement() {
  56. this->globalMenu = globalMenu;
  57. bgShape = new ScreenShape(ScreenShape::SHAPE_RECT, width, 25);
  58. addChild(bgShape);
  59. bgShape->setColor(0.0, 0.0, 0.0, 1.0);
  60. bgShape->setPositionMode(ScreenEntity::POSITION_TOPLEFT);
  61. entryOffset = 0;
  62. currentEntry = NULL;
  63. dropMenu = NULL;
  64. holdingMouse = false;
  65. CoreServices::getInstance()->getCore()->getInput()->addEventListener(this, InputEvent::EVENT_KEYDOWN);
  66. }
  67. UIMenuBarEntry *UIMenuBar::addMenuBarEntry(String name) {
  68. UIMenuBarEntry *newEntry = new UIMenuBarEntry(name);
  69. entries.push_back(newEntry);
  70. addChild(newEntry);
  71. newEntry->setPosition(entryOffset, 0);
  72. entryOffset += newEntry->width;
  73. newEntry->bg->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
  74. newEntry->bg->addEventListener(this, InputEvent::EVENT_MOUSEUP);
  75. newEntry->bg->addEventListener(this, InputEvent::EVENT_MOUSEUP_OUTSIDE);
  76. newEntry->bg->addEventListener(this, InputEvent::EVENT_MOUSEMOVE);
  77. return newEntry;
  78. }
  79. void UIMenuBar::showMenuForEntry(UIMenuBarEntry *entry) {
  80. dropMenu = globalMenu->showMenu(entry->position.x, 25, 130);
  81. dropMenu->addEventListener(this, UIEvent::OK_EVENT);
  82. dropMenu->addEventListener(this, UIEvent::CANCEL_EVENT);
  83. for(int i=0; i < entry->items.size(); i++) {
  84. dropMenu->addOption(entry->items[i].name, entry->items[i].code);
  85. }
  86. if(currentEntry) {
  87. currentEntry->Deselect();
  88. }
  89. entry->Select();
  90. currentEntry = entry;
  91. }
  92. String UIMenuBar::getSelectedItem() {
  93. return selectedItem;
  94. }
  95. void UIMenuBar::handleEvent(Event *event) {
  96. if(event->getDispatcher() == CoreServices::getInstance()->getCore()->getInput()) {
  97. InputEvent *inputEvent = (InputEvent*) event;
  98. if(event->getEventCode() == InputEvent::EVENT_KEYDOWN) {
  99. for(int i=0; i < entries.size(); i++) {
  100. UIMenuBarEntry *entry = entries[i];
  101. for(int j=0; j < entry->items.size(); j++) {
  102. if(entry->items[j].checkShortCut(inputEvent->key)) {
  103. selectedItem = entry->items[j].code;
  104. dispatchEvent(new UIEvent(), UIEvent::OK_EVENT);
  105. break;
  106. }
  107. }
  108. }
  109. }
  110. }
  111. if(event->getDispatcher() == dropMenu) {
  112. if(event->getEventCode() == UIEvent::OK_EVENT) {
  113. selectedItem = dropMenu->getSelectedItem()->_id;
  114. dispatchEvent(new UIEvent(), UIEvent::OK_EVENT);
  115. }
  116. if(currentEntry) {
  117. currentEntry->Deselect();
  118. currentEntry = NULL;
  119. dropMenu = NULL;
  120. }
  121. }
  122. for(int i=0; i < entries.size(); i++) {
  123. if(event->getDispatcher() == entries[i]->bg) {
  124. switch(event->getEventCode()) {
  125. case InputEvent::EVENT_MOUSEMOVE:
  126. if(entries[i] != currentEntry && dropMenu) {
  127. showMenuForEntry(entries[i]);
  128. }
  129. break;
  130. case InputEvent::EVENT_MOUSEUP:
  131. case InputEvent::EVENT_MOUSEUP_OUTSIDE:
  132. holdingMouse = false;
  133. break;
  134. case InputEvent::EVENT_MOUSEDOWN:
  135. holdingMouse = true;
  136. showMenuForEntry(entries[i]);
  137. break;
  138. }
  139. }
  140. }
  141. }
  142. UIMenuBar::~UIMenuBar() {
  143. if(!ownsChildren) {
  144. delete bgShape;
  145. }
  146. }
  147. void UIMenuBar::Resize(Number width, Number height) {
  148. bgShape->setShapeSize(width, 25);
  149. }