File indexing completed on 2024-05-19 16:43:51
0001 #include <QDebug> 0002 #include <QGraphicsProxyWidget> 0003 #include <QGraphicsSceneMouseEvent> 0004 #include <QKeyEvent> 0005 #include <QLineEdit> 0006 #include <QPainter> 0007 #include <QPixmap> 0008 0009 #include "commands/movevmapitem.h" 0010 #include "data/character.h" 0011 #include "graphicsItems/anchoritem.h" 0012 #include "graphicsItems/characteritem.h" 0013 #include "graphicsItems/ellipsitem.h" 0014 #include "graphicsItems/griditem.h" 0015 #include "graphicsItems/highlighteritem.h" 0016 #include "graphicsItems/imageitem.h" 0017 #include "graphicsItems/lineitem.h" 0018 #include "graphicsItems/pathitem.h" 0019 #include "graphicsItems/rectitem.h" 0020 #include "graphicsItems/ruleitem.h" 0021 #include "graphicsItems/sightitem.h" 0022 #include "graphicsItems/textitem.h" 0023 0024 #include "vmap.h" 0025 0026 #include "controller/view_controller/vectorialmapcontroller.h" 0027 #include "data/cleveruri.h" 0028 #include "data/cleverurimimedata.h" 0029 #include "data/rolisteammimedata.h" 0030 #include "media/mediatype.h" 0031 0032 #include "controller/item_controllers/characteritemcontroller.h" 0033 #include "controller/item_controllers/ellipsecontroller.h" 0034 #include "controller/item_controllers/imageitemcontroller.h" 0035 #include "controller/item_controllers/linecontroller.h" 0036 #include "controller/item_controllers/rectcontroller.h" 0037 #include "controller/item_controllers/sightcontroller.h" 0038 #include "controller/item_controllers/textcontroller.h" 0039 0040 #include "utils/logcategories.h" 0041 0042 void setNewParent(VisualItem* child, VisualItem* parent) 0043 { 0044 auto pos = child->scenePos(); 0045 child->setParentItem(parent); 0046 auto ctrl = child->controller(); 0047 if(parent) 0048 ctrl->setPos(parent->mapFromScene(pos)); 0049 else 0050 ctrl->setPos(pos); 0051 } 0052 0053 0054 void addCharacterItem(VectorialMapController* ctrl, const QPointF& pos, Character* character) 0055 { 0056 if(!character) 0057 return; 0058 0059 std::map<QString, QVariant> params; 0060 params.insert({Core::vmapkeys::KEY_CHARACTER, QVariant::fromValue(character)}); 0061 params.insert({Core::vmapkeys::KEY_POS, pos}); 0062 params.insert({Core::vmapkeys::KEY_TOOL, character->isNpc() ? Core::SelectableTool::NonPlayableCharacter : 0063 Core::SelectableTool::PlayableCharacter}); 0064 0065 ctrl->insertItemAt(params); 0066 } 0067 0068 void addImageIntoController(VectorialMapController* ctrl, const QPointF& pos, CleverURI* uri) 0069 { 0070 std::map<QString, QVariant> params; 0071 params.insert({Core::vmapkeys::KEY_POS, pos}); 0072 params.insert({Core::vmapkeys::KEY_TOOL, Core::SelectableTool::IMAGE}); 0073 if(uri->exists()) 0074 params.insert({Core::vmapkeys::KEY_PATH, uri->path()}); 0075 0076 if(uri->hasData()) 0077 params.insert({Core::vmapkeys::KEY_DATA, uri->data()}); 0078 ctrl->insertItemAt(params); 0079 } 0080 0081 VMap::VMap(VectorialMapController* ctrl, QObject* parent) : QGraphicsScene(parent), m_ctrl(ctrl) 0082 { 0083 if(!m_ctrl) 0084 return; 0085 0086 // connection to signal 0087 connect(m_ctrl, &VectorialMapController::backgroundColorChanged, this, 0088 [this]() { setBackgroundBrush(m_ctrl->backgroundColor()); }); 0089 connect(m_ctrl, &VectorialMapController::gridSizeChanged, this, &VMap::computePattern); 0090 connect(m_ctrl, &VectorialMapController::gridPatternChanged, this, &VMap::computePattern); 0091 connect(m_ctrl, &VectorialMapController::gridScaleChanged, this, &VMap::computePattern); 0092 connect(m_ctrl, &VectorialMapController::gridAboveChanged, this, &VMap::computePattern); 0093 connect(m_ctrl, &VectorialMapController::gridVisibilityChanged, this, &VMap::computePattern); 0094 connect(m_ctrl, &VectorialMapController::gridColorChanged, this, &VMap::computePattern); 0095 connect(m_ctrl, &VectorialMapController::backgroundColorChanged, this, &VMap::computePattern); 0096 connect(m_ctrl, &VectorialMapController::toolChanged, this, 0097 [this]() 0098 { 0099 m_currentPath= nullptr; 0100 m_currentItem= nullptr; 0101 }); 0102 connect(m_ctrl, &VectorialMapController::highLightAt, this, 0103 [this](const QPointF& p, const qreal& penSize, const QColor& color) 0104 { 0105 auto hitem= new HighlighterItem(p, penSize, color); 0106 addAndInit(hitem); 0107 hitem->setPos(p); 0108 }); 0109 0110 // item Managers 0111 0112 // initialization 0113 connect(m_ctrl, &VectorialMapController::visualItemControllerCreated, this, &VMap::addVisualItem); 0114 0115 setBackgroundBrush(m_ctrl->backgroundColor()); 0116 0117 auto grid= m_ctrl->gridController(); 0118 0119 m_gridItem.reset(new GridItem(grid)); 0120 addItem(m_gridItem.get()); 0121 0122 m_gridItem->setPos(grid->pos()); 0123 0124 auto sight= m_ctrl->sightController(); 0125 m_sightItem= new SightItem(sight); 0126 addItem(m_sightItem); 0127 0128 m_sightItem->setPos(0, 0); 0129 0130 // m_ctrl->loadItems(); 0131 m_gridItem->setVisible(grid->visible()); 0132 m_sightItem->setVisible(sight->visible()); 0133 computePattern(); 0134 0135 addExistingItems(); 0136 } 0137 0138 void VMap::addExistingItems() 0139 { 0140 auto model= m_ctrl->model(); 0141 auto const& modelItems= model->items(); 0142 std::for_each(std::begin(modelItems), std::end(modelItems), 0143 [this](vmap::VisualItemController* item) { addVisualItem(item); }); 0144 0145 // management of parenting 0146 QHash<QString, VisualItem*> hash; 0147 QHash<QString, VisualItem*> needParent; 0148 for(auto& item : items()) 0149 { 0150 auto vItem = getNormalItem(item); 0151 if(!vItem) 0152 continue; 0153 0154 hash.insert(vItem->uuid(), vItem); 0155 0156 if(!vItem->controller()->parentUuid().isEmpty()) 0157 needParent.insert(needParent); 0158 } 0159 0160 0161 for(auto const& item : std::as_const(needParent)) 0162 { 0163 auto parentId = item->controller()->parentUuid(); 0164 if(hash.contains(parentId)) 0165 { 0166 item->setParentItem(hash.value(parentId)); 0167 } 0168 } 0169 } 0170 0171 void VMap::addAndInit(QGraphicsItem* item) 0172 { 0173 addItem(item); 0174 } 0175 void VMap::addVisualItem(vmap::VisualItemController* ctrl) 0176 { 0177 if(!ctrl) 0178 return; 0179 0180 switch(ctrl->itemType()) 0181 { 0182 case vmap::VisualItemController::RECT: 0183 addRectItem(dynamic_cast<vmap::RectController*>(ctrl), !ctrl->initialized()); 0184 break; 0185 case vmap::VisualItemController::LINE: 0186 addLineItem(dynamic_cast<vmap::LineController*>(ctrl), !ctrl->initialized()); 0187 break; 0188 case vmap::VisualItemController::IMAGE: 0189 addImageItem(dynamic_cast<vmap::ImageItemController*>(ctrl)); 0190 break; 0191 case vmap::VisualItemController::PATH: 0192 addPathItem(dynamic_cast<vmap::PathController*>(ctrl), !ctrl->initialized()); 0193 break; 0194 case vmap::VisualItemController::TEXT: 0195 addTextItem(dynamic_cast<vmap::TextController*>(ctrl)); 0196 break; 0197 case vmap::VisualItemController::ELLIPSE: 0198 addEllipseItem(dynamic_cast<vmap::EllipseController*>(ctrl), !ctrl->initialized()); 0199 break; 0200 case vmap::VisualItemController::CHARACTER: 0201 addCharaterItem(dynamic_cast<vmap::CharacterItemController*>(ctrl)); 0202 break; 0203 default: 0204 break; 0205 } 0206 connect(ctrl, &vmap::CharacterItemController::parentUuidChanged, ctrl, [ctrl, this](){ 0207 auto graphicItems = items(); 0208 auto parentId = ctrl->parentUuid(); 0209 0210 QPointer<VisualItem> child; 0211 QPointer<VisualItem> parent; 0212 for(auto &item : graphicItems) 0213 { 0214 auto vItem = getNormalItem(item); 0215 if(!vItem) 0216 continue; 0217 0218 if(vItem->controller() == ctrl) 0219 child = vItem; 0220 0221 if(vItem->uuid() == parentId) 0222 parent = vItem; 0223 0224 if((child && parent) || (child && (parentId.isEmpty()))) 0225 break; 0226 } 0227 0228 if(!child) 0229 return; 0230 0231 setNewParent(child, parent.data()); 0232 }); 0233 update(); 0234 } 0235 void VMap::addLineItem(vmap::LineController* lineCtrl, bool editing) 0236 { 0237 if(!lineCtrl) 0238 return; 0239 auto item= new LineItem(lineCtrl); 0240 addAndInit(item); 0241 item->setPos(lineCtrl->pos()); 0242 if(editing) 0243 m_currentItem= item; 0244 } 0245 0246 void VMap::addImageItem(vmap::ImageItemController* imgCtrl) 0247 { 0248 if(!imgCtrl) 0249 return; 0250 auto img= new ImageItem(imgCtrl); 0251 addAndInit(img); 0252 img->setPos(imgCtrl->pos()); 0253 } 0254 0255 void VMap::addRectItem(vmap::RectController* rectCtrl, bool editing) 0256 { 0257 if(!rectCtrl) 0258 return; 0259 0260 auto item= new RectItem(rectCtrl); 0261 addAndInit(item); 0262 item->setPos(rectCtrl->pos()); 0263 if(editing) 0264 m_currentItem= item; 0265 } 0266 0267 void VMap::addEllipseItem(vmap::EllipseController* ellisCtrl, bool editing) 0268 { 0269 if(!ellisCtrl) 0270 return; 0271 auto item= new EllipsItem(ellisCtrl); 0272 addAndInit(item); 0273 item->setPos(ellisCtrl->pos()); 0274 if(editing) 0275 m_currentItem= item; 0276 } 0277 0278 void VMap::addTextItem(vmap::TextController* textCtrl) 0279 { 0280 if(!textCtrl) 0281 return; 0282 auto tmp= new TextItem(textCtrl); 0283 addAndInit(tmp); 0284 tmp->setPos(textCtrl->pos()); 0285 } 0286 0287 void VMap::addCharaterItem(vmap::CharacterItemController* itemCtrl) 0288 { 0289 if(!itemCtrl) 0290 return; 0291 auto tmp= new CharacterItem(itemCtrl); 0292 addAndInit(tmp); 0293 tmp->setPos(itemCtrl->pos()); 0294 } 0295 0296 void VMap::addPathItem(vmap::PathController* pathCtrl, bool editing) 0297 { 0298 if(!pathCtrl) 0299 return; 0300 auto path= new PathItem(pathCtrl); 0301 0302 if(editing) 0303 { 0304 m_currentItem= path; 0305 if(!pathCtrl->penLine()) 0306 { 0307 m_currentPath= path; 0308 } 0309 } 0310 addAndInit(path); 0311 path->setPos(pathCtrl->pos()); 0312 } 0313 0314 void VMap::updateItem(const QPointF& end) 0315 { 0316 if(!m_currentPath) 0317 return; 0318 0319 switch(m_ctrl->tool()) 0320 { 0321 case Core::PATH: 0322 { 0323 m_currentPath->addPoint(m_currentPath->mapFromScene(end)); 0324 update(); 0325 } 0326 break; 0327 default: 0328 break; 0329 } 0330 } 0331 0332 void VMap::insertItem(const QPointF& pos) 0333 { 0334 std::map<QString, QVariant> params; 0335 params.insert({Core::vmapkeys::KEY_POS, pos}); 0336 params.insert({Core::vmapkeys::KEY_COLOR, m_ctrl->toolColor()}); 0337 params.insert({Core::vmapkeys::KEY_PENWIDTH, m_ctrl->penSize()}); 0338 params.insert({Core::vmapkeys::KEY_TOOL, m_ctrl->tool()}); 0339 params.insert({Core::vmapkeys::KEY_NUMBER, m_ctrl->npcNumber()}); 0340 params.insert({Core::vmapkeys::KEY_CHARAC_NAME, m_ctrl->npcName()}); 0341 m_ctrl->insertItemAt(params); 0342 } 0343 0344 VisualItem* VMap::visualItemUnder(const QPointF& pos) 0345 { 0346 QList<QGraphicsItem*> itemList= items(pos); 0347 itemList.removeAll(gridItem()); 0348 itemList.removeAll(m_sightItem); 0349 if(itemList.isEmpty()) 0350 return nullptr; 0351 0352 return dynamic_cast<VisualItem*>(itemList.at(0)); 0353 } 0354 0355 void VMap::mousePressEvent(QGraphicsSceneMouseEvent* mouseEvent) 0356 { 0357 auto leftButton= (mouseEvent->button() == Qt::LeftButton); 0358 if(m_ctrl->tool() == Core::HANDLER && leftButton) 0359 { 0360 const QList<QGraphicsItem*> itemList= selectedItems(); 0361 for(auto item : itemList) 0362 { 0363 VisualItem* vitem= dynamic_cast<VisualItem*>(item); 0364 if(nullptr != vitem) 0365 { 0366 if(isNormalItem(vitem)) 0367 { 0368 m_movingItems.append(vitem); 0369 m_oldPos.append(vitem->pos()); 0370 } 0371 } 0372 } 0373 QGraphicsScene::mousePressEvent(mouseEvent); 0374 } 0375 else if(Core::PIPETTE == m_ctrl->tool() && leftButton) 0376 { 0377 auto item= visualItemUnder(mouseEvent->scenePos()); 0378 0379 if(nullptr == item) 0380 { 0381 qCInfo(logCategory::map) << "no item under the pipette"; 0382 return; 0383 } 0384 0385 if(item->getType() != vmap::VisualItemController::ItemType::IMAGE) 0386 { 0387 QColor color= item->color(); 0388 if(color.isValid()) 0389 { 0390 m_ctrl->setToolColor(color); 0391 } 0392 } 0393 } 0394 else if(Core::HIGHLIGHTER == m_ctrl->tool() && leftButton) 0395 { 0396 m_ctrl->addHighLighter(mouseEvent->scenePos()); 0397 } 0398 else if(Core::BUCKET == m_ctrl->tool() && leftButton) 0399 { 0400 auto item= visualItemUnder(mouseEvent->scenePos()); 0401 if(nullptr == item) 0402 { 0403 qCInfo(logCategory::map) << "no item under the bucket"; 0404 return; 0405 } 0406 0407 if(item->getType() != vmap::VisualItemController::ItemType::IMAGE) 0408 { 0409 // auto cmd= new ChangeColorItemCmd(item->controller(), m_ctrl->toolColor()); 0410 m_ctrl->askForColorChange(item->controller()); 0411 } 0412 } 0413 else if(Core::ANCHOR == m_ctrl->tool() && leftButton) 0414 { 0415 m_parentItemAnchor= new AnchorItem(); 0416 addAndInit(m_parentItemAnchor); 0417 m_parentItemAnchor->setPos(mouseEvent->scenePos()); 0418 } 0419 else if(Core::RULE == m_ctrl->tool() && leftButton) 0420 { 0421 m_ruleItem= new RuleItem(m_ctrl); 0422 addAndInit(m_ruleItem); 0423 m_ruleItem->setPos(mouseEvent->scenePos()); 0424 } 0425 else if(leftButton) 0426 { 0427 if(m_currentPath == nullptr) 0428 { 0429 insertItem(mouseEvent->scenePos()); 0430 } 0431 else 0432 { 0433 updateItem(mouseEvent->scenePos()); 0434 } 0435 } 0436 else if(mouseEvent->button() == Qt::RightButton) 0437 { 0438 m_currentPath= nullptr; 0439 auto item= visualItemUnder(mouseEvent->scenePos()); 0440 if(item) 0441 { 0442 if(!(mouseEvent->modifiers() & Qt::CTRL) && !item->isSelected()) 0443 clearSelection(); 0444 item->setSelected(true); 0445 QGraphicsScene::mousePressEvent(mouseEvent); 0446 } 0447 } 0448 } 0449 void VMap::mouseMoveEvent(QGraphicsSceneMouseEvent* mouseEvent) 0450 { 0451 if(!m_currentItem.isNull()) 0452 { 0453 m_currentItem->setModifiers(mouseEvent->modifiers()); 0454 mouseEvent->accept(); 0455 m_currentItem->setNewEnd(mouseEvent->scenePos() - mouseEvent->lastScenePos()); // mouseEvent->scenePos() 0456 update(); 0457 } 0458 else if(!m_ruleItem.isNull()) 0459 { 0460 mouseEvent->accept(); 0461 m_ruleItem->setNewEnd(mouseEvent->scenePos() - mouseEvent->lastScenePos(), 0462 mouseEvent->modifiers() & Qt::ControlModifier); 0463 update(); 0464 } 0465 else if(!m_parentItemAnchor.isNull()) 0466 { 0467 mouseEvent->accept(); 0468 m_parentItemAnchor->setNewEnd(mouseEvent->scenePos() - mouseEvent->lastScenePos()); 0469 update(); 0470 } 0471 if((m_ctrl->tool() == Core::HANDLER) || (m_ctrl->tool() == Core::TEXT) || (m_ctrl->tool() == Core::TEXTBORDER)) 0472 { 0473 QGraphicsScene::mouseMoveEvent(mouseEvent); 0474 } 0475 } 0476 void VMap::mouseReleaseEvent(QGraphicsSceneMouseEvent* mouseEvent) 0477 { 0478 if(m_parentItemAnchor) 0479 { 0480 manageAnchor(); 0481 removeItem(m_parentItemAnchor); 0482 delete m_parentItemAnchor; 0483 m_parentItemAnchor.clear(); 0484 } 0485 if(m_ruleItem) 0486 { 0487 removeItem(m_ruleItem); 0488 delete m_ruleItem; 0489 m_ruleItem.clear(); 0490 } 0491 if(!m_currentItem.isNull()) 0492 { 0493 if(Core::EditionMode::Painting == m_ctrl->editionMode()) 0494 { 0495 m_currentItem->endOfGeometryChange(ChildPointItem::Resizing); 0496 } 0497 else 0498 { 0499 auto poly= m_currentItem->shape().toFillPolygon(); 0500 poly= poly.translated(m_currentItem->pos()); 0501 auto ctrl = m_currentItem->controller(); 0502 m_ctrl->changeFogOfWar(poly, ctrl, (Core::EditionMode::Mask == m_ctrl->editionMode())); 0503 } 0504 } 0505 else if((nullptr != m_currentPath) && (Core::EditionMode::Painting != m_ctrl->editionMode())) 0506 { 0507 auto poly= m_currentPath->shape().toFillPolygon(); 0508 m_ctrl->changeFogOfWar(poly,m_currentPath->controller(), (Core::EditionMode::Mask == m_ctrl->editionMode())); 0509 update(); 0510 } 0511 m_ctrl->setIdle(true); 0512 m_currentItem= nullptr; 0513 if(m_ctrl->tool() == Core::HANDLER) 0514 { 0515 if(!m_movingItems.isEmpty()) 0516 { 0517 if(m_movingItems.first() != nullptr && mouseEvent->button() == Qt::LeftButton) 0518 { 0519 if(m_oldPos.first() != m_movingItems.first()->pos()) 0520 { 0521 m_ctrl->addCommand(new MoveItemCommand(m_movingItems, m_oldPos)); 0522 } 0523 m_movingItems.clear(); 0524 m_oldPos.clear(); 0525 } 0526 } 0527 QGraphicsScene::mouseReleaseEvent(mouseEvent); 0528 } 0529 } 0530 0531 bool VMap::isNormalItem(const QGraphicsItem* item) const 0532 { 0533 if(!item) 0534 return false; 0535 0536 if((item == m_gridItem.get()) || (item == m_sightItem)) 0537 { 0538 return false; 0539 } 0540 auto vItem= dynamic_cast<const VisualItem*>(item); 0541 if(!vItem) 0542 return false; 0543 return true; 0544 } 0545 0546 VisualItem* VMap::getNormalItem(QGraphicsItem* item) 0547 { 0548 if(!item) 0549 return nullptr; 0550 0551 if((item == m_gridItem.get()) || (item == m_sightItem)) 0552 { 0553 return nullptr; 0554 } 0555 auto vItem= dynamic_cast<VisualItem*>(item); 0556 return vItem; 0557 } 0558 0559 GridItem* VMap::gridItem() const 0560 { 0561 return m_gridItem.get(); 0562 } 0563 0564 void VMap::manageAnchor() 0565 { 0566 if(m_parentItemAnchor.isNull()) 0567 return; 0568 0569 vmap::VisualItemController* child= nullptr; 0570 vmap::VisualItemController* parent= nullptr; 0571 QList<QGraphicsItem*> item1= items(m_parentItemAnchor->getStart()); 0572 for(QGraphicsItem* item : item1) 0573 { 0574 if(item == nullptr) 0575 continue; 0576 0577 qDebug() << item->boundingRect(); 0578 0579 if(!isNormalItem(item)) 0580 continue; 0581 0582 auto itemChild = getNormalItem(item); 0583 if(itemChild) 0584 child= itemChild->controller(); 0585 } 0586 QList<QGraphicsItem*> item2= items(m_parentItemAnchor->getEnd()); 0587 for(QGraphicsItem* item : item2) 0588 { 0589 if(item == nullptr) 0590 continue; 0591 0592 if(!isNormalItem(item)) 0593 continue; 0594 0595 auto parentChild = getNormalItem(item); 0596 if(parentChild) 0597 parent= parentChild->controller(); 0598 } 0599 m_ctrl->setParent(child, parent); 0600 } 0601 0602 void VMap::computePattern() 0603 { 0604 setBackgroundBrush(m_ctrl->backgroundColor()); 0605 0606 if(!m_ctrl->gridAbove() && m_ctrl->gridVisibility() && (m_ctrl->gridPattern() != Core::GridPattern::NONE)) 0607 { 0608 auto ctrl= m_ctrl->gridController(); 0609 setBackgroundBrush(QPixmap::fromImage(ctrl->gridPattern())); 0610 } 0611 } 0612 0613 void VMap::promoteItemInType(VisualItem* item, vmap::VisualItemController::ItemType type) 0614 { 0615 if(nullptr != item) 0616 { 0617 VisualItem* bis= item->promoteTo(type); 0618 if(bis == nullptr) 0619 return; 0620 // bis->setLayer(item->getLayer()); 0621 // removeItemFromScene(item->getId()); 0622 // addNewItem(new AddVmapItemCommand(bis, false, this), true); 0623 // bis->initChildPointItem(); 0624 } 0625 } 0626 0627 void VMap::keyPressEvent(QKeyEvent* event) 0628 { 0629 if(event->key() == Qt::Key_Delete) 0630 { 0631 QStringList idListToRemove; 0632 for(auto& item : selectedItems()) 0633 { 0634 VisualItem* itemV= dynamic_cast<VisualItem*>(item); 0635 if(nullptr != itemV) 0636 { 0637 if(itemV->canBeMoved()) 0638 { 0639 // idListToRemove << itemV->getId(); 0640 } 0641 } 0642 } 0643 /*for(auto& id : idListToRemove) 0644 { 0645 removeItemFromScene(id); 0646 }*/ 0647 setFocusItem(nullptr); 0648 event->accept(); 0649 // return; 0650 } 0651 QGraphicsScene::keyPressEvent(event); 0652 } 0653 0654 void VMap::dragMoveEvent(QGraphicsSceneDragDropEvent* event) 0655 { 0656 event->acceptProposedAction(); 0657 } 0658 0659 void VMap::dropEvent(QGraphicsSceneDragDropEvent* event) 0660 { 0661 auto data= event->mimeData(); 0662 if(data->hasFormat("rolisteam/userlist-item")) 0663 { 0664 qInfo() << "VMAP dropEvent character"; 0665 const RolisteamMimeData* rolisteamData= qobject_cast<const RolisteamMimeData*>(data); 0666 Person* item= rolisteamData->person(); 0667 addCharacterItem(m_ctrl, event->scenePos(), dynamic_cast<Character*>(item)); 0668 } 0669 else if(data->hasFormat("rolisteam/cleverurilist")) 0670 { 0671 const CleverUriMimeData* resourcesData= qobject_cast<const CleverUriMimeData*>(data); 0672 if(!resourcesData) 0673 return; 0674 0675 QList<ResourcesNode*> resourcesList= resourcesData->getList(); 0676 for(ResourcesNode* resource : resourcesList) 0677 { 0678 if(resource->type() == ResourcesNode::Cleveruri) 0679 { 0680 qInfo() << "VMAP dropEvent: image from resources list"; 0681 auto media= dynamic_cast<CleverURI*>(resource); 0682 if(nullptr == media) 0683 continue; 0684 0685 if(media->contentType() == Core::ContentType::PICTURE) 0686 { 0687 addImageIntoController(m_ctrl, event->scenePos(), media); 0688 } 0689 } 0690 else if(resource->type() == ResourcesNode::Person) 0691 { 0692 qInfo() << "VMAP dropEvent: Character from resources list"; 0693 addCharacterItem(m_ctrl, event->scenePos(), dynamic_cast<Character*>(resource)); 0694 } 0695 } 0696 } 0697 else 0698 { 0699 if(!data->hasUrls()) 0700 return; 0701 0702 for(QUrl& url : data->urls()) 0703 { 0704 if(url.isLocalFile() && url.fileName().endsWith("rtok")) 0705 { 0706 qInfo() << "VMAP dropEvent: rtok from file"; 0707 std::map<QString, QVariant> params; 0708 /*if(IOHelper::loadToken(url.toLocalFile(), params)) 0709 { 0710 params.insert({QStringLiteral("position"), event->scenePos()}); 0711 params.insert({QStringLiteral("color"), m_ctrl->toolColor()}); 0712 params.insert({QStringLiteral("penWidth"), m_ctrl->penSize()}); 0713 params.insert({QStringLiteral("tool"), Core::SelectableTool::NonPlayableCharacter}); 0714 m_ctrl->insertItemAt(params); 0715 }*/ 0716 } 0717 else if(url.isLocalFile()) 0718 { 0719 qInfo() << "VMAP dropEvent: Image from file"; 0720 std::map<QString, QVariant> params; 0721 params.insert({Core::vmapkeys::KEY_POS, event->scenePos()}); 0722 params.insert({Core::vmapkeys::KEY_TOOL, Core::SelectableTool::IMAGE}); 0723 params.insert({Core::vmapkeys::KEY_PATH, url.toLocalFile()}); 0724 m_ctrl->insertItemAt(params); 0725 } 0726 } 0727 } 0728 } 0729 void VMap::dragEnterEvent(QGraphicsSceneDragDropEvent* event) 0730 { 0731 const RolisteamMimeData* data= qobject_cast<const RolisteamMimeData*>(event->mimeData()); 0732 if(nullptr != data) 0733 { 0734 if(data->hasFormat("rolisteam/userlist-item")) 0735 { 0736 event->acceptProposedAction(); 0737 } 0738 } 0739 else 0740 { 0741 const QMimeData* mimeData= event->mimeData(); 0742 if(mimeData->hasUrls()) 0743 { 0744 event->acceptProposedAction(); 0745 } 0746 } 0747 } 0748 0749