void Drop::dropEvent(QDropEvent *event) { if (!m_data->widget) return; const std::string str = event->mimeData()->text().toStdString(); try { TypeDescriptor_ptr descriptor = m_data->widget->getReflective(); Holder holder = descriptor->create_holder(); bool res = json::parse(descriptor, holder, str.c_str(), str.size()); if (res && m_data->widget) { m_data->widget->fromHolder(holder); event->acceptProposedAction(); } } catch(...) { // parse exception: nothing to do } }
void Drag::mouseMoveEvent(QMouseEvent *event) { if (!m_data->widget) return; if (!(event->buttons() & Qt::LeftButton)) return; if ((event->globalPos() - m_data->dragStartPosition).manhattanLength() < QApplication::startDragDistance()) return; TypeDescriptor_ptr descriptor = m_data->widget->getReflective(); Holder holder (descriptor->create_holder()); m_data->widget->toHolder(holder); if (core::utils::calculate_size(holder) < GSIM_DRAG_MAX_SIZE) { QDrag * drag = new QDrag(m_data->qwidget); QMimeData * mimeData = new QMimeData; std::ostringstream oss; json::write(oss, descriptor, holder); mimeData->setText(oss.str().c_str()); drag->setMimeData(mimeData); /* Qt::DropAction dropAction = */ drag->exec(Qt::CopyAction); } else { QMessageBox::information(m_data->qwidget, "Information", "Drag events have been disabled for performance reasons."); } }