typeRound(int nbr, int type) { if (type == 0) return toNext20(nbr-10); else return toNext16Compatible(nbr); }
void ObjectsEditonMode::mouseDrag(int x, int y, Qt::KeyboardModifiers modifieres) { if (creatNewObject) { lx = x; ly = y; int xpos = typeRound(dx, newObject->getType()); int ypos = typeRound(dy, newObject->getType()); int mX = typeRound(qMax(0, lx), newObject->getType()); int mY = typeRound(qMax(0, ly), newObject->getType()); int w = qAbs(mX-xpos); int h = qAbs(mY-ypos); if (newObject->getType() == 0) { if (mX < 0) mX = 0; else w += 20; if (mY < 0) mY = 0; else h += 20; } newObject->setPosition(qMin(xpos, mX), qMin(ypos, mY)); newObject->resize(w, h); return; } if (selectionMode) { lx = x; ly = y; selectedObjects.clear(); selectedObjects = getObjectsAtPos(lx, ly, dx, dy, false); } else { updateSelectionBounds(); // Drag if (mouseAct.hor == ResizeNone && mouseAct.vert == ResizeNone) { int xDelta = x-lx; int yDelta = y-ly; // Quick and dirty fix to prevent the dragging objects from wiggling sometimes if (xDelta == -xDeltaL) xDelta = 0; else xDeltaL = xDelta; if (yDelta == -yDeltaL) yDelta = 0; else yDeltaL = yDelta; if (xDelta < -minBoundX) xDelta = -minBoundX; if (yDelta < -minBoundY) yDelta = -minBoundY; if (xDelta == 0 && yDelta == 0) return; if (selectionHasBGDats) { xDelta = toNext20(xDelta); yDelta = toNext20(yDelta); } else if (modifieres == Qt::AltModifier) { xDelta = toNext16Compatible(xDelta); xDelta = toNext16Compatible(xDelta); } else { xDelta = toNext10(xDelta); yDelta = toNext10(yDelta); } foreach (Object* obj, selectedObjects) { obj->increasePosition(xDelta, yDelta); } minBoundX += xDelta; minBoundY += yDelta; lx += xDelta; ly += yDelta; }
void ObjectsEditonMode::mouseDown(int x, int y, Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers) { dx = x; dy = y; lx = x; ly = y; if (buttons == Qt::RightButton) { selectedObjects.clear(); if (drawType == 0) { int id = selTileset << 12; id = (id & 0xF000) | selObject; BgdatObject* bgdatobj = new BgdatObject(toNext20(x-10), toNext20(y-10), 20, 20, id, selLayer); level->objects[selLayer].append(bgdatobj); newObject = bgdatobj; creatNewObject = true; selectedObjects.append(bgdatobj); } else if (drawType == 1) { Sprite* spr = new Sprite(0, 0, selSprite); spr->setRect(); int xpos = toNext10(dx-spr->getwidth()/2-spr->getOffsetX()); int ypos = toNext10(dy-spr->getheight()/2-spr->getOffsetY()); if (xpos < 0) xpos = 0; if (ypos < 0) ypos = 0; spr->setPosition(xpos, ypos); level->sprites.append(spr); selectedObjects.append(spr); } else if (drawType == 4) { Location* loc = new Location(toNext16Compatible(x), toNext16Compatible(y), 4, 4, 0); level->locations.append(loc); newObject = loc; creatNewObject = true; } } if (buttons == Qt::LeftButton) { mouseAct = getActionAtPos(x, y); if (!mouseAct.drag || (mouseAct.hor == ResizeNone && mouseAct.vert == ResizeNone)) { QList<Object*> tempSelObjects = selectedObjects; bool shift = false; if (modifiers != Qt::ShiftModifier) selectedObjects = getObjectsAtPos(dx, dy, dx, dy, true); else { shift = true; QList<Object*> newObjList = getObjectsAtPos(dx, dy, dx, dy, true); if (newObjList.size() == 1) { if(!selectedObjects.contains(newObjList[0])) selectedObjects.append(newObjList[0]); else selectedObjects.removeOne(newObjList[0]); } } if (!shift && selectedObjects.size() != 0 && tempSelObjects.contains(selectedObjects[0])) { selectedObjects = tempSelObjects; } if (selectedObjects.size() == 0) selectionMode = true; } mouseAct = getActionAtPos(x, y); actualCursor = getCursorAtPos(x, y); updateSelectionBounds(); } }