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.

118 lines
3.4 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
  1. package wow.doge.chatto
  2. import javax.enterprise.context.ApplicationScoped
  3. import javax.enterprise.inject.Produces
  4. import javax.inject.Named
  5. import com.sfxcode.sapphire.core.controller.DefaultWindowController
  6. // import org.asynchttpclient.Dsl._
  7. import wow.doge.chatto.controller.MainViewController
  8. import sttp.client.asynchttpclient.future.AsyncHttpClientFutureBackend
  9. import scala.concurrent.ExecutionContext.Implicits.global
  10. import scala.async.Async.{async, await}
  11. // import org.json4s.native.JsonMethods._
  12. import org.scalafx.extras._
  13. import javax.inject._
  14. import javafx.application.Platform
  15. @Named
  16. @ApplicationScoped
  17. class ApplicationController extends DefaultWindowController {
  18. // import ApplicationController._
  19. lazy val mainViewController = getController[MainViewController]()
  20. private implicit lazy val serialization = org.json4s.jackson.Serialization
  21. private implicit lazy val backend = AsyncHttpClientFutureBackend()
  22. // override def width: Int = 400
  23. // @Inject
  24. // private var appDataHandler: AppDataHandler = _
  25. def applicationDidLaunch() = {
  26. logger.info("start " + this)
  27. applicationEnvironment.loadResourceBundle("bundles/application")
  28. replaceSceneContent(mainViewController.loginController)
  29. }
  30. @Produces
  31. def applicationName: ApplicationName = {
  32. ApplicationName(configStringValue("application.name"))
  33. }
  34. @Produces
  35. def httpBackend = backend
  36. // @Produces
  37. // def encryptionService: EncryptionService = EncryptionServiceImpl()
  38. def replacePrimarySceneContent(): Unit = {
  39. // Styling
  40. reloadStyles()
  41. // Resources
  42. applicationEnvironment.clearResourceBundleCache()
  43. applicationEnvironment.loadResourceBundle("bundles/application")
  44. // FXML
  45. val newMainViewController = getController[MainViewController]()
  46. replaceSceneContent(newMainViewController)
  47. }
  48. // def testListener(@Observes event: SceneControllerWillChangeEvent) = {
  49. // logger.info("test success 1")
  50. // // logger.info(s"${event.newController}")
  51. // }
  52. // def testListener2(@Observes event: SceneControllerDidChangeEvent) = {
  53. // logger.info("test success 2")
  54. // // logger.info(s"${event.newController}")
  55. // }
  56. override def applicationWillStop(): Unit = async {
  57. super.applicationWillStop()
  58. println("stopping")
  59. await(httpBackend.close())
  60. Platform.exit()
  61. System.exit(0)
  62. }
  63. def showLoginPane() = onFX {
  64. // offFX { appDataHandler.clearCredentials() }
  65. replaceSceneContent(mainViewController.loginController)
  66. }
  67. def logout() = onFX {
  68. val newMainViewController = getController[MainViewController]()
  69. replaceSceneContent(mainViewController.loginController)
  70. }
  71. def showChatPane(): Unit = onFX {
  72. replaceSceneContent(mainViewController)
  73. mainViewController.showChatController()
  74. }
  75. }
  76. final case class ApplicationName(name: String)
  77. final case class UserCredentials(
  78. username: String,
  79. token: String
  80. )
  81. object UserCredentials {
  82. def empty = UserCredentials("empty", "empty")
  83. }
  84. @ApplicationScoped
  85. class AppDataHandler {
  86. private var _appData: AppData = AppData(UserCredentials.empty, "empty")
  87. private def appData_=(appData: AppData) = synchronized { _appData = appData }
  88. def appData = _appData
  89. def updateCredentials(credentials: UserCredentials): Unit = offFX {
  90. appData = appData.copy(credentials = credentials)
  91. }
  92. def clearCredentials() = {
  93. appData = appData.copy(credentials = UserCredentials.empty)
  94. }
  95. }
  96. final case class AppData(credentials: UserCredentials, sumth: String)