1
0
Fork 0
mirror of https://github.com/FrankerFaceZ/FrankerFaceZ.git synced 2025-07-30 06:28:31 +00:00

4.0.0-rc19.1

* Changed: Remember which sections of the settings menu a user has expanded and restore that state when re-opening the menu.
* Changed: Begin tracking which settings a user has seen, so that a future update can begin highlighting newly added settings.
* Changed: Clean up the new localization code a bit more.
This commit is contained in:
SirStendec 2019-05-03 22:36:26 -04:00
parent 35316b8827
commit 3e9e1b2ede
21 changed files with 242 additions and 38 deletions

View file

@ -41,6 +41,7 @@ export default class MainMenu extends Module {
this.dialog = new Dialog(() => this.buildDialog());
this.has_update = false;
this.opened = false;
this.settings.addUI('profiles', {
path: 'Data Management @{"sort": 1000, "profile_warning": false} > Profiles @{"profile_warning": false}',
@ -102,6 +103,8 @@ export default class MainMenu extends Module {
if ( this._vue )
this._vue.$children[0].context.has_update = true;
});
this.scheduleUpdate();
}
openPopout() {
@ -130,7 +133,16 @@ export default class MainMenu extends Module {
async onEnable() {
await this.site.awaitElement(Dialog.EXCLUSIVE);
this.dialog.on('hide', this.destroyDialog, this);
this.dialog.on('show', () => {
this.opened = true;
this.updateButtonUnseen();
this.emit('show')
});
this.dialog.on('hide', () => {
this.emit('hide');
this.destroyDialog();
});
this.dialog.on('resize', () => {
if ( this._vue )
this._vue.$children[0].maximized = this.dialog.maximized
@ -146,6 +158,20 @@ export default class MainMenu extends Module {
}
getUnseen() {
const pages = this.getSettingsTree();
if ( ! Array.isArray(pages) )
return 0;
let i=0;
for(const page of pages)
if ( page )
i += (page.unseen || 0);
return i;
}
buildDialog() {
if ( this._menu )
return this._menu;
@ -174,10 +200,19 @@ export default class MainMenu extends Module {
}
updateButtonUnseen() {
const mb = this.resolve('site.menu_button');
if ( mb )
mb.new_settings = this.opened ? 0 : this.getUnseen();
}
updateLiveMenu() {
clearTimeout(this._update_timer);
this._update_timer = null;
this.updateButtonUnseen();
if ( ! this._vue || ! this._vue.$children || ! this._vue.$children[0] )
return;
@ -222,7 +257,6 @@ export default class MainMenu extends Module {
return;
const tree = this._settings_tree,
expanded = this.settings.provider.get('settings-expanded', {}),
tokens = def.ui.path_tokens,
len = tokens.length;
@ -241,16 +275,13 @@ export default class MainMenu extends Module {
full_key: key,
sort: 0,
parent: prefix,
expanded: prefix === null,
expanded: prefix == null,
i18n_key: `setting.${key}`,
desc_i18n_key: `setting.${key}.description`
};
Object.assign(token, raw_token);
if ( has(expanded, key) )
token.expanded = expanded[key];
prefix = key;
}
@ -268,6 +299,8 @@ export default class MainMenu extends Module {
this.rebuildSettingsTree();
const tree = this._settings_tree,
settings_seen = this.settings.provider.get('cfg-seen', []),
collapsed = this.settings.provider.get('cfg-collapsed'),
root = {},
copies = {},
@ -291,6 +324,9 @@ export default class MainMenu extends Module {
token.parent = p_key ? parent : null;
token.page = token.page || parent.page;
if ( collapsed )
token.expanded = ! collapsed.includes(token.full_key);
if ( token.page && ! token.component )
needs_component.add(token);
@ -337,6 +373,18 @@ export default class MainMenu extends Module {
tok.search_terms = terms.map(format_term).join('\n');
if ( ! settings_seen.includes(setting_key)) {
// Mark existing settings as unseen for now.
// Let users run this for a while to build up their cache.
settings_seen.push(setting_key);
/*let i = tok;
while(i) {
i.unseen = (i.unseen||0) + 1;
i = i.parent;
}*/
}
list.push(tok);
}
@ -401,9 +449,24 @@ export default class MainMenu extends Module {
return a.key && a.key.localeCompare(b.key);
});
this.log.info(`Built Tree in ${(performance.now() - started).toFixed(5)}ms with ${Object.keys(tree).length} structure nodes and ${this._settings_count} settings nodes.`);
const items = root.items || [];
items.keys = copies;
// Save for now, since we just want to mark everything as seen.
this.settings.provider.set('cfg-seen', settings_seen);
if ( ! collapsed ) {
const new_collapsed = [];
for(const key of Object.keys(copies)) {
const item = copies[key];
if ( item && item.items && item.parent )
new_collapsed.push(key);
}
this.settings.provider.set('cfg-collapsed', new_collapsed);
}
this.log.info(`Built Tree in ${(performance.now() - started).toFixed(5)}ms with ${Object.keys(tree).length} structure nodes and ${this._settings_count} settings nodes.`);
return items;
}
@ -560,9 +623,40 @@ export default class MainMenu extends Module {
return _c;
}
markSeen(item, seen) {
let had_seen = true;
if ( ! seen ) {
had_seen = false;
seen = this.settings.provider.get('cfg-seen', []);
}
if ( Array.isArray(item.contents) ) {
for(const child of item.contents)
child && this.markSeen(child, seen);
} else if ( ! item.setting )
return;
if ( ! seen.includes(item.setting) ) {
seen.push(item.setting);
let i = item.parent;
while(i) {
i.unseen = (i.unseen || 1) - 1;
i = i.parent;
}
}
if ( ! had_seen )
this.settings.provider.set('cfg-seen', seen);
}
getData() {
const settings = this.getSettingsTree(),
context = this.getContext();
context = this.getContext(),
current = this.has_update ? settings.keys['home.changelog'] : settings.keys['home'];
this.markSeen(current);
return {
context,
@ -571,14 +665,28 @@ export default class MainMenu extends Module {
faded: false,
nav: settings,
currentItem: this.has_update ?
settings.keys['home.changelog'] :
settings.keys['home'], // settings[0],
currentItem: current,
nav_keys: settings.keys,
maximized: this.dialog.maximized,
exclusive: this.dialog.exclusive,
markSeen: item => this.markSeen(item),
markExpanded: item => {
const collapsed = this.settings.provider.get('cfg-collapsed', []),
included = collapsed.indexOf(item.full_key);
if ( item.expanded && included !== -1 )
collapsed.splice(included, 1);
else if ( ! item.expanded && included === -1 )
collapsed.push(item.full_key);
else
return;
this.settings.provider.set('cfg-collapsed', collapsed);
},
resize: e => ! this.dialog.exclusive && this.dialog.toggleSize(e),
close: e => ! this.dialog.exclusive && this.dialog.toggleVisible(e),