Add plugin settings in plugin dialog

Adjust bedrock display setting to match in game angle
This commit is contained in:
JannisX11 2023-10-16 21:40:20 +02:00
parent e7b69b2935
commit 5a0849330d
5 changed files with 140 additions and 54 deletions

View File

@ -486,54 +486,54 @@
/*Settings*/
#settingslist {
.settings_list {
width: 100%;
max-height: 600px;
overflow-y: scroll;
clear: both;
}
#settingslist li {
.settings_list li {
padding: 2px 1px;
margin: 4px 0;
}
#settingslist li.has_profile_override {
.settings_list li.has_profile_override {
border: 1px solid var(--color-profile);
padding: 1px 0;
position: relative;
}
#settingslist .setting_profile_clear_button {
.settings_list .setting_profile_clear_button {
position: absolute;
top: 4px;
right: 0;
}
#settingslist li:hover input[type=checkbox] {
.settings_list li:hover input[type=checkbox] {
color: var(--color-light);
}
#settingslist .setting_element {
.settings_list .setting_element {
width: 50px;
text-align: center;
float: left;
margin-top: 12px;
}
#settingslist input[type=checkbox] {
.settings_list input[type=checkbox] {
margin-top: -6px;
}
#settingslist input[type=checkbox]::before {
.settings_list input[type=checkbox]::before {
font-size: 18pt;
}
#settingslist li > .setting_icon {
.settings_list li > .setting_icon {
margin-top: 8px;
}
#settingslist li > .setting_label {
.settings_list li > .setting_label {
display: inline-block;
margin-left: 8px;
width: calc(100% - 60px);
}
#settingslist .setting_name {
.settings_list .setting_name {
font-size: 1.1em;
display: inline-block;
}
#settingslist .setting_description {
.settings_list .setting_description {
font-size: 0.94em;
color: var(--color-subtle_text);
}
@ -553,7 +553,7 @@
.setting_profile_value_indicator:hover {
opacity: 1;
}
#settingslist input[type=number] {
.settings_list input[type=number] {
height: 28px;
width: 100%;
background-color: var(--color-back);
@ -561,24 +561,24 @@
padding-left: 4px;
text-align: right;
}
#settingslist input[type=text], #settingslist input[type=password] {
.settings_list input[type=text], .settings_list input[type=password] {
padding: 10px;
margin-left: 5px;
vertical-align: bottom;
}
#settingslist div.bar_select {
.settings_list div.bar_select {
margin: 8px;
width: 96%;
}
#settingslist div.bar_select select {
.settings_list div.bar_select select {
width: 100%;
}
#settingslist li .setting_icon i {
.settings_list li .setting_icon i {
font-size: 26pt;
width: 34px;
margin-top: -6px;
}
#settingslist li:hover .setting_icon i {
.settings_list li:hover .setting_icon i {
color: var(--color-light);
}
.password_toggle {
@ -1443,16 +1443,19 @@ dialog#edit_bedrock_binding > .dialog_wrapper > .dialog_content {
overflow: hidden;
max-width: unset;
}
#plugin_browser_info {
#plugin_browser_details {
padding: 8px 24px;
}
#plugin_browser_info tr:nth-child(even) {
#plugin_browser_details tr:nth-child(even) {
background-color: var(--color-back);
}
#plugin_browser_info td {
#plugin_browser_details td {
padding: 5px 2px;
line-height: 20px;
}
#plugin_browser_page .settings_list {
padding: 4px 20px;
}
#plugin_browser_start_page > img {

View File

@ -681,15 +681,15 @@
}
.numeric_input > div.tool {
position: absolute;
width: 22px;
width: 18px;
right: 1px;
top: 0;
color: var(--color-subtle_text);
cursor: ew-resize;
}
.numeric_input > div.tool > i {
font-size: 20px;
margin-top: 5px;
font-size: 18px;
margin-top: 6px;
}
div.nslide {

View File

@ -2146,7 +2146,7 @@ BARS.defineActions(function() {
Project.model_3d.position.set(-20, 21, 0);
Project.model_3d.rotation.set(
Math.degToRad(-95),
Math.degToRad(44),
Math.degToRad(45),
Math.degToRad(115),
'ZYX'
);

View File

@ -32,6 +32,7 @@ class Setting {
this.name = data.name || tl(`settings.${id}`);
this.description = data.description || tl(`settings.${id}.desc`);
this.launch_setting = data.launch_setting || false;
this.plugin = data.plugin || (typeof Plugins != 'undefined' ? Plugins.currently_loading : '');
if (this.type == 'number') {
this.min = data.min;
@ -962,7 +963,7 @@ onVueSetup(function() {
<search-bar id="settings_search_bar" v-model="search_term"></search-bar>
<ul id="settingslist">
<ul class="settings_list" id="settingslist">
<li v-for="(setting, key) in list" v-if="Condition(setting.condition)"
v-on="setting.click ? {click: setting.click} : {}"

View File

@ -54,7 +54,7 @@ class Plugin {
this.source = 'store';
this.creation_date = 0;
this.await_loading = false;
this.info = null;
this.details = null;
this.about_fetched = false;
this.disabled = false;
this.new_repository_format = false;
@ -512,9 +512,9 @@ class Plugin {
this.about_fetched = true;
}
}
getPluginInfo() {
if (this.info) return this.info;
this.info = {
getPluginDetails() {
if (this.details) return this.details;
this.details = {
version: this.version,
last_modified: 'N/A',
creation_date: 'N/A',
@ -543,13 +543,12 @@ class Plugin {
} else {
label = date.toLocaleDateString();
}
console.log(label),
this.info[key] = label;
this.info[key + '_full'] = date.toLocaleDateString() + ' ' + date.toLocaleTimeString();
this.details[key] = label;
this.details[key + '_full'] = date.toLocaleDateString() + ' ' + date.toLocaleTimeString();
}
if (this.source == 'store') {
this.info.issue_url = `https://github.com/JannisX11/blockbench-plugins/issues/new?title=[${this.title}]`;
this.info.source = `https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/${this.id + (this.new_repository_format ? '' : '.js')}`;
this.details.issue_url = `https://github.com/JannisX11/blockbench-plugins/issues/new?title=[${this.title}]`;
this.details.source = `https://github.com/JannisX11/blockbench-plugins/tree/master/plugins/${this.id + (this.new_repository_format ? '' : '.js')}`;
let github_path = (this.new_repository_format ? (this.id+'/'+this.id) : this.id) + '.js';
let commit_url = `https://api.github.com/repos/JannisX11/blockbench-plugins/commits?path=plugins/${github_path}`;
@ -557,7 +556,6 @@ class Plugin {
console.error('Cannot access commit info for ' + this.id, err);
}).then(async response => {
let commits = await response.json().catch(err => console.error(err));
console.log(response, commits)
if (!commits || !commits.length) return;
trackDate(Date.parse(commits[0].commit.committer.date), 'last_modified');
@ -570,7 +568,7 @@ class Plugin {
if (this.creation_date) {
trackDate(this.creation_date, 'creation_date');
}
return this.info;
return this.details;
}
}
Plugin.prototype.menu = new Menu([
@ -830,6 +828,7 @@ BARS.defineActions(function() {
selected_plugin: null,
page: 0,
per_page: 25,
settings: settings,
isMobile: Blockbench.isMobile,
},
computed: {
@ -890,6 +889,16 @@ BARS.defineActions(function() {
pages.push(i);
}
return pages;
},
selected_plugin_settings() {
if (!this.selected_plugin) return {};
let plugin_settings = {};
for (let id in this.settings) {
if (settings[id].plugin == this.selected_plugin.id) {
plugin_settings[id] = settings[id];
}
}
return plugin_settings;
}
},
methods: {
@ -941,6 +950,29 @@ BARS.defineActions(function() {
reduceLink(url) {
return url.replace('https://', '').substring(0, 50)+'...';
},
// Settings
saveSettings() {
Settings.saveLocalStorages();
},
settingContextMenu(setting, event) {
new Menu([
{
name: 'dialog.settings.reset_to_default',
icon: 'replay',
click: () => {
setting.ui_value = setting.default_value;
this.saveSettings();
}
}
]).open(event);
},
getProfileValuesForSetting(key) {
return SettingsProfile.all.filter(profile => {
return profile.settings[key] !== undefined;
});
},
getIconNode: Blockbench.getIconNode,
pureMarked,
tl
@ -1043,7 +1075,7 @@ BARS.defineActions(function() {
<ul id="plugin_browser_page_tab_bar">
<li :class="{selected: page_tab == 'about'}" @click="page_tab = 'about'">About</li>
<li :class="{selected: page_tab == 'info'}" @click="page_tab = 'info'">Info</li>
<li :class="{selected: page_tab == 'details'}" @click="page_tab = 'details'">Details</li>
<li :class="{selected: page_tab == 'settings'}" @click="page_tab = 'settings'" v-if="selected_plugin.installed">Settings</li>
<li :class="{selected: page_tab == 'features'}" @click="page_tab = 'features'" v-if="selected_plugin.installed">Features</li>
</ul>
@ -1053,54 +1085,104 @@ BARS.defineActions(function() {
<div class="about markdown" v-show="page_tab == 'about'" v-if="selected_plugin.about" v-html="formatAbout(selected_plugin.about)">
</div>
<table v-if="page_tab == 'info'" id="plugin_browser_info">
<table v-if="page_tab == 'details'" id="plugin_browser_details">
<tbody>
<tr>
<td>Author</td>
<td>{{ selected_plugin.getPluginInfo().author }}</td>
<td>{{ selected_plugin.getPluginDetails().author }}</td>
</tr>
<tr>
<td>Version</td>
<td>{{ selected_plugin.info.version }}</td>
<td>{{ selected_plugin.details.version }}</td>
</tr>
<tr>
<td>Last Updated</td>
<td :title="selected_plugin.info.last_modified_full">{{ selected_plugin.info.last_modified }}</td>
<td :title="selected_plugin.details.last_modified_full">{{ selected_plugin.details.last_modified }}</td>
</tr>
<tr>
<td>Published</td>
<td :title="selected_plugin.info.creation_date_full">{{ selected_plugin.info.creation_date }}</td>
<td :title="selected_plugin.details.creation_date_full">{{ selected_plugin.details.creation_date }}</td>
</tr>
<tr>
<td>Required Blockbench version</td>
<td>{{ selected_plugin.info.min_version }}</td>
<td>{{ selected_plugin.details.min_version }}</td>
</tr>
<tr v-if="selected_plugin.info.max_version">
<tr v-if="selected_plugin.details.max_version">
<td>Maximum allowed Blockbench version</td>
<td>{{ selected_plugin.info.max_version }}</td>
<td>{{ selected_plugin.details.max_version }}</td>
</tr>
<tr>
<td>Supported Variants</td>
<td>{{ capitalizeFirstLetter(selected_plugin.info.variant || '') }}</td>
<td>{{ capitalizeFirstLetter(selected_plugin.details.variant || '') }}</td>
</tr>
<tr>
<td>Installations per Week</td>
<td>{{ selected_plugin.info.weekly_installations }}</td>
<td>{{ selected_plugin.details.weekly_installations }}</td>
</tr>
<tr v-if="selected_plugin.info.website">
<tr v-if="selected_plugin.details.website">
<td>Website</td>
<td>{{ selected_plugin.info.website }}</td>
<td>{{ selected_plugin.details.website }}</td>
</tr>
<tr v-if="selected_plugin.info.source">
<tr v-if="selected_plugin.details.source">
<td>Plugin Source</td>
<td><a :href="selected_plugin.info.source" :title="selected_plugin.info.source">{{ reduceLink(selected_plugin.info.source) }}</a></td>
<td><a :href="selected_plugin.details.source" :title="selected_plugin.details.source">{{ reduceLink(selected_plugin.details.source) }}</a></td>
</tr>
<tr v-if="selected_plugin.info.issue_url">
<tr v-if="selected_plugin.details.issue_url">
<td>Report issue</td>
<td><a :href="selected_plugin.info.issue_url" :title="selected_plugin.info.issue_url">{{ reduceLink(selected_plugin.info.issue_url) }}</a></td>
<td><a :href="selected_plugin.details.issue_url" :title="selected_plugin.details.issue_url">{{ reduceLink(selected_plugin.details.issue_url) }}</a></td>
</tr>
</tbody>
</table>
<div v-if="page_tab == 'settings'">
<ul class="settings_list">
<li v-for="(setting, key) in selected_plugin_settings" v-if="Condition(setting.condition)"
v-on="setting.click ? {click: setting.click} : {}"
@contextmenu="settingContextMenu(setting, $event)"
>
<template v-if="setting.type === 'number'">
<div class="setting_element"><numeric-input v-model.number="setting.ui_value" :min="setting.min" :max="setting.max" :step="setting.step" v-on:input="saveSettings()" /></div>
</template>
<template v-else-if="setting.type === 'click'">
<div class="setting_element setting_icon" v-html="getIconNode(setting.icon).outerHTML"></div>
</template>
<template v-else-if="setting.type == 'toggle'"><!--TOGGLE-->
<div class="setting_element"><input type="checkbox" v-model="setting.ui_value" v-bind:id="'setting_'+key" v-on:click="saveSettings()"></div>
</template>
<div class="setting_label">
<label class="setting_name" v-bind:for="'setting_'+key">{{ setting.name }}</label>
<div class="setting_profile_value_indicator"
v-for="profile_here in getProfileValuesForSetting(key)"
:style="{'--color-profile': markerColors[profile_here.color] && markerColors[profile_here.color].standard}"
:class="{active: profile_here.isActive()}"
:title="tl('Has override in profile ' + profile_here.name)"
@click.stop="profile = (profile == profile_here) ? null : profile_here"
/>
<div class="setting_description">{{ setting.description }}</div>
</div>
<template v-if="setting.type === 'text'">
<input type="text" class="dark_bordered" style="width: 96%" v-model="setting.ui_value" v-on:input="saveSettings()">
</template>
<template v-if="setting.type === 'password'">
<input :type="setting.hidden ? 'password' : 'text'" class="dark_bordered" style="width: calc(96% - 28px);" v-model="setting.ui_value" v-on:input="saveSettings()">
<div class="password_toggle" @click="setting.hidden = !setting.hidden;">
<i class="fas fa-eye-slash" v-if="setting.hidden"></i>
<i class="fas fa-eye" v-else></i>
</div>
</template>
<template v-else-if="setting.type === 'select'">
<div class="bar_select">
<select-input v-model="setting.ui_value" :options="setting.options" />
</div>
</template>
</li>
</ul>
</div>
<div v-if="page_tab == 'features'">
Tools
Actions