void ScreenSetup::dropEvent(QDropEvent* event) { for (auto& _item : screenItems_) _item.second->setDrop(false); auto* _screenItem = getItemAtPos(event->pos()); //dragWidget_->hide(); if (_screenItem) { _screenItem->setDrop(false); _screenItem->setHoverIndex(event->pos()); auto* _tuningWidget = static_cast<proj::Tuning*>(event->source()); if (!_tuningWidget->tuning()) return; _screenItem->attachTuning(_tuningWidget); event->acceptProposedAction(); } for (auto& _screenItem : screenItems_) { auto& _item = _screenItem.second; _item->endDrop(); } }
void PaletteItem::mouseDown(int x, int y, int button) { PaletteItem *p = getItemAtPos(x, y); if(p) p->mouseDown(x, y, button); else { down = true; invalidate(); } }
void ControlSystem::pickUpItem() const { if (player_turn_->turn_taken) { return; } GameObject item = getItemAtPos(player_space_->pos); if (item.getId()) { addToInventory(item); } }
void ScreenSetup::mouseDoubleClickEvent(QMouseEvent* _event) { auto _screenItem = getItemAtPos(_event->pos()); if (_screenItem) { _screenItem->setHoverIndex(_event->pos()); _screenItem->detachCurrentTuning(); update(); } }
void PaletteItem::mouseMove(int x, int y, int button) { PaletteItem *p = getItemAtPos(x, y); if(p != selected) { if(selected) selected->mouseLeave(); selected = p; if(selected) selected->mouseEnter(); } if(p) p->mouseMove(x, y, button); else down = button; }
void ScreenSetup::dragMoveEvent(QDragMoveEvent* event) { auto* _screenItem = getItemAtPos(event->pos()); for (auto& _item : screenItems_) _item.second->setDrop(false); if (event->mimeData()->hasFormat("text/plain") && _screenItem) { auto* _tuningWidget = static_cast<proj::Tuning*>(event->source()); if (!_tuningWidget->tuning()) return; auto _color = _tuningWidget->tuning()->color(); _screenItem->setHoverIndex(event->pos()); _screenItem->setDrop(true,_color); event->acceptProposedAction(); } update(); }
void LMaster::returnPressed() { if (!editedItem) return; setFocus(); // Tempo event: if (editedItem->getType() == LMASTER_TEMPO && editorColumn == LMASTER_VAL_COL) { QString input = tempo_editor->text(); tempo_editor->hide(); repaint(); LMasterTempoItem* e = (LMasterTempoItem*) editedItem; const MusECore::TEvent* t = e->getEvent(); unsigned tick = t->tick; bool conversionOK; double dbl_input = input.toDouble(&conversionOK); if (conversionOK && dbl_input < 250.0) { int tempo = (int) ((1000000.0 * 60.0)/dbl_input); if (!editingNewItem) { MusEGlobal::song->startUndo(); // Operation is undoable but do not start/end undo. MusEGlobal::song->applyOperation(MusECore::UndoOp(MusECore::UndoOp::DeleteTempo, tick, e->tempo()), MusECore::Song::OperationUndoable); // Operation is undoable but do not start/end undo. MusEGlobal::song->applyOperation(MusECore::UndoOp(MusECore::UndoOp::AddTempo, tick, tempo), MusECore::Song::OperationUndoable); MusEGlobal::song->endUndo(SC_TEMPO); } // // New item edited: // else { MusEGlobal::song->applyOperation(MusECore::UndoOp(MusECore::UndoOp::AddTempo, tick, tempo)); } } else { QMessageBox::warning(this, tr("MusE: List Editor"), tr("Input error, conversion not OK or value out of range"), QMessageBox::Ok, Qt::NoButton ); } } // // Beat column, change position of a particular tempo or signature event // else if (editorColumn == LMASTER_BEAT_COL) { int oldtick = editedItem->tick(); int newtick = pos_editor->pos().tick(); if (newtick == 0) { // Do not allow change of position to beginning of song QMessageBox::warning(this, tr(LMASTER_MSGBOX_STRING), tr("Reposition of tempo and signature events to start position is not allowed!"), QMessageBox::Ok, Qt::NoButton ); } else if (oldtick != newtick) { // Ignore if tick hasn't changed if (editedItem->getType() == LMASTER_TEMPO) { LMasterTempoItem* t = (LMasterTempoItem*) editedItem; int tempo = t->tempo(); MusEGlobal::song->startUndo(); // Operation is undoable but do not start/end undo. MusEGlobal::song->applyOperation(MusECore::UndoOp(MusECore::UndoOp::DeleteTempo, oldtick, tempo), MusECore::Song::OperationUndoable); // Operation is undoable but do not start/end undo. MusEGlobal::song->applyOperation(MusECore::UndoOp(MusECore::UndoOp::AddTempo, newtick, tempo), MusECore::Song::OperationUndoable); MusEGlobal::song->endUndo(SC_TEMPO); // Select the item: QTreeWidgetItem* newSelected = (QTreeWidgetItem*) getItemAtPos(newtick, LMASTER_TEMPO); if (newSelected) { view->clearSelection(); view->setCurrentItem(newSelected); } } else if (editedItem->getType() == LMASTER_SIGEVENT) { LMasterSigEventItem* t = (LMasterSigEventItem*) editedItem; int z = t->z(); int n = t->n(); if (!editingNewItem) { MusEGlobal::song->startUndo(); //Delete first, in order to get sane tick-value // Operation is undoable but do not start/end undo. MusEGlobal::song->applyOperation(MusECore::UndoOp(MusECore::UndoOp::DeleteSig, oldtick, z, n), MusECore::Song::OperationUndoable); newtick = pos_editor->pos().tick(); // Add will replace if found. // Operation is undoable but do not start/end undo. MusEGlobal::song->applyOperation(MusECore::UndoOp(MusECore::UndoOp::AddSig, newtick, z, n), MusECore::Song::OperationUndoable); MusEGlobal::song->endUndo(SC_SIG); } else // Add will replace if found. // Operation is undoable but do not start/end undo. MusEGlobal::song->applyOperation(MusECore::UndoOp(MusECore::UndoOp::AddSig, newtick, z, n), MusECore::Song::OperationUndoable); // Select the item: QTreeWidgetItem* newSelected = (QTreeWidgetItem*) getItemAtPos(newtick, LMASTER_SIGEVENT); if (newSelected) { view->clearSelection(); view->setCurrentItem(newSelected); } } else if (editedItem->getType() == LMASTER_KEYEVENT) { LMasterKeyEventItem* k = (LMasterKeyEventItem*) editedItem; MusECore::key_enum key = k->key(); MusEGlobal::song->startUndo(); // Operation is undoable but do not start/end undo. MusEGlobal::song->applyOperation(MusECore::UndoOp(MusECore::UndoOp::DeleteKey, oldtick, key), MusECore::Song::OperationUndoable); // Operation is undoable but do not start/end undo. MusEGlobal::song->applyOperation(MusECore::UndoOp(MusECore::UndoOp::AddKey, newtick, key), MusECore::Song::OperationUndoable); MusEGlobal::song->endUndo(SC_KEY); // Select the item: QTreeWidgetItem* newSelected = (QTreeWidgetItem*) getItemAtPos(newtick, LMASTER_KEYEVENT); if (newSelected) { view->clearSelection(); view->setCurrentItem(newSelected); } } else { printf("unknown master list event type!\n"); } } pos_editor->hide(); repaint(); } // // SigEvent, value changed: // else if (editedItem->getType() == LMASTER_SIGEVENT && editorColumn == LMASTER_VAL_COL) { MusECore::TimeSignature newSig = sig_editor->sig(); sig_editor->hide(); // Added p3.3.43 Prevents aborting with 0 z or n. if(newSig.isValid()) { LMasterSigEventItem* e = (LMasterSigEventItem*) editedItem; int tick = e->tick(); if (!editingNewItem) { MusEGlobal::song->startUndo(); // Operation is undoable but do not start/end undo. MusEGlobal::song->applyOperation(MusECore::UndoOp(MusECore::UndoOp::DeleteSig, tick, e->z(), e->n()), MusECore::Song::OperationUndoable); // Add will replace if found. // Operation is undoable but do not start/end undo. MusEGlobal::song->applyOperation(MusECore::UndoOp(MusECore::UndoOp::AddSig, tick, newSig.z, newSig.n), MusECore::Song::OperationUndoable); MusEGlobal::song->endUndo(SC_SIG); } else // Add will replace if found. MusEGlobal::song->applyOperation(MusECore::UndoOp(MusECore::UndoOp::AddSig, tick, newSig.z, newSig.n)); } else { printf("Signature is not valid!\n"); } } else if (editedItem->getType() == LMASTER_KEYEVENT && editorColumn == LMASTER_VAL_COL) { QString input = key_editor->currentText(); key_editor->hide(); repaint(); LMasterKeyEventItem* e = (LMasterKeyEventItem*) editedItem; const MusECore::KeyEvent& t = e->getEvent(); unsigned tick = t.tick; MusECore::key_enum key = MusECore::stringToKey(input); if (!editingNewItem) { MusEGlobal::song->startUndo(); // Operation is undoable but do not start/end undo. MusEGlobal::song->applyOperation(MusECore::UndoOp(MusECore::UndoOp::DeleteKey, tick, e->key()), MusECore::Song::OperationUndoable); // Operation is undoable but do not start/end undo. MusEGlobal::song->applyOperation(MusECore::UndoOp(MusECore::UndoOp::AddKey, tick, key), MusECore::Song::OperationUndoable); MusEGlobal::song->endUndo(SC_KEY); } // // New item edited: // else { MusEGlobal::song->applyOperation(MusECore::UndoOp(MusECore::UndoOp::AddKey, tick, key)); } } updateList(); view->setFocus(); // No item edited now: editedItem = 0; editorColumn = -1; editingNewItem = false; }
void LMaster::updateList() { LMasterLViewItem* selected = (LMasterLViewItem*) view->currentItem(); LMASTER_LVTYPE type = LMASTER_TEMPO; unsigned tick = 0; if (selected) { type = selected->getType(); tick = selected->tick(); } view->clear(); const MusECore::TempoList* t = &MusEGlobal::tempomap; const MusECore::SigList* s = &MusEGlobal::sigmap; const MusECore::KeyList* k = &MusEGlobal::keymap; MusECore::criTEvent it = t->rbegin(); MusECore::criSigEvent is = s->rbegin(); MusECore::criKeyEvent ik = k->rbegin(); // three lists that should be added to the view. // question if it would not be easier to merge the lists and use a sorting algorithm? // how often is this function called? A: only on songChanged (SC_TEMPO && SC_SIG) for (;;) { // crazy long, must be possible to solve more elegantly... if (ik != k->rend() && is == s->rend() && it == t->rend()) {// ik biggest insertKey(ik->second); ++ik; } else if (is != s->rend() && ik == k->rend() && it == t->rend()) {// is biggest insertSig(is->second); ++is; } else if (it != t->rend() && ik == k->rend() && is == s->rend()) {// it biggest insertTempo(it->second); ++it; } else if ( ((ik != k->rend()) && (is == s->rend()) && (ik->second.tick >= it->second->tick)) || ((it == t->rend()) && (ik->second.tick >= is->second->tick ) )) {// ik biggest insertKey(ik->second); ++ik; } else if ( ((is != s->rend()) && (ik == k->rend()) && (is->second->tick >= it->second->tick)) || ((it == t->rend()) && (is->second->tick >= ik->second.tick ))) {// is biggest insertSig(is->second); ++is; } else if (((it != t->rend()) && (ik == k->rend()) && (it->second->tick >= is->second->tick)) || ((is == s->rend()) && (it->second->tick >= ik->second.tick ))) {// it biggest insertTempo(it->second); ++it; } else if (ik != k->rend() && ik->second.tick >= is->second->tick && ik->second.tick >= it->second->tick) {// ik biggest insertKey(ik->second); ++ik; } else if (is != s->rend() && is->second->tick >= it->second->tick && is->second->tick >= ik->second.tick) { // is biggest insertSig(is->second); ++is; } else if (it != t->rend() && it->second->tick >= is->second->tick && it->second->tick >= ik->second.tick) { // it biggest insertTempo(it->second); ++it; } if (ik == k->rend() && is == s->rend() && it == t->rend() ) break; } // Try to reselect the previous selection: if(selected) { LMasterLViewItem* tmp = getItemAtPos(tick, type); if (tmp) { view->clearSelection(); view->setCurrentItem(tmp); } } }
bool GUIInventoryMenu::OnEvent(const SEvent& event) { if(event.EventType==EET_KEY_INPUT_EVENT) { KeyPress kp(event.KeyInput); if (event.KeyInput.PressedDown && (kp == EscapeKey || kp == getKeySetting("keymap_inventory"))) { quitMenu(); return true; } } if(event.EventType==EET_MOUSE_INPUT_EVENT) { char amount = -1; if(event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN) amount = 0; else if(event.MouseInput.Event == EMIE_RMOUSE_PRESSED_DOWN) amount = 1; else if(event.MouseInput.Event == EMIE_MMOUSE_PRESSED_DOWN) amount = 10; if(amount >= 0) { v2s32 p(event.MouseInput.X, event.MouseInput.Y); //infostream<<"Mouse down at p=("<<p.X<<","<<p.Y<<")"<<std::endl; ItemSpec s = getItemAtPos(p); if(s.isValid()) { infostream<<"Mouse down on "<<s.inventoryname <<"/"<<s.listname<<" "<<s.i<<std::endl; if(m_selected_item) { Inventory *inv_from = m_invmgr->getInventory(m_c, m_selected_item->inventoryname); Inventory *inv_to = m_invmgr->getInventory(m_c, s.inventoryname); assert(inv_from); assert(inv_to); InventoryList *list_from = inv_from->getList(m_selected_item->listname); InventoryList *list_to = inv_to->getList(s.listname); if(list_from == NULL) infostream<<"from list doesn't exist"<<std::endl; if(list_to == NULL) infostream<<"to list doesn't exist"<<std::endl; // Indicates whether source slot completely empties bool source_empties = false; if(list_from && list_to && list_from->getItem(m_selected_item->i) != NULL) { infostream<<"Handing IACTION_MOVE to manager"<<std::endl; IMoveAction *a = new IMoveAction(); a->count = amount; a->from_inv = m_selected_item->inventoryname; a->from_list = m_selected_item->listname; a->from_i = m_selected_item->i; a->to_inv = s.inventoryname; a->to_list = s.listname; a->to_i = s.i; //ispec.actions->push_back(a); m_invmgr->inventoryAction(a); if(list_from->getItem(m_selected_item->i)->getCount()==1) source_empties = true; } // Remove selection if target was left-clicked or source // slot was emptied if(amount == 0 || source_empties) { delete m_selected_item; m_selected_item = NULL; } } else { /* Select if non-NULL */ Inventory *inv = m_invmgr->getInventory(m_c, s.inventoryname); assert(inv); InventoryList *list = inv->getList(s.listname); if(list->getItem(s.i) != NULL) { m_selected_item = new ItemSpec(s); } } } else { if(m_selected_item) { delete m_selected_item; m_selected_item = NULL; } } } } if(event.EventType==EET_GUI_EVENT) { if(event.GUIEvent.EventType==gui::EGET_ELEMENT_FOCUS_LOST && isVisible()) { if(!canTakeFocus(event.GUIEvent.Element)) { infostream<<"GUIInventoryMenu: Not allowing focus change." <<std::endl; // Returning true disables focus change return true; } } if(event.GUIEvent.EventType==gui::EGET_BUTTON_CLICKED) { /*switch(event.GUIEvent.Caller->getID()) { case 256: // continue setVisible(false); break; case 257: // exit dev->closeDevice(); break; }*/ } } return Parent ? Parent->OnEvent(event) : false; }
void PaletteItem::mouseUp(int x, int y, int button) { PaletteItem *p = getItemAtPos(x, y); if(p) p->mouseUp(x, y, button); }
bool GUIFormSpecMenu::OnEvent(const SEvent& event) { if(event.EventType==EET_KEY_INPUT_EVENT) { KeyPress kp(event.KeyInput); if (event.KeyInput.PressedDown && (kp == EscapeKey || kp == getKeySetting("keymap_inventory"))) { quitMenu(); return true; } if(event.KeyInput.Key==KEY_RETURN && event.KeyInput.PressedDown) { acceptInput(); quitMenu(); return true; } } if(event.EventType==EET_MOUSE_INPUT_EVENT && event.MouseInput.Event == EMIE_MOUSE_MOVED) { // Mouse moved m_pointer = v2s32(event.MouseInput.X, event.MouseInput.Y); } if(event.EventType==EET_MOUSE_INPUT_EVENT && event.MouseInput.Event != EMIE_MOUSE_MOVED) { // Mouse event other than movement v2s32 p(event.MouseInput.X, event.MouseInput.Y); m_pointer = p; // Get selected item and hovered/clicked item (s) updateSelectedItem(); ItemSpec s = getItemAtPos(p); Inventory *inv_selected = NULL; Inventory *inv_s = NULL; if(m_selected_item) { inv_selected = m_invmgr->getInventory(m_selected_item->inventoryloc); assert(inv_selected); assert(inv_selected->getList(m_selected_item->listname) != NULL); } u32 s_count = 0; if(s.isValid()) do{ // breakable inv_s = m_invmgr->getInventory(s.inventoryloc); if(!inv_s){ errorstream<<"InventoryMenu: The selected inventory location " <<"\""<<s.inventoryloc.dump()<<"\" doesn't exist" <<std::endl; s.i = -1; // make it invalid again break; } InventoryList *list = inv_s->getList(s.listname); if(list == NULL){ verbosestream<<"InventoryMenu: The selected inventory list \"" <<s.listname<<"\" does not exist"<<std::endl; s.i = -1; // make it invalid again break; } if((u32)s.i >= list->getSize()){ infostream<<"InventoryMenu: The selected inventory list \"" <<s.listname<<"\" is too small (i="<<s.i<<", size=" <<list->getSize()<<")"<<std::endl; s.i = -1; // make it invalid again break; } s_count = list->getItem(s.i).count; }while(0); bool identical = (m_selected_item != NULL) && s.isValid() && (inv_selected == inv_s) && (m_selected_item->listname == s.listname) && (m_selected_item->i == s.i); // buttons: 0 = left, 1 = right, 2 = middle // up/down: 0 = down (press), 1 = up (release), 2 = unknown event int button = 0; int updown = 2; if(event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN) { button = 0; updown = 0; } else if(event.MouseInput.Event == EMIE_RMOUSE_PRESSED_DOWN) { button = 1; updown = 0; } else if(event.MouseInput.Event == EMIE_MMOUSE_PRESSED_DOWN) { button = 2; updown = 0; } else if(event.MouseInput.Event == EMIE_LMOUSE_LEFT_UP) { button = 0; updown = 1; } else if(event.MouseInput.Event == EMIE_RMOUSE_LEFT_UP) { button = 1; updown = 1; } else if(event.MouseInput.Event == EMIE_MMOUSE_LEFT_UP) { button = 2; updown = 1; } // Set this number to a positive value to generate a move action // from m_selected_item to s. u32 move_amount = 0; // Set this number to a positive value to generate a drop action // from m_selected_item. u32 drop_amount = 0; // Set this number to a positive value to generate a craft action at s. u32 craft_amount = 0; if(updown == 0) { // Some mouse button has been pressed //infostream<<"Mouse button "<<button<<" pressed at p=(" // <<p.X<<","<<p.Y<<")"<<std::endl; m_selected_dragging = false; if(s.isValid() && s.listname == "craftpreview") { // Craft preview has been clicked: craft craft_amount = (button == 2 ? 10 : 1); } else if(m_selected_item == NULL) { if(s_count != 0) { // Non-empty stack has been clicked: select it m_selected_item = new ItemSpec(s); if(button == 1) // right m_selected_amount = (s_count + 1) / 2; else if(button == 2) // middle m_selected_amount = MYMIN(s_count, 10); else // left m_selected_amount = s_count; m_selected_dragging = true; } } else // m_selected_item != NULL { assert(m_selected_amount >= 1); if(s.isValid()) { // Clicked a slot: move if(button == 1) // right move_amount = 1; else if(button == 2) // middle move_amount = MYMIN(m_selected_amount, 10); else // left move_amount = m_selected_amount; if(identical) { if(move_amount >= m_selected_amount) m_selected_amount = 0; else m_selected_amount -= move_amount; move_amount = 0; } } else if(getAbsoluteClippingRect().isPointInside(m_pointer)) { // Clicked somewhere else: deselect m_selected_amount = 0; } else { // Clicked outside of the window: drop if(button == 1) // right drop_amount = 1; else if(button == 2) // middle drop_amount = MYMIN(m_selected_amount, 10); else // left drop_amount = m_selected_amount; } } } else if(updown == 1) { // Some mouse button has been released //infostream<<"Mouse button "<<button<<" released at p=(" // <<p.X<<","<<p.Y<<")"<<std::endl; if(m_selected_item != NULL && m_selected_dragging && s.isValid()) { if(!identical) { // Dragged to different slot: move all selected move_amount = m_selected_amount; } } else if(m_selected_item != NULL && m_selected_dragging && !(getAbsoluteClippingRect().isPointInside(m_pointer))) { // Dragged outside of window: drop all selected drop_amount = m_selected_amount; } m_selected_dragging = false; } // Possibly send inventory action to server if(move_amount > 0) { // Send IACTION_MOVE assert(m_selected_item && m_selected_item->isValid()); assert(s.isValid()); assert(inv_selected && inv_s); InventoryList *list_from = inv_selected->getList(m_selected_item->listname); InventoryList *list_to = inv_s->getList(s.listname); assert(list_from && list_to); ItemStack stack_from = list_from->getItem(m_selected_item->i); ItemStack stack_to = list_to->getItem(s.i); // Check how many items can be moved move_amount = stack_from.count = MYMIN(move_amount, stack_from.count); ItemStack leftover = stack_to.addItem(stack_from, m_gamedef->idef()); // If source stack cannot be added to destination stack at all, // they are swapped if(leftover.count == stack_from.count && leftover.name == stack_from.name) { m_selected_amount = stack_to.count; // In case the server doesn't directly swap them but instead // moves stack_to somewhere else, set this m_selected_content_guess = stack_to; m_selected_content_guess_inventory = s.inventoryloc; } // Source stack goes fully into destination stack else if(leftover.empty()) { m_selected_amount -= move_amount; m_selected_content_guess = ItemStack(); // Clear } // Source stack goes partly into destination stack else { move_amount -= leftover.count; m_selected_amount -= move_amount; m_selected_content_guess = ItemStack(); // Clear } infostream<<"Handing IACTION_MOVE to manager"<<std::endl; IMoveAction *a = new IMoveAction(); a->count = move_amount; a->from_inv = m_selected_item->inventoryloc; a->from_list = m_selected_item->listname; a->from_i = m_selected_item->i; a->to_inv = s.inventoryloc; a->to_list = s.listname; a->to_i = s.i; m_invmgr->inventoryAction(a); } else if(drop_amount > 0) { m_selected_content_guess = ItemStack(); // Clear // Send IACTION_DROP assert(m_selected_item && m_selected_item->isValid()); assert(inv_selected); InventoryList *list_from = inv_selected->getList(m_selected_item->listname); assert(list_from); ItemStack stack_from = list_from->getItem(m_selected_item->i); // Check how many items can be dropped drop_amount = stack_from.count = MYMIN(drop_amount, stack_from.count); assert(drop_amount > 0 && drop_amount <= m_selected_amount); m_selected_amount -= drop_amount; infostream<<"Handing IACTION_DROP to manager"<<std::endl; IDropAction *a = new IDropAction(); a->count = drop_amount; a->from_inv = m_selected_item->inventoryloc; a->from_list = m_selected_item->listname; a->from_i = m_selected_item->i; m_invmgr->inventoryAction(a); } else if(craft_amount > 0) { m_selected_content_guess = ItemStack(); // Clear // Send IACTION_CRAFT assert(s.isValid()); assert(inv_s); infostream<<"Handing IACTION_CRAFT to manager"<<std::endl; ICraftAction *a = new ICraftAction(); a->count = craft_amount; a->craft_inv = s.inventoryloc; m_invmgr->inventoryAction(a); } // If m_selected_amount has been decreased to zero, deselect if(m_selected_amount == 0) { delete m_selected_item; m_selected_item = NULL; m_selected_amount = 0; m_selected_dragging = false; m_selected_content_guess = ItemStack(); } } if(event.EventType==EET_GUI_EVENT) { if(event.GUIEvent.EventType==gui::EGET_ELEMENT_FOCUS_LOST && isVisible()) { if(!canTakeFocus(event.GUIEvent.Element)) { infostream<<"GUIFormSpecMenu: Not allowing focus change." <<std::endl; // Returning true disables focus change return true; } } if(event.GUIEvent.EventType==gui::EGET_BUTTON_CLICKED) { switch(event.GUIEvent.Caller->getID()) { case 257: acceptInput(); quitMenu(); // quitMenu deallocates menu return true; } // find the element that was clicked for(u32 i=0; i<m_fields.size(); i++) { FieldSpec &s = m_fields[i]; // if its a button, set the send field so // lua knows which button was pressed if (s.is_button && s.fid == event.GUIEvent.Caller->getID()) { s.send = true; acceptInput(); if(s.is_exit){ quitMenu(); return true; }else{ s.send = false; // Restore focus to the full form Environment->setFocus(this); return true; } } } } if(event.GUIEvent.EventType==gui::EGET_EDITBOX_ENTER) { if(event.GUIEvent.Caller->getID() > 257) { acceptInput(); quitMenu(); // quitMenu deallocates menu return true; } } } return Parent ? Parent->OnEvent(event) : false; }