I have stressed the importance of settings in a number of other threads. I would like to make the case for a hierarchical settings system.
There are a number of settings which are UI/UX related which must have a global default setting. Examples include fonts, colors, locale, layout, notification settings, markup enable, etc.
This global default gets applied to any new channels (chats, teams, apps, users, etc.) which are created, but each also gets a set of local settings. These may optionally override the default global settings.
It must be possible to override the default setting with the same setting if it is important. This avoids unwanted changes to the behavior of a channel if the global default changes.
There should also be ways to temporarily override settings (e.g. slash commands, markup-like annotations, etc.) so that the local behavior can itself be overridden.
Where several sets of settings could be in play (e.g. a channel is muted, but a user is not) sensible options should be available to specify which one is higher priority. This may be as simple as adding an additional option like "Always show notifications from this user, even in a muted channel."
I created another Feedback item "Incoming call/ message sounds", but perhaps it should have been added as a comment to this request, as its related. Many thanks.
All settings should also include:
- Color, duration and type of visual alert
- Sound and volume of audio alert
This should be relatively easy as long as the settings interface is properly abstracted.
Implement settings as a map of name/value pairs. The global settings act as the root of a tree of settings.
When created, each item (channel, user, etc.) gets a new map which is a node in this tree of settings. It is initially empty except for a link to its parent.
The query function for the value of a setting will start at the local node, and search for the setting name. If found, it is returned, otherwise it recurses up to its parent and repeats the search (which may in turn recurse up until the root node is found).
Since items with default behavior are just empty maps, they are cheap in terms of both storage space and run-time.
Channel settings include:
- Font choice, size, color
- Background choice, size, color
- Layout options (compact!)
- Markup substitution
- Emoji substitution
- Image expansion inline
- Presence settings
User settings include:
- Display name override
Global settings include:
- Key mappings esp global shortcuts
- Default presence settings
- Default channel settings
- Default user settings