WIP desktop client for Chatto reimplemented in ScalaFX and Sapphire Framework
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

199 lines
6.4 KiB

package wow.doge.chatto.controller
import javafx.fxml.FXML
import javafx.scene.control.Label
import javafx.scene.control.Button
import javafx.scene.layout.FlowPane
import javafx.scene.control.TextArea
import javafx.scene.control.ListView
import javafx.scene.layout.HBox
import javafx.scene.layout.VBox
import scalafx.Includes._
import wow.doge.chatto.control.UserBox
import javafx.application.Platform
import javax.inject.Inject
import org.scalafx.extras._
import wow.doge.chatto.messagebuble.BubbledMDFXNode
import wow.doge.chatto.service.UserService
import scala.concurrent.ExecutionContext
import scala.concurrent.ExecutionContext.Implicits.global
import com.typesafe.scalalogging.LazyLogging
// import wow.doge.chatto.controller.LoginController.Person
import com.sfxcode.sapphire.core.value.FXBean
import wow.doge.chatto.AppDataHandler
import com.jfoenix.controls.JFXListView
import scala.async.Async.{async, await}
import javafx.scene.paint.Color
import scalafx.collections.ObservableBuffer
import javafx.beans.property.SimpleListProperty
import wow.doge.chatto.control.UserBox2
import javafx.beans.value.ChangeListener
import com.sfxcode.sapphire.core.value.KeyBindings
import com.sfxcode.sapphire.core.value.FXBeanAdapter
import scalafx.collections.ObservableMap
import com.sfxcode.sapphire.core.value.BeanConversions
import javafx.util.converter.DateStringConverter
class ChatController @Inject() (
userService: UserService,
appDataHandler: AppDataHandler
) extends AbstractViewController
with LazyLogging
with BeanConversions {
// @FXML private var label: Label = _
@FXML private var flowPane: FlowPane = _
@FXML private var submitButton: Button = _
@FXML private var logoutButton: Button = _
// @FXML private var chatTextArea: TextArea = _
@FXML private var chatInput: TextArea = _
@FXML private var usersVBox: VBox = _
@FXML var usersListView: JFXListView[UserBox2] = _
@FXML private var chatListView: JFXListView[HBox] = _
@FXML private var curUsr: Label = _
@FXML private var dataContent: Label = _
// applicationController.show
private val usersBuffer = ObservableBuffer[FXBean[User]]()
private val chatDataBuffer = ObservableMap[String, FXBean[User]]()
private lazy val curUserKeys = KeyBindings("curUser")
// bindings.add("person", "Person ${_self.name()} with age of ${_self.age()} is active: ${_self.isActive()}")
private lazy val curUserAdapter = FXBeanAdapter[User](this)
override def didGainVisibilityFirstTime(): Unit = {
super.didGainVisibilityFirstTime()
// val ub = new UserBox()
this.stage.resizable = true
// ub.messageLabel.text = "Hi there"
// ub.messageLabel.id =
// ub.userRadioButton.text = "User 1"
// usersVBox.children.clear()
// usersVBox.children += ub
// println("test")
// println(s"Result = ${func()}")
// offFX(println("hello from new thread"))
// chatTextArea.visible <== !chatInput.text.isEmpty
// chatTextArea.text <== chatInput.text
// for (r <- userService.func2()) yield (logger.info(s"${r.body}"))
// val person = Person(0, 10, "Billy")
// val bean = FXBean[Person](person)
// ub.messageLabel.text <== bean.getStringProperty("name")
// bean.getStringProperty("name") <== chatInput.text
// bean.getStringProperty("name")() = "Lester"
// println(bean.getValue("name"))
// println(bean.getStringProperty("name")())
// bean.
// bean.updateValue("name", "Lester")
// println(bean.bean)
// val curUserBean = FXBean[User](User("None"))
// logoutButton.onAction = (e) =>
// usersListView
// .getSelectionModel()
// .selectedItemProperty()
// .addListener((_, _, newValue) => {
// curUsr.text() = newValue.usernameLabel.text()
// })
curUserKeys.add("content", "${_self.data().content()}")
// curUserAdapter.addDateConverter()
curUserAdapter.addBindings(curUserKeys)
usersListView
.getSelectionModel()
.selectedItemProperty()
.addListener((_, _, newValue) => {
if (newValue != null) {
val dataBean =
FXBean(User(newValue.usernameLabel.text(), Data("test data")))
curUserAdapter
.set(dataBean)
}
})
// curUsr.text <== usersListView
// .getSelectionModel()
// .getSelectedItem()
// .username
// .text
}
override def didGainVisibility(): Unit = {
super.didGainVisibility()
chatInput.requestFocus()
async {
val willBeUsers = userService
.getUsers(appDataHandler.appData.credentials)
.map(_.body)
val willBeActiveUsers = userService
.getActiveUsers(appDataHandler.appData.credentials)
.map(_.body)
val maybeUsers = await(willBeUsers)
val maybeActiveUsers = await(willBeActiveUsers)
// maybeActiveUsers.foreach(println)
logger.debug(s"$maybeActiveUsers")
val maybeUsersBoxes = maybeUsers.map(users => {
// usersBuffer ++= users
users.map(user => {
// usersBuffer += FXBean(User(user))
// val ub = new UserBox()
// ub.messageLabel.text = "Hi there"
// ub.userRadioButton.text = user
// ub
// new Rectangle {
// fill <== when(hover) choose (Color.Red)
// }
// val hb = new HBox
new UserBox2(user) {
// this.children += new Label {
// textProperty() = user
// // textFillProperty <== when(this.hover) choose (Color.RED) otherwise (Color.BLUE)
// }
// fill <== when(this.hover) choose (Color.RED) otherwise (Color.BLUE)
}
})
})
onFX {
maybeUsersBoxes.map(userBoxes => {
usersListView.items() ++= userBoxes
// val x = new SimpleListProperty(ObservableBuffer(userBoxes))
// usersListView.items <== x
})
}
}
}
def func() = {
val x = offFXAndWait {
2 + 3
}
x
}
def actionLogout = {
offFXAndWait {
appDataHandler.clearCredentials()
println(appDataHandler.appData)
}
curUserAdapter.set(User.empty)
usersListView.items().clear()
chatListView.items().clear()
applicationController.logout()
println(appDataHandler.appData)
}
}
final case class Person(id: Int, age: Int, name: String)
final case class Data(content: String)
final case class User(curUser: String, data: Data)
object User {
def empty = User("", Data(""))
}
// final case class chatData()