From 19b144f37becbdc996724bddabefbfc104a1ab7b Mon Sep 17 00:00:00 2001 From: GenevensiS <66968533+G-e-n-e-v-e-n-s-i-S@users.noreply.github.com> Date: Sun, 10 May 2026 09:39:19 +0200 Subject: [PATCH] restore ability to paste in Paint --- src/data/format/clipboard.cpp | 22 ++++++++++++++-------- src/data/format/formats.hpp | 2 +- src/data/format/image.cpp | 8 +++++--- src/gui/control/card_list.cpp | 9 ++++++--- src/gui/control/keyword_list.cpp | 2 ++ src/gui/set/console_panel.cpp | 1 + src/gui/value/image.cpp | 6 ++++-- src/gui/value/text.cpp | 6 ++++-- 8 files changed, 37 insertions(+), 19 deletions(-) diff --git a/src/data/format/clipboard.cpp b/src/data/format/clipboard.cpp index b0a9a1d7..11698aaa 100644 --- a/src/data/format/clipboard.cpp +++ b/src/data/format/clipboard.cpp @@ -161,23 +161,29 @@ KeywordP KeywordDataObject::getKeyword(const SetP& set) { // ----------------------------------------------------------------------------- : Card on clipboard CardsOnClipboard::CardsOnClipboard(const SetP& set, const String id, const vector& cards) { + wxBusyCursor busy; // Conversion to image file if (cards.size() < 6) { + Bitmap bmp; Image img; if (cards.size() == 1) { - img = export_image(set, cards[0]); + img = export_image(set, cards[0], true, 1.0, 0.0, 0.0, &bmp); } else { - img = export_image(set, cards); + img = export_image(set, cards); + bmp = Bitmap(img); } - String temp_path = wxFileName::CreateTempFileName(_("mse")) + _(".png"); - img.SaveFile(temp_path, wxBITMAP_TYPE_PNG); - wxFileDataObject* fileData = new wxFileDataObject(); - fileData->AddFile(temp_path); - Add(fileData); - wxImageDataObject* imgData = new wxImageDataObject(); + //wxFileDataObject* fileData = new wxFileDataObject(); // needed for pasting on desktop, but slow + //String temp_path = wxFileName::CreateTempFileName(_("mse")) + _(".png"); + //img.SaveFile(temp_path, wxBITMAP_TYPE_PNG); + //fileData->AddFile(temp_path); + //Add(fileData); + wxImageDataObject* imgData = new wxImageDataObject(); // needed for metadata imgData->SetImage(img); Add(imgData); + wxBitmapDataObject* bmpData = new wxBitmapDataObject(); // needed for pasting in MSPaint + bmpData->SetBitmap(bmp); + Add(bmpData); } // Conversion to serialized card format Add(new CardsDataObject(set, id, cards), true); diff --git a/src/data/format/formats.hpp b/src/data/format/formats.hpp index d25b23fc..dc0926d7 100644 --- a/src/data/format/formats.hpp +++ b/src/data/format/formats.hpp @@ -89,7 +89,7 @@ FileFormatP mtg_editor_file_format(); // ----------------------------------------------------------------------------- : Other ways to export /// Generate a wxImage of one or more cards -Image export_image(const SetP& set, const CardP& card, bool write_metadata = true, double zoom = 1.0, Radians angle_radians = 0.0, double bleed_pixels = 0.0); +Image export_image(const SetP& set, const CardP& card, bool write_metadata = true, double zoom = 1.0, Radians angle_radians = 0.0, double bleed_pixels = 0.0, Bitmap* out_bitmap = nullptr); Image export_image(const SetP& set, const vector& cards, int padding = 2, double global_zoom = 1.0, bool use_zoom_setting = true, bool use_rotation_setting = true, bool use_bleed_setting = false); /// Export the image of one or more cards to a given filename, using the app's zoom, rotation and bleed settings, and including metadata diff --git a/src/data/format/image.cpp b/src/data/format/image.cpp index 25e759e1..07f26a12 100644 --- a/src/data/format/image.cpp +++ b/src/data/format/image.cpp @@ -35,7 +35,7 @@ Rotation ZoomedUnrotatedDataViewer::getRotation() const { // ----------------------------------------------------------------------------- : wxImage export -Image export_image(const SetP& set, const CardP& card, bool write_metadata, double zoom, Radians angle_radians, double bleed_pixels) { +Image export_image(const SetP& set, const CardP& card, bool write_metadata, double zoom, Radians angle_radians, double bleed_pixels, Bitmap* out_bitmap) { if (!set) throw Error(_("no set")); /// create and zoom ZoomedUnrotatedDataViewer viewer = ZoomedUnrotatedDataViewer(zoom); @@ -51,6 +51,9 @@ Image export_image(const SetP& set, const CardP& card, bool write_metadata, doub viewer.draw(dc); dc.SelectObject(wxNullBitmap); Image img = bitmap.ConvertToImage(); + + /// return bitmap if needed + if (out_bitmap) *out_bitmap = std::move(bitmap); /// rotate img = rotate_image(img, angle_radians); @@ -218,8 +221,7 @@ void export_image(const SetP& set, const CardP& card, const String& filename) { img.SaveFile(filename); } -void export_image(const SetP& set, const vector& cards, const String& path, const String& filename_template, FilenameConflicts conflicts) -{ +void export_image(const SetP& set, const vector& cards, const String& path, const String& filename_template, FilenameConflicts conflicts) { wxBusyCursor busy; // Script ScriptP filename_script = parse(filename_template, nullptr, true); diff --git a/src/gui/control/card_list.cpp b/src/gui/control/card_list.cpp index d9a8a366..15fc6f31 100644 --- a/src/gui/control/card_list.cpp +++ b/src/gui/control/card_list.cpp @@ -165,7 +165,8 @@ bool CardListBase::doCopy() { if (cards_to_copy.empty()) return false; // put on clipboard if (!wxTheClipboard->Open()) return false; - bool ok = wxTheClipboard->SetData(new CardsOnClipboard(set, _(""), cards_to_copy)); // ignore result + bool ok = wxTheClipboard->SetData(new CardsOnClipboard(set, _(""), cards_to_copy)); // ignore result + wxTheClipboard->Flush(); wxTheClipboard->Close(); return ok; } @@ -191,7 +192,8 @@ bool CardListBase::doCopyCardAndLinkedCards() { } } } - bool ok = wxTheClipboard->SetData(new CardsOnClipboard(set, _(""), cards_to_copy)); // ignore result + bool ok = wxTheClipboard->SetData(new CardsOnClipboard(set, _(""), cards_to_copy)); // ignore result + wxTheClipboard->Flush(); wxTheClipboard->Close(); return ok; } @@ -199,7 +201,8 @@ bool CardListBase::doCopyCardAndLinkedCards() { bool CardListBase::doPaste() { if (!canPaste()) return false; if (!wxTheClipboard->Open()) return false; - bool ok = wxTheClipboard->GetData(*drop_target->data_object); + bool ok = wxTheClipboard->GetData(*drop_target->data_object); + wxTheClipboard->Flush(); wxTheClipboard->Close(); if (ok) return parseData(false); return false; diff --git a/src/gui/control/keyword_list.cpp b/src/gui/control/keyword_list.cpp index 8a6cab58..37cd173e 100644 --- a/src/gui/control/keyword_list.cpp +++ b/src/gui/control/keyword_list.cpp @@ -109,6 +109,7 @@ bool KeywordList::doCopy() { if (!canCopy()) return false; if (!wxTheClipboard->Open()) return false; bool ok = wxTheClipboard->SetData(new KeywordDataObject(set, getKeyword())); // ignore result + wxTheClipboard->Flush(); wxTheClipboard->Close(); return ok; } @@ -125,6 +126,7 @@ bool KeywordList::doPaste() { if (!wxTheClipboard->Open()) return false; KeywordDataObject data; bool ok = wxTheClipboard->GetData(data); + wxTheClipboard->Flush(); wxTheClipboard->Close(); if (!ok) return false; // add keyword to set diff --git a/src/gui/set/console_panel.cpp b/src/gui/set/console_panel.cpp index 658c8dd2..80d1ba7d 100644 --- a/src/gui/set/console_panel.cpp +++ b/src/gui/set/console_panel.cpp @@ -107,6 +107,7 @@ public: } else { ok = wxTheClipboard->SetData(new wxTextDataObject(msg.text)); } + wxTheClipboard->Flush(); wxTheClipboard->Close(); return ok; } diff --git a/src/gui/value/image.cpp b/src/gui/value/image.cpp index c92066ae..74e750d9 100644 --- a/src/gui/value/image.cpp +++ b/src/gui/value/image.cpp @@ -92,7 +92,8 @@ bool ImageValueEditor::doCopy() { if (!image_load_file(image, *image_file)) return false; // set data if (!wxTheClipboard->Open()) return false; - bool ok = wxTheClipboard->SetData(new wxBitmapDataObject(image)); + bool ok = wxTheClipboard->SetData(new wxBitmapDataObject(image)); + wxTheClipboard->Flush(); wxTheClipboard->Close(); return ok; } @@ -101,7 +102,8 @@ bool ImageValueEditor::doPaste() { // get bitmap if (!wxTheClipboard->Open()) return false; wxBitmapDataObject data; - bool ok = wxTheClipboard->GetData(data); + bool ok = wxTheClipboard->GetData(data); + wxTheClipboard->Flush(); wxTheClipboard->Close(); if (!ok) return false; // slice diff --git a/src/gui/value/text.cpp b/src/gui/value/text.cpp index 0d34c529..5bd24758 100644 --- a/src/gui/value/text.cpp +++ b/src/gui/value/text.cpp @@ -782,7 +782,8 @@ bool TextValueEditor::doPaste() { // get data if (!wxTheClipboard->Open()) return false; wxTextDataObject data; - bool ok = wxTheClipboard->GetData(data); + bool ok = wxTheClipboard->GetData(data); + wxTheClipboard->Flush(); wxTheClipboard->Close(); if (!ok) return false; // paste @@ -800,7 +801,8 @@ bool TextValueEditor::doCopy() { if (str.empty()) return false; // no data to copy // set data if (!wxTheClipboard->Open()) return false; - bool ok = wxTheClipboard->SetData(new wxTextDataObject(str)); + bool ok = wxTheClipboard->SetData(new wxTextDataObject(str)); + wxTheClipboard->Flush(); wxTheClipboard->Close(); return ok; }