PolyUIMenuBar.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #include "PolyUIMenuBar.h"
  2. #include "PolyLabel.h"
  3. using namespace Polycode;
  4. UIMenuBarEntry::UIMenuBarEntry(String name): UIElement() {
  5. label = new ScreenLabel(name, 14, "sans");
  6. setWidth(label->getLabel()->getTextWidth() + 20);
  7. bg = new ScreenShape(ScreenShape::SHAPE_RECT, width, 25);
  8. bg->setPositionMode(ScreenEntity::POSITION_TOPLEFT);
  9. addChild(bg);
  10. bg->color.setColorHex(0xce5a1600);
  11. bg->processInputEvents = true;
  12. addChild(label);
  13. label->setPosition(10, 5);
  14. }
  15. void UIMenuBarEntry::Select() {
  16. bg->color.setColorHex(0xce5a16ff);
  17. }
  18. void UIMenuBarEntry::Deselect() {
  19. bg->color.setColorHex(0xce5a1600);
  20. }
  21. void UIMenuBarEntry::addItem(String name, String code) {
  22. items.push_back(UIMenuBarEntryItem(name,code));
  23. }
  24. UIMenuBarEntry::~UIMenuBarEntry() {
  25. delete bg;
  26. delete label;
  27. }
  28. UIMenuBar::UIMenuBar(int width, UIGlobalMenu *globalMenu) : UIElement() {
  29. this->globalMenu = globalMenu;
  30. bgShape = new ScreenShape(ScreenShape::SHAPE_RECT, width, 25);
  31. addChild(bgShape);
  32. bgShape->setColor(0.0, 0.0, 0.0, 1.0);
  33. bgShape->setPositionMode(ScreenEntity::POSITION_TOPLEFT);
  34. entryOffset = 0;
  35. currentEntry = NULL;
  36. dropMenu = NULL;
  37. holdingMouse = false;
  38. }
  39. UIMenuBarEntry *UIMenuBar::addMenuBarEntry(String name) {
  40. UIMenuBarEntry *newEntry = new UIMenuBarEntry(name);
  41. entries.push_back(newEntry);
  42. addChild(newEntry);
  43. newEntry->setPosition(entryOffset, 0);
  44. entryOffset += newEntry->width;
  45. newEntry->bg->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
  46. newEntry->bg->addEventListener(this, InputEvent::EVENT_MOUSEUP);
  47. newEntry->bg->addEventListener(this, InputEvent::EVENT_MOUSEUP_OUTSIDE);
  48. newEntry->bg->addEventListener(this, InputEvent::EVENT_MOUSEMOVE);
  49. return newEntry;
  50. }
  51. void UIMenuBar::showMenuForEntry(UIMenuBarEntry *entry) {
  52. dropMenu = globalMenu->showMenu(entry->position.x, 25, 130);
  53. dropMenu->addEventListener(this, UIEvent::OK_EVENT);
  54. dropMenu->addEventListener(this, UIEvent::CANCEL_EVENT);
  55. for(int i=0; i < entry->items.size(); i++) {
  56. dropMenu->addOption(entry->items[i].name, entry->items[i].code);
  57. }
  58. if(currentEntry) {
  59. currentEntry->Deselect();
  60. }
  61. entry->Select();
  62. currentEntry = entry;
  63. }
  64. String UIMenuBar::getSelectedItem() {
  65. return selectedItem;
  66. }
  67. void UIMenuBar::handleEvent(Event *event) {
  68. if(event->getDispatcher() == dropMenu) {
  69. if(event->getEventCode() == UIEvent::OK_EVENT) {
  70. selectedItem = dropMenu->getSelectedItem()->_id;
  71. dispatchEvent(new UIEvent(), UIEvent::OK_EVENT);
  72. }
  73. if(currentEntry) {
  74. currentEntry->Deselect();
  75. currentEntry = NULL;
  76. dropMenu = NULL;
  77. }
  78. }
  79. for(int i=0; i < entries.size(); i++) {
  80. if(event->getDispatcher() == entries[i]->bg) {
  81. switch(event->getEventCode()) {
  82. case InputEvent::EVENT_MOUSEMOVE:
  83. if(entries[i] != currentEntry && dropMenu) {
  84. showMenuForEntry(entries[i]);
  85. }
  86. break;
  87. case InputEvent::EVENT_MOUSEUP:
  88. case InputEvent::EVENT_MOUSEUP_OUTSIDE:
  89. holdingMouse = false;
  90. break;
  91. case InputEvent::EVENT_MOUSEDOWN:
  92. holdingMouse = true;
  93. showMenuForEntry(entries[i]);
  94. break;
  95. }
  96. }
  97. }
  98. }
  99. UIMenuBar::~UIMenuBar() {
  100. delete bgShape;
  101. }
  102. void UIMenuBar::Resize(Number width, Number height) {
  103. bgShape->setShapeSize(width, 25);
  104. }