2020-06-26 10:08:08 -04:00
|
|
|
import NimQml, eventemitter, chronicles, os
|
2020-05-29 15:54:35 -04:00
|
|
|
|
2020-05-15 18:02:20 -04:00
|
|
|
import app/chat/core as chat
|
|
|
|
import app/wallet/core as wallet
|
|
|
|
import app/node/core as node
|
2020-05-19 21:59:15 -04:00
|
|
|
import app/profile/core as profile
|
2020-05-20 13:36:44 -04:00
|
|
|
import app/onboarding/core as onboarding
|
2020-05-27 17:15:42 +10:00
|
|
|
import app/login/core as login
|
2020-05-29 15:54:35 -04:00
|
|
|
import signals/core as signals
|
|
|
|
|
2020-06-23 08:32:56 -04:00
|
|
|
import status/libstatus/[types, libstatus]
|
2020-05-29 15:54:35 -04:00
|
|
|
import status/status as statuslib
|
2020-05-16 19:46:46 -04:00
|
|
|
|
2020-05-18 21:48:20 +03:00
|
|
|
var signalsQObjPointer: pointer
|
2020-05-11 13:31:07 -04:00
|
|
|
|
2020-05-21 15:07:55 -04:00
|
|
|
logScope:
|
|
|
|
topics = "main"
|
|
|
|
|
2020-05-06 13:40:00 -04:00
|
|
|
proc mainProc() =
|
2020-05-29 15:54:35 -04:00
|
|
|
let status = statuslib.newStatusInstance()
|
2020-06-04 17:38:24 +10:00
|
|
|
status.initNode()
|
2020-05-29 15:54:35 -04:00
|
|
|
|
2020-06-23 15:31:52 -04:00
|
|
|
enableHDPI()
|
|
|
|
|
2020-06-25 10:39:59 -04:00
|
|
|
let app = newQApplication("Nim Status Client")
|
2020-06-23 18:54:21 -04:00
|
|
|
app.icon("./status.svg")
|
|
|
|
|
2020-05-18 16:32:53 -04:00
|
|
|
let engine = newQQmlApplicationEngine()
|
|
|
|
let signalController = signals.newController(app)
|
2020-05-18 21:48:20 +03:00
|
|
|
|
|
|
|
# We need this global variable in order to be able to access the application
|
|
|
|
# from the non-closure callback passed to `libstatus.setSignalEventCallback`
|
|
|
|
signalsQObjPointer = cast[pointer](signalController.vptr)
|
|
|
|
|
2020-05-29 15:54:35 -04:00
|
|
|
var wallet = wallet.newController(status)
|
2020-06-02 16:10:48 -04:00
|
|
|
engine.setRootContextProperty("walletModel", wallet.variant)
|
2020-05-13 15:14:35 -04:00
|
|
|
|
2020-05-29 15:54:35 -04:00
|
|
|
var chat = chat.newController(status)
|
2020-05-15 17:40:05 -04:00
|
|
|
engine.setRootContextProperty("chatsModel", chat.variant)
|
2020-05-12 07:24:08 +10:00
|
|
|
|
2020-05-29 15:54:35 -04:00
|
|
|
var node = node.newController(status)
|
2020-05-15 17:40:05 -04:00
|
|
|
engine.setRootContextProperty("nodeModel", node.variant)
|
2020-05-20 13:11:30 -04:00
|
|
|
|
2020-05-29 15:54:35 -04:00
|
|
|
var profile = profile.newController(status)
|
2020-05-19 21:59:15 -04:00
|
|
|
engine.setRootContextProperty("profileModel", profile.variant)
|
|
|
|
|
2020-06-17 12:13:13 -04:00
|
|
|
status.events.once("login") do(a: Args):
|
2020-05-22 22:35:40 +10:00
|
|
|
var args = AccountArgs(a)
|
2020-05-29 15:54:35 -04:00
|
|
|
status.startMessenger()
|
2020-05-27 17:15:42 +10:00
|
|
|
profile.init(args.account)
|
2020-06-25 09:26:58 -04:00
|
|
|
wallet.init()
|
|
|
|
chat.init()
|
|
|
|
|
2020-05-21 16:52:00 -04:00
|
|
|
|
2020-05-29 15:54:35 -04:00
|
|
|
var login = login.newController(status)
|
|
|
|
var onboarding = onboarding.newController(status)
|
2020-05-27 17:15:42 +10:00
|
|
|
|
2020-05-28 14:06:57 +10:00
|
|
|
engine.setRootContextProperty("loginModel", login.variant)
|
|
|
|
engine.setRootContextProperty("onboardingModel", onboarding.variant)
|
2020-05-21 16:52:00 -04:00
|
|
|
|
2020-06-26 10:08:08 -04:00
|
|
|
let isExperimental = if getEnv("EXPERIMENTAL") == "1": "1" else: "0" # value explicity passed to avoid trusting input
|
|
|
|
let experimentalFlag = newQVariant(isExperimental)
|
|
|
|
engine.setRootContextProperty("isExperimental", experimentalFlag)
|
|
|
|
|
2020-06-18 17:56:04 -04:00
|
|
|
defer:
|
|
|
|
error "TODO: if user is logged in, logout"
|
|
|
|
engine.delete()
|
|
|
|
app.delete()
|
|
|
|
signalController.delete()
|
|
|
|
login.delete()
|
|
|
|
onboarding.delete()
|
|
|
|
wallet.delete()
|
|
|
|
chat.delete()
|
|
|
|
profile.delete()
|
|
|
|
|
|
|
|
|
2020-06-04 17:38:24 +10:00
|
|
|
# Initialize only controllers whose init functions
|
|
|
|
# do not need a running node
|
|
|
|
proc initControllers() =
|
|
|
|
node.init()
|
|
|
|
login.init()
|
|
|
|
onboarding.init()
|
|
|
|
|
|
|
|
initControllers()
|
|
|
|
|
|
|
|
# Handle node.stopped signal when user has logged out
|
2020-06-17 12:13:13 -04:00
|
|
|
status.events.once("nodeStopped") do(a: Args):
|
2020-06-04 17:38:24 +10:00
|
|
|
# TODO: remove this once accounts are not tracked in the AccountsModel
|
|
|
|
status.reset()
|
|
|
|
|
|
|
|
# 1. Reset controller data
|
|
|
|
login.reset()
|
|
|
|
onboarding.reset()
|
|
|
|
# TODO: implement all controller resets
|
|
|
|
# chat.reset()
|
|
|
|
# node.reset()
|
|
|
|
# wallet.reset()
|
|
|
|
# profile.reset()
|
|
|
|
|
|
|
|
# 2. Re-init controllers that don't require a running node
|
|
|
|
initControllers()
|
|
|
|
|
|
|
|
|
2020-05-18 11:07:30 -04:00
|
|
|
signalController.init()
|
|
|
|
signalController.addSubscriber(SignalType.Wallet, wallet)
|
2020-05-19 17:00:04 -04:00
|
|
|
signalController.addSubscriber(SignalType.Wallet, node)
|
2020-05-18 14:20:20 -04:00
|
|
|
signalController.addSubscriber(SignalType.Message, chat)
|
2020-06-16 17:24:43 -04:00
|
|
|
signalController.addSubscriber(SignalType.Message, profile)
|
2020-06-02 12:35:21 -04:00
|
|
|
signalController.addSubscriber(SignalType.DiscoverySummary, chat)
|
2020-07-01 14:24:13 -04:00
|
|
|
signalController.addSubscriber(SignalType.EnvelopeSent, chat)
|
2020-05-27 17:15:42 +10:00
|
|
|
signalController.addSubscriber(SignalType.NodeLogin, login)
|
|
|
|
signalController.addSubscriber(SignalType.NodeLogin, onboarding)
|
2020-06-04 17:38:24 +10:00
|
|
|
signalController.addSubscriber(SignalType.NodeStopped, login)
|
|
|
|
signalController.addSubscriber(SignalType.NodeStarted, login)
|
|
|
|
signalController.addSubscriber(SignalType.NodeReady, login)
|
2020-05-25 04:18:37 +02:00
|
|
|
|
2020-05-18 11:07:30 -04:00
|
|
|
engine.setRootContextProperty("signals", signalController.variant)
|
|
|
|
|
2020-05-16 19:46:46 -04:00
|
|
|
engine.load("../ui/main.qml")
|
2020-05-18 21:48:20 +03:00
|
|
|
|
|
|
|
# Please note that this must use the `cdecl` calling convention because
|
|
|
|
# it will be passed as a regular C function to libstatus. This means that
|
|
|
|
# we cannot capture any local variables here (we must rely on globals)
|
|
|
|
var callback: SignalCallback = proc(p0: cstring) {.cdecl.} =
|
2020-06-04 17:18:11 -04:00
|
|
|
setupForeignThreadGc()
|
2020-05-18 11:07:30 -04:00
|
|
|
signal_handler(signalsQObjPointer, p0, "receiveSignal")
|
2020-06-04 17:18:11 -04:00
|
|
|
tearDownForeignThreadGc()
|
2020-05-16 19:46:46 -04:00
|
|
|
|
|
|
|
libstatus.setSignalEventCallback(callback)
|
2020-05-15 17:10:00 -04:00
|
|
|
|
2020-05-10 19:24:06 -04:00
|
|
|
# Qt main event loop is entered here
|
|
|
|
# The termination of the loop will be performed when exit() or quit() is called
|
2020-05-21 15:07:55 -04:00
|
|
|
info "Starting application..."
|
2020-05-06 13:40:00 -04:00
|
|
|
app.exec()
|
|
|
|
|
|
|
|
when isMainModule:
|
|
|
|
mainProc()
|
|
|
|
GC_fullcollect()
|