Merge pull request #5023 from marioalexis84/gui-encoding

Gui:  Harmonize encoding/decoding between view, property editor and command line.
This commit is contained in:
Yorik van Havre
2021-10-14 12:24:49 +02:00
committed by GitHub
7 changed files with 30 additions and 38 deletions

View File

@@ -2561,7 +2561,6 @@ QVariant PropertyStringListItem::toString(const QVariant& prop) const
}
QString text = QString::fromUtf8("[%1]").arg(list.join(QLatin1String(",")));
text.replace(QString::fromUtf8("'"),QString::fromUtf8("\\'"));
return QVariant(text);
}
@@ -2569,11 +2568,10 @@ QVariant PropertyStringListItem::toString(const QVariant& prop) const
QVariant PropertyStringListItem::value(const App::Property* prop) const
{
assert(prop && prop->getTypeId().isDerivedFrom(App::PropertyStringList::getClassTypeId()));
QStringList list;
const std::vector<std::string>& value = ((App::PropertyStringList*)prop)->getValues();
const std::vector<std::string>& value = (static_cast<const App::PropertyStringList*>(prop))->getValues();
for ( std::vector<std::string>::const_iterator jt = value.begin(); jt != value.end(); ++jt ) {
list << QString::fromUtf8(Base::Tools::escapedUnicodeToUtf8(*jt).c_str());
list << QString::fromUtf8((*jt).c_str());
}
return QVariant(list);
@@ -2586,16 +2584,16 @@ void PropertyStringListItem::setValue(const QVariant& value)
QStringList values = value.toStringList();
QString data;
QTextStream str(&data);
str.setCodec("UTF-8");
str << "[";
for (QStringList::Iterator it = values.begin(); it != values.end(); ++it) {
QString text(*it);
text.replace(QString::fromUtf8("'"),QString::fromUtf8("\\'"));
std::string pystr = Base::Tools::escapedUnicodeFromUtf8(text.toUtf8());
pystr = Base::Interpreter().strToPython(pystr.c_str());
str << "u\"" << pystr.c_str() << "\", ";
std::string pystr = Base::Interpreter().strToPython(text.toUtf8().constData());
str << "\"" << QString::fromUtf8(pystr.c_str()) << "\", ";
}
str << "]";
setPropertyValue(data);
}

View File

@@ -1740,7 +1740,11 @@ class DraftToolBar:
"""this function sends the entered text to the active draft command
if enter has been pressed twice. Otherwise it blanks the line.
"""
self.sourceCmd.text = self.textValue.toPlainText().splitlines()
self.sourceCmd.text = self.textValue.toPlainText()\
.replace("\\","\\\\")\
.replace("\"","\\\"")\
.replace("\'","\\\'")\
.splitlines()
self.sourceCmd.createObject()
def displayPoint(self, point=None, last=None, plane=None, mask=None):

View File

@@ -89,19 +89,16 @@ class Text(gui_base_original.Creator):
base = pts[1:-1]
text_list = self.text
text_list = [text.replace("\"","\\\"") for text in text_list]
if not text_list:
self.finish()
return None
# If the last element is an empty string "" we remove it
if not text_list[-1]:
text_list.pop()
# For Python 2 we convert the string to unicode,
# Python 3 nothing needs to be done
if sys.version_info.major < 3:
u_list = [unicode(line) for line in text_list]
t_list = ['"' + str(line.encode("utf8")) + '"' for line in u_list]
else:
t_list = ['"' + line + '"' for line in text_list]
t_list = ['"' + line + '"' for line in text_list]
list_as_text = ", ".join(t_list)

View File

@@ -229,6 +229,7 @@ class ViewProviderLabel(ViewProviderDraftAnnotation):
self.text2d.string = self.text3d.string = "Label"
self.text2d.justification = coin.SoText2.RIGHT
self.text3d.justification = coin.SoAsciiText.RIGHT
self.font.name = utils.get_param("textfont")
switchnode = coin.SoSeparator()
switchnode.addChild(self.line)
@@ -310,10 +311,7 @@ class ViewProviderLabel(ViewProviderDraftAnnotation):
self.text2d.string.setValue("")
self.text3d.string.setValue("")
if sys.version_info.major >= 3:
_list = [l for l in obj.Text if l]
else:
_list = [l.encode("utf8") for l in obj.Text if l]
_list = [l for l in obj.Text if l]
self.text2d.string.setValues(_list)
self.text3d.string.setValues(_list)

View File

@@ -245,9 +245,13 @@ class ViewProviderText(ViewProviderDraftAnnotation):
def createObject(self):
import FreeCAD
import FreeCADGui
if hasattr(self,"Object"):
txt = [t.replace("\"","\\\"") for t in self.text]
txt = self.text
if not txt:
self.finish()
return None
# If the last element is an empty string "" we remove it
if not txt[-1]:
txt.pop()

View File

@@ -111,7 +111,7 @@ void DrawViewSymbol::onChanged(const App::Property* prop)
while (!queryResult.next().isNull())
{
QDomElement tspanElement = model.toDomNode(queryResult.current().toNodeModelIndex()).toElement();
editables.push_back(Base::Tools::escapedUnicodeFromUtf8(tspanElement.text().toStdString().c_str()));
editables.push_back(tspanElement.text().toStdString());
}
}
else {
@@ -188,7 +188,7 @@ App::DocumentObjectExecReturn *DrawViewSymbol::execute(void)
// Finally append text node with editable replacement as the only <tspan> descendant
tspanElement.appendChild(symbolDocument.createTextNode(
QString::fromUtf8(Base::Tools::escapedUnicodeToUtf8(editText[count]).c_str())));
QString::fromUtf8(editText[count].c_str())));
++count;
}

View File

@@ -160,18 +160,9 @@ void QGIViewAnnotation::drawAnnotation()
if (it != annoText.begin()) {
ss << "<br>";
}
//TODO: there is still a bug here. entering "'" works, save and restore works, but edit after
// save and restore brings "\'" back into text. manually deleting the "\" fixes it until the next
// save/restore/edit cycle.
// a guess is that the editor for propertyStringList is too enthusiastic about substituting.
// the substituting might be necessary for using the strings in Python.
// &apos; doesn't seem to help in this case.
std::string u8String = Base::Tools::escapedUnicodeToUtf8(*it); //from \x??\x?? to real utf8
std::string apos = std::regex_replace((u8String), std::regex("\\\\"), ""); //remove doubles.
apos = std::regex_replace((apos), std::regex("\\'"), "'"); //replace escaped apos
//"less than" symbol chops off line. need to use html sub.
std::string lt = std::regex_replace((apos), std::regex("<"), "&lt;");
std::string lt = std::regex_replace((*it), std::regex("<"), "&lt;");
ss << lt;
}
ss << "<br></p>\n</body>\n</html> ";
@@ -203,11 +194,11 @@ void QGIViewAnnotation::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event)
const std::vector<std::string> &values = annotation->Text.getValues();
QString text;
if (values.size() > 0) {
text = QString::fromUtf8(Base::Tools::escapedUnicodeToUtf8(values[0]).c_str());
text = QString::fromUtf8(values[0].c_str());
for (unsigned int i = 1; i < values.size(); ++i) {
text += QChar::fromLatin1('\n');
text += QString::fromUtf8(Base::Tools::escapedUnicodeToUtf8(values[i]).c_str());
text += QString::fromUtf8(values[i].c_str());
}
}
@@ -233,7 +224,7 @@ void QGIViewAnnotation::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event)
std::vector<std::string> newValues;
for (int i = 0; i < list.size(); ++i) {
newValues.push_back(Base::Tools::escapedUnicodeFromUtf8(list[i].toStdString().c_str()));
newValues.push_back(list[i].toStdString());
}
App::GetApplication().setActiveTransaction("Set Annotation Text");