10#include <QApplication>
16using namespace Qt::Literals::StringLiterals;
20void traverseQml(QObject *obj, QHash<QString, QList<QObject *>> &targets)
23 if (QVariant text = obj->property(
"text"); text.isValid()) {
24 if (
auto itr = targets.find(text.toString()); itr != targets.end()) {
29 for (QObject *child : obj->children())
30 traverseQml(child, targets);
34void matchSources(QQuickItem *root, QHash<QString, QList<QObject *>> &targets)
36 traverseQml(root, targets);
39QHash<QString, QList<QObject *>> extractSources(DataModel *m,
const QString &contextName)
41 QHash<QString, QList<QObject *>> t;
42 GroupItem *ctx = m->findGroup(contextName, TEXTBASED);
44 for (
int j = 0; j < ctx->messageCount(); j++)
45 t[ctx->messageItem(j)->text()] = {};
47 for (DataModelIterator it(IDBASED, m); it.isValid(); ++it)
48 t[it.current()->text()] = {};
55QmlFormPreviewView::QmlFormPreviewView(MultiDataModel *dataModel)
56 : QQuickWidget(0), m_dataModel(dataModel) {}
60 if (model < 0 || !messageItem) {
64 const QDir dir = QFileInfo(m_dataModel->srcFileName(model)).dir();
65 const QString fileName = QDir::cleanPath(dir.absoluteFilePath(messageItem->fileName()));
66 if (m_lastFormName != fileName) {
67 m_lastFormName = fileName;
69 setAttribute(Qt::WA_TransparentForMouseEvents, !fileName.endsWith(
".ui.qml"_L1));
71 setSource(QUrl::fromLocalFile(fileName));
72 if (!errors().empty()) {
77 m_targets = extractSources(m_dataModel->model(model), messageItem->context());
78 matchSources(rootObject(), m_targets);
80 setResizeMode(SizeViewToRootObject);
82 }
else if (m_lastError) {
85 if (m_lastModel != model) {
88 for (QObject *item : std::as_const(m_targets[message->text()]))
89 item->setProperty(
"text", message->translation());
93 for (QObject *item : std::as_const(m_targets[message->text()]))
94 item->setProperty(
"text", message->translation());
98 for (QObject *item : std::as_const(m_targets[messageItem->text()]))
99 item->setProperty(
"text", messageItem->translation());
DataModelIterator(TranslationType type, const DataModel *model=0, int groupNo=0, int messageNo=0)
MessageItem * current() const