Skip to content

Commit 2865ebc

Browse files
authored
Merge branch 'master' into 158-add-searcheditfield-widget
2 parents d0af660 + abf1283 commit 2865ebc

File tree

2 files changed

+83
-27
lines changed

2 files changed

+83
-27
lines changed

widgets/+wt/+abstract/BaseExternalDialog.m

Lines changed: 82 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,59 @@
214214
end %properties
215215

216216

217+
%% Constructor
218+
methods
219+
220+
function obj = BaseExternalDialog(fig, varargin)
221+
222+
arguments
223+
% Figure parent - Empty if not provided
224+
fig matlab.ui.Figure {mustBeScalarOrEmpty} = matlab.ui.Figure.empty(0)
225+
end
226+
227+
arguments (Repeating)
228+
% Property-value pairs
229+
varargin
230+
end
231+
232+
233+
% Was a calling figure provided?
234+
if isscalar(fig) && isvalid(fig)
235+
236+
% Get the figure size
237+
posF = getpixelposition(fig);
238+
szFig = posF(3:4);
239+
240+
% Add modal image
241+
modalImage = uiimage(fig);
242+
modalImage.ImageSource = "overlay_gray.png";
243+
modalImage.ScaleMethod = "stretch";
244+
modalImage.Visible = "off";
245+
modalImage.Position = [1 1 szFig];
246+
modalImage.Tooltip = "Close the dialog box to continue using the app.";
247+
modalImage.Tag = "ModalImage";
248+
249+
end %if
250+
251+
% Call superclass constructor
252+
obj = [email protected]("Parent",[], varargin{:});
253+
254+
% Was a calling figure provided?
255+
if isscalar(fig) && isvalid(fig)
256+
257+
% Store the modal background image
258+
obj.ModalImage = modalImage;
259+
260+
% Update the modal image positioning
261+
obj.updateModalImage();
262+
263+
end %if
264+
265+
end %function
266+
267+
end %methods
268+
269+
217270

218271
%% Destructor
219272
methods
@@ -349,7 +402,10 @@ function setup(obj)
349402
% Configure the dialog
350403

351404
% Store the parent figure
352-
obj.CallingFigure = ancestor(obj,'figure');
405+
callingFig = ancestor(obj,'figure');
406+
if isscalar(callingFig)
407+
obj.CallingFigure = callingFig;
408+
end
353409

354410
% Get the size input
355411
sizeInput = obj.Size;
@@ -362,7 +418,8 @@ function setup(obj)
362418
obj.positionOverCallingFigure()
363419

364420
% Apply the same theme (R2025a and later)
365-
if ~isMATLABReleaseOlderThan("R2025a")
421+
if ~isMATLABReleaseOlderThan("R2025a") && ...
422+
isscalar(obj.CallingFigure) && isvalid(obj.CallingFigure)
366423
obj.DialogFigure.Theme = obj.CallingFigure.Theme;
367424
end
368425

@@ -393,14 +450,6 @@ function setup(obj)
393450
obj.Grid.ColumnSpacing = 5;
394451
obj.Grid.Scrollable = true;
395452

396-
% Add modal image over the app's figure
397-
obj.ModalImage = uiimage(obj.CallingFigure);
398-
obj.ModalImage.ImageSource = "overlay_gray.png";
399-
obj.ModalImage.ScaleMethod = "stretch";
400-
obj.ModalImage.Tooltip = "Close the dialog box to continue using the app.";
401-
obj.ModalImage.Visible = "off";
402-
obj.ModalImage.Position = [1 1 1 1];
403-
404453
% Add lower buttons
405454
obj.DialogButtons = wt.ButtonGrid(obj.InnerGrid,"Text",[],"Icon",[]);
406455
obj.DialogButtons.Layout.Row = 2;
@@ -483,22 +532,26 @@ function checkDeletionCriteria(obj)
483532
function positionOverCallingFigure(obj)
484533
% Positions the dialog centered over the reference figure
485534

486-
% Reference component size and position
487-
refPos = getpixelposition(obj.CallingFigure, true);
488-
refSize = refPos(3:4);
489-
refCornerA = refPos(1:2);
535+
% Is there a calling figure?
536+
if isscalar(obj.CallingFigure) && isvalid(obj.CallingFigure)
537+
538+
% Reference component size and position
539+
refPos = getpixelposition(obj.CallingFigure, true);
540+
refSize = refPos(3:4);
541+
refCornerA = refPos(1:2);
490542

491-
% Dialog size
492-
dlgSize = obj.DialogFigure.Position(3:4);
543+
% Dialog size
544+
dlgSize = obj.DialogFigure.Position(3:4);
493545

494-
% center it over the figure
546+
% center it over the figure
495547

496-
% Calculate lower-left corner
497-
dlgPos = floor((refSize - dlgSize) / 2) + refCornerA;
548+
% Calculate lower-left corner
549+
dlgPos = floor((refSize - dlgSize) / 2) + refCornerA;
498550

499-
% Set final position
500-
obj.DialogFigure.Position = [dlgPos dlgSize];
551+
% Set final position
552+
obj.DialogFigure.Position = [dlgPos dlgSize];
501553

554+
end %if
502555

503556
end %function
504557

@@ -511,6 +564,11 @@ function positionOverCallingFigure(obj)
511564
function updateModalImage(obj)
512565
% Triggered when the Modal property is changed
513566

567+
% Return now if no modal image
568+
if ~isscalar(obj.ModalImage) || ~isvalid(obj.ModalImage)
569+
return
570+
end
571+
514572
% If toggled on, do the following
515573
if obj.Modal
516574

@@ -537,9 +595,6 @@ function onDialogButtonPushed(obj,evt)
537595
% The pushed button's Tag (or Name if Tag is empty) will be
538596
% set as the LastAction
539597

540-
% Request to assign output
541-
obj.assignOutput();
542-
543598
% What button was pushed?
544599
if isa(evt, "matlab.ui.eventdata.WindowCloseRequestData")
545600
srcButton = "close";
@@ -562,6 +617,9 @@ function onDialogButtonPushed(obj,evt)
562617
% Set last action
563618
obj.LastAction = action;
564619

620+
% Request to assign output
621+
obj.assignOutput();
622+
565623
% Prep event data
566624
evtOut = wt.eventdata.DialogButtonPushedData;
567625
evtOut.Action = obj.LastAction;

widgets/+wt/+mixin/ModelObserver.m

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
classdef (Abstract, AllowedSubclasses = ...
2-
{?wt.abstract.BaseViewController, ?wt.abstract.BaseViewChart})...
3-
ModelObserver < handle
1+
classdef (Abstract) ModelObserver < handle
42
% Mixin for components using a model that observe changes
53

64
% Copyright 2025 The MathWorks Inc.

0 commit comments

Comments
 (0)