17using namespace Qt::StringLiterals;
20 : m_stdout(stdout, QFile::WriteOnly | QFile::Text),
29static inline QString
actionClass() {
return QStringLiteral(
"QAction"); }
32template <
class DomClass>
33Driver::DomObjectHashConstIt<DomClass>
34 Driver::findByAttributeNameIt(
const DomObjectHash<DomClass> &domHash,
35 const QString &name)
const
37 const auto end = domHash.cend();
38 for (
auto it = domHash.cbegin(); it != end; ++it) {
39 if (it.key()->attributeName() == name)
45template <
class DomClass>
46const DomClass *
Driver::findByAttributeName(
const DomObjectHash<DomClass> &domHash,
47 const QString &name)
const
49 auto it = findByAttributeNameIt(domHash, name);
50 return it != domHash.cend() ? it.key() :
nullptr;
53template <
class DomClass>
54QString
Driver::findOrInsert(DomObjectHash<DomClass> *domHash,
const DomClass *dom,
55 const QString &className,
bool isMember)
57 auto it = domHash->find(dom);
58 if (it == domHash->end()) {
59 const QString name =
this->unique(dom->attributeName(), className);
60 it = domHash->insert(dom, isMember ?
language::self + name : name);
68 const bool isMember = !m_widgets.isEmpty();
69 return findOrInsert(&m_widgets, ui_widget, ui_widget->attributeClass(), isMember);
74 return findOrInsert(&m_spacers, ui_spacer, spacerItemClass());
79 return findOrInsert(&m_layouts, ui_layout, ui_layout->attributeClass());
84 switch (ui_layoutItem->kind()) {
85 case DomLayoutItem::Widget:
86 return findOrInsertWidget(ui_layoutItem->elementWidget());
87 case DomLayoutItem::Spacer:
88 return findOrInsertSpacer(ui_layoutItem->elementSpacer());
89 case DomLayoutItem::Layout:
90 return findOrInsertLayout(ui_layoutItem->elementLayout());
91 case DomLayoutItem::Unknown:
102 return findOrInsert(&m_actionGroups, ui_group, actionGroupClass());
107 return findOrInsert(&m_actions, ui_action, actionClass());
112 return findOrInsert(&m_buttonGroups, ui_group, buttonGroupClass());
118 return findByAttributeName(m_buttonGroups, attributeName);
129 QString result = name;
130 std::replace_if(result.begin(), result.end(),
131 [] (QChar c) {
return !c.isLetterOrNumber(); },
136QString
Driver::
unique(
const QString &instanceName,
const QString &className)
139 bool alreadyUsed =
false;
141 if (!instanceName.isEmpty()) {
142 name = normalizedName(instanceName);
145 for (
int id = 1; m_nameRepository.contains(name); ++id) {
147 name = base + QString::number(id);
149 }
else if (!className.isEmpty()) {
150 name = unique(qtify(className));
152 name = unique(
"var"_L1);
155 if (alreadyUsed && !className.isEmpty()) {
156 fprintf(stderr,
"%s: Warning: The name '%s' (%s) is already in use, defaulting to '%s'.\n",
162 m_nameRepository.insert(name,
true);
168 QString qname = name;
170 if (qname.at(0) == u'Q' || qname.at(0) == u'K')
173 for (qsizetype i = 0, size = qname.size(); i < size && qname.at(i).isUpper(); ++i)
174 qname[i] = qname.at(i).toLower();
181 return (c.toUpper() >= u'A' && c.toUpper() <= u'Z') || c.isDigit() || c == u'_';
186 QString name = m_option.outputFile;
188 if (name.isEmpty()) {
190 name.append(m_option.inputFile);
193 return headerFileName(name);
198 if (fileName.isEmpty())
199 return headerFileName(u"noname"_s);
202 QString baseName = info.baseName();
204 if (!baseName.isEmpty() && baseName.at(0).isDigit())
205 baseName.prepend(u'_');
206 for (qsizetype i = 0; i < baseName.size(); ++i) {
207 QChar c = baseName.at(i);
208 if (!isAnsiCCharacter(c)) {
210 QString hex = QString::number(c.unicode(), 16);
211 baseName.replace(i, 1, u'_' + hex + u'_');
215 return baseName.toUpper() +
"_H"_L1;
220 Q_ASSERT(m_option.dependencies ==
true);
222 m_option.inputFile = fileName;
228bool Driver::
uic(
const QString &fileName, DomUI *ui, QTextStream *out)
230 m_option.inputFile = fileName;
233 QTextStream *oldOutput = m_output;
235 m_output = out !=
nullptr ? out : &m_stdout;
240 m_output = oldOutput;
245bool Driver::
uic(
const QString &fileName, QTextStream *out)
248 if (fileName.isEmpty()) {
249 if (!f.open(stdin, QIODevice::ReadOnly))
252 f.setFileName(fileName);
253 if (!f.open(QIODevice::ReadOnly))
257 m_option.inputFile = fileName;
259 QTextStream *oldOutput = m_output;
260 bool deleteOutput =
false;
270 m_output =
new QTextStream(stdout, QIODevice::WriteOnly);
272 m_output =
new QTextStream(stdout, QIODevice::WriteOnly | QFile::Text);
278 bool rtn = tool.write(&f);
284 m_output = oldOutput;
291 return findByAttributeName(m_widgets, attributeName);
296 auto it = findByAttributeNameIt(m_widgets, attributeName);
297 return it != m_widgets.cend() ? it.value() : QString();
302 return findByAttributeName(m_actionGroups, attributeName);
307 return findByAttributeName(m_actions, attributeName);
bool uic(const QString &fileName, QTextStream *output=nullptr)
void setUseIdBasedTranslations(bool u)
const DomAction * actionByName(const QString &attributeName) const
QString widgetVariableName(const QString &attributeName) const
static QString qtify(const QString &name)
const DomActionGroup * actionGroupByName(const QString &attributeName) const
QString unique(const QString &instanceName=QString(), const QString &className=QString())
QString findOrInsertButtonGroup(const DomButtonGroup *ui_group)
static QString normalizedName(const QString &name)
QString findOrInsertWidget(const DomWidget *ui_widget)
const DomWidget * widgetByName(const QString &attributeName) const
QString findOrInsertActionGroup(const DomActionGroup *ui_group)
bool uic(const QString &fileName, DomUI *ui, QTextStream *output=nullptr)
static QString headerFileName(const QString &fileName)
QString findOrInsertLayoutItem(const DomLayoutItem *ui_layoutItem)
const DomButtonGroup * findButtonGroup(const QString &attributeName) const
QString headerFileName() const
QString findOrInsertAction(const DomAction *ui_action)
QString findOrInsertLayout(const DomLayout *ui_layout)
QString findOrInsertSpacer(const DomSpacer *ui_spacer)
QString findOrInsertName(const QString &name)
bool printDependencies(const QString &fileName)
static QString buttonGroupClass()
static bool isAnsiCCharacter(QChar c)
static QString spacerItemClass()
static QString actionGroupClass()
static QString actionClass()
Combined button and popup list for selecting options.
#define qPrintable(string)