[IMP] web_widget_model_viewer: black, isort, prettier

pull/2044/head
Marco Colombo 2021-10-07 13:22:00 +02:00
parent 495b040f12
commit 1e6942bd3f
5 changed files with 123 additions and 66 deletions

View File

@ -0,0 +1 @@
../../../../web_widget_model_viewer

View File

@ -0,0 +1,6 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

View File

@ -1,34 +1,33 @@
// Copyright 2020 Lorenzo Battistini @ TAKOBI // Copyright 2020 Lorenzo Battistini @ TAKOBI
// Copyright 2020 Andrea Piovesana @ Openindustry.it // Copyright 2020 Andrea Piovesana @ Openindustry.it
odoo.define('web_widget_model_viewer.FieldBinaryModelViewer', function (require) { odoo.define("web_widget_model_viewer.FieldBinaryModelViewer", function (require) {
"use strict"; "use strict";
var BasicFields = require('web.basic_fields'); var BasicFields = require("web.basic_fields");
var core = require('web.core'); var core = require("web.core");
var registry = require('web.field_registry'); var registry = require("web.field_registry");
var session = require('web.session'); var session = require("web.session");
var utils = require('web.utils'); var utils = require("web.utils");
var _t = core._t; var _t = core._t;
var qweb = core.qweb; var qweb = core.qweb;
var FieldBinaryModelViewer = BasicFields.FieldBinaryFile.extend({ var FieldBinaryModelViewer = BasicFields.FieldBinaryFile.extend({
template: 'FieldBinaryModelViewer', template: "FieldBinaryModelViewer",
events: _.extend({}, BasicFields.FieldBinaryFile.prototype.events, { events: _.extend({}, BasicFields.FieldBinaryFile.prototype.events, {
'click': function () { click: function () {
if (this.mode === "readonly") { if (this.mode === "readonly") {
this.trigger_up('bounce_edit'); this.trigger_up("bounce_edit");
} }
}, },
'click #model-viewer-fullscreen': 'fullscreen', "click #model-viewer-fullscreen": "fullscreen",
}), }),
supportedFieldTypes: ['binary'], supportedFieldTypes: ["binary"],
init: function () { init: function () {
this._super.apply(this, arguments); this._super.apply(this, arguments);
var max_upload_size = this.attrs.max_upload_size; var max_upload_size = this.attrs.max_upload_size;
if (max_upload_size) { if (max_upload_size) {
this.max_upload_size = parseInt(max_upload_size) * 1024 * 1024; this.max_upload_size = parseInt(max_upload_size) * 1024 * 1024;
} } else {
else {
this.max_upload_size = 250 * 1024 * 1024; // 250M this.max_upload_size = 250 * 1024 * 1024; // 250M
} }
}, },
@ -37,61 +36,77 @@ odoo.define('web_widget_model_viewer.FieldBinaryModelViewer', function (require)
var url = ""; var url = "";
if (this.value) { if (this.value) {
if (!utils.is_bin_size(this.value)) { if (!utils.is_bin_size(this.value)) {
url = 'data:model/gltf-binary;base64,' + this.value; url = "data:model/gltf-binary;base64," + this.value;
} else { } else {
url = session.url('/web/content', { url = session.url("/web/content", {
model: this.model, model: this.model,
id: JSON.stringify(this.res_id), id: JSON.stringify(this.res_id),
field: this.name, field: this.name,
}); });
} }
} }
var $glb = $(qweb.render("FieldBinaryModelViewer-glb", {widget: this, url: url})); var $glb = $(
qweb.render("FieldBinaryModelViewer-glb", {widget: this, url: url})
);
var style = this.attrs.style; var style = this.attrs.style;
if (style) { if (style) {
$glb.attr('style', style); $glb.attr("style", style);
} }
this.$('> model-viewer').remove(); this.$("> model-viewer").remove();
this.$el.prepend($glb); this.$el.prepend($glb);
$glb.on('error', function () { $glb.on("error", function () {
self._clearFile(); self._clearFile();
$glb.attr('src', ""); $glb.attr("src", "");
self.do_warn(_t("3D model"), _t("Could not display the selected model.")); self.do_warn(
_t("3D model"),
_t("Could not display the selected model.")
);
}); });
}, },
fullscreen: function (ev) { fullscreen: function (ev) {
var isFullscreenAvailable = document.fullscreenEnabled || document.mozFullScreenEnabled || document.webkitFullscreenEnabled || document.msFullscreenEnabled || false; var isFullscreenAvailable =
document.fullscreenEnabled ||
document.mozFullScreenEnabled ||
document.webkitFullscreenEnabled ||
document.msFullscreenEnabled ||
false;
var modelViewerElem = ev.target.parentElement.parentElement.parentElement; var modelViewerElem = ev.target.parentElement.parentElement.parentElement;
if (isFullscreenAvailable) { if (isFullscreenAvailable) {
var fullscreenElement = document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement; var fullscreenElement =
document.fullscreenElement ||
document.mozFullScreenElement ||
document.webkitFullscreenElement ||
document.msFullscreenElement;
if (fullscreenElement) { if (fullscreenElement) {
if (document.exitFullscreen) { if (document.exitFullscreen) {
document.exitFullscreen(); document.exitFullscreen();
} else if (document.mozCancelFullScreen) { /* Firefox */ } else if (document.mozCancelFullScreen) {
/* Firefox */
document.mozCancelFullScreen(); document.mozCancelFullScreen();
} else if (document.webkitExitFullscreen) { /* Chrome, Safari and Opera */ } else if (document.webkitExitFullscreen) {
/* Chrome, Safari and Opera */
document.webkitExitFullscreen(); document.webkitExitFullscreen();
} else if (document.msExitFullscreen) { /* IE/Edge */ } else if (document.msExitFullscreen) {
/* IE/Edge */
document.msExitFullscreen(); document.msExitFullscreen();
} }
} } else if (modelViewerElem.requestFullscreen) {
else {
if (modelViewerElem.requestFullscreen) {
modelViewerElem.requestFullscreen(); modelViewerElem.requestFullscreen();
} else if (modelViewerElem.mozRequestFullScreen) { /* Firefox */ } else if (modelViewerElem.mozRequestFullScreen) {
/* Firefox */
modelViewerElem.mozRequestFullScreen(); modelViewerElem.mozRequestFullScreen();
} else if (modelViewerElem.webkitRequestFullscreen) { /* Chrome, Safari and Opera */ } else if (modelViewerElem.webkitRequestFullscreen) {
/* Chrome, Safari and Opera */
modelViewerElem.webkitRequestFullscreen(); modelViewerElem.webkitRequestFullscreen();
} else if (modelViewerElem.msRequestFullscreen) { /* IE/Edge */ } else if (modelViewerElem.msRequestFullscreen) {
/* IE/Edge */
modelViewerElem.msRequestFullscreen(); modelViewerElem.msRequestFullscreen();
} }
} } else {
}
else {
console.error("ERROR : full screen not supported by web browser"); console.error("ERROR : full screen not supported by web browser");
} }
}, },
}); });
registry.add('model_viewer', FieldBinaryModelViewer); registry.add("model_viewer", FieldBinaryModelViewer);
}); });

View File

@ -1,16 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8" ?>
<templates id="template" xml:space="preserve"> <templates id="template" xml:space="preserve">
<t t-name="FieldBinaryModelViewer"> <t t-name="FieldBinaryModelViewer">
<div class="o_field_image" aria-atomic="true" style="background-color: #FFFFFF;"> <div
class="o_field_image"
aria-atomic="true"
style="background-color: #FFFFFF;"
>
<t t-if="widget.mode !== 'readonly'"> <t t-if="widget.mode !== 'readonly'">
<div class="o_form_image_controls"> <div class="o_form_image_controls">
<button class="fa fa-pencil float-left o_select_file_button fa-2x" title="Edit" aria-label="Edit"/> <button
<button class="fa fa-trash-o float-right o_clear_file_button fa-2x" title="Clear" aria-label="Clear"/> class="fa fa-pencil float-left o_select_file_button fa-2x"
title="Edit"
aria-label="Edit"
/>
<button
class="fa fa-trash-o float-right o_clear_file_button fa-2x"
title="Clear"
aria-label="Clear"
/>
<span class="o_form_binary_progress">Uploading...</span> <span class="o_form_binary_progress">Uploading...</span>
<t t-call="HiddenInputFile"> <t t-call="HiddenInputFile">
<t t-set="image_only" t-value="true"/> <t t-set="image_only" t-value="true" />
<t t-set="fileupload_id" t-value="widget.fileupload_id"/> <t t-set="fileupload_id" t-value="widget.fileupload_id" />
</t> </t>
</div> </div>
</t> </t>
@ -23,10 +35,16 @@
t-att-name="widget.name" t-att-name="widget.name"
alt="3D model" alt="3D model"
auto-rotate="1" auto-rotate="1"
camera-controls="1"> camera-controls="1"
>
<div class="text-center mt-2 mb-2 mr-2"> <div class="text-center mt-2 mb-2 mr-2">
<span id="model-viewer-fullscreen" title="View fullscreen" role="img" aria-label="Fullscreen"> <span
<i class="fa fa-arrows-alt fa-2x"/> id="model-viewer-fullscreen"
title="View fullscreen"
role="img"
aria-label="Fullscreen"
>
<i class="fa fa-arrows-alt fa-2x" />
</span> </span>
</div> </div>
</model-viewer> </model-viewer>

View File

@ -1,14 +1,31 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8" ?>
<odoo> <odoo>
<template id="web_layout_model_viewer" name="Web layout Model viewer" inherit_id="web.layout"> <template
id="web_layout_model_viewer"
name="Web layout Model viewer"
inherit_id="web.layout"
>
<xpath expr="//meta[@name='viewport']" position="after"> <xpath expr="//meta[@name='viewport']" position="after">
<script type="module" src="/web_widget_model_viewer/static/lib/model-viewer.min.js" /> <script
<script nomodule="1" src="/web_widget_model_viewer/static/lib/model-viewer-legacy.js" /> type="module"
src="/web_widget_model_viewer/static/lib/model-viewer.min.js"
/>
<script
nomodule="1"
src="/web_widget_model_viewer/static/lib/model-viewer-legacy.js"
/>
</xpath> </xpath>
</template> </template>
<template id="assets_backend" name="web_widget_model_viewer assets" inherit_id="web.assets_backend"> <template
id="assets_backend"
name="web_widget_model_viewer assets"
inherit_id="web.assets_backend"
>
<xpath expr="." position="inside"> <xpath expr="." position="inside">
<script type="text/javascript" src="/web_widget_model_viewer/static/src/js/web_widget_model_viewer.js" /> <script
type="text/javascript"
src="/web_widget_model_viewer/static/src/js/web_widget_model_viewer.js"
/>
</xpath> </xpath>
</template> </template>
</odoo> </odoo>