WIP predicate override editor

Auto-shift dialogs into screen when size changes
This commit is contained in:
JannisX11 2022-10-17 18:59:36 +02:00
parent 1d8e134267
commit fed2652da3
6 changed files with 160 additions and 0 deletions

View File

@ -616,6 +616,10 @@
input[type=radio][disabled=disabled] {
color: var(--color-subtle_text);
}
input:-webkit-autofill,
input:-webkit-autofill:focus {
transition: background-color 600000s 0s, color 600000s 0s;
}
div.nslide {
position: relative;

View File

@ -136,6 +136,7 @@
<script src="js/animations/timeline.js"></script>
<script src="js/preview/preview_scenes.js"></script>
<script src="js/validator.js"></script>
<script src="js/predicate_editor.js"></script>
<script src="js/plugin_loader.js"></script>
<script src="js/io/codec.js"></script>

View File

@ -680,6 +680,14 @@ window.Dialog = class Dialog {
})
jq_dialog.css('position', 'absolute')
}
let sanitizePosition = () => {
if (this.object.clientHeight + this.object.offsetTop - 26 > Interface.page_wrapper.clientHeight) {
this.object.style.top = Math.max(Interface.page_wrapper.clientHeight - this.object.clientHeight + 26, 26) + 'px';
console.log(this.object.style.top, Interface.page_wrapper.clientHeight, this.object.clientHeight)
}
}
sanitizePosition();
this.resize_observer = new ResizeObserver(sanitizePosition).observe(this.object);
if (typeof this.onBuild == 'function') {
this.onBuild(this.object);

View File

@ -358,6 +358,7 @@ const MenuBar = {
'swap_tools',
'action_control',
'_',
'predicate_overrides',
'convert_to_mesh',
'remove_blank_faces',
])

126
js/predicate_editor.js Normal file
View File

@ -0,0 +1,126 @@
const PredicateOverrideEditor = {
dialog: null,
showDialog() {
PredicateOverrideEditor.dialog = PredicateOverrideEditor.dialog || new Dialog({
id: 'predicate_overrides',
title: 'action.predicate_overrides',
width: 700,
component: {
data() {return {
overrides: [],
name: '',
search_term: '',
model_options: [],
predicate_options: {
custom_model_data: {type: 'number'},
damage: {type: 'number'},
damaged: {type: 'checkbox'},
lefthanded: {type: 'checkbox'},
angle: {type: 'number', filter: 'compass'},
time: {type: 'number', filter: 'clock'},
blocking: {type: 'checkbox', filter: 'shield'},
broken: {type: 'checkbox', filter: 'elytra'},
cast: {type: 'number', filter: 'fishing_rod'},
cooldown: {type: 'number', filter: ['ender_pearl', 'chorus_fruit']},
pull: {type: 'number', filter: ['bow', 'crossbow']},
pulling: {type: 'checkbox', filter: ['bow', 'crossbow']},
charged: {type: 'checkbox', filter: 'crossbow'},
firework: {type: 'checkbox', filter: 'crossbow'},
throwing: {type: 'checkbox', filter: 'trident'},
level: {type: 'number', filter: 'light'},
filled: {type: 'number', filter: 'bundle'},
}
}},
methods: {
},
computed: {
available_predicate_options() {
let options = {};
for (let key in this.predicate_options) {
let data = this.predicate_options[key];
if ((typeof data.filter == 'string' && data.filter !== this.name) || (data.filter instanceof Array && !data.filter.includes(this.name))) continue;
options[key] = tl(`dialog.predicate_overrides.predicate.${key}`);
}
return options;
}
},
template: `
<div style="margin-top: 10px;">
<div class="bar">
<search-bar id="predicate_search_bar" v-model="search_term"></search-bar>
</div>
<div class="bar" style="display: flex;">
<div>Model</div>
<div>Predicates</div>
</div>
<ul class="list" id="predicate_list">
<li v-for="override in overrides">
<div>
<input type="text" v-model="override.model" class="dark_bordered" list="predicate_model_list">
</div>
</li>
</ul>
</div>
`
},
onClose() {
Project.saved = false;
if (Project.overrides instanceof Array == false) Project.overrides = [];
Project.overrides.replace(dialog.content_vue.overrides);
model_options_datalist.remove();
}
});
let model_options_datalist = Interface.createElement('datalist', {id: 'predicate_model_list'});
let model_options = [];
let {dialog} = PredicateOverrideEditor;
dialog.show();
dialog.content_vue.name = Project.name;
dialog.content_vue.overrides.replace(Project.overrides || []);
if (isApp && Project.export_path) {
let path_array = Project.export_path.split(/[\\\/]/g);
let base_path = path_array.slice(0, path_array.lastIndexOf('models')+1).join(osfs);
let searchFolder = (path) => {
try {
var files = fs.readdirSync(path);
for (var name of files) {
var new_path = path + osfs + name;
if (name.match(/\.json$/)) {
let rel_path = new_path.replace(base_path, '').replace(/^[\\\/]/, '').replace(/\.json$/, '').replace(/\\+/g, '/');
model_options.push(rel_path);
if (model_options.length > 2000) return false;
} else if (!name.includes('.')) {
let result = searchFolder(new_path);
if (result) return false;
}
}
} catch (err) {}
}
searchFolder(base_path);
}
model_options.forEach(model => {
let option = Interface.createElement('option', {value: model})
model_options_datalist.append(option);
})
document.body.append(model_options_datalist);
}
}
BARS.defineActions(function() {
new Action('predicate_overrides', {
icon: 'format_list_bulleted',
category: 'tools',
condition: {formats: ['java_block']},
click(e) {
PredicateOverrideEditor.showDialog();
}
})
})

View File

@ -587,6 +587,24 @@
"dialog.flip_animation.offset": "Offset by half the animation length",
"dialog.flip_animation.show_in_timeline": "Show modified bones in timeline",
"dialog.predicate_overrides.predicate.angle": "Compass Angle",
"dialog.predicate_overrides.predicate.blocking": "Is Blocking",
"dialog.predicate_overrides.predicate.broken": "Is Broken",
"dialog.predicate_overrides.predicate.cast": "Is Cast",
"dialog.predicate_overrides.predicate.cooldown": "Cooldown",
"dialog.predicate_overrides.predicate.damage": "Damage",
"dialog.predicate_overrides.predicate.damaged": "Is Damaged",
"dialog.predicate_overrides.predicate.lefthanded": "Is Left-Handed",
"dialog.predicate_overrides.predicate.pull": "Pull Amount",
"dialog.predicate_overrides.predicate.pulling": "Is Pulling",
"dialog.predicate_overrides.predicate.charged": "Is Charged",
"dialog.predicate_overrides.predicate.firework": "Has Firework",
"dialog.predicate_overrides.predicate.throwing": "Ready to Throw",
"dialog.predicate_overrides.predicate.time": "Time of Day",
"dialog.predicate_overrides.predicate.custom_model_data": "Custom Model Data",
"dialog.predicate_overrides.predicate.level": "Light Level",
"dialog.predicate_overrides.predicate.filled": "Bundle Fill Level",
"dialog.export_private_settings.title": "Private Settings",
"dialog.export_private_settings.message": "Your file contains the following private informations: **%0**. Leave these values out if you plan to share the file with someone else.",
"dialog.export_private_settings.keep": "Keep",
@ -1273,6 +1291,8 @@
"action.gui_light.desc": "Select the way the item is lit in the inventory",
"action.gui_light.side": "Side Light",
"action.gui_light.front": "Front Light",
"action.predicate_overrides": "Edit Predicate Overrides...",
"action.predicate_overrides.desc": "Select models to override this model based on selected conditions",
"action.move_up": "Move Up",
"action.move_up.desc": "Move the selected elements up relative to the current camera angle",