X-Git-Url: https://git.ktnx.net/?p=mobile-ledger.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fui%2Fnew_transaction%2FNewTransactionModel.java;h=ba2903c1d3bf3d6ea363f64b411bd1116d89e29b;hp=b22bcc14d390683055e64e9dccb4fdbe12d02507;hb=ad1487422eb36c06d1910a382de6dac90d9d30f4;hpb=9d3292a088ce87c01e2c7338a670efecd92c5fe9 diff --git a/app/src/main/java/net/ktnx/mobileledger/ui/new_transaction/NewTransactionModel.java b/app/src/main/java/net/ktnx/mobileledger/ui/new_transaction/NewTransactionModel.java index b22bcc14..ba2903c1 100644 --- a/app/src/main/java/net/ktnx/mobileledger/ui/new_transaction/NewTransactionModel.java +++ b/app/src/main/java/net/ktnx/mobileledger/ui/new_transaction/NewTransactionModel.java @@ -18,6 +18,8 @@ package net.ktnx.mobileledger.ui.new_transaction; import android.annotation.SuppressLint; +import android.os.Handler; +import android.os.Looper; import android.text.TextUtils; import androidx.annotation.NonNull; @@ -91,7 +93,6 @@ public class NewTransactionModel extends ViewModel { setItemsWithoutSubmittableChecks(newList); } private void setItemsWithoutSubmittableChecks(@NonNull List list) { - Logger.debug("new-trans", "model: Setting new item list"); final int cnt = list.size(); for (int i = 1; i < cnt - 1; i++) { final TransactionAccount item = list.get(i) @@ -110,14 +111,13 @@ public class NewTransactionModel extends ViewModel { list.set(cnt - 1, replacement); } + if (BuildConfig.DEBUG) + dumpItemList("Before setValue()", list); items.setValue(list); } private List copyList() { - return copyList(null); - } - private List copyList(@Nullable List source) { List copy = new ArrayList<>(); - List oldList = (source == null) ? items.getValue() : source; + List oldList = items.getValue(); if (oldList != null) for (Item item : oldList) { @@ -126,7 +126,7 @@ public class NewTransactionModel extends ViewModel { return copy; } - private List shallowCopyListWithoutItem(int position) { + private List copyListWithoutItem(int position) { List copy = new ArrayList<>(); List oldList = items.getValue(); @@ -135,7 +135,7 @@ public class NewTransactionModel extends ViewModel { for (Item item : oldList) { if (i++ == position) continue; - copy.add(item); + copy.add(Item.from(item)); } } @@ -168,10 +168,13 @@ public class NewTransactionModel extends ViewModel { return this.isSubmittable; } void reset() { + Logger.debug("new-trans", "Resetting model"); List list = new ArrayList<>(); list.add(new TransactionHead("")); list.add(new TransactionAccount("")); list.add(new TransactionAccount("")); + noteFocusChanged(0, FocusedElement.Description); + isSubmittable.setValue(false); setItemsWithoutSubmittableChecks(list); } boolean accountsInInitialState() { @@ -276,7 +279,7 @@ public class NewTransactionModel extends ViewModel { newItems.add(accRow); } - items.postValue(newItems); + new Handler(Looper.getMainLooper()).post(() -> setItems(newItems)); }); } private int extractIntFromMatches(MatchResult m, Integer group, Integer literal) { @@ -326,7 +329,11 @@ public class NewTransactionModel extends ViewModel { return null; } void removeItem(int pos) { - List newList = shallowCopyListWithoutItem(pos); + Logger.debug("new-trans", String.format(Locale.US, "Removing item at position %d", pos)); + List newList = copyListWithoutItem(pos); + final FocusInfo fi = focusInfo.getValue(); + if ((fi != null) && (pos < fi.position)) + noteFocusChanged(fi.position - 1, fi.element); setItems(newList); } void noteFocusChanged(int position, FocusedElement element) { @@ -341,6 +348,11 @@ public class NewTransactionModel extends ViewModel { List newList = shallowCopyList(); Item item = newList.remove(fromIndex); newList.add(toIndex, item); + + FocusInfo fi = focusInfo.getValue(); + if (fi != null && fi.position == fromIndex) + noteFocusChanged(toIndex, fi.element); + items.setValue(newList); // same count, same submittable state } void moveItemLast(List list, int index) { @@ -356,7 +368,20 @@ public class NewTransactionModel extends ViewModel { list.add(list.remove(index)); } void toggleCurrencyVisible() { - showCurrency.setValue(!Objects.requireNonNull(showCurrency.getValue())); + final boolean newValue = !Objects.requireNonNull(showCurrency.getValue()); + + // remove currency from all items, or reset currency to the default + // no need to clone the list, because the removal of the currency won't lead to + // visual changes -- the currency fields will be hidden or reset to default anyway + // still, there may be changes in the submittable state + final List list = Objects.requireNonNull(this.items.getValue()); + for (int i = 1; i < list.size(); i++) { + ((TransactionAccount) list.get(i)).setCurrency(newValue ? Data.getProfile() + .getDefaultCommodity() + : null); + } + checkTransactionSubmittable(null); + showCurrency.setValue(newValue); } void stopObservingBusyFlag(Observer observer) { busyFlag.removeObserver(observer); @@ -503,14 +528,14 @@ public class NewTransactionModel extends ViewModel { @SuppressLint("DefaultLocale") void checkTransactionSubmittable(@Nullable List list) { boolean workingWithLiveList = false; - boolean liveListCopied = false; if (list == null) { - list = Objects.requireNonNull(items.getValue()); + list = copyList(); workingWithLiveList = true; } if (BuildConfig.DEBUG) - dumpItemList("Before submittable checks", list); + dumpItemList(String.format("Before submittable checks (%s)", + workingWithLiveList ? "LIVE LIST" : "custom list"), list); int accounts = 0; final BalanceForCurrency balance = new BalanceForCurrency(); @@ -609,25 +634,15 @@ public class NewTransactionModel extends ViewModel { if (Misc.equalStrings(acc.getCurrency(), balCurrency)) { if (BuildConfig.DEBUG) Logger.debug("submittable", - String.format("Resetting hint of '%s' [%s]", - Misc.nullIsEmpty(acc.getAccountName()), + String.format(Locale.US, "Resetting hint of %d:'%s' [%s]", + i, Misc.nullIsEmpty(acc.getAccountName()), balCurrency)); // skip if the amount is set, in which case the hint is not // important/visible if (!acc.isAmountSet() && acc.amountHintIsSet && !TextUtils.isEmpty(acc.getAmountHint())) { - if (workingWithLiveList && !liveListCopied) { - list = copyList(list); - liveListCopied = true; - } - final TransactionAccount newAcc = new TransactionAccount(acc); - newAcc.setAmountHint(null); - if (!liveListCopied) { - list = copyList(list); - liveListCopied = true; - } - list.set(i, newAcc); + acc.setAmountHint(null); listChanged = true; } } @@ -678,13 +693,7 @@ public class NewTransactionModel extends ViewModel { Logger.debug("submittable", String.format("Setting amount hint of {%s} to %s [%s]", acc.toString(), hint, balCurrency)); - if (workingWithLiveList & !liveListCopied) { - list = copyList(list); - liveListCopied = true; - } - final TransactionAccount newAcc = new TransactionAccount(acc); - newAcc.setAmountHint(hint); - list.set(i, newAcc); + acc.setAmountHint(hint); listChanged = true; } } @@ -695,13 +704,7 @@ public class NewTransactionModel extends ViewModel { Misc.nullIsEmpty(acc.getAccountName()), balCurrency)); if (acc.amountHintIsSet && !TextUtils.isEmpty(acc.getAmountHint())) { - if (workingWithLiveList && !liveListCopied) { - list = copyList(list); - liveListCopied = true; - } - final TransactionAccount newAcc = new TransactionAccount(acc); - newAcc.setAmountHint(null); - list.set(i, newAcc); + acc.setAmountHint(null); listChanged = true; } } @@ -736,10 +739,6 @@ public class NewTransactionModel extends ViewModel { // } // // if (!foundIt) - if (workingWithLiveList && !liveListCopied) { - list = copyList(list); - liveListCopied = true; - } final TransactionAccount newAcc = new TransactionAccount("", balCurrency); final float bal = balance.get(balCurrency); if (!Misc.isZero(bal) && currAmounts == currRows) @@ -756,10 +755,6 @@ public class NewTransactionModel extends ViewModel { for (String currName : emptyRowsForCurrency.currencies()) { List emptyItems = emptyRowsForCurrency.getList(currName); while ((list.size() > MIN_ITEMS) && (emptyItems.size() > 1)) { - if (workingWithLiveList && !liveListCopied) { - list = copyList(list); - liveListCopied = true; - } // the list is a copy, so the empty item is no longer present Item itemToRemove = emptyItems.remove(1); removeItemById(list, itemToRemove.id); @@ -771,10 +766,6 @@ public class NewTransactionModel extends ViewModel { List currItems = itemsForCurrency.getList(currName); if (currItems.size() == 1) { - if (workingWithLiveList && !liveListCopied) { - list = copyList(list); - liveListCopied = true; - } // the list is a copy, so the empty item is no longer present removeItemById(list, emptyItems.get(0).id); listChanged = true; @@ -785,15 +776,10 @@ public class NewTransactionModel extends ViewModel { // 6) at least two rows need to be present in the ledger // (the list also contains header and trailer) while (list.size() < MIN_ITEMS) { - if (workingWithLiveList && !liveListCopied) { - list = copyList(list); - liveListCopied = true; - } list.add(new TransactionAccount("")); listChanged = true; } - Logger.debug("submittable", submittable ? "YES" : "NO"); isSubmittable.setValue(submittable); @@ -987,7 +973,7 @@ public class NewTransactionModel extends ViewModel { if (TextUtils.isEmpty(description)) b.append(" «no description»"); else - b.append(String.format(" descr'%s'", description)); + b.append(String.format(" '%s'", description)); if (date != null) b.append(String.format("@%s", date.toString())); @@ -1035,8 +1021,9 @@ public class NewTransactionModel extends ViewModel { private boolean amountSet; private boolean amountValid = true; private FocusedElement focusedElement = FocusedElement.Account; - private boolean amountHintIsSet = true; + private boolean amountHintIsSet = false; private boolean isLast = false; + private int accountNameCursorPosition; public TransactionAccount(TransactionAccount origin) { id = origin.id; accountName = origin.accountName; @@ -1049,6 +1036,7 @@ public class NewTransactionModel extends ViewModel { amountValid = origin.amountValid; focusedElement = origin.focusedElement; isLast = origin.isLast; + accountNameCursorPosition = origin.accountNameCursorPosition; } public TransactionAccount(LedgerTransactionAccount account) { super(); @@ -1153,6 +1141,9 @@ public class NewTransactionModel extends ViewModel { if (!TextUtils.isEmpty(comment)) b.append(String.format(" /%s/", comment)); + if (isLast) + b.append(" last"); + return b.toString(); } public boolean equalContents(TransactionAccount other) { @@ -1175,6 +1166,12 @@ public class NewTransactionModel extends ViewModel { equal)); return equal; } + public int getAccountNameCursorPosition() { + return accountNameCursorPosition; + } + public void setAccountNameCursorPosition(int position) { + this.accountNameCursorPosition = position; + } } private static class BalanceForCurrency {