Add multiaccount write-as alias account setting

This commit is contained in:
miruka 2019-07-18 21:58:21 -04:00
parent 4f1884b121
commit 93bc2ff5a9
5 changed files with 72 additions and 24 deletions

View File

@ -1,4 +1,4 @@
- aiofiles Thumbnails
- Set Qt.application.* stuff from C++
- Devices and client settings in edit account page
- Multiaccount aliases
- If avatar is set, name color from average color?

View File

@ -11,6 +11,8 @@ from dataclasses import dataclass, field
from .backend import Backend
JsonData = Dict[str, Any]
WRITE_LOCK = asyncio.Lock()
@ -27,14 +29,18 @@ class ConfigFile:
@dataclass
class JSONConfigFile(ConfigFile):
async def read(self) -> Dict[str, Any]:
try:
return json.loads(self.path.read_text())
except (json.JSONDecodeError, FileNotFoundError):
async def default_data(self) -> JsonData:
return {}
async def write(self, data: Dict[str, Any]) -> None:
async def read(self) -> JsonData:
try:
return json.loads(self.path.read_text())
except (json.JSONDecodeError, FileNotFoundError):
return await self.default_data()
async def write(self, data: JsonData) -> None:
js = json.dumps(data, indent=4, ensure_ascii=False, sort_keys=True)
async with WRITE_LOCK:
@ -76,3 +82,8 @@ class Accounts(JSONConfigFile):
@dataclass
class UISettings(JSONConfigFile):
filename: str = "ui-settings.json"
async def default_data(self) -> JsonData:
return {
"write_aliases": {}
}

View File

@ -19,6 +19,11 @@ HGridLayout {
)
}
if (aliasField.changed) {
window.settings.write_aliases[userId] = aliasField.field.text
window.settingsChanged()
}
if (avatar.changed) {
saveButton.avatarChangeRunning = true
let path = Qt.resolvedUrl(avatar.imageUrl).replace(/^file:/, "")
@ -32,6 +37,13 @@ HGridLayout {
}
}
function cancelChanges() {
nameField.field.text = userInfo.displayName
aliasField.field.text = aliasField.currentAlias
fileDialog.selectedFile = ""
fileDialog.file = ""
}
columns: 2
flow: window.isWide ? GridLayout.LeftToRight : GridLayout.TopToBottom
rowSpacing: currentSpacing
@ -123,6 +135,21 @@ HGridLayout {
Layout.fillWidth: true
Layout.maximumWidth: 480
}
HLabeledTextField {
property string currentAlias:
window.settings.write_aliases[userId] || ""
property bool changed: field.text != currentAlias
id: aliasField
label.text: qsTr("Write alias:")
field.text: currentAlias
field.onAccepted: applyChanges()
Layout.fillWidth: true
Layout.maximumWidth: 480
}
}
HSpacer {}
@ -138,7 +165,8 @@ HGridLayout {
iconName: "apply"
text: qsTr("Apply")
loading: nameChangeRunning || avatarChangeRunning
enabled: nameField.changed || avatar.changed
enabled:
nameField.changed || aliasField.changed || avatar.changed
Layout.fillWidth: true
Layout.alignment: Qt.AlignBottom
@ -149,16 +177,12 @@ HGridLayout {
HUIButton {
iconName: "cancel"
text: qsTr("Cancel")
enabled: saveButton.enabled && ! saveButton.loading
Layout.fillWidth: true
Layout.alignment: Qt.AlignBottom
enabled: saveButton.enabled && ! saveButton.loading
onClicked: {
nameField.field.text = userInfo.displayName
fileDialog.selectedFile = ""
fileDialog.file = ""
}
onClicked: cancelChanges()
}
}
}

View File

@ -33,6 +33,11 @@ Python {
call("APP.call_client_coro", [accountId, name, uuid, args])
}
function saveSettings(callback=null) {
if (! py.ready) { return } // config not loaded yet
callCoro("ui_settings.write", [window.settings], callback)
}
Component.onCompleted: {
for (var func in EventHandlers) {
if (EventHandlers.hasOwnProperty(func)) {
@ -46,6 +51,9 @@ Python {
call("APP.is_debug_on", [Qt.application.arguments], on => {
window.debug = on
callCoro("ui_settings.read", [], settings => {
window.settings = settings
callCoro("saved_accounts.any_saved", [], any => {
py.ready = true
willLoadAccounts(any)
@ -59,5 +67,6 @@ Python {
})
})
})
})
}
}

View File

@ -16,10 +16,6 @@ ApplicationWindow {
title: "Harmony QML"
color: "black"
property bool debug: false
property bool ready: false
property bool isWide: width > theme.isWideAbove
Component.onCompleted: {
Qt.application.organization = "harmonyqml"
Qt.application.name = "harmonyqml"
@ -28,6 +24,14 @@ ApplicationWindow {
window.ready = true
}
property bool debug: false
property bool ready: false
property bool isWide: width > theme.isWideAbove
// Note: window.settingsChanged() must be called manually
property var settings: ({})
onSettingsChanged: py.saveSettings()
Theme { id: theme }
Python { id: py }