Skip to content

Commit e0a0f77

Browse files
committed
Check if toolpanel intersects with any screen or reset its position
Also don't restore toolpanel window position when preference not to restore window geometry is set (to solve startup crashes)
1 parent 5e10986 commit e0a0f77

2 files changed

Lines changed: 49 additions & 5 deletions

File tree

SidebarGUIProxy.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55
from UM.Logger import Logger
66
from UM.FlameProfiler import pyqtSlot
77

8+
from PyQt5.QtCore import QObject, QRectF
9+
810
try:
911
from cura.Machines.ContainerTree import ContainerTree
1012
except ImportError:
1113
ContainerTree = None # type: ignore
1214

13-
from PyQt5.QtCore import QObject
14-
1515
class SidebarGUIProxy(QObject):
1616
def __init__(self, parent = None) -> None:
1717
super().__init__(parent)
@@ -66,3 +66,17 @@ def getExtruderHasQualityForMaterial(self, extruder_stack):
6666
containers_metadata = container_registry.findInstanceContainersMetadata(**search_criteria)
6767

6868
return containers_metadata != []
69+
70+
71+
@pyqtSlot("QVariant", result = bool)
72+
def checkRectangleOnScreen(self, rectangle):
73+
# Check if rectangle is not outside the currently available screens
74+
application = Application.getInstance()
75+
screen_found = False
76+
for screen_number in range(0, application.desktop().screenCount()):
77+
if rectangle.intersects(QRectF(application.desktop().availableGeometry(screen_number))):
78+
screen_found = True
79+
break
80+
if not screen_found:
81+
return False
82+
return True

resources/qml/SidebarStageMenu.qml

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -312,16 +312,41 @@ Item
312312

313313
flags: Qt.Tool | Qt.WindowTitleHint;
314314

315+
function boolCheck(value) //Hack to ensure a good match between python and qml.
316+
{
317+
if(value == "True")
318+
{
319+
return true
320+
}else if(value == "False" || value == undefined)
321+
{
322+
return false
323+
}
324+
else
325+
{
326+
return value
327+
}
328+
}
329+
315330
minimumWidth: UM.Theme.getSize("print_setup_widget").width
316331
maximumWidth: minimumWidth
317332
width: minimumWidth
318333

319334
minimumHeight: Math.floor(1.5 * minimumWidth)
320-
height: UM.Preferences.getValue("sidebargui/settings_window_height") != 0 ? UM.Preferences.getValue("sidebargui/settings_window_left") : minimumHeight
335+
height: UM.Preferences.getValue("sidebargui/settings_window_height") != 0 ? UM.Preferences.getValue("sidebargui/settings_window_height") : minimumHeight
321336
onHeightChanged: UM.Preferences.setValue("sidebargui/settings_window_height", height)
322337

323-
x: UM.Preferences.getValue("sidebargui/settings_window_left") != 65535 ? UM.Preferences.getValue("sidebargui/settings_window_left") : undefined
324-
y: UM.Preferences.getValue("sidebargui/settings_window_top") != 65535 ? UM.Preferences.getValue("sidebargui/settings_window_top") : undefined
338+
x:
339+
{
340+
if (UM.Preferences.getValue("sidebargui/settings_window_left") != 65535 && boolCheck(UM.Preferences.getValue("general/restore_window_geometry")))
341+
return UM.Preferences.getValue("sidebargui/settings_window_left")
342+
return base.x + base.width - sidebarToolWindow.width + UM.Theme.getSize("wide_margin").width
343+
}
344+
y:
345+
{
346+
if (UM.Preferences.getValue("sidebargui/settings_window_top") != 65535 && boolCheck(UM.Preferences.getValue("general/restore_window_geometry")))
347+
return UM.Preferences.getValue("sidebargui/settings_window_top")
348+
return base.y + UM.Theme.getSize("wide_margin").width
349+
}
325350
onXChanged: UM.Preferences.setValue("sidebargui/settings_window_left", x)
326351
onYChanged: UM.Preferences.setValue("sidebargui/settings_window_top", y)
327352

@@ -342,6 +367,11 @@ Item
342367
{
343368
if (visible)
344369
{
370+
if(!Cura.SidebarGUIPlugin.checkRectangleOnScreen(Qt.rect(sidebarToolWindow.x, sidebarToolWindow.y, sidebarToolWindow.width, sidebarToolWindow.height)))
371+
{
372+
sidebarToolWindow.x = base.x + base.width - sidebarToolWindow.width + UM.Theme.getSize("wide_margin").width
373+
sidebarToolWindow.y = base.y + UM.Theme.getSize("wide_margin").width
374+
}
345375
printSetupWindow.children = [sidebarContents]
346376
printSetupTooltip.visible = false // hide vestigial tooltip in main window
347377
}

0 commit comments

Comments
 (0)