* @brief Arranges windows using a macOS-inspired smart cascade layout. */
| 961 | * @brief Arranges windows using a macOS-inspired smart cascade layout. |
| 962 | */ |
| 963 | void UI::WindowManager::cascadeLayout() |
| 964 | { |
| 965 | const int canvasW = static_cast<int>(width()); |
| 966 | const int canvasH = static_cast<int>(height()); |
| 967 | |
| 968 | if (canvasW <= 0 || canvasH <= 0) |
| 969 | return; |
| 970 | |
| 971 | if (anyWindowMaximized(m_windows)) |
| 972 | return; |
| 973 | |
| 974 | QList<QQuickItem*> visibleWindows; |
| 975 | for (int id : std::as_const(m_windowOrder)) { |
| 976 | auto* win = m_windows.value(id); |
| 977 | if (win && win->state() == "normal") |
| 978 | visibleWindows.append(win); |
| 979 | } |
| 980 | |
| 981 | if (visibleWindows.isEmpty()) |
| 982 | return; |
| 983 | |
| 984 | const int margin = 8; |
| 985 | const int cascadeOffsetX = 26; |
| 986 | const int cascadeOffsetY = 26; |
| 987 | |
| 988 | const int availableW = canvasW - 2 * margin; |
| 989 | const int availableH = canvasH - 2 * margin; |
| 990 | |
| 991 | for (int i = 0; i < visibleWindows.size(); ++i) { |
| 992 | QQuickItem* win = visibleWindows[i]; |
| 993 | if (!win) |
| 994 | continue; |
| 995 | |
| 996 | int minW = qMax(static_cast<int>(win->implicitWidth()), 200); |
| 997 | int minH = qMax(static_cast<int>(win->implicitHeight()), 150); |
| 998 | |
| 999 | int winW = qMax(minW, availableW * 55 / 100); |
| 1000 | int winH = qMax(minH, availableH * 60 / 100); |
| 1001 | |
| 1002 | winW = qMin(winW, availableW); |
| 1003 | winH = qMin(winH, availableH); |
| 1004 | |
| 1005 | int baseX = margin + (availableW - winW) / 2; |
| 1006 | int baseY = margin + (availableH - winH) / 2; |
| 1007 | |
| 1008 | int offsetX = i * cascadeOffsetX; |
| 1009 | int offsetY = i * cascadeOffsetY; |
| 1010 | |
| 1011 | int wrapCount = 0; |
| 1012 | while (baseY + offsetY + winH > canvasH - margin && wrapCount < 10) { |
| 1013 | offsetY -= (availableH - winH); |
| 1014 | offsetX += cascadeOffsetX * 2; |
| 1015 | wrapCount++; |
| 1016 | } |
| 1017 | |
| 1018 | while (baseX + offsetX + winW > canvasW - margin && wrapCount < 20) { |
| 1019 | offsetX -= (availableW - winW); |
| 1020 | wrapCount++; |
nothing calls this directly
no test coverage detected