feat: window size presets — 4x8 screen-ratio grid in settings (v1.8.0)

- Settings 'Size' section: 8 col x 4 row grid, 31 buttons labeled a:b
  (a splits H, b splits W); top-left cell empty placeholder (no 1:1 —
  title bar double click already maximizes)
- Click resizes the window to work.width/b x work.height/a of the
  display's work area (screen_retriever visibleSize, taskbar excluded);
  position unchanged, no selection state tracking
- minimumSize 400x300 -> 160x100 (4:8 cell needs it)
- Settings file-properties rows left-aligned (were centered under path)
This commit is contained in:
Alhan committed 2026-10-31 02:10:39 +03:00
1 parent 8a80cba116
commit 9a7480cd68
11 files changed
+150 -3

No files matched your search

+30
View File
@@ -84,6 +84,36 @@ class WindowPersistence {
}
}
/// Work area (taskbar excluded) of the display containing the window,
/// in logical px. Returns null if screen info is unavailable.
static Future<Size?> workAreaSize({
required Offset windowPosition,
}) async {
try {
final displays = await screenRetriever.getAllDisplays();
// Pencerenin bulunduğu monitörü bul (çoklu monitör desteği)
Display display = await screenRetriever.getPrimaryDisplay();
for (final d in displays) {
final pos = d.visiblePosition;
final size = d.visibleSize ?? d.size;
if (pos != null &&
windowPosition.dx >= pos.dx &&
windowPosition.dx < pos.dx + size.width &&
windowPosition.dy >= pos.dy &&
windowPosition.dy < pos.dy + size.height) {
display = d;
break;
}
}
return display.visibleSize ?? display.size;
} catch (_) {
// Fallback: screen info unavailable → caller silently no-ops.
return null;
}
}
/// Cascade: place new window to the right of the previous one.
/// Falls to the next row (row start) when it would overflow the screen,
/// and wraps to the top-left if the next row also overflows.