Draft: Added load/save functionality to SetStyle dialog

This commit is contained in:
Yorik van Havre
2021-05-06 18:36:41 +02:00
parent 970158f78b
commit 8c4f4e6895
2 changed files with 174 additions and 5 deletions

View File

@@ -6,14 +6,51 @@
<rect>
<x>0</x>
<y>0</y>
<width>245</width>
<height>531</height>
<width>255</width>
<height>571</height>
</rect>
</property>
<property name="windowTitle">
<string>Style settings</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QComboBox" name="comboPresets">
<property name="toolTip">
<string>Fills the values below with a stored style preset</string>
</property>
<item>
<property name="text">
<string>Load preset</string>
</property>
</item>
</widget>
</item>
<item>
<widget class="QPushButton" name="saveButton">
<property name="maximumSize">
<size>
<width>32</width>
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>Save current style as a preset...</string>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset theme="gtk-save">
<normaloff/>
</iconset>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
@@ -311,6 +348,11 @@
<property name="text">
<string>Apply to selected objects</string>
</property>
<property name="icon">
<iconset theme="gtk-apply">
<normaloff/>
</iconset>
</property>
</widget>
</item>
</layout>

View File

@@ -20,6 +20,7 @@
# ***************************************************************************
"""Provides GUI tools to set up default styles."""
## @package gui_setstyle
# \ingroup draftguitools
# \brief Provides GUI tools to set Draft styles such as color or line width
@@ -28,18 +29,23 @@
# @{
import FreeCAD
import os
if FreeCAD.GuiUp:
import FreeCADGui
import Draft_rc
def QT_TRANSLATE_NOOP(ctx,txt):
return txt
translate = FreeCAD.Qt.translate
__title__ = "FreeCAD Draft Workbench GUI Tools - Styling tools"
__author__ = ("Yorik van Havre")
__url__ = "https://www.freecadweb.org"
PRESETPATH = os.path.join(FreeCAD.getUserAppDataDir(),"Draft","StylePresets.json")
class Draft_SetStyle:
"""The Draft_SetStyle FreeCAD command definition."""
def GetResources(self):
@@ -57,6 +63,7 @@ class Draft_SetStyle:
class Draft_SetStyle_TaskPanel:
"""The task panel for the Draft_SetStyle command"""
def __init__(self):
@@ -64,8 +71,8 @@ class Draft_SetStyle_TaskPanel:
from PySide import QtCore,QtGui
self.p = "User parameter:BaseApp/Preferences/"
self.form = FreeCADGui.PySideUic.loadUi(":/ui/TaskPanel_SetStyle.ui")
self.form.setWindowIcon(QtGui.QIcon(":/icons/Draft_Apply.svg"))
self.form.applyButton.setIcon(QtGui.QIcon(":/icons/Draft_Apply.svg"))
self.form.setWindowIcon(QtGui.QIcon.fromTheme("gtk-apply", QtGui.QIcon(":/icons/Draft_Apply.svg")))
self.form.applyButton.setIcon(QtGui.QIcon.fromTheme("gtk-apply", QtGui.QIcon(":/icons/Draft_Apply.svg")))
self.form.LineColor.setProperty("color",self.getPrefColor("View","DefaultShapeLineColor",255))
self.form.LineWidth.setValue(FreeCAD.ParamGet(self.p+"View").GetInt("DefaultShapeLineWidth",2))
self.form.DrawStyle.setCurrentIndex(FreeCAD.ParamGet(self.p+"Mod/Draft").GetInt("DefaultDrawStyle",0))
@@ -79,17 +86,73 @@ class Draft_SetStyle_TaskPanel:
self.form.ArrowSize.setText(FreeCAD.Units.Quantity(FreeCAD.ParamGet(self.p+"/Mod/Draft").GetFloat("arrowsize",5),FreeCAD.Units.Length).UserString)
self.form.ShowUnit.setChecked(FreeCAD.ParamGet(self.p+"Mod/Draft").GetBool("showUnit",True))
self.form.UnitOverride.setText(FreeCAD.ParamGet(self.p+"Mod/Draft").GetString("overrideUnit",""))
self.form.saveButton.setIcon(QtGui.QIcon.fromTheme("gtk-save", QtGui.QIcon(":/icons/document-save.svg")))
self.form.saveButton.clicked.connect(self.onSaveStyle)
self.form.applyButton.clicked.connect(self.onApplyStyle)
self.form.comboPresets.currentIndexChanged.connect(self.onLoadStyle)
self.loadDefaults()
def loadDefaults(self):
presets = [self.form.comboPresets.itemText(0)]
self.form.comboPresets.clear()
pdict = self.load()
presets.extend(pdict.keys())
self.form.comboPresets.addItems(presets)
current = self.getValues()
for name,preset in pdict.items():
if preset == current:
self.form.comboPresets.setCurrentIndex(1+(list(pdict.keys()).index(name)))
break
def getPrefColor(self,group,prop,default):
c = FreeCAD.ParamGet(self.p+group).GetUnsigned(prop,default)
return self.getColor(c)
def getColor(self,c):
from PySide import QtGui
r = ((c>>24)&0xFF)/255.0
g = ((c>>16)&0xFF)/255.0
b = ((c>>8)&0xFF)/255.0
from PySide import QtGui
return QtGui.QColor.fromRgbF(r,g,b)
def getValues(self):
preset = {}
preset["LineColor"] = self.form.LineColor.property("color").rgb()<<8
preset["LineWidth"] = self.form.LineWidth.value()
preset["DrawStyle"] = self.form.DrawStyle.currentIndex()
preset["DisplayMode"] = self.form.DisplayMode.currentIndex()
preset["ShapeColor"] = self.form.ShapeColor.property("color").rgb()<<8
preset["Transparency"] = self.form.Transparency.value()
preset["TextFont"] = self.form.TextFont.currentFont().family()
preset["TextSize"] = FreeCAD.Units.Quantity(self.form.TextSize.text()).Value
preset["TextColor"] = self.form.TextColor.property("color").rgb()<<8
preset["ArrowStyle"] = self.form.ArrowStyle.currentIndex()
preset["ArrowSize"] = FreeCAD.Units.Quantity(self.form.ArrowSize.text()).Value
preset["ShowUnit"] = self.form.ShowUnit.isChecked()
preset["UnitOverride"] = self.form.UnitOverride.text()
return preset
def setValues(self,preset):
from PySide import QtCore,QtGui
self.form.LineColor.setProperty("color",self.getColor(preset["LineColor"]))
self.form.LineWidth.setValue(preset["LineWidth"])
self.form.DrawStyle.setCurrentIndex(preset["DrawStyle"])
self.form.DisplayMode.setCurrentIndex(preset["DisplayMode"])
self.form.ShapeColor.setProperty("color",self.getColor(preset["ShapeColor"]))
self.form.Transparency.setValue(preset["Transparency"])
self.form.TextFont.setCurrentFont(QtGui.QFont(preset["TextFont"]))
self.form.TextColor.setProperty("color",self.getColor(preset["TextColor"]))
self.form.ArrowStyle.setCurrentIndex(preset["ArrowStyle"])
self.form.ShowUnit.setChecked(preset["ShowUnit"])
self.form.UnitOverride.setText(preset["UnitOverride"])
self.form.TextSize.setText(FreeCAD.Units.Quantity(preset["TextSize"],FreeCAD.Units.Length).UserString)
self.form.ArrowSize.setText(FreeCAD.Units.Quantity(preset["ArrowSize"],FreeCAD.Units.Length).UserString)
def reject(self):
FreeCADGui.Control.closeDialog()
@@ -155,6 +218,70 @@ class Draft_SetStyle_TaskPanel:
if "UnitOverride" in vobj.PropertiesList:
vobj.UnitOverride = self.form.UnitOverride.text()
def onLoadStyle(self,index):
if index > 0:
pdict = self.load()
if self.form.comboPresets.itemText(index) in pdict.keys():
preset = pdict[self.form.comboPresets.itemText(index)]
self.setValues(preset)
def onSaveStyle(self):
from PySide import QtCore,QtGui
reply = QtGui.QInputDialog.getText(None,
translate("Draft","Save style"),
translate("Draft","Name of this new style:"))
if reply[1]:
name = reply[0]
pdict = self.load()
if pdict:
if name in pdict.keys():
reply = QtGui.QMessageBox.question(None,
tranlate("Draft","Warning"),
translate("Draft","Name exists. Overwrite?"),
QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
QtGui.QMessageBox.No)
if reply == QtGui.QMessageBox.No:
return
preset = self.getValues()
pdict[name] = preset
self.save(pdict)
self.loadDefaults()
def load(self):
"""loads the presets json file, returns a dict"""
pdict = {}
try:
import json
from json.decoder import JSONDecodeError
except:
return
if os.path.exists(PRESETPATH):
with open(PRESETPATH,"r") as f:
try:
pdict = json.load(f)
except JSONDecodeError:
return {}
return pdict
def save(self,d):
"""saves the given dict to the presets json file"""
try:
import json
except:
FreeCAD.Console.PrintError(translate("Draft","Error: json module not found. Unable to save style")+"\n")
return
folder = os.path.dirname(PRESETPATH)
if not os.path.exists(folder):
os.makedirs(folder)
with open(PRESETPATH,"w") as f:
json.dump(d,f,indent=4)
FreeCADGui.addCommand('Draft_SetStyle', Draft_SetStyle())