diff --git a/src/data/action/set.cpp b/src/data/action/set.cpp index 9ef6f56e..07ab9bf0 100644 --- a/src/data/action/set.cpp +++ b/src/data/action/set.cpp @@ -58,14 +58,15 @@ AddCardAction::AddCardAction(AddingOrRemoving ar, Set& set, const vector& // Otherwise, if it's an existing card, create an action to copy the link else if (set.card_uids.find(linked_uid) != set.card_uids.end()) { CardP linked_card = set.card_uids.at(linked_uid); - int linked_index = linked_card->findFreeLink(new_uid, set.card_uids); - if (linked_index < 0) { + int selected_index = linked_card->findUIDLink(old_uid); + if (selected_index < 0) continue; + int free_index = linked_card->findFreeLink(new_uid, set.card_uids); + if (free_index < 0) { queue_message(MESSAGE_WARNING, _ERROR_1_("not enough free links", linked_card->identification())); + continue; } - else { - String relation(linked_card->getLinkedRelation(linked_index)); - card_link_actions.push_back(make_intrusive(linked_card, new_uid, relation, linked_index)); - } + String selected_relation(linked_card->getLinkedRelation(selected_index)); + card_link_actions.push_back(make_intrusive(linked_card, new_uid, selected_relation, free_index)); } } } @@ -83,7 +84,7 @@ void AddCardAction::perform(bool to_undo) { card_link_actions[i]->perform(to_undo); } // Update uid map - set.buildUidMap(); + set.buildUIDMap(); } // ----------------------------------------------------------------------------- : Reorder cards @@ -245,7 +246,7 @@ void ChangeCardUIDAction::perform(bool to_undo) { c->updateLinkedUID(card->uid, uid); } swap(card->uid, uid); - set.buildUidMap(); + set.buildUIDMap(); } // ----------------------------------------------------------------------------- : Pack types diff --git a/src/data/set.cpp b/src/data/set.cpp index e47866a7..a28bf9d4 100644 --- a/src/data/set.cpp +++ b/src/data/set.cpp @@ -68,7 +68,7 @@ void Set::updateStyles(const CardP& card, bool only_content_dependent) { void Set::updateDelayed() { script_manager->updateDelayed(); } -void Set::buildUidMap() { +void Set::buildUIDMap() { card_uids.clear(); FOR_EACH(c, cards) { while (card_uids.find(c->uid) != card_uids.end()) { @@ -201,7 +201,7 @@ void Set::validate(Version file_app_version) { // update scripts script_manager->updateAll(); // build uid map - buildUidMap(); + buildUIDMap(); } void reflect_version_check(Reader& handler, const Char* key, intrusive_ptr const& package) { diff --git a/src/data/set.hpp b/src/data/set.hpp index 5a9affe6..44c2d467 100644 --- a/src/data/set.hpp +++ b/src/data/set.hpp @@ -73,7 +73,7 @@ public: /// Update scripts that were delayed void updateDelayed(); /// Update uid map - void buildUidMap(); + void buildUIDMap(); /// A context for performing scripts /** Should only be used from the thumbnail thread! */ Context& getContextForThumbnails(); diff --git a/src/gui/control/card_list.cpp b/src/gui/control/card_list.cpp index 0a48c67f..93dfc0c8 100644 --- a/src/gui/control/card_list.cpp +++ b/src/gui/control/card_list.cpp @@ -320,11 +320,14 @@ bool CardListBase::parseUrl(String& url, vector& out) { bool CardListBase::parseFiles(wxArrayString& filenames, vector& out) { size_t j = out.size(); for (size_t i = 0; i < filenames.size(); i++) { - // if it's an image file, try to get meta_data - Image image_file; - image_file.SetLoadFlags(image_file.GetLoadFlags() & ~wxImage::Load_Verbose); - if (image_file.LoadFile(filenames[i])) { - parseImage(image_file, out); + if (wxImage::CanRead(filenames[i])) { + // if it's an image file, try to get meta_data + Image image_file; + image_file.SetLoadFlags(image_file.GetLoadFlags() & ~wxImage::Load_Verbose); + if (image_file.LoadFile(filenames[i])) { + parseImage(image_file, out); + } + else queue_message(MESSAGE_ERROR, _ERROR_("can't load image")); } else { // if it's an url, request the data std::ifstream ifs(filenames[i].ToStdString()); @@ -653,7 +656,8 @@ void CardListBase::onChar(wxKeyEvent& ev) { } } -void CardListBase::onBeginDrag(wxListEvent&) { +void CardListBase::onBeginDrag(wxListEvent& ev) { + ev.Skip(); drop_timer.Start(200, wxTIMER_ONE_SHOT); } diff --git a/src/gui/set/cards_panel.cpp b/src/gui/set/cards_panel.cpp index 120438e6..1285f349 100644 --- a/src/gui/set/cards_panel.cpp +++ b/src/gui/set/cards_panel.cpp @@ -654,8 +654,9 @@ CardP CardsPanel::selectedCard() const { return card_list->getCard(); } void CardsPanel::selectCard(const CardP& card) { - if (!set) return; // we want onChangeSet first + if (!set) return; // we want onChangeSet first + card_list->SetFocus(); card_list->setCard(card); editor->setCard(card); diff --git a/src/gui/set/window.cpp b/src/gui/set/window.cpp index ae0a81b9..3a7ad4ac 100644 --- a/src/gui/set/window.cpp +++ b/src/gui/set/window.cpp @@ -309,7 +309,7 @@ void SetWindow::onChangeSet() { // make sure there is always at least one card // some things need this if (set->cards.empty()) set->cards.push_back(make_intrusive(*set->game)); - set->buildUidMap(); + set->buildUIDMap(); // all panels view the same set FOR_EACH(p, panels) { p->setSet(set);