8#include <QtUiPlugin/customwidget.h>
10#include <formbuilder.h>
11#include <formbuilderextra_p.h>
12#include <textbuilder_p.h>
15#include <QtWidgets/qapplication.h>
16#include <QtWidgets/qlayout.h>
17#include <QtWidgets/qwidget.h>
18#if QT_CONFIG(tabwidget)
19# include <QtWidgets/qtabwidget.h>
21#if QT_CONFIG(treewidget)
22# include <QtWidgets/qtreewidget.h>
24#if QT_CONFIG(listwidget)
25# include <QtWidgets/qlistwidget.h>
27#if QT_CONFIG(tablewidget)
28# include <QtWidgets/qtablewidget.h>
31# include <QtWidgets/qtoolbox.h>
33#if QT_CONFIG(combobox)
34# include <QtWidgets/qcombobox.h>
37#include <QtGui/qaction.h>
38#include <QtGui/qactiongroup.h>
40#include <QtCore/qdebug.h>
41#include <QtCore/qdatastream.h>
42#include <QtCore/qmap.h>
43#include <QtCore/qdir.h>
44#include <QtCore/qlibraryinfo.h>
50using widget_map = QMap<QString,
bool>;
56#ifndef QT_NO_DATASTREAM
61 out << s.qualifier() << s.value();
67 QByteArray qualifier, value;
68 in >> qualifier >> value;
69 s.setQualifier(qualifier);
75QString QUiTranslatableStringValue::translate(
const QByteArray &className,
bool idBased)
const
78 ? qtTrId(m_qualifier.constData())
79 : QCoreApplication::translate(className.constData(), m_value.constData(), m_qualifier.constData());
82#ifdef QFORMINTERNAL_NAMESPACE
83namespace QFormInternal
97 bool idBased()
const {
return m_idBased; }
102 QByteArray m_className;
107 const DomString *str = text->elementString();
110 if (str->hasAttributeNotr()) {
111 const QString notr = str->attributeNotr();
113 return QVariant::fromValue(str->text());
116 strVal.setValue(str->text().toUtf8());
118 strVal.setQualifier(str->attributeId().toUtf8());
119 else if (str->hasAttributeComment())
120 strVal.setQualifier(str->attributeComment().toUtf8());
121 return QVariant::fromValue(strVal);
129 return QString::fromUtf8(tsv.value().constData());
130 return QVariant::fromValue(tsv.translate(m_className, m_idBased));
132 if (value.canConvert<QString>())
133 return QVariant::fromValue(qvariant_cast<QString>(value));
139 { Qt::DisplayRole, Qt::DisplayPropertyRole },
140#if QT_CONFIG(tooltip)
141 { Qt::ToolTipRole, Qt::ToolTipPropertyRole },
143#if QT_CONFIG(statustip)
144 { Qt::StatusTipRole, Qt::StatusTipPropertyRole },
146#if QT_CONFIG(whatsthis)
147 { Qt::WhatsThisRole, Qt::WhatsThisPropertyRole },
152#if QT_CONFIG(treewidget)
153static void recursiveReTranslate(QTreeWidgetItem *item,
const QByteArray &class_name,
bool idBased)
155 const QUiItemRolePair *irs = qUiItemRoles;
157 int cnt = item->columnCount();
158 for (
int i = 0; i < cnt; ++i) {
159 for (
unsigned j = 0; irs[j].shadowRole >= 0; j++) {
160 QVariant v = item->data(i, irs[j].shadowRole);
162 auto tsv = qvariant_cast<QUiTranslatableStringValue>(v);
163 item->setData(i, irs[j].realRole, tsv.translate(class_name, idBased));
168 cnt = item->childCount();
169 for (
int i = 0; i < cnt; ++i)
170 recursiveReTranslate(item->child(i), class_name, idBased);
179 for (
unsigned j = 0; irs[j]
.shadowRole >= 0; j++) {
180 QVariant v = item->data(irs[j].shadowRole);
183 item->setData(irs[j]
.realRole, tsv.translate(class_name, idBased));
188#if QT_CONFIG(tablewidget)
189static void reTranslateTableItem(QTableWidgetItem *item,
const QByteArray &class_name,
bool idBased)
192 reTranslateWidgetItem(item, class_name, idBased);
221#if QT_CONFIG(tabwidget)
224 for (
int i = 0;
i <
cnt; ++
i) {
226#if QT_CONFIG(tooltip)
229#if QT_CONFIG(whatsthis)
234#if QT_CONFIG(listwidget)
237 for (
int i = 0;
i <
cnt; ++
i)
240#if QT_CONFIG(treewidget)
245 for (
int i = 0;
i <
cnt; ++
i) {
250#if QT_CONFIG(tablewidget)
262#if QT_CONFIG(combobox)
266 for (
int i = 0;
i <
cnt; ++
i) {
275#if QT_CONFIG(toolbox)
278 for (
int i = 0;
i <
cnt; ++
i) {
280#if QT_CONFIG(tooltip)
324 return ParentClass::createWidget(className, parent, name);
329 return ParentClass::createLayout(className, parent, name);
334 return ParentClass::createAction(parent, name);
339 return ParentClass::createActionGroup(parent, name);
344 if (
QWidget *widget =
loader->createWidget(className, parent, name)) {
345 widget->setObjectName(name);
354 if (QLayout *layout =
loader->createLayout(className, parent, name)) {
355 layout->setObjectName(name);
364 if (QActionGroup *actionGroup =
loader->createActionGroup(parent, name)) {
365 actionGroup->setObjectName(name);
374 if (QAction *action =
loader->createAction(parent, name)) {
375 action->setObjectName(name);
387 template <
class Widget>
390 const QString &attribute,
392 void (Widget::*setter)(
int,
const QString &),
393 const char *propName)
const;
398 bool m_idBased =
false;
402 bool idBased, QUiTranslatableStringValue *strVal)
404 if (p->kind() != DomProperty::String)
406 const DomString *dom_str = p->elementString();
409 if (dom_str->hasAttributeNotr()) {
410 const QString notr = dom_str->attributeNotr();
414 strVal->setValue(dom_str->text().toUtf8());
415 strVal->setQualifier(idBased ? dom_str->attributeId().toUtf8() : dom_str->attributeComment().toUtf8());
416 if (strVal->value().isEmpty() && strVal->qualifier().isEmpty())
418 return strVal->translate(className, idBased);
422 const QString &attribute)
424 auto pred = [&attribute](
const DomProperty *prop) {
425 return prop->attributeName() == attribute;
427 auto it =
std::find_if(attributes.cbegin(), attributes.cend(), pred);
428 return it != attributes.cend() ? *it :
nullptr;
431template <
class Widget>
434 const QString &attribute,
436 void (Widget::*setter)(
int,
const QString &),
437 const char *propName)
const
441 const QString text = convertTranslatable(p, m_class, m_idBased, &strVal);
442 if (!text.isEmpty()) {
444 mainWidget->widget(i)->setProperty(propName, QVariant::fromValue(strVal));
445 (mainWidget->*setter)(i, text);
452 QFormBuilder::applyProperties(o, properties);
455 m_trwatch =
new TranslationWatcher(o, m_class, m_idBased);
457 if (properties.isEmpty())
464 for (
const DomProperty *p : properties) {
465 QUiTranslatableStringValue strVal;
466 const QString text = convertTranslatable(p, m_class, m_idBased, &strVal);
469 const QByteArray name = p->attributeName().toUtf8();
471 const QByteArray dynname = QByteArray(PROP_GENERIC_PREFIX + name);
472 o->setProperty(dynname, QVariant::fromValue(strVal));
475 if (p->elementString()->text() != text)
476 o->setProperty(name, text);
479 o->installEventFilter(m_trwatch);
484 m_class = ui->elementClass().toUtf8();
486 m_idBased = ui->attributeIdbasedtr();
487 setTextBuilder(
new TranslatingTextBuilder(m_idBased, trEnabled, m_class));
488 return QFormBuilder::create(ui, parentWidget);
493 QWidget *w = QFormBuilder::create(ui_widget, parentWidget);
498#if QT_CONFIG(tabwidget)
499 }
else if (qobject_cast<QTabWidget*>(w)) {
501#if QT_CONFIG(listwidget)
502 }
else if (qobject_cast<QListWidget*>(w)) {
504#if QT_CONFIG(treewidget)
505 }
else if (qobject_cast<QTreeWidget*>(w)) {
507#if QT_CONFIG(tablewidget)
508 }
else if (qobject_cast<QTableWidget*>(w)) {
510#if QT_CONFIG(combobox)
511 }
else if (qobject_cast<QComboBox*>(w)) {
512 if (QFormBuilderExtra::isQFontComboBox(w))
515#if QT_CONFIG(toolbox)
516 }
else if (qobject_cast<QToolBox*>(w)) {
522 w->installEventFilter(m_trwatch);
528 if (parentWidget ==
nullptr)
531 if (!ParentClass::addItem(ui_widget, widget, parentWidget))
535 const QString className = QLatin1String(parentWidget->metaObject()->className());
536 if (!d->customWidgetAddPageMethod(className).isEmpty())
540#if QT_CONFIG(tabwidget)
541 }
else if (
auto *tabWidget = qobject_cast<QTabWidget*>(parentWidget)) {
542 const int i = tabWidget->count() - 1;
543 translateSubwidgetProperty(ui_widget->elementAttribute(), tabWidget,
544 QFormBuilderStrings::titleAttribute,
545 i, &QTabWidget::setTabText, PROP_TABPAGETEXT);
546#if QT_CONFIG(tooltip)
547 translateSubwidgetProperty(ui_widget->elementAttribute(), tabWidget,
548 QFormBuilderStrings::toolTipAttribute,
549 i, &QTabWidget::setTabToolTip, PROP_TABPAGETOOLTIP);
551#if QT_CONFIG(whatsthis)
552 translateSubwidgetProperty(ui_widget->elementAttribute(), tabWidget,
553 QFormBuilderStrings::whatsThisAttribute,
554 i, &QTabWidget::setTabWhatsThis, PROP_TABPAGEWHATSTHIS);
557#if QT_CONFIG(toolbox)
558 }
else if (
auto *toolBox = qobject_cast<QToolBox*>(parentWidget)) {
559 const int i = toolBox->count() - 1;
560 translateSubwidgetProperty(ui_widget->elementAttribute(), toolBox,
561 QFormBuilderStrings::labelAttribute,
562 i, &QToolBox::setItemText, PROP_TOOLITEMTEXT);
563#if QT_CONFIG(tooltip)
564 translateSubwidgetProperty(ui_widget->elementAttribute(), toolBox,
565 QFormBuilderStrings::toolTipAttribute,
566 i, &QToolBox::setItemToolTip, PROP_TOOLITEMTOOLTIP);
574#ifdef QFORMINTERNAL_NAMESPACE
581#ifdef QFORMINTERNAL_NAMESPACE
592 if (!g_widgets()->isEmpty())
595#define DECLARE_WIDGET(a, b) g_widgets()->insert(QLatin1String(#a), true);
596#define DECLARE_LAYOUT(a, b)
598#include "widgets.table"
601#undef DECLARE_WIDGET_1
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
661
662
663QUiLoader::QUiLoader(QObject *parent)
664 : QObject(parent), d_ptr(
new QUiLoaderPrivate)
668#ifndef QT_NO_DATASTREAM
669 static int metaTypeId = 0;
671 metaTypeId = qRegisterMetaType<QUiTranslatableStringValue>(
"QUiTranslatableStringValue");
674 d->builder.loader =
this;
676#if QT_CONFIG(library)
678 const QStringList &libraryPaths = QApplication::libraryPaths();
679 for (
const QString &path : libraryPaths) {
680 QString libPath = path;
681 libPath += QDir::separator();
682 libPath += QStringLiteral(
"designer");
683 paths.append(libPath);
686 d->builder.setPluginPath(paths);
691
692
693QUiLoader::~QUiLoader() =
default;
696
697
698
699
700
701QWidget *QUiLoader::load(QIODevice *device, QWidget *parentWidget)
705 if (!device->isOpen())
706 device->open(QIODevice::ReadOnly|QIODevice::Text);
707 return d->builder.load(device, parentWidget);
711
712
713
714
715
716QStringList QUiLoader::pluginPaths()
const
718 Q_D(
const QUiLoader);
719 return d->builder.pluginPaths();
723
724
725
726
727
728void QUiLoader::clearPluginPaths()
731 d->builder.clearPluginPaths();
735
736
737
738
739
740void QUiLoader::addPluginPath(
const QString &path)
743 d->builder.addPluginPath(path);
747
748
749
750
751
752
753
754
755
756
757
758
759QWidget *QUiLoader::createWidget(
const QString &className, QWidget *parent,
const QString &name)
762 return d->builder.defaultCreateWidget(className, parent, name);
766
767
768
769
770
771
772
773
774
775
776
777QLayout *QUiLoader::createLayout(
const QString &className, QObject *parent,
const QString &name)
780 return d->builder.defaultCreateLayout(className, parent, name);
784
785
786
787
788
789
790
791
792
793
794QActionGroup *QUiLoader::createActionGroup(QObject *parent,
const QString &name)
797 return d->builder.defaultCreateActionGroup(parent, name);
801
802
803
804
805
806
807
808
809
810
811QAction *QUiLoader::createAction(QObject *parent,
const QString &name)
814 return d->builder.defaultCreateAction(parent, name);
818
819
820
821
822
823
824
825QStringList QUiLoader::availableWidgets()
const
827 Q_D(
const QUiLoader);
830 widget_map available = *g_widgets();
832 const auto &customWidgets = d->builder.customWidgets();
833 for (QDesignerCustomWidgetInterface *plugin : customWidgets)
834 available.insert(plugin->name(),
true);
836 return available.keys();
841
842
843
844
845
846
848QStringList QUiLoader::availableLayouts()
const
851#define DECLARE_WIDGET(a, b)
852#define DECLARE_LAYOUT(a, b) rc.push_back(QLatin1String(#a));
854#include "widgets.table"
862
863
864
865
866
867
869void QUiLoader::setWorkingDirectory(
const QDir &dir)
872 d->builder.setWorkingDirectory(dir);
876
877
878
879
881QDir QUiLoader::workingDirectory()
const
883 Q_D(
const QUiLoader);
884 return d->builder.workingDirectory();
887
888
889
890
891
892
893
894
896void QUiLoader::setLanguageChangeEnabled(
bool enabled)
899 d->builder.dynamicTr = enabled;
903
904
905
906
907
908
909
911bool QUiLoader::isLanguageChangeEnabled()
const
913 Q_D(
const QUiLoader);
914 return d->builder.dynamicTr;
918
919
920
921
922
923
924
925
926
927
929void QUiLoader::setTranslationEnabled(
bool enabled)
932 d->builder.trEnabled = enabled;
936
937
938
939
940
941
942
944bool QUiLoader::isTranslationEnabled()
const
946 Q_D(
const QUiLoader);
947 return d->builder.trEnabled;
951
952
953
954
955
957QString QUiLoader::errorString()
const
959 Q_D(
const QUiLoader);
960 return d->builder.errorString();
965#include "quiloader.moc"
void setupWidgetMap() const
FormBuilderPrivate builder
QVariant toNativeValue(const QVariant &value) const override
QVariant loadText(const DomProperty *icon) const override
TranslatingTextBuilder(bool idBased, bool trEnabled, const QByteArray &className)
Q_GLOBAL_STATIC(QReadWriteLock, g_updateMutex)
#define QStringLiteral(str)
const QUiItemRolePair qUiItemRoles[]
static void reTranslateWidgetItem(T *item, const QByteArray &class_name, bool idBased)
static QString convertTranslatable(const DomProperty *p, const QByteArray &className, bool idBased, QUiTranslatableStringValue *strVal)
static DomProperty * attributeByName(const QList< DomProperty * > &attributes, const QString &attribute)
QDataStream & operator<<(QDataStream &stream, const QImage &image)
[0]
QDataStream & operator>>(QDataStream &stream, QImage &image)