void LayerEditScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { if(!event->buttons() & Qt::LeftButton) { return; } if((event->scenePos() - _dragStartPosition).manhattanLength() < QApplication::startDragDistance()) { return; } qDebug() << "LayerEditScene::mouseMoveEvent - Starting a drag"; // Get the pixmap item related to the start of the drag. QGraphicsItem *item = itemAt(_dragStartPosition, QTransform()); if(item == 0) { // Couldn't find an item at the location for some reason. qDebug() << "LayerEditScene::mouseMoveEvent - Could not find a sprite at the drag location."; return; } // Static cast is safe because this scene only adds QGraphicsPixmapItem QGraphicsPixmapItem *pixmapItem = static_cast<QGraphicsPixmapItem *>(item); // Remove item from scene Sprite sprite = _pixmapToSprite[pixmapItem]; // Save sprite before it's removed. qDebug() << "LayerEditScene::mouseMoveEvent - Dragging " << sprite.getFileInfo().fileName(); int index = _previews.indexOf(pixmapItem); if(index != -1) { removeSprite(index); recalculatePositions(); } // Create a new drag event and put the source image into the mime data. QDrag *drag = new QDrag((QObject *)event->widget()); QMimeData *data = new QMimeData(); data->setImageData(sprite.getTexture()); data->setText(sprite.getFileInfo().absoluteFilePath()); drag->setMimeData(data); // Put the pixmap that was selected onto the cursor QPixmap pixmap = pixmapItem->pixmap(); drag->setPixmap(pixmap); drag->setHotSpot(QPoint(pixmap.width() / 2, pixmap.height() / 2)); // Execute the drag with a move action. qDebug() << "LayerEditScene::mouseMoveEvent - Executing drag as MoveAction"; Qt::DropAction action = drag->exec(Qt::MoveAction, Qt::MoveAction); if(action != Qt::MoveAction) { // Put sprite back qDebug() << "LayerEditScene::mouseMoveEvent - Move action failed, putting sprite back where it was."; insertSprite(index, sprite); recalculatePositions(); } else { // Delete the old item qDebug() << "LayerEditScene::mouseMoveEvent - Move succeeded, deleting old sprite."; delete pixmapItem; } }
void ProfileEdit::startAddingNew() { active = true; editing = false; profileBeingEdited = -1; editText = ""; recalculatePositions(); };
void ProfileEdit::startEditing(int profileId) { active = true; editing = true; profileBeingEdited = profileId; editText = profiles->getName(profileId); recalculatePositions(); };
void LayerEditScene::setLayer(Layer *layer) { _layer = layer; if(_layer != 0) { resizeImages(QSize()); recalculatePositions(); } }
void Palette::setSprites(const QList<Sprite> &sprites) { _sprites = sprites; qSort(_sprites.begin(), _sprites.end(), compareBySize); resizeImages(QSize(), _previewSize); recalculatePositions(); }
void LayerEditScene::keyPressEvent(QKeyEvent *event) { // Remove all selected items when the delete key is pressed. if(event->key() == Qt::Key_Delete) { QList<QGraphicsPixmapItem *> remove; for(int i = 0; i < items().size(); i++) { if(items().at(i)->isSelected()) { remove.append(static_cast<QGraphicsPixmapItem *>(items().at(i))); } } for(int i = 0; i < remove.size(); i++) { removeSprite(_previews.indexOf(remove.at(i))); recalculatePositions(); } } }
void LayerEditScene::dropEvent(QGraphicsSceneDragDropEvent *event) { qDebug() << "LayerEditScene::dropEvent - Receiving drop event"; // Make sure the drop is a sprite if(event->mimeData()->hasImage() && event->mimeData()->hasText()) { QString filename = event->mimeData()->text(); QImage image = event->mimeData()->imageData().value<QImage>(); // Make a sprite Sprite sprite(image, filename); // Insert sprite into scene int index = mapPointToIndex(event->scenePos()); insertSprite(index, sprite); recalculatePositions(); event->acceptProposedAction(); } else { qDebug() << "LayerEditScene::dropEvent - Mime data does not contain image AND text, ignoring."; event->ignore(); } }
void Palette::setPreviewSize(const QSize &size) { resizeImages(_previewSize, size); _previewSize = size; recalculatePositions(); }
void Palette::setNumberOfColumns(int columns) { _numberOfColumns = columns; recalculatePositions(); }
void GfxTextBuffer::addFormattedString (const std::string &text, const Vector3 &top_colour, float top_alpha, const Vector3 &bot_colour, float bot_alpha) { Vector3 ansi_colour[] = { Vector3(0,0,0), Vector3(.8,0,0), Vector3(0,.8,0), Vector3(.8,.8,0), Vector3(0,0,.93), Vector3(.8,0,.8), Vector3(0,.8,.8), Vector3(.75,.75,.75), }; Vector3 ansi_bold_colour[] = { Vector3(0.5,0.5,0.5), Vector3(1,0,0), Vector3(0,1,0), Vector3(1,1,0), Vector3(.36,.36,1), Vector3(1,0,1), Vector3(0,1,1), Vector3(1,1,1), }; ColouredChar c(0, top_colour, top_alpha, bot_colour, bot_alpha); unsigned long original_size = colouredText.size(); bool bold = false; unsigned default_colour = 7; // FIXME: this assumes a 'white on black' console unsigned last_colour = default_colour; for (size_t i=0 ; i<text.length() ; ++i) { GfxFont::codepoint_t cp = decode_utf8(text, i); if (cp == UNICODE_ESCAPE_CODEPOINT) { if (++i >= text.length()) break; cp = decode_utf8(text, i); if (cp == '[') { // continue until 'm' unsigned code = 0; do { if (++i >= text.length()) break; cp = decode_utf8(text, i); if (cp == 'm' || cp == ';') { // act on code if (code == 0) { bold = false; last_colour = default_colour; c.topColour = top_colour; c.bottomColour = bot_colour; } else if (code == 1) { bold = true; Vector3 col = bold ? ansi_bold_colour[last_colour] : ansi_colour[last_colour]; c.topColour = col; c.bottomColour = col; } else if (code == 22) { bold = false; Vector3 col = bold ? ansi_bold_colour[last_colour] : ansi_colour[last_colour]; c.topColour = col; c.bottomColour = col; } else if (code >= 30 && code <= 37) { last_colour = code - 30; Vector3 col = bold ? ansi_bold_colour[last_colour] : ansi_colour[last_colour]; c.topColour = col; c.bottomColour = col; } code = 0; } if (cp == 'm') break; if (cp >= '0' && cp <= '9') { unsigned digit = cp - '0'; code = 10*code + digit; } } while (true); if (cp == 'm') continue; } } // This char is not part of an ansi terminal colour code. c.cp = cp; colouredText.push_back(c); } recalculatePositions(original_size); }