X-Git-Url: https://git.ktnx.net/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fui%2Factivity%2FNewTransactionModel.java;h=7c49bf1b4b08a0e49ad9b166ed147367ea7ab894;hb=040d5ba3aaa78a295a6c4a29500a234d3188ad6b;hp=4c200fc592af0ea2610c890d2f54b53d67d822fd;hpb=ba6513e75e8cfc577f333fb38c0e6c597f9c8875;p=mobile-ledger.git diff --git a/app/src/main/java/net/ktnx/mobileledger/ui/activity/NewTransactionModel.java b/app/src/main/java/net/ktnx/mobileledger/ui/activity/NewTransactionModel.java index 4c200fc5..7c49bf1b 100644 --- a/app/src/main/java/net/ktnx/mobileledger/ui/activity/NewTransactionModel.java +++ b/app/src/main/java/net/ktnx/mobileledger/ui/activity/NewTransactionModel.java @@ -26,6 +26,7 @@ import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModel; import net.ktnx.mobileledger.BuildConfig; +import net.ktnx.mobileledger.model.Currency; import net.ktnx.mobileledger.model.LedgerTransactionAccount; import net.ktnx.mobileledger.utils.Logger; import net.ktnx.mobileledger.utils.Misc; @@ -34,6 +35,7 @@ import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Calendar; +import java.util.Collections; import java.util.Date; import java.util.GregorianCalendar; import java.util.List; @@ -51,8 +53,24 @@ public class NewTransactionModel extends ViewModel { private final Item trailer = new Item(this); private final ArrayList items = new ArrayList<>(); private final MutableLiveData isSubmittable = new MutableLiveData<>(false); - private final MutableLiveData focusedItem = new MutableLiveData<>(null); + private final MutableLiveData focusedItem = new MutableLiveData<>(0); private final MutableLiveData accountCount = new MutableLiveData<>(0); + private final MutableLiveData simulateSave = new MutableLiveData<>(false); + final MutableLiveData showCurrency = new MutableLiveData<>(false); + public boolean getSimulateSave() { + return simulateSave.getValue(); + } + public void setSimulateSave(boolean simulateSave) { + this.simulateSave.setValue(simulateSave); + } + public void toggleSimulateSave() { + simulateSave.setValue(!simulateSave.getValue()); + } + public void observeSimulateSave(@NonNull @NotNull androidx.lifecycle.LifecycleOwner owner, + @NonNull + androidx.lifecycle.Observer observer) { + this.simulateSave.observe(owner, observer); + } public int getAccountCount() { return items.size(); } @@ -90,6 +108,7 @@ public class NewTransactionModel extends ViewModel { @NonNull androidx.lifecycle.Observer observer) { this.accountCount.removeObserver(observer); } + public int getFocusedItem() { return focusedItem.getValue(); } public void setFocusedItem(int position) { focusedItem.setValue(position); } @@ -134,6 +153,8 @@ public class NewTransactionModel extends ViewModel { 3a) there must be exactly one empty amount (with account) 4) empty accounts with empty amounts are ignored 5) a row with an empty account name or empty amount is guaranteed to exist + 6) at least two rows need to be present in the ledger + */ @SuppressLint("DefaultLocale") public void checkTransactionSubmittable(NewTransactionItemsAdapter adapter) { @@ -239,6 +260,9 @@ public class NewTransactionModel extends ViewModel { adapter.addRow(); } + // 6) at least two rows need to be present in the ledger + while (this.items.size() < 2) adapter.addRow(); + debug("submittable", submittable ? "YES" : "NO"); isSubmittable.setValue(submittable); @@ -248,8 +272,9 @@ public class NewTransactionModel extends ViewModel { for (int i = 0; i < items.size(); i++) { Item item = items.get(i); LedgerTransactionAccount acc = item.getAccount(); - debug("submittable", String.format("Item %2d: [%4.2f] %s", i, - acc.isAmountSet() ? acc.getAmount() : 0, acc.getAccountName())); + debug("submittable", String.format("Item %2d: [%4.2f] %s (%s)", i, + acc.isAmountSet() ? acc.getAmount() : 0, acc.getAccountName(), + acc.getComment())); } } } @@ -270,11 +295,45 @@ public class NewTransactionModel extends ViewModel { public void sendCountNotifications() { accountCount.setValue(getAccountCount()); } + public void sendFocusedNotification() { + focusedItem.setValue(focusedItem.getValue()); + } + public void updateFocusedItem(int position) { + focusedItem.setValue(position); + } + public void noteFocusChanged(int position, FocusedElement element) { + getItem(position).setFocusedElement(element); + } + public void swapItems(int one, int two) { + Collections.swap(items, one - 1, two - 1); + } + public void toggleComment(int position) { + final MutableLiveData commentVisible = getItem(position).commentVisible; + commentVisible.postValue(!commentVisible.getValue()); + } + public void moveItemLast(int index) { + /* 0 + 1 <-- index + 2 + 3 <-- desired position + */ + int itemCount = items.size(); + + if (index < itemCount - 1) { + Item acc = items.remove(index); + items.add(itemCount - 1, acc); + } + } + public void toggleCurrencyVisible() { + showCurrency.setValue(!showCurrency.getValue()); + } enum ItemType {generalData, transactionRow, bottomFiller} //========================================================================================== - class Item extends Object { + enum FocusedElement {Account, Comment, Amount} + + class Item { private ItemType type; private MutableLiveData date = new MutableLiveData<>(); private MutableLiveData description = new MutableLiveData<>(); @@ -282,6 +341,10 @@ public class NewTransactionModel extends ViewModel { private MutableLiveData amountHint = new MutableLiveData<>(null); private NewTransactionModel model; private MutableLiveData editable = new MutableLiveData<>(true); + private FocusedElement focusedElement = FocusedElement.Account; + private MutableLiveData comment = new MutableLiveData<>(null); + private MutableLiveData commentVisible = new MutableLiveData<>(false); + private MutableLiveData currency = new MutableLiveData<>(null); public Item(NewTransactionModel model) { this.model = model; type = ItemType.bottomFiller; @@ -300,6 +363,12 @@ public class NewTransactionModel extends ViewModel { this.account = account; this.editable.setValue(true); } + public FocusedElement getFocusedElement() { + return focusedElement; + } + public void setFocusedElement(FocusedElement focusedElement) { + this.focusedElement = focusedElement; + } public NewTransactionModel getModel() { return model; } @@ -361,6 +430,13 @@ public class NewTransactionModel extends ViewModel { this.date.setValue(date); } public void setDate(String text) { + if ((text == null) || text.trim() + .isEmpty()) + { + setDate((Date) null); + return; + } + int year, month, day; final Calendar c = GregorianCalendar.getInstance(); Matcher m = reYMD.matcher(text); @@ -460,5 +536,37 @@ public class NewTransactionModel extends ViewModel { public void stopObservingEditableFlag(Observer observer) { editable.removeObserver(observer); } + public void observeCommentVisible(NewTransactionActivity activity, + Observer observer) { + commentVisible.observe(activity, observer); + } + public void stopObservingCommentVisible(Observer observer) { + commentVisible.removeObserver(observer); + } + public void observeComment(NewTransactionActivity activity, Observer observer) { + comment.observe(activity, observer); + } + public void stopObservingComment(Observer observer) { + comment.removeObserver(observer); + } + public void setComment(String comment) { + getAccount().setComment(comment); + this.comment.postValue(comment); + } + public Currency getCurrency() { + return this.currency.getValue(); + } + public void setCurrency(Currency currency) { + getAccount().setCurrency((currency != null && !currency.getName() + .isEmpty()) ? currency.getName() + : null); + this.currency.setValue(currency); + } + public void observeCurrency(NewTransactionActivity activity, Observer observer) { + currency.observe(activity, observer); + } + public void stopObservingCurrency(Observer observer) { + currency.removeObserver(observer); + } } }