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