diff options
Diffstat (limited to 'src/commands/modifyentries.cpp')
-rw-r--r-- | src/commands/modifyentries.cpp | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/src/commands/modifyentries.cpp b/src/commands/modifyentries.cpp new file mode 100644 index 0000000..895348e --- /dev/null +++ b/src/commands/modifyentries.cpp @@ -0,0 +1,88 @@ +/*************************************************************************** + copyright : (C) 2005-2006 by Robby Stephenson + email : robby@periapsis.org + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of version 2 of the GNU General Public License as * + * published by the Free Software Foundation; * + * * + ***************************************************************************/ + +#include "modifyentries.h" +#include "../collection.h" +#include "../controller.h" +#include "../tellico_debug.h" + +#include <klocale.h> + +using Tellico::Command::ModifyEntries; + +ModifyEntries::ModifyEntries(Data::CollPtr coll_, const Data::EntryVec& oldEntries_, const Data::EntryVec& newEntries_) + : KCommand() + , m_coll(coll_) + , m_oldEntries(oldEntries_) + , m_entries(newEntries_) + , m_needToSwap(false) +{ +#ifndef NDEBUG + if(m_oldEntries.count() != m_entries.count()) { + kdWarning() << "ModifyEntriesCommand() - unequal number of entries" << endl; + } +#endif +} + +void ModifyEntries::execute() { + if(!m_coll || m_entries.isEmpty()) { + return; + } + if(m_needToSwap) { + swapValues(); + m_needToSwap = false; + } + // loans expose a field named "loaned", and the user might modify that without + // checking in the loan, so verify that. Heavy-handed, yes... + const QString loaned = QString::fromLatin1("loaned"); + bool hasLoanField = m_coll->hasField(loaned); + for(Data::EntryVecIt entry = m_entries.begin(); hasLoanField && entry != m_entries.end(); ++entry) { + if(entry->field(loaned).isEmpty()) { + Data::EntryVec notLoaned; + notLoaned.append(entry); + Controller::self()->slotCheckIn(notLoaned); + } + } + m_coll->updateDicts(m_entries); + Controller::self()->modifiedEntries(m_entries); +} + +void ModifyEntries::unexecute() { + if(!m_coll || m_entries.isEmpty()) { + return; + } + swapValues(); + m_needToSwap = true; + m_coll->updateDicts(m_entries); + Controller::self()->modifiedEntries(m_entries); + //TODO: need to tell edit dialog that it's not modified +} + +QString ModifyEntries::name() const { + return m_entries.count() > 1 ? i18n("Modify Entries") + : i18n("Modify (Entry Title)", "Modify %1").arg(m_entries.begin()->title()); +} + +void ModifyEntries::swapValues() { + // since things like the detailedlistview and the entryiconview hold pointers to the entries + // can't just call Controller::modifiedEntry() on the old pointers + for(size_t i = 0; i < m_entries.count(); ++i) { + // need to swap entry values, not just pointers + // the id gets reset when copying, so need to keep it + long id = m_entries.at(i)->id(); + Data::Entry tmp(*m_entries.at(i)); // tmp id becomes -1 + *m_entries.at(i) = *m_oldEntries.at(i); // id becomes -1 + m_entries.at(i)->setId(id); // id becomes what was originally + *m_oldEntries.at(i) = tmp; // id becomes -1 + } +} |