1
0
mirror of https://github.com/psychopy/psychojs.git synced 2025-05-10 10:40:54 +00:00

src/visual

This commit is contained in:
lgtst 2023-03-24 13:20:34 +00:00
parent e92bb527e8
commit bff887b793

View File

@ -82,6 +82,10 @@ export class Survey extends VisualStim
{
super({ name, win, units, ori, depth, pos, size, autoDraw, autoLog });
// Storing all existing signaturePad questions to properly handle their resize.
// Unfortunately signaturepad question type can't handle resizing properly by itself.
this._signaturePads = [];
// whether the user is done with the survey, independently of whether the survey is completed:
this.isFinished = false;
@ -968,8 +972,6 @@ export class Survey extends VisualStim
this.psychoJS.logger.warn(`Flag _isCompletedAll is false!`);
}
this._detachResizeObservers();
this._surveyRunningPromiseResolve(completionCode);
}
@ -1017,6 +1019,10 @@ export class Survey extends VisualStim
this._surveyModel.onTextMarkdown.add(this._onTextMarkdown.bind(this));
this._surveyModel.isInitialized = true;
this._surveyModel.onAfterRenderQuestion.add(this._handleAfterQuestionRender.bind(this));
this._surveyModel.onQuestionRemoved.add(() =>
{
console.log("question removed")
})
}
const completeText = surveyIdx < this._surveyData.surveys.length - 1 ? (this._surveyModel.pageNextText || Survey.CAPTIONS.NEXT) : undefined;
@ -1137,34 +1143,58 @@ export class Survey extends VisualStim
this._lastPageSwitchHandledIdx = -1;
}
_handleSignaturePadResize(entries)
_getQuestionByNameIncludingInDesign(questionName = "")
{
for (let i = 0; i < entries.length; i++)
const allQuestions = this._surveyModel.getAllQuestions(false, true);
for (const question of allQuestions)
{
// const signatureCanvas = entries[i].target.querySelector("canvas");
const question = this._surveyModel.getQuestionByName(entries[i].target.dataset.name);
question.signatureWidth = Math.min(question.maxSignatureWidth, entries[i].contentBoxSize[0].inlineSize);
if (question.name === questionName)
{
return question;
}
}
}
_handleWindowResize(e)
{
if (this._surveyModel)
{
for (let i = this._signaturePads.length - 1; i >= 0; i--)
{
// As of writing this (24.03.2023). SurveyJS doesn't have a proper event
// for question being removed from nested locations, such as dynamic panel.
// However, surveyJS will set .signaturePad property to null once the question is removed.
// Utilising this knowledge to sync our lists.
if (this._signaturePads[ i ].question.signaturePad)
{
this._signaturePads[ i ].question.signatureWidth = Math.min(
this._signaturePads[i].question.maxSignatureWidth,
this._signaturePads[ i ].htmlElement.getBoundingClientRect().width
);
}
else
{
// Signature pad was removed. Syncing list.
this._signaturePads.splice(i, 1);
}
}
}
}
_addEventListeners()
{
this._signaturePadRO = new ResizeObserver(this._handleSignaturePadResize.bind(this));
window.addEventListener("resize", (e) => this._handleWindowResize(e));
}
_handleAfterQuestionRender (sender, options)
{
if (options.question.getType() === "signaturepad")
{
this._signaturePadRO.observe(options.htmlElement);
this._signaturePads.push(options);
options.question.signatureWidth = Math.min(options.question.maxSignatureWidth, options.htmlElement.getBoundingClientRect().width);
}
}
_detachResizeObservers()
{
this._signaturePadRO.disconnect();
}
/**
* Init the SurveyJS.io library and various extensions, setup the theme.
*