163 lines
5.8 KiB
JavaScript
163 lines
5.8 KiB
JavaScript
import { AddDiv, AddDomElement, CreateDomElement } from '../engine/viewer/domutils.js';
|
|
import { AddCheckbox, AddNumberInput, AddRadioButton } from '../website/utils.js';
|
|
import { ButtonDialog } from './dialog.js';
|
|
import { DownloadUrlAsFile } from './utils.js';
|
|
import { CookieGetBoolVal, CookieGetIntVal, CookieGetStringVal, CookieSetBoolVal, CookieSetIntVal, CookieSetStringVal } from './cookiehandler.js';
|
|
import { HandleEvent } from './eventhandler.js';
|
|
|
|
export function ShowSnapshotDialog (viewer)
|
|
{
|
|
function AddSizeRadioButton (parentDiv, id, text, isSelected, onChange)
|
|
{
|
|
let line = AddDiv (parentDiv, 'ov_dialog_row');
|
|
AddRadioButton (line, id, 'snapshot_size', text, isSelected, onChange);
|
|
}
|
|
|
|
function GetImageUrl (viewer, size, isTransparent)
|
|
{
|
|
let width = parseInt (size[0], 10);
|
|
let height = parseInt (size[1], 10);
|
|
if (width < 1 || height < 1) {
|
|
return null;
|
|
}
|
|
return viewer.GetImageAsDataUrl (size[0], size[1], isTransparent);
|
|
}
|
|
|
|
function UpdatePreview (viewer, previewImage, size, isTransparent)
|
|
{
|
|
let url = GetImageUrl (viewer, size, isTransparent);
|
|
previewImage.src = url;
|
|
}
|
|
|
|
function UpdateCustomStatus (sizes, customIndex, selectedIndex)
|
|
{
|
|
let customSize = sizes[customIndex];
|
|
customSize.widthInput.disabled = (selectedIndex !== customIndex);
|
|
customSize.heightInput.disabled = (selectedIndex !== customIndex);
|
|
}
|
|
|
|
function GetSize (sizes, selectedIndex)
|
|
{
|
|
let selectedSize = sizes[selectedIndex];
|
|
if (selectedSize.size !== null) {
|
|
return selectedSize.size;
|
|
} else {
|
|
return [
|
|
selectedSize.widthInput.value,
|
|
selectedSize.heightInput.value
|
|
];
|
|
}
|
|
}
|
|
|
|
function AddWidthHeightNumberInput (parentDiv, text, onChange)
|
|
{
|
|
let line = AddDiv (parentDiv, 'ov_dialog_row');
|
|
AddDiv (line, 'ov_snapshot_dialog_param_name', text);
|
|
let numberInput = AddNumberInput (line, 'ov_dialog_text', onChange);
|
|
numberInput.classList.add ('ov_snapshot_dialog_param_value');
|
|
numberInput.addEventListener ('focus', () => {
|
|
numberInput.setSelectionRange (0, numberInput.value.length);
|
|
});
|
|
return numberInput;
|
|
}
|
|
|
|
let selectedIndex = 0;
|
|
let isTransparent = CookieGetBoolVal ('ov_last_snapshot_transparent', false);
|
|
let customIndex = 3;
|
|
let sizes = [
|
|
{
|
|
name : 'Small (1280x720)',
|
|
size : [1280, 720]
|
|
},
|
|
{
|
|
name : 'Medium (1920x1080)',
|
|
size : [1920, 1080]
|
|
},
|
|
{
|
|
name : 'Large (2560x1440)',
|
|
size : [2560, 1440]
|
|
},
|
|
{
|
|
name : 'Custom',
|
|
size : null,
|
|
widthInput : null,
|
|
heightInput : null
|
|
}
|
|
];
|
|
|
|
let dialog = new ButtonDialog ();
|
|
let contentDiv = dialog.Init ('Create Snapshot', [
|
|
{
|
|
name : 'Cancel',
|
|
subClass : 'outline',
|
|
onClick () {
|
|
dialog.Close ();
|
|
}
|
|
},
|
|
{
|
|
name : 'Create',
|
|
onClick () {
|
|
dialog.Close ();
|
|
HandleEvent ('snapshot_created', sizes[selectedIndex].name);
|
|
let url = GetImageUrl (viewer, GetSize (sizes, selectedIndex), isTransparent);
|
|
if (url !== null) {
|
|
DownloadUrlAsFile (url, 'model.png');
|
|
}
|
|
}
|
|
}
|
|
]);
|
|
|
|
let dialogDiv = dialog.GetContentDiv ();
|
|
dialogDiv.classList.add ('ov_snapshot_dialog');
|
|
|
|
let previewImage = CreateDomElement ('img', 'ov_snapshot_dialog_preview');
|
|
contentDiv.appendChild (previewImage);
|
|
|
|
let optionsDiv = AddDiv (contentDiv, 'ov_snapshot_dialog_options');
|
|
|
|
let lastSnapshotSizeName = CookieGetStringVal ('ov_last_snapshot_size', sizes[1].name);
|
|
for (let i = 0; i < sizes.length; i++) {
|
|
if (lastSnapshotSizeName === sizes[i].name) {
|
|
selectedIndex = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
let customSize = sizes[customIndex];
|
|
for (let i = 0; i < sizes.length; i++) {
|
|
let size = sizes[i];
|
|
let selected = (i === selectedIndex);
|
|
AddSizeRadioButton (optionsDiv, 'snapshot_' + i.toString (), size.name, selected, () => {
|
|
selectedIndex = i;
|
|
CookieSetStringVal ('ov_last_snapshot_size', size.name);
|
|
UpdatePreview (viewer, previewImage, GetSize (sizes, i), isTransparent);
|
|
UpdateCustomStatus (sizes, customIndex, selectedIndex);
|
|
});
|
|
}
|
|
|
|
customSize.widthInput = AddWidthHeightNumberInput (optionsDiv, 'Width', (val) => {
|
|
UpdatePreview (viewer, previewImage, GetSize (sizes, selectedIndex), isTransparent);
|
|
CookieSetIntVal ('ov_snapshot_custom_width', val);
|
|
});
|
|
customSize.heightInput = AddWidthHeightNumberInput (optionsDiv, 'Height', (val) => {
|
|
UpdatePreview (viewer, previewImage, GetSize (sizes, selectedIndex), isTransparent);
|
|
CookieSetIntVal ('ov_snapshot_custom_height', val);
|
|
});
|
|
customSize.widthInput.value = CookieGetIntVal ('ov_snapshot_custom_width', 1000);
|
|
customSize.heightInput.value = CookieGetIntVal ('ov_snapshot_custom_height', 1000);
|
|
UpdateCustomStatus (sizes, customIndex, selectedIndex);
|
|
|
|
AddDomElement (optionsDiv, 'div', 'ov_snapshot_dialog_separator', null);
|
|
|
|
let transparentCheckbox = AddCheckbox (optionsDiv, 'snapshot_transparent_background', 'Transparent background', isTransparent, () => {
|
|
isTransparent = transparentCheckbox.checked;
|
|
UpdatePreview (viewer, previewImage, GetSize (sizes, selectedIndex), isTransparent);
|
|
CookieSetBoolVal ('ov_last_snapshot_transparent', isTransparent);
|
|
});
|
|
|
|
UpdatePreview (viewer, previewImage, GetSize (sizes, selectedIndex), isTransparent);
|
|
|
|
dialog.Open ();
|
|
return dialog;
|
|
}
|