|
| 1 | +function moveOnScreen(fig) |
| 2 | +% Ensure the figure is placed on screen |
| 3 | + |
| 4 | +% Define arguments |
| 5 | +arguments |
| 6 | + fig (1,1) matlab.ui.Figure |
| 7 | +end |
| 8 | + |
| 9 | +% Figure must be in pixel units |
| 10 | +if ~strcmp(fig.Units,'pixels') |
| 11 | + oldUnits = fig.Units; |
| 12 | + cleanupObj = onCleanup(@()set(fig,"Units",oldUnits)); |
| 13 | + fig.Units = 'pixels'; |
| 14 | +end |
| 15 | + |
| 16 | +% Get screen positions |
| 17 | +g = groot; |
| 18 | +screenPos = g.MonitorPositions; |
| 19 | + |
| 20 | +% Buffer for title bar |
| 21 | +titleBarHeight = 30; |
| 22 | + |
| 23 | +% Get the corners of the figure (bottom left and top right) |
| 24 | +figPos = fig.OuterPosition; |
| 25 | +figCornerA = figPos(1:2); |
| 26 | +figCornerB = figPos(1:2) + figPos(:,3:4) - 1; |
| 27 | + |
| 28 | +% Calculate the figure's area shown on each screen |
| 29 | +overlapAreas = zeros(size(screenPos, 1), 1); |
| 30 | +for i = 1:size(screenPos, 1) |
| 31 | + thisScreen = screenPos(i, :); |
| 32 | + overlapWidth = max(0, min(figPos(1) + figPos(3), thisScreen(1) + thisScreen(3)) - max(figPos(1), thisScreen(1))); |
| 33 | + overlapHeight = max(0, min(figPos(2) + figPos(4), thisScreen(2) + thisScreen(4)) - max(figPos(2), thisScreen(2))); |
| 34 | + overlapAreas(i) = overlapWidth * overlapHeight; |
| 35 | +end |
| 36 | + |
| 37 | +% Determine the screen with the largest overlap |
| 38 | +[~, screenIdx] = max(overlapAreas); |
| 39 | + |
| 40 | +% Get the corners of the screen |
| 41 | +screenCornerA = screenPos(screenIdx, 1:2); |
| 42 | +screenCornerB = screenCornerA + screenPos(screenIdx, 3:4) - 1; |
| 43 | + |
| 44 | +% Are the corners on the screen? |
| 45 | +aIsOnScreen = all( figCornerA >= screenCornerA & ... |
| 46 | + figCornerA <= screenCornerB, 2 ); |
| 47 | +bIsOnScreen = all( figCornerB >= screenCornerA & ... |
| 48 | + figCornerB <= screenCornerB, 2); |
| 49 | + |
| 50 | + |
| 51 | +% Are both corners fully on one screen? |
| 52 | +if aIsOnScreen && bIsOnScreen |
| 53 | + % Yes - do nothing |
| 54 | + |
| 55 | +elseif bIsOnScreen |
| 56 | + % Upper right corner is on a screen |
| 57 | + % Adjust so the entire figure is on that screen |
| 58 | + |
| 59 | + % Calculate the adjustment needed, and make it |
| 60 | + figAdjust = max(figCornerA, screenCornerA) - figCornerA; |
| 61 | + figPos(1:2) = figPos(1:2) + figAdjust; |
| 62 | + |
| 63 | + % Ensure the upper right corner still fits |
| 64 | + requestedSize = screenCornerB - figPos(1:2) - [0 titleBarHeight] + 1; |
| 65 | + figPos(3:4) = min(figPos(3:4), requestedSize); |
| 66 | + |
| 67 | + % Move the figure |
| 68 | + fig.Position = figPos; |
| 69 | + |
| 70 | +else |
| 71 | + % Lower left corner is on a screen |
| 72 | + % Adjust so the entire figure is on that screen |
| 73 | + |
| 74 | + % Calculate the adjustment needed, and make it |
| 75 | + figAdjust = min(figCornerB, screenCornerB) - figCornerB; |
| 76 | + figPos(1:2) = max(screenCornerA, figPos(1:2) + figAdjust); |
| 77 | + |
| 78 | + % Ensure the upper right corner still fits |
| 79 | + requestedSize = screenCornerB - figPos(1:2) - [0 titleBarHeight] + 1; |
| 80 | + figPos(3:4) = min(figPos(3:4), requestedSize); |
| 81 | + |
| 82 | + % Move the figure |
| 83 | + fig.Position = figPos; |
| 84 | + |
| 85 | +end %if |
0 commit comments