r18929 - gnucash/trunk/src/gnc - Cutecash: Add empty line for entering a new transaction in the register. Doesn't yet store data, though.
Christian Stimming
cstim at code.gnucash.org
Thu Mar 18 18:07:02 EDT 2010
Author: cstim
Date: 2010-03-18 18:07:02 -0400 (Thu, 18 Mar 2010)
New Revision: 18929
Trac: http://svn.gnucash.org/trac/changeset/18929
Modified:
gnucash/trunk/src/gnc/Cmd.cpp
gnucash/trunk/src/gnc/Cmd.hpp
gnucash/trunk/src/gnc/SplitListModel.cpp
gnucash/trunk/src/gnc/SplitListModel.hpp
Log:
Cutecash: Add empty line for entering a new transaction in the register. Doesn't yet store data, though.
Modified: gnucash/trunk/src/gnc/Cmd.cpp
===================================================================
--- gnucash/trunk/src/gnc/Cmd.cpp 2010-03-18 22:06:42 UTC (rev 18928)
+++ gnucash/trunk/src/gnc/Cmd.cpp 2010-03-18 22:07:02 UTC (rev 18929)
@@ -227,6 +227,28 @@
}
+QUndoCommand* setSplitReconcile(TmpSplit& t, char newValue)
+{
+ return 0;
+}
+QUndoCommand* setTransactionNum(TmpTransaction& t, const QString& newValue)
+{
+ return 0;
+}
+QUndoCommand* setTransactionDescription(TmpTransaction& t, const QString& newValue)
+{
+ return 0;
+}
+QUndoCommand* setTransactionDate(TmpTransaction& t, const QDate& newValue)
+{
+ return 0;
+}
+QUndoCommand* setSplitValueAndAmount(TmpSplit& t, const Numeric& newValue)
+{
+ return 0;
+}
+
+
} // END namespace cmd
Modified: gnucash/trunk/src/gnc/Cmd.hpp
===================================================================
--- gnucash/trunk/src/gnc/Cmd.hpp 2010-03-18 22:06:42 UTC (rev 18928)
+++ gnucash/trunk/src/gnc/Cmd.hpp 2010-03-18 22:07:02 UTC (rev 18929)
@@ -30,8 +30,10 @@
namespace gnc
{
+class Account;
class Split;
-class Account;
+class TmpSplit;
+class TmpTransaction;
class Transaction;
/** This is a templated implementation of a QUndoCommand class. This
@@ -156,16 +158,21 @@
// members. Just create one of those, add it to a QUndoStack, and
// magically the values will change with undo/redo back and
// forth. Spooky, IMHO.
-QUndoCommand* setSplitMemo(Split& split, const QString& newValue);
-QUndoCommand* setSplitAction(Split& t, const QString& newValue);
+// QUndoCommand* setSplitMemo(Split& split, const QString& newValue);
+// QUndoCommand* setSplitAction(Split& t, const QString& newValue);
QUndoCommand* setSplitReconcile(Split& t, char newValue);
-QUndoCommand* setSplitAmount(Split& t, const Numeric& newValue);
-QUndoCommand* setSplitValue(Split& t, const Numeric& newValue);
+QUndoCommand* setSplitReconcile(TmpSplit& t, char newValue);
+// QUndoCommand* setSplitAmount(Split& t, const Numeric& newValue);
+// QUndoCommand* setSplitValue(Split& t, const Numeric& newValue);
QUndoCommand* setTransactionNum(Transaction& t, const QString& newValue);
+QUndoCommand* setTransactionNum(TmpTransaction& t, const QString& newValue);
QUndoCommand* setTransactionDescription(Transaction& t, const QString& newValue);
-QUndoCommand* setTransactionNotes(Transaction& t, const QString& newValue);
+QUndoCommand* setTransactionDescription(TmpTransaction& t, const QString& newValue);
+// QUndoCommand* setTransactionNotes(Transaction& t, const QString& newValue);
QUndoCommand* setTransactionDate(Transaction& t, const QDate& newValue);
+QUndoCommand* setTransactionDate(TmpTransaction& t, const QDate& newValue);
QUndoCommand* setSplitValueAndAmount(Split& t, const Numeric& newValue);
+QUndoCommand* setSplitValueAndAmount(TmpSplit& t, const Numeric& newValue);
QUndoCommand* destroyTransaction(Transaction& t);
} // END namespace cmd
Modified: gnucash/trunk/src/gnc/SplitListModel.cpp
===================================================================
--- gnucash/trunk/src/gnc/SplitListModel.cpp 2010-03-18 22:06:42 UTC (rev 18928)
+++ gnucash/trunk/src/gnc/SplitListModel.cpp 2010-03-18 22:07:02 UTC (rev 18929)
@@ -44,8 +44,10 @@
, m_undoStack(undoStack)
, m_eventWrapper(*this, &SplitListModel::transactionEvent, GNC_ID_TRANS)
, m_eventWrapperAccount(*this, &SplitListModel::accountEvent, GNC_ID_ACCOUNT)
+ , m_enableNewTransaction(true)
{
recreateCache();
+ recreateTmpTrans();
}
void SplitListModel::recreateCache()
@@ -66,6 +68,14 @@
reset();
}
+void SplitListModel::recreateTmpTrans()
+{
+ m_tmpTransaction.clear();
+ m_tmpTransaction.push_back(TmpSplit(m_account.get()));
+ m_tmpTransaction.setCommodity(m_account.getCommodity());
+ m_tmpTransaction.setDatePosted(QDate::currentDate());
+}
+
SplitListModel::~SplitListModel()
{
}
@@ -74,9 +84,12 @@
const QModelIndex &parent) const
{
//qDebug() << "index(), " << row << column << parent;
- if (!hasIndex(row, column, parent) || row >= m_list.size())
+ if (!hasIndex(row, column, parent) || row >= rowCount())
return QModelIndex();
+ if (m_enableNewTransaction && row == m_list.size())
+ return createIndex(row, column, (void*)NULL);
+
Split childItem = m_list.at(row);
if (childItem.get())
{
@@ -87,16 +100,8 @@
return QModelIndex();
}
-bool SplitListModel::insertRows(int position, int rows, const QModelIndex &index)
-{
- beginInsertRows(QModelIndex(), position, position + rows - 1);
- endInsertRows();
- return true;
-}
-
bool SplitListModel::removeRows(int position, int rows, const QModelIndex &index)
{
- beginRemoveRows(QModelIndex(), position, position+rows-1);
for (int row = position; row < position + rows; ++row)
{
Split s(m_list.at(row));
@@ -106,10 +111,16 @@
QUndoCommand* cmd = cmd::destroyTransaction(t);
m_undoStack->push(cmd);
}
- endRemoveRows();
+ // No beginInsertRows/endInsertRows because reset() is called in
+ // recreateCache() anyway.
return true;
}
+int SplitListModel::rowCount(const QModelIndex& parent) const
+{
+ return m_list.size() + (m_enableNewTransaction ? 1 : 0);
+}
+
int SplitListModel::columnCount(const QModelIndex& parent) const
{
//qDebug() << "columnCount()" << parent;
@@ -148,95 +159,187 @@
if (!index.isValid())
return QVariant();
- Split split(static_cast< ::Split*>(index.internalPointer()));
- Transaction trans(split.getParent());
- Numeric amount = split.getValue(); // Alternatively: xaccSplitConvertAmount(split.get(), split.getAccount().get());
- PrintAmountInfo printInfo(split.get(), false);
+ if (m_enableNewTransaction && index.row() == m_list.size())
+ {
+ // Special case: We are in the last row which represents the
+ // newly entered txn.
- switch (index.column())
- {
- case 0:
- switch (role)
+ TmpSplit split(m_tmpTransaction.getSplits().front());
+ const TmpTransaction& trans = m_tmpTransaction;
+ Numeric amount = split.getValue();
+ PrintAmountInfo printInfo(m_account, false);
+ switch (index.column())
{
- case Qt::DisplayRole:
- case Qt::EditRole:
- return trans.getDatePosted();
+ case 0:
+ switch (role)
+ {
+ case Qt::DisplayRole:
+ case Qt::EditRole:
+ return trans.getDatePosted();
+ default:
+ return QVariant();
+ }
+ case 1:
+ switch (role)
+ {
+ case Qt::DisplayRole:
+ case Qt::EditRole:
+ return trans.getNum();
+ default:
+ return QVariant();
+ }
+ case 2:
+ switch (role)
+ {
+ case Qt::DisplayRole:
+ case Qt::EditRole:
+ return trans.getDescription();
+ default:
+ return QVariant();
+ }
+ case 3:
+ switch (role)
+ {
+// case Qt::DisplayRole:
+// return split.getCorrAccountFullName();
+ default:
+ return QVariant();
+ }
+ case 4:
+ switch (role)
+ {
+ case Qt::DisplayRole:
+ case Qt::EditRole:
+ return QString::fromUtf8(gnc_get_reconcile_str(split.getReconcile()));
+ default:
+ return QVariant();
+ }
+ case 5:
+ switch (role)
+ {
+ case Qt::DisplayRole:
+ case Qt::EditRole:
+ if (amount.positive_p())
+ return amount.printAmount(printInfo);
+ else
+ return QString();
+ default:
+ return QVariant();
+ }
+ case 6:
+ switch (role)
+ {
+ case Qt::DisplayRole:
+ case Qt::EditRole:
+ if (amount.positive_p())
+ return QString();
+ else
+ return amount.neg().printAmount(printInfo);
+ default:
+ return QVariant();
+ }
+ case 7:
default:
return QVariant();
}
- case 1:
- switch (role)
+
+
+ }
+ else
+ {
+ // Normal case: We are in a row that displays a normal
+ // transaction and split
+
+ Split split(static_cast< ::Split*>(index.internalPointer()));
+ Transaction trans(split.getParent());
+ Numeric amount = split.getValue(); // Alternatively: xaccSplitConvertAmount(split.get(), split.getAccount().get());
+ PrintAmountInfo printInfo(split, false);
+
+ switch (index.column())
{
- case Qt::DisplayRole:
- case Qt::EditRole:
- return trans.getNum();
+ case 0:
+ switch (role)
+ {
+ case Qt::DisplayRole:
+ case Qt::EditRole:
+ return trans.getDatePosted();
+ default:
+ return QVariant();
+ }
+ case 1:
+ switch (role)
+ {
+ case Qt::DisplayRole:
+ case Qt::EditRole:
+ return trans.getNum();
+ default:
+ return QVariant();
+ }
+ case 2:
+ switch (role)
+ {
+ case Qt::DisplayRole:
+ case Qt::EditRole:
+ return trans.getDescription();
+ default:
+ return QVariant();
+ }
+ case 3:
+ switch (role)
+ {
+ case Qt::DisplayRole:
+ return split.getCorrAccountFullName();
+ default:
+ return QVariant();
+ }
+ case 4:
+ switch (role)
+ {
+ case Qt::DisplayRole:
+ case Qt::EditRole:
+ return QString::fromUtf8(gnc_get_reconcile_str(split.getReconcile()));
+ default:
+ return QVariant();
+ }
+ case 5:
+ switch (role)
+ {
+ case Qt::DisplayRole:
+ case Qt::EditRole:
+ if (amount.positive_p())
+ return amount.printAmount(printInfo);
+ else
+ return QString();
+ default:
+ return QVariant();
+ }
+ case 6:
+ switch (role)
+ {
+ case Qt::DisplayRole:
+ case Qt::EditRole:
+ if (amount.positive_p())
+ return QString();
+ else
+ return amount.neg().printAmount(printInfo);
+ default:
+ return QVariant();
+ }
+ case 7:
+ switch (role)
+ {
+ case Qt::DisplayRole:
+ return split.getBalance().printAmount(printInfo);
+ case Qt::ForegroundRole:
+ return split.getBalance().negative_p()
+ ? QBrush(Qt::red)
+ : QBrush();
+ default:
+ return QVariant();
+ }
default:
return QVariant();
}
- case 2:
- switch (role)
- {
- case Qt::DisplayRole:
- case Qt::EditRole:
- return trans.getDescription();
- default:
- return QVariant();
- }
- case 3:
- switch (role)
- {
- case Qt::DisplayRole:
- return split.getCorrAccountFullName();
- default:
- return QVariant();
- }
- case 4:
- switch (role)
- {
- case Qt::DisplayRole:
- case Qt::EditRole:
- return QString::fromUtf8(gnc_get_reconcile_str(split.getReconcile()));
- default:
- return QVariant();
- }
- case 5:
- switch (role)
- {
- case Qt::DisplayRole:
- case Qt::EditRole:
- if (amount.positive_p())
- return amount.printAmount(printInfo);
- else
- return QString();
- default:
- return QVariant();
- }
- case 6:
- switch (role)
- {
- case Qt::DisplayRole:
- case Qt::EditRole:
- if (amount.positive_p())
- return QString();
- else
- return amount.neg().printAmount(printInfo);
- default:
- return QVariant();
- }
- case 7:
- switch (role)
- {
- case Qt::DisplayRole:
- return split.getBalance().printAmount(printInfo);
- case Qt::ForegroundRole:
- return split.getBalance().negative_p()
- ? QBrush(Qt::red)
- : QBrush();
- default:
- return QVariant();
- }
- default:
- return QVariant();
}
}
@@ -275,9 +378,109 @@
bool SplitListModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
+ if (!index.isValid() || role != Qt::EditRole)
+ return false;
+
QUndoCommand* cmd = NULL;
- if (index.isValid() && role == Qt::EditRole)
+ if (m_enableNewTransaction && index.row() == m_list.size())
{
+ // Special case: We are in the last row which represents the
+ // newly entered txn.
+
+ TmpTransaction& trans = m_tmpTransaction;
+ TmpSplit& split = trans.getSplits().front();
+
+ // "Editing" is done by creating a Cmd-object and adding it to
+ // the undo stack. That's in fact all that was needed to
+ // create an *undoable* edit of this data cell. Seems almost
+ // spooky, doesn't it?
+ switch (index.column())
+ {
+ case 0:
+ {
+ QDate date = value.toDate();
+ if (date.isValid())
+ {
+ cmd = cmd::setTransactionDate(trans, date);
+ }
+ break;
+ }
+ case 1:
+ cmd = cmd::setTransactionNum(trans, value.toString());
+ break;
+ case 2:
+ cmd = cmd::setTransactionDescription(trans, value.toString());
+ break;
+ case 4:
+ {
+ QString str(value.toString());
+ if (str.size() > 0)
+ {
+ char recn = str[0].toLatin1();
+ switch (recn)
+ {
+ case NREC:
+ case CREC:
+ case YREC:
+ case FREC:
+ case VREC:
+ cmd = cmd::setSplitReconcile(split, recn);
+ break;
+ default:
+ qDebug() << "Unknown reconcile string:" << str;
+ }
+ }
+ break;
+ }
+ case 5:
+ case 6:
+ {
+ QString str(value.toString().simplified());
+ Numeric n;
+ QString errmsg = n.parse(str);
+ if (errmsg.isEmpty())
+ {
+ qDebug() << "Does setting numeric work? numeric=" << n.to_string();
+ if (index.column() == 6)
+ n = n.neg();
+ // Check whether we have the simple case here
+ if (trans.getSplits().size() != 1)
+ {
+ QMessageBox::warning(NULL, tr("Unimplemented"),
+ tr("Sorry, but editing a transaction with more than two splits (here: %1) is not yet implemented.").arg(trans.getSplits().size()));
+ }
+ else
+ {
+ Commodity originCommodity = m_account.getCommodity();
+ Commodity transCommodity = trans.getCommodity();
+ if (originCommodity != transCommodity)
+ {
+ QMessageBox::warning(NULL, tr("Unimplemented"),
+ tr("Sorry, but editing a transaction with different accounts is not yet implemented."));
+ }
+ else
+ {
+ // This is the really simple case which we can
+ // handle now.
+ cmd = cmd::setSplitValueAndAmount(split, n);
+ }
+ }
+ }
+ else
+ {
+ qDebug() << "Cannot convert this string to gnc_numeric:" << str;
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ else
+ {
+ // Normal case: We are in a row that displays a normal
+ // transaction and split
+
Split split(static_cast< ::Split*>(index.internalPointer()));
Transaction trans(split.getParent());
Modified: gnucash/trunk/src/gnc/SplitListModel.hpp
===================================================================
--- gnucash/trunk/src/gnc/SplitListModel.hpp 2010-03-18 22:06:42 UTC (rev 18928)
+++ gnucash/trunk/src/gnc/SplitListModel.hpp 2010-03-18 22:07:02 UTC (rev 18929)
@@ -26,6 +26,7 @@
#include "gnc/Account.hpp"
#include "gnc/Split.hpp"
#include "gnc/QofEventWrapper.hpp"
+#include "gnc/Transaction.hpp"
extern "C"
{
@@ -49,7 +50,7 @@
~SplitListModel();
QModelIndex parent(const QModelIndex &index) const { return QModelIndex(); }
- int rowCount(const QModelIndex& parent = QModelIndex()) const { return m_list.size(); }
+ int rowCount(const QModelIndex& parent = QModelIndex()) const;
int columnCount(const QModelIndex& parent = QModelIndex()) const;
QModelIndex index(int row, int column,
const QModelIndex &parent = QModelIndex()) const;
@@ -59,7 +60,6 @@
QVariant headerData(int section, Qt::Orientation orientation, int role) const;
bool setData(const QModelIndex &index, const QVariant &value, int role);
- bool insertRows(int position, int rows, const QModelIndex &index = QModelIndex());
bool removeRows(int position, int rows, const QModelIndex &index = QModelIndex());
public slots:
@@ -68,6 +68,8 @@
private:
void recreateCache();
+ void recreateTmpTrans();
+
protected:
Account m_account;
SplitQList m_list;
@@ -78,6 +80,9 @@
/** The wrapper for receiving events from gnc. */
QofEventWrapper<SplitListModel, ::Transaction*> m_eventWrapper;
QofEventWrapper<SplitListModel, ::Account*> m_eventWrapperAccount;
+
+ bool m_enableNewTransaction;
+ TmpTransaction m_tmpTransaction;
};
} // END namespace gnc
More information about the gnucash-changes
mailing list