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.constData(), QVariant::fromValue(strVal));
475 if (p->elementString()->text() != text)
476 o->setProperty(name.constData(), 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
701
702
703
704QWidget *QUiLoader::load(QIODevice *device, QWidget *parentWidget)
708 if (!device->isOpen())
709 device->open(QIODevice::ReadOnly|QIODevice::Text);
710 return d->builder.load(device, parentWidget);
714
715
716
717
718
719QStringList QUiLoader::pluginPaths()
const
721 Q_D(
const QUiLoader);
722 return d->builder.pluginPaths();
726
727
728
729
730
731void QUiLoader::clearPluginPaths()
734 d->builder.clearPluginPaths();
738
739
740
741
742
743
744
745
746void QUiLoader::addPluginPath(
const QString &path)
749 d->builder.addPluginPath(path);
753
754
755
756
757
758
759
760
761
762
763
764
765QWidget *QUiLoader::createWidget(
const QString &className, QWidget *parent,
const QString &name)
768 return d->builder.defaultCreateWidget(className, parent, name);
772
773
774
775
776
777
778
779
780
781
782
783QLayout *QUiLoader::createLayout(
const QString &className, QObject *parent,
const QString &name)
786 return d->builder.defaultCreateLayout(className, parent, name);
790
791
792
793
794
795
796
797
798
799
800QActionGroup *QUiLoader::createActionGroup(QObject *parent,
const QString &name)
803 return d->builder.defaultCreateActionGroup(parent, name);
807
808
809
810
811
812
813
814
815
816
817QAction *QUiLoader::createAction(QObject *parent,
const QString &name)
820 return d->builder.defaultCreateAction(parent, name);
824
825
826
827
828
829
830
831QStringList QUiLoader::availableWidgets()
const
833 Q_D(
const QUiLoader);
836 widget_map available = *g_widgets();
838 const auto &customWidgets = d->builder.customWidgets();
839 for (QDesignerCustomWidgetInterface *plugin : customWidgets)
840 available.insert(plugin->name(),
true);
842 return available.keys();
847
848
849
850
851
852
854QStringList QUiLoader::availableLayouts()
const
857#define DECLARE_WIDGET(a, b)
858#define DECLARE_LAYOUT(a, b) rc.push_back(QLatin1String(#a));
860#include "widgets.table"
868
869
870
871
872
873
874
875
876
877
879void QUiLoader::setWorkingDirectory(
const QDir &dir)
882 d->builder.setWorkingDirectory(dir);
886
887
888
889
891QDir QUiLoader::workingDirectory()
const
893 Q_D(
const QUiLoader);
894 return d->builder.workingDirectory();
897
898
899
900
901
902
903
904
906void QUiLoader::setLanguageChangeEnabled(
bool enabled)
909 d->builder.dynamicTr = enabled;
913
914
915
916
917
918
919
921bool QUiLoader::isLanguageChangeEnabled()
const
923 Q_D(
const QUiLoader);
924 return d->builder.dynamicTr;
928
929
930
931
932
933
934
935
936
937
939void QUiLoader::setTranslationEnabled(
bool enabled)
942 d->builder.trEnabled = enabled;
946
947
948
949
950
951
952
954bool QUiLoader::isTranslationEnabled()
const
956 Q_D(
const QUiLoader);
957 return d->builder.trEnabled;
961
962
963
964
965
967QString QUiLoader::errorString()
const
969 Q_D(
const QUiLoader);
970 return d->builder.errorString();
975#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)