mirror of
https://github.com/JannisX11/blockbench.git
synced 2025-04-06 17:31:09 +08:00
WIP predicate override editor
Auto-shift dialogs into screen when size changes
This commit is contained in:
parent
1d8e134267
commit
fed2652da3
@ -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;
|
||||
|
@ -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>
|
||||
|
@ -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);
|
||||
|
@ -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
126
js/predicate_editor.js
Normal 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();
|
||||
}
|
||||
})
|
||||
})
|
20
lang/en.json
20
lang/en.json
@ -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",
|
||||
|
Loading…
x
Reference in New Issue
Block a user