desktop: remember window position and size (#3465)
* initial work on storing desktop window position and size * removed useless imports * updated to use app preferences * vars to vals * defensive programming * fixed default * removed default json * do nothing if encoding to json while storing fails * names, clean up * move comment * changes --------- Co-authored-by: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> Co-authored-by: Avently <7953703+avently@users.noreply.github.com>
This commit is contained in:
parent
05a64c99a2
commit
9580b4110d
@ -173,6 +173,8 @@ class AppPreferences {
|
|||||||
val connectRemoteViaMulticastAuto = mkBoolPreference(SHARED_PREFS_CONNECT_REMOTE_VIA_MULTICAST_AUTO, true)
|
val connectRemoteViaMulticastAuto = mkBoolPreference(SHARED_PREFS_CONNECT_REMOTE_VIA_MULTICAST_AUTO, true)
|
||||||
val offerRemoteMulticast = mkBoolPreference(SHARED_PREFS_OFFER_REMOTE_MULTICAST, true)
|
val offerRemoteMulticast = mkBoolPreference(SHARED_PREFS_OFFER_REMOTE_MULTICAST, true)
|
||||||
|
|
||||||
|
val desktopWindowState = mkStrPreference(SHARED_PREFS_DESKTOP_WINDOW_STATE, null)
|
||||||
|
|
||||||
private fun mkIntPreference(prefName: String, default: Int) =
|
private fun mkIntPreference(prefName: String, default: Int) =
|
||||||
SharedPreference(
|
SharedPreference(
|
||||||
get = fun() = settings.getInt(prefName, default),
|
get = fun() = settings.getInt(prefName, default),
|
||||||
@ -317,6 +319,7 @@ class AppPreferences {
|
|||||||
private const val SHARED_PREFS_CONNECT_REMOTE_VIA_MULTICAST = "ConnectRemoteViaMulticast"
|
private const val SHARED_PREFS_CONNECT_REMOTE_VIA_MULTICAST = "ConnectRemoteViaMulticast"
|
||||||
private const val SHARED_PREFS_CONNECT_REMOTE_VIA_MULTICAST_AUTO = "ConnectRemoteViaMulticastAuto"
|
private const val SHARED_PREFS_CONNECT_REMOTE_VIA_MULTICAST_AUTO = "ConnectRemoteViaMulticastAuto"
|
||||||
private const val SHARED_PREFS_OFFER_REMOTE_MULTICAST = "OfferRemoteMulticast"
|
private const val SHARED_PREFS_OFFER_REMOTE_MULTICAST = "OfferRemoteMulticast"
|
||||||
|
private const val SHARED_PREFS_DESKTOP_WINDOW_STATE = "DesktopWindowState"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,7 +15,6 @@ import androidx.compose.ui.unit.dp
|
|||||||
import androidx.compose.ui.window.*
|
import androidx.compose.ui.window.*
|
||||||
import chat.simplex.common.model.ChatController
|
import chat.simplex.common.model.ChatController
|
||||||
import chat.simplex.common.model.ChatModel
|
import chat.simplex.common.model.ChatModel
|
||||||
import chat.simplex.common.platform.desktopPlatform
|
|
||||||
import chat.simplex.common.ui.theme.DEFAULT_START_MODAL_WIDTH
|
import chat.simplex.common.ui.theme.DEFAULT_START_MODAL_WIDTH
|
||||||
import chat.simplex.common.ui.theme.SimpleXTheme
|
import chat.simplex.common.ui.theme.SimpleXTheme
|
||||||
import chat.simplex.common.views.TerminalView
|
import chat.simplex.common.views.TerminalView
|
||||||
@ -31,10 +30,30 @@ import java.io.File
|
|||||||
val simplexWindowState = SimplexWindowState()
|
val simplexWindowState = SimplexWindowState()
|
||||||
|
|
||||||
fun showApp() = application {
|
fun showApp() = application {
|
||||||
// For some reason on Linux actual width will be 10.dp less after specifying it here. If we specify 1366,
|
// Creates file if not exists; comes with proper defaults
|
||||||
// it will show 1356. But after that we can still update it to 1366 by changing window state. Just making it +10 now here
|
val state = getStoredWindowState()
|
||||||
val width = if (desktopPlatform.isLinux()) 1376.dp else 1366.dp
|
|
||||||
val windowState = rememberWindowState(placement = WindowPlacement.Floating, width = width, height = 768.dp)
|
val windowState: WindowState = rememberWindowState(
|
||||||
|
placement = WindowPlacement.Floating,
|
||||||
|
width = state.width.dp,
|
||||||
|
height = state.height.dp,
|
||||||
|
position = WindowPosition(state.x.dp, state.y.dp)
|
||||||
|
)
|
||||||
|
|
||||||
|
LaunchedEffect(
|
||||||
|
windowState.position.x.value,
|
||||||
|
windowState.position.y.value,
|
||||||
|
windowState.size.width.value,
|
||||||
|
windowState.size.height.value
|
||||||
|
) {
|
||||||
|
storeWindowState(WindowPositionSize(
|
||||||
|
x = windowState.position.x.value.toInt(),
|
||||||
|
y = windowState.position.y.value.toInt(),
|
||||||
|
width = windowState.size.width.value.toInt(),
|
||||||
|
height = windowState.size.height.value.toInt()
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
simplexWindowState.windowState = windowState
|
simplexWindowState.windowState = windowState
|
||||||
// Reload all strings in all @Composable's after language change at runtime
|
// Reload all strings in all @Composable's after language change at runtime
|
||||||
if (remember { ChatController.appPrefs.appLanguage.state }.value != "") {
|
if (remember { ChatController.appPrefs.appLanguage.state }.value != "") {
|
||||||
|
@ -0,0 +1,36 @@
|
|||||||
|
package chat.simplex.common
|
||||||
|
|
||||||
|
import chat.simplex.common.model.json
|
||||||
|
import chat.simplex.common.platform.appPreferences
|
||||||
|
import chat.simplex.common.platform.desktopPlatform
|
||||||
|
import kotlinx.serialization.*
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class WindowPositionSize(
|
||||||
|
val width: Int = 1366,
|
||||||
|
val height: Int = 768,
|
||||||
|
val x: Int = 0,
|
||||||
|
val y: Int = 0,
|
||||||
|
)
|
||||||
|
|
||||||
|
fun getStoredWindowState(): WindowPositionSize =
|
||||||
|
try {
|
||||||
|
val str = appPreferences.desktopWindowState.get()
|
||||||
|
var state = if (str == null) {
|
||||||
|
WindowPositionSize()
|
||||||
|
} else {
|
||||||
|
json.decodeFromString(str)
|
||||||
|
}
|
||||||
|
|
||||||
|
// For some reason on Linux actual width will be 10.dp less after specifying it here. If we specify 1366,
|
||||||
|
// it will show 1356. But after that we can still update it to 1366 by changing window state. Just making it +10 now here
|
||||||
|
if (desktopPlatform.isLinux() && state.width == 1366) {
|
||||||
|
state = state.copy(width = 1376)
|
||||||
|
}
|
||||||
|
state
|
||||||
|
} catch (e: Throwable) {
|
||||||
|
WindowPositionSize()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun storeWindowState(state: WindowPositionSize) =
|
||||||
|
appPreferences.desktopWindowState.set(json.encodeToString(state))
|
Loading…
Reference in New Issue
Block a user