void PopupMenu::setSelected(int32 newSelected) { if (newSelected >= _actions.size()) { newSelected = -1; } if (newSelected != _selected) { updateSelectedItem(); _selected = newSelected; if (_mouseSelection) { popupChildMenu(PressSourceMouse); } updateSelectedItem(); } }
void Menu::setSelected(int selected) { if (selected >= _actions.size()) { selected = -1; } if (_selected != selected) { updateSelectedItem(); if (_selected >= 0 && _selected != _pressed && _actionsData[_selected].toggle) { _actionsData[_selected].toggle->setStyle(_st.itemToggle); } _selected = selected; if (_selected >= 0 && _actionsData[_selected].toggle && _actions[_selected]->isEnabled()) { _actionsData[_selected].toggle->setStyle(_st.itemToggleOver); } updateSelectedItem(); if (_activatedCallback) { auto source = _mouseSelection ? TriggeredSource::Mouse : TriggeredSource::Keyboard; _activatedCallback((_selected >= 0) ? _actions[_selected] : nullptr, itemTop(_selected), source); } } }
void PianorollTrackView::onMouseMoveSlot(QMouseEvent *event) { if (mouseStatus.mode == MouseStatus::LEFTBUTTON_SELECT_ITEM) { mouseStatus.endPosition = mapToScene(event->pos()); updateSelectedItem(); updateWidget(); } else if (mouseStatus.mode == MouseStatus::MIDDLEBUTTON_SCROLL) { QPoint globalMousePos = ui->mainContent->mapToGlobal(event->pos()); int deltaX = globalMousePos.x() - mouseStatus.globalStartPosition.x(); int deltaY = globalMousePos.y() - mouseStatus.globalStartPosition.y(); ui->mainContent->horizontalScrollBar() ->setValue(mouseStatus.horizontalScrollStartValue - deltaX); ui->mainContent->verticalScrollBar() ->setValue(mouseStatus.verticalScrollStartValue - deltaY); updateWidget(); } else if (mouseStatus.mode == MouseStatus::LEFTBUTTON_MOVE_ITEM) { QPoint currentMousePos = mapToScene(event->pos()); // マウスの移動量から、クロック・ノートの移動量を算出 VSQ_NS::tick_t deltaClocks = controllerAdapter->getTickFromX(currentMousePos.x()) - controllerAdapter->getTickFromX(mouseStatus.startPosition.x()); if (mouseStatus.noteOnMouse) { VSQ_NS::tick_t editedNoteClock = quantize(mouseStatus.noteOnMouse->clock + deltaClocks); deltaClocks = editedNoteClock - mouseStatus.noteOnMouse->clock; } int deltaNoteNumbers = getNoteNumberFromY(currentMousePos.y(), trackHeight) - getNoteNumberFromY(mouseStatus.startPosition.y(), trackHeight); // 選択されたアイテムすべてについて、移動を適用する ItemSelectionManager *manager = controllerAdapter->getItemSelectionManager(); manager->moveItems(deltaClocks, deltaNoteNumbers); updateWidget(); } else if (mouseStatus.mode == MouseStatus::LEFTBUTTON_ADD_ITEM) { QPoint currentMousePos = mapToScene(event->pos()); VSQ_NS::tick_t endClock = controllerAdapter->getTickFromX(currentMousePos.x()); VSQ_NS::tick_t length = 0; if (mouseStatus.addingNoteItem.clock < endClock) { length = endClock - mouseStatus.addingNoteItem.clock; length = quantize(length); } mouseStatus.addingNoteItem.setLength(length); updateWidget(); } mouseStatus.isMouseMoved = true; }
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; }
void GUIFormSpecMenu::drawMenu() { if(m_form_src){ std::string newform = m_form_src->getForm(); if(newform != m_formspec_string){ m_formspec_string = newform; regenerateGui(m_screensize_old); } } updateSelectedItem(); gui::IGUISkin* skin = Environment->getSkin(); if (!skin) return; video::IVideoDriver* driver = Environment->getVideoDriver(); video::SColor bgcolor(140,0,0,0); driver->draw2DRectangle(bgcolor, AbsoluteRect, &AbsoluteClippingRect); m_tooltip_element->setVisible(false); /* Draw items Phase 0: Item slot rectangles Phase 1: Item images; prepare tooltip */ for(int phase=0; phase<=1; phase++) for(u32 i=0; i<m_inventorylists.size(); i++) { drawList(m_inventorylists[i], phase); } for(u32 i=0; i<m_images.size(); i++) { const ImageDrawSpec &spec = m_images[i]; video::ITexture *texture = m_gamedef->tsrc()->getTextureRaw(spec.name); // Image size on screen core::rect<s32> imgrect(0, 0, spec.geom.X, spec.geom.Y); // Image rectangle on screen core::rect<s32> rect = imgrect + spec.pos; const video::SColor color(255,255,255,255); const video::SColor colors[] = {color,color,color,color}; driver->draw2DImage(texture, rect, core::rect<s32>(core::position2d<s32>(0,0), core::dimension2di(texture->getOriginalSize())), NULL/*&AbsoluteClippingRect*/, colors, true); } /* Draw dragged item stack */ drawSelectedItem(); /* Call base class */ gui::IGUIElement::draw(); }
void HgGridContainer::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { HgContainer::paint(painter, option, widget); // Draw these only while pinching if(mPinchingOngoing) { const QPen& oldPen = painter->pen(); // dim the background, i.e. draw trasparent black screen-sized rect (alpha is 100 of 255) painter->fillRect(rect(), QColor(0, 0, 0, 100)); QPen pen = painter->pen(); pen.setColor(Qt::white); pen.setWidth(4); painter->setPen(pen); int imageXCount; int imageYCount; int widthSpacingPlusImage; int heightSpacingPlusImage; // Use temp values that are updated during pinching QSize imageSize(mTempImageHeightForLineGrid, mTempImageHeightForLineGrid); if (scrollDirection() == Qt::Horizontal ) //landscape mode { imageXCount = rect().width() / imageSize.width(); imageYCount = mTempRowCount; widthSpacingPlusImage = mRenderer->getSpacing().height() + imageSize.height(); heightSpacingPlusImage = mRenderer->getSpacing().width() + imageSize.width(); } else //portrait mode { imageXCount = mTempRowCount; imageYCount = rect().height() / imageSize.height(); widthSpacingPlusImage = mRenderer->getSpacing().width() + imageSize.width(); heightSpacingPlusImage = mRenderer->getSpacing().height() + imageSize.height(); } int yOffset(0); if (scrollDirection() == Qt::Horizontal ) { yOffset = (rect().height() - (mUserItemSize.height()*mHorizontalRowCount))/2; } for (int xCounter = 0; xCounter < (imageXCount+1); ++xCounter) { for (int yCounter = 0; yCounter < (imageYCount+1); ++yCounter) { painter->drawLine(QPoint(0, yOffset + yCounter * heightSpacingPlusImage), QPoint(rect().width(), yOffset + yCounter * heightSpacingPlusImage)); } painter->drawLine(QPoint(xCounter * widthSpacingPlusImage, yOffset), QPoint(xCounter * widthSpacingPlusImage, rect().height()-yOffset)); } painter->setPen(oldPen); } updateSelectedItem(); }