freecad-cam/Mod/Tux/PersistentToolbarsGui.py
2026-02-01 01:59:24 +01:00

263 lines
7.4 KiB
Python

# Persistent toolbars for FreeCAD
# Copyright (C) 2016, 2017 triplus @ FreeCAD
#
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
"""Persistent toolbars for FreeCAD."""
import operator
import FreeCAD as App
import FreeCADGui as Gui
from PySide import QtCore
from PySide import QtGui
conectedToolbars = []
timer = QtCore.QTimer()
mw = Gui.getMainWindow()
def pythonToolbars():
"""Manage Python based toolbar in BIM workbench."""
active = Gui.activeWorkbench().__class__.__name__
if active == "BIMWorkbench" and hasattr(Gui, "Snapper"):
try:
Gui.Snapper.show()
except Exception:
m = "Persistent toolbars: Snapper toolbar not managed.\n"
App.Console.PrintMessage(m)
else:
pass
def isConnected(i):
"""Connect toolbar to onSave function."""
if i not in conectedToolbars:
conectedToolbars.append(i)
i.topLevelChanged.connect(onSave)
else:
pass
def onRestore(active):
"""Restore current workbench toolbars position."""
toolbars = {}
tb = mw.findChildren(QtGui.QToolBar)
pUser = App.ParamGet("User parameter:Tux/PersistentToolbars/User")
pSystem = App.ParamGet("User parameter:Tux/PersistentToolbars/System")
for i in tb:
isConnected(i)
if i.objectName() and i.parentWidget() == mw and not i.isFloating():
toolbars[i.objectName()] = i
else:
pass
if pUser.GetGroup(active).GetBool("Saved"):
group = pUser.GetGroup(active)
elif pSystem.GetGroup(active).GetBool("Saved"):
group = pSystem.GetGroup(active)
else:
group = None
if group:
topRestore = group.GetString("Top").split(",")
leftRestore = group.GetString("Left").split(",")
rightRestore = group.GetString("Right").split(",")
bottomRestore = group.GetString("Bottom").split(",")
# Reduce flickering.
for i in toolbars:
if (
i not in topRestore
and i not in leftRestore
and i not in rightRestore
and i not in bottomRestore
):
area = mw.toolBarArea(toolbars[i])
if area == QtCore.Qt.ToolBarArea.LeftToolBarArea:
leftRestore.append(i)
elif area == QtCore.Qt.ToolBarArea.RightToolBarArea:
rightRestore.append(i)
elif area == QtCore.Qt.ToolBarArea.BottomToolBarArea:
bottomRestore.append(i)
else:
topRestore.append(i)
else:
pass
for i in topRestore:
if i == "Break":
mw.addToolBarBreak(QtCore.Qt.TopToolBarArea)
elif i in toolbars:
mw.addToolBar(QtCore.Qt.TopToolBarArea, toolbars[i])
else:
pass
for i in leftRestore:
if i == "Break":
mw.addToolBarBreak(QtCore.Qt.LeftToolBarArea)
elif i in toolbars:
mw.addToolBar(QtCore.Qt.LeftToolBarArea, toolbars[i])
else:
pass
for i in rightRestore:
if i == "Break":
mw.addToolBarBreak(QtCore.Qt.RightToolBarArea)
elif i in toolbars:
mw.addToolBar(QtCore.Qt.RightToolBarArea, toolbars[i])
else:
pass
for i in bottomRestore:
if i == "Break":
mw.addToolBarBreak(QtCore.Qt.BottomToolBarArea)
elif i in toolbars:
mw.addToolBar(QtCore.Qt.BottomToolBarArea, toolbars[i])
else:
pass
else:
pass
def onSave():
"""Save current workbench toolbars position."""
tb = mw.findChildren(QtGui.QToolBar)
active = Gui.activeWorkbench().__class__.__name__
p = App.ParamGet("User parameter:Tux/PersistentToolbars/User")
group = p.GetGroup(active)
top = []
left = []
right = []
bottom = []
for i in tb:
if i.objectName() and i.isVisible() and not i.isFloating():
area = mw.toolBarArea(i)
x = i.geometry().x()
y = i.geometry().y()
b = mw.toolBarBreak(i)
n = i.objectName()
if area == QtCore.Qt.ToolBarArea.TopToolBarArea:
top.append([x, y, b, n])
elif area == QtCore.Qt.ToolBarArea.LeftToolBarArea:
left.append([x, y, b, n])
elif area == QtCore.Qt.ToolBarArea.RightToolBarArea:
right.append([-x, y, b, n])
elif area == QtCore.Qt.ToolBarArea.BottomToolBarArea:
bottom.append([x, -y, b, n])
else:
pass
else:
pass
top = sorted(top, key=operator.itemgetter(1, 0))
left = sorted(left, key=operator.itemgetter(0, 1))
right = sorted(right, key=operator.itemgetter(0, 1))
bottom = sorted(bottom, key=operator.itemgetter(1, 0))
topSave = []
leftSave = []
rightSave = []
bottomSave = []
for i in top:
if i[2] is True:
topSave.append("Break")
topSave.append(i[3])
else:
topSave.append(i[3])
for i in left:
if i[2] is True:
leftSave.append("Break")
leftSave.append(i[3])
else:
leftSave.append(i[3])
for i in right:
if i[2] is True:
rightSave.append("Break")
rightSave.append(i[3])
else:
rightSave.append(i[3])
for i in bottom:
if i[2] is True:
bottomSave.append("Break")
bottomSave.append(i[3])
else:
bottomSave.append(i[3])
group.SetBool("Saved", 1)
group.SetString("Top", ",".join(topSave))
group.SetString("Left", ",".join(leftSave))
group.SetString("Right", ",".join(rightSave))
group.SetString("Bottom", ",".join(bottomSave))
def onWorkbenchActivated():
"""When workbench gets activated restore toolbar position."""
active = Gui.activeWorkbench().__class__.__name__
if active:
pythonToolbars()
onRestore(active)
else:
pass
def onStart():
"""Start persistent toolbars."""
if mw.property("eventLoop"):
start = False
try:
mw.mainWindowClosed
mw.workbenchActivated
start = True
except AttributeError:
pass
if start:
timer.stop()
onWorkbenchActivated()
mw.mainWindowClosed.connect(onClose)
mw.workbenchActivated.connect(onWorkbenchActivated)
def onClose():
"""Remove system provided presets on FreeCAD close."""
p = App.ParamGet("User parameter:Tux/PersistentToolbars")
p.RemGroup("System")
timer.timeout.connect(onStart)
timer.start(500)