necplsultra
necplsultra

Reputation: 49

Wrapping domain classes to ItemViewModel

I have a domain class

class UserItem(var simpleItem: Item, var id: String, var status: String, var price: Int) {
    var upperLimit: Int = 0
    var lowerLimit: Int = 0
    /* methods here */
}

and a class storing these objects

class Trades {
    val saleableItems: ArrayList<UserItem> = ArrayList()
    val soldAwaitingItems: ArrayList<UserItem> = ArrayList()

    /* methods */
}

saleableItems and soldAwaitingItems are updated from within Trades

I want to display saleableItems using TableView so that I could bind data and View without converting properties to TornadoFX properties so I wrapped UserItem to ItemViewModel

class UserItemModel(uItem: UserItem) : ItemViewModel<UserItem>() {
    val simpleItem = bind { item?.observable(UserItem::simpleItem) }
    val id = bind { item?.observable(UserItem::id) }
    val status = bind { item?.observable(UserItem::status) }
    val price = bind { item?.observable(UserItem::price) }
    val upperLimit = bind { item?.observable(UserItem::upperLimit) }
    val lowerLimit = bind { item?.observable(UserItem::lowerLimit) }

    init {
        item = uItem
    }
}

Is there any way to wrap Trades to ItemViewModel<Trades> so that I have something like

class TradesModel : ItemViewModel<Trades>() {
    val saleableItems: ObservableList<UserItemModel>
    val soldAwaitingItems: ObservableList<UserItemModel>
}

and then use it in View

class TradesView : View("My View") {
val tradesModel: TradesModel by inject()

    tableview(tradesModel.saleableItems) {
        column("Name", UserItemModel::simpleItem)
        column("Price", UserItemModel::price)
        column("Lower limit", UserItemModel::lowerLimit)
        column("Upper limit", UserItemModel::upperLimit)
    }
}

Upvotes: 1

Views: 206

Answers (1)

Trein
Trein

Reputation: 3688

Have you tried something like this?

class UserItemModel(uItem: UserItem) : ItemViewModel<UserItem>() {
    // Same way you defined previously.
}

class TradesViewModel {
    val saleableItems: SimpleListProperty<UserItemModel>(FXCollections.observableArrayList())
    val soldAwaitingItems: SimpleListProperty<UserItemModel>(FXCollections.observableArrayList())
}

class TradesView : View("My View") {
    val tradesModel: TradesViewModel by inject()

    init {
        with(root) {
            tableview(tradesModel.saleableItems) {
                column("Name", UserItemModel::simpleItem)
                column("Price", UserItemModel::price)
                column("Lower limit", UserItemModel::lowerLimit)
                column("Upper limit", UserItemModel::upperLimit)
            }   
        }
    }
}

Also, if your table is read-only, you might be able to define UserItemModel as a simple data class - no need for extending ItemViewModel or performing property bindings.

Upvotes: 1

Related Questions