Q3DragObject* NoteDrag::dragObject(NoteSelection *noteList, bool cutting, QWidget *source) { if (noteList->count() <= 0) return 0; // The MimeSource: K3MultipleDrag *multipleDrag = new K3MultipleDrag(source); // Make sure the temporary folder exists and is empty (we delete previously moved file(s) (if exists) // since we override the content of the clipboard and previous file willn't be accessable anymore): createAndEmptyCuttingTmpFolder(); // The "Native Format" Serialization: QBuffer buffer; if (buffer.open(QIODevice::WriteOnly)) { QDataStream stream(&buffer); // First append a pointer to the basket: stream << (quint64)(noteList->firstStacked()->note->basket()); // Then a list of pointers to all notes, and parent groups: for (NoteSelection *node = noteList->firstStacked(); node; node = node->nextStacked()) stream << (quint64)(node->note); Q3ValueList<Note*> groups = noteList->parentGroups(); for (Q3ValueList<Note*>::iterator it = groups.begin(); it != groups.end(); ++it) stream << (quint64)(*it); stream << (quint64)0; // And finally the notes themselves: serializeNotes(noteList, stream, cutting); // Append the object: buffer.close(); Q3StoredDrag *dragObject = new Q3StoredDrag(NOTE_MIME_STRING, source); dragObject->setEncodedData(buffer.buffer()); multipleDrag->addDragObject(dragObject); } // The "Other Flavours" Serialization: serializeText( noteList, multipleDrag ); serializeHtml( noteList, multipleDrag ); serializeImage( noteList, multipleDrag ); serializeLinks( noteList, multipleDrag, cutting ); // The Alternate Flavours: if (noteList->count() == 1) noteList->firstStacked()->note->content()->addAlternateDragObjects(multipleDrag); // If it is a drag, and not a copy/cut, add the feedback pixmap: if (source) setFeedbackPixmap(noteList, multipleDrag); return multipleDrag; }
// Public functions Variant WidgetSaver::serialize(WidgetVirtual* w, std::map<std::string, WidgetVirtual*>& association, int& unknownIndex) { Variant rootVariant; rootVariant.createMap(); // write type switch (w->type) { case WidgetVirtual::VIRTUAL: rootVariant.insert("type", Variant("VIRTUAL")); break; case WidgetVirtual::BOARD: rootVariant.insert("type", Variant("BOARD")); break; case WidgetVirtual::IMAGE: rootVariant.insert("type", Variant("IMAGE")); break; case WidgetVirtual::LABEL: rootVariant.insert("type", Variant("LABEL")); break; case WidgetVirtual::CONSOLE: rootVariant.insert("type", Variant("CONSOLE")); break; case WidgetVirtual::RADIO_BUTTON: rootVariant.insert("type", Variant("RADIO_BUTTON"));break; default: rootVariant.insert("type", Variant("UNKNOWN")); break; } // write configuration rootVariant.insert("config", Variant((int)w->configuration)); // write sizes if (w->sizes[WidgetVirtual::DEFAULT] == w->sizes[WidgetVirtual::HOVER] && w->sizes[WidgetVirtual::DEFAULT] == w->sizes[WidgetVirtual::ACTIVE] && w->sizes[WidgetVirtual::DEFAULT] == w->sizes[WidgetVirtual::CURRENT]) rootVariant.insert("sizeAll", ToolBox::getFromVec2(w->sizes[WidgetVirtual::DEFAULT])); else { rootVariant.insert("sizeDefault", ToolBox::getFromVec2(w->sizes[WidgetVirtual::DEFAULT])); rootVariant.insert("sizeHover", ToolBox::getFromVec2(w->sizes[WidgetVirtual::HOVER])); rootVariant.insert("sizeActive", ToolBox::getFromVec2(w->sizes[WidgetVirtual::ACTIVE])); rootVariant.insert("sizeCurrent", ToolBox::getFromVec2(w->sizes[WidgetVirtual::CURRENT])); } // write positions if (w->positions[WidgetVirtual::DEFAULT] == w->positions[WidgetVirtual::HOVER] && w->positions[WidgetVirtual::DEFAULT] == w->positions[WidgetVirtual::ACTIVE] && w->positions[WidgetVirtual::DEFAULT] == w->positions[WidgetVirtual::CURRENT]) rootVariant.insert("positionAll", ToolBox::getFromVec3(w->positions[WidgetVirtual::DEFAULT])); else { rootVariant.insert("positionDefault", ToolBox::getFromVec3(w->positions[WidgetVirtual::DEFAULT])); rootVariant.insert("positionHover", ToolBox::getFromVec3(w->positions[WidgetVirtual::HOVER])); rootVariant.insert("positionActive", ToolBox::getFromVec3(w->positions[WidgetVirtual::ACTIVE])); rootVariant.insert("positionCurrent", ToolBox::getFromVec3(w->positions[WidgetVirtual::CURRENT])); } // write colors if (w->colors[WidgetVirtual::DEFAULT] == w->colors[WidgetVirtual::HOVER] && w->colors[WidgetVirtual::DEFAULT] == w->colors[WidgetVirtual::ACTIVE] && w->colors[WidgetVirtual::DEFAULT] == w->colors[WidgetVirtual::CURRENT]) rootVariant.insert("colorAll", ToolBox::getFromVec4(w->colors[WidgetVirtual::DEFAULT])); else { rootVariant.insert("colorDefault", ToolBox::getFromVec4(w->colors[WidgetVirtual::DEFAULT])); rootVariant.insert("colorHover", ToolBox::getFromVec4(w->colors[WidgetVirtual::HOVER])); rootVariant.insert("colorActive", ToolBox::getFromVec4(w->colors[WidgetVirtual::ACTIVE])); rootVariant.insert("colorCurrent", ToolBox::getFromVec4(w->colors[WidgetVirtual::CURRENT])); } // write shader and texture name if (w->shader && w->shader->name != "defaultWidget") rootVariant.insert("shader", Variant(w->shader->name)); if (w->texture) rootVariant.insert("texture", Variant(w->texture->name)); // derivate type switch (w->type) { case WidgetVirtual::BOARD: serializeBoard(static_cast<WidgetBoard*>(w), rootVariant); break; case WidgetVirtual::IMAGE: serializeImage(static_cast<WidgetImage*>(w), rootVariant); break; case WidgetVirtual::LABEL: serializeLabel(static_cast<WidgetLabel*>(w), rootVariant); break; case WidgetVirtual::CONSOLE: serializeConsole(static_cast<WidgetConsole*>(w), rootVariant); break; case WidgetVirtual::RADIO_BUTTON: serializeRadioButton(static_cast<WidgetRadioButton*>(w), rootVariant); break; default: break; } // children if (!w->children.empty()) { rootVariant.insert("children", Variant::MapType()); for (unsigned int i = 0; i < w->children.size(); ++i) { std::string name = "unknown_" + std::to_string(++unknownIndex); for (std::map<std::string, WidgetVirtual*>::iterator it = association.begin(); it != association.end(); ++it) { if (w->children[i] == it->second) { name = it->first; break; } } Variant child = serialize(w->children[i], association, unknownIndex); rootVariant.getMap()["children"].insert(name, child); } } // end return rootVariant; }