diff --git a/src/Mod/Draft/Resources/ui/TaskPanel_SetStyle.ui b/src/Mod/Draft/Resources/ui/TaskPanel_SetStyle.ui index 6637fcbcf8..02554a9815 100644 --- a/src/Mod/Draft/Resources/ui/TaskPanel_SetStyle.ui +++ b/src/Mod/Draft/Resources/ui/TaskPanel_SetStyle.ui @@ -6,14 +6,51 @@ 0 0 - 245 - 531 + 255 + 571 Style settings + + + + + + Fills the values below with a stored style preset + + + + Load preset + + + + + + + + + 32 + 16777215 + + + + Save current style as a preset... + + + + + + + + + + + + + @@ -311,6 +348,11 @@ Apply to selected objects + + + + + diff --git a/src/Mod/Draft/draftguitools/gui_setstyle.py b/src/Mod/Draft/draftguitools/gui_setstyle.py index 75702c6ca0..9ab520c519 100644 --- a/src/Mod/Draft/draftguitools/gui_setstyle.py +++ b/src/Mod/Draft/draftguitools/gui_setstyle.py @@ -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())