6#include "ui_qtresourceeditordialog.h"
10#include <abstractdialoggui_p.h>
12#include <QtDesigner/abstractsettings.h>
13#include <QtDesigner/abstractformeditor.h>
15#include <QtCore/qcompare.h>
16#include <QtCore/qfileinfo.h>
17#include <QtCore/qdir.h>
18#include <QtCore/qcoreapplication.h>
19#include <QtXml/qdom.h>
20#include <QtWidgets/qmenu.h>
21#include <QtWidgets/qheaderview.h>
22#include <QtWidgets/qinputdialog.h>
23#include <QtWidgets/qmessagebox.h>
24#include <QtWidgets/qpushbutton.h>
25#include <QtGui/qstandarditemmodel.h>
29using namespace Qt::StringLiterals;
32static constexpr auto rccTag =
"qresource"_L1;
43 return QCoreApplication::translate(
"QtResourceEditorDialog",
"%1 already exists.\nDo you want to replace it?").arg(fname);
48 return QCoreApplication::translate(
"QtResourceEditorDialog",
"The file does not appear to be a resource file; element '%1' was found where '%2' was expected.").arg(got, expected);
62 return lhs.path == rhs.path && lhs.alias == rhs.alias;
76 return lhs.prefix == rhs.prefix && lhs.language == rhs.language
77 && lhs.resourceFileList == rhs.resourceFileList;
90 return lhs.qrcPath == rhs.qrcPath && lhs.resourceList == rhs.resourceList;
102 QString *errorMessage)
107 if (fileElem.tagName() != rccFileTag) {
108 *errorMessage = msgTagMismatch(fileElem.tagName(), rccFileTag);
114 data.path = fileElem.text();
115 data.alias = fileElem.attribute(rccAliasAttribute);
125 if (prefixElem.tagName() != rccTag) {
126 *errorMessage = msgTagMismatch(prefixElem.tagName(), rccTag);
132 data.prefix = prefixElem.attribute(rccPrefixAttribute);
133 data.language = prefixElem.attribute(rccLangAttribute);
134 QDomElement fileElem = prefixElem.firstChildElement();
135 while (!fileElem.isNull()) {
137 if (!loadResourceFileData(fileElem, &fileData, errorMessage))
139 data.resourceFileList.append(fileData);
140 fileElem = fileElem.nextSiblingElement();
152 QDomElement docElem = doc.documentElement();
153 if (docElem.tagName() != rccRootTag) {
154 *errorMessage = msgTagMismatch(docElem.tagName(), rccRootTag);
158 QDomElement prefixElem = docElem.firstChildElement();
159 while (!prefixElem.isNull()) {
161 if (!loadResourcePrefixData(prefixElem, &prefixData, errorMessage))
163 data.resourceList.append(prefixData);
164 prefixElem = prefixElem.nextSiblingElement();
174 QDomElement fileElem = doc.createElement(rccFileTag);
175 if (!fileData.alias.isEmpty())
176 fileElem.setAttribute(rccAliasAttribute, fileData.alias);
178 QDomText textElem = doc.createTextNode(fileData.path);
179 fileElem.appendChild(textElem);
186 QDomElement prefixElem = doc.createElement(rccTag);
187 if (!prefixData.prefix.isEmpty())
188 prefixElem.setAttribute(rccPrefixAttribute, prefixData.prefix);
189 if (!prefixData.language.isEmpty())
190 prefixElem.setAttribute(rccLangAttribute, prefixData.language);
192 for (
const QtResourceFileData &rfd : prefixData.resourceFileList) {
193 QDomElement fileElem = saveResourceFileData(doc, rfd);
194 prefixElem.appendChild(fileElem);
203 QDomElement docElem = doc.createElement(rccRootTag);
204 for (
const QtResourcePrefixData &prefixData : qrcFileData.resourceList) {
205 QDomElement prefixElem = saveResourcePrefixData(doc, prefixData);
207 docElem.appendChild(prefixElem);
209 doc.appendChild(docElem);
221 QString
path()
const {
return m_path; }
222 QString
alias()
const {
return m_alias; }
225 QtResourceFile() =
default;
236 QString
prefix()
const {
return m_prefix; }
240 QtResourcePrefix() =
default;
244 QList<QtResourceFile *> m_resourceFiles;
252 QString
path()
const {
return m_path; }
258 QtQrcFile() =
default;
260 void setPath(
const QString &path) {
263 m_fileName = fi.fileName();
268 QList<QtResourcePrefix *> m_resourcePrefixes;
290 QIcon
icon(
const QString &resourceFullPath)
const;
291 bool exists(
const QString &resourceFullPath)
const;
313 const QString &prefix,
const QString &language,
321 const QString &path,
const QString &alias,
338 const QString &oldPrefix);
340 const QString &oldLanguage);
347 const QString &oldAlias);
351 QList<QtQrcFile *> m_qrcFiles;
352 QMap<QString, QtQrcFile *> m_pathToQrc;
353 QHash<QtQrcFile *,
bool> m_qrcFileToExists;
354 QHash<QtResourcePrefix *, QtQrcFile *> m_prefixToQrc;
355 QHash<QtResourceFile *, QtResourcePrefix *> m_fileToPrefix;
356 QMap<QString, QList<QtResourceFile *> > m_fullPathToResourceFiles;
357 QMap<QString, QIcon> m_fullPathToIcon;
358 QMap<QString,
bool> m_fullPathToExists;
379 return m_pathToQrc.value(path);
384 return m_prefixToQrc.value(resourcePrefix);
389 return m_fileToPrefix.value(resourceFile);
394 QtQrcFile *qrcFile = insertQrcFile(qrcFileData.qrcPath, beforeQrcFile);
397 for (
const QtResourcePrefixData &prefixData : qrcFileData.resourceList) {
398 QtResourcePrefix *resourcePrefix = insertResourcePrefix(qrcFile, prefixData.prefix, prefixData.language,
nullptr);
399 for (
const QtResourceFileData &fileData : prefixData.resourceFileList)
400 insertResourceFile(resourcePrefix, fileData.path, fileData.alias,
nullptr);
416 QList<QtResourcePrefixData> resourceList;
418 const auto resourcePrefixes = qrcFile->resourcePrefixList();
419 for (
const QtResourcePrefix *prefix : resourcePrefixes) {
420 QList<QtResourceFileData> resourceFileList;
421 const auto resourceFiles = prefix->resourceFiles();
422 for (QtResourceFile *file : resourceFiles) {
423 QtResourceFileData fileData;
424 fileData.path = file->path();
425 fileData.alias = file->alias();
426 resourceFileList << fileData;
428 QtResourcePrefixData prefixData;
429 prefixData.prefix = prefix->prefix();
430 prefixData.language = prefix->language();
431 prefixData.resourceFileList = resourceFileList;
433 resourceList << prefixData;
436 data.qrcPath = qrcFile->path();
437 data.resourceList = resourceList;
442 return m_fullPathToIcon.value(resourceFullPath);
447 return m_fullPathToExists.value(resourceFullPath,
false);
452 return m_qrcFileToExists.value(qrcFile,
false);
459 const int idx = m_qrcFiles.indexOf(qrcFile);
462 return m_qrcFiles.at(idx - 1);
469 const int idx = m_qrcFiles.indexOf(qrcFile);
470 if (idx < 0 || idx == m_qrcFiles.size() - 1)
472 return m_qrcFiles.at(idx + 1);
479 const auto prefixes =
qrcFileOf(resourcePrefix
)->resourcePrefixList();
480 const int idx = prefixes.indexOf(resourcePrefix);
483 return prefixes.at(idx - 1);
490 const auto prefixes =
qrcFileOf(resourcePrefix
)->resourcePrefixList();
491 const int idx = prefixes.indexOf(resourcePrefix);
492 if (idx < 0 || idx == prefixes.size() - 1)
494 return prefixes.at(idx + 1);
502 const int idx = files.indexOf(resourceFile);
505 return files.at(idx - 1);
513 const int idx = files.indexOf(resourceFile);
514 if (idx < 0 || idx == files.size() - 1)
516 return files.at(idx + 1);
521 const auto oldQrcFiles = qrcFiles();
522 for (QtQrcFile *qf : oldQrcFiles)
528 if (m_pathToQrc.contains(path))
531 int idx = m_qrcFiles.indexOf(beforeQrcFile);
533 idx = m_qrcFiles.size();
536 qrcFile->setPath(path);
538 m_qrcFiles.insert(idx, qrcFile);
539 m_pathToQrc[path] = qrcFile;
541 const QFileInfo fi(path);
542 m_qrcFileToExists[qrcFile] = fi.exists() || newFile;
544 emit qrcFileInserted(qrcFile);
550 if (qrcFile == beforeQrcFile)
553 const int idx = m_qrcFiles.indexOf(qrcFile);
557 int beforeIdx = m_qrcFiles.indexOf(beforeQrcFile);
559 beforeIdx = m_qrcFiles.size();
561 if (idx == beforeIdx - 1)
565 if (idx < m_qrcFiles.size() - 1)
566 oldBefore = m_qrcFiles.at(idx + 1);
568 m_qrcFiles.removeAt(idx);
572 m_qrcFiles.insert(beforeIdx, qrcFile);
574 emit qrcFileMoved(qrcFile, oldBefore);
579 qrcFile->m_initialState = initialState;
584 const int idx = m_qrcFiles.indexOf(qrcFile);
588 const auto resourcePrefixes = qrcFile->resourcePrefixList();
589 for (QtResourcePrefix *rp : resourcePrefixes)
590 removeResourcePrefix(rp);
592 emit qrcFileRemoved(qrcFile);
594 m_qrcFiles.removeAt(idx);
595 m_pathToQrc.remove(qrcFile->path());
596 m_qrcFileToExists.remove(qrcFile);
606 int idx = qrcFile->m_resourcePrefixes.indexOf(beforeResourcePrefix);
608 idx = qrcFile->m_resourcePrefixes.size();
611 resourcePrefix->m_prefix = prefix;
612 resourcePrefix->m_language = language;
614 qrcFile->m_resourcePrefixes.insert(idx, resourcePrefix);
615 m_prefixToQrc[resourcePrefix] = qrcFile;
617 emit resourcePrefixInserted(resourcePrefix);
618 return resourcePrefix;
623 if (resourcePrefix == beforeResourcePrefix)
630 if (beforeResourcePrefix &&
qrcFileOf(beforeResourcePrefix
) != qrcFile)
633 const int idx = qrcFile->m_resourcePrefixes.indexOf(resourcePrefix);
635 int beforeIdx = qrcFile->m_resourcePrefixes.indexOf(beforeResourcePrefix);
637 beforeIdx = qrcFile->m_resourcePrefixes.size();
639 if (idx == beforeIdx - 1)
643 if (idx < qrcFile->m_resourcePrefixes.size() - 1)
644 oldBefore = qrcFile->m_resourcePrefixes.at(idx + 1);
646 qrcFile->m_resourcePrefixes.removeAt(idx);
650 qrcFile->m_resourcePrefixes.insert(beforeIdx, resourcePrefix);
652 emit resourcePrefixMoved(resourcePrefix, oldBefore);
660 const QString oldPrefix = resourcePrefix->m_prefix;
661 if (oldPrefix == newPrefix)
664 resourcePrefix->m_prefix = newPrefix;
666 emit resourcePrefixChanged(resourcePrefix, oldPrefix);
674 const QString oldLanguage = resourcePrefix->m_language;
675 if (oldLanguage == newLanguage)
678 resourcePrefix->m_language = newLanguage;
680 emit resourceLanguageChanged(resourcePrefix, oldLanguage);
689 const int idx = qrcFile->m_resourcePrefixes.indexOf(resourcePrefix);
691 const auto resourceFiles = resourcePrefix->resourceFiles();
692 for (QtResourceFile *rf : resourceFiles)
693 removeResourceFile(rf);
695 emit resourcePrefixRemoved(resourcePrefix);
697 qrcFile->m_resourcePrefixes.removeAt(idx);
698 m_prefixToQrc.remove(resourcePrefix);
699 delete resourcePrefix;
708 int idx = resourcePrefix->m_resourceFiles.indexOf(beforeResourceFile);
710 idx = resourcePrefix->m_resourceFiles.size();
713 resourceFile->m_path = path;
714 resourceFile->m_alias = alias;
715 const QFileInfo fi(
qrcFileOf(resourcePrefix
)->path());
716 const QDir dir(fi.absolutePath());
717 const QString fullPath = dir.absoluteFilePath(path);
718 resourceFile->m_fullPath = fullPath;
720 resourcePrefix->m_resourceFiles.insert(idx, resourceFile);
721 m_fileToPrefix[resourceFile] = resourcePrefix;
722 m_fullPathToResourceFiles[fullPath].append(resourceFile);
723 if (!m_fullPathToIcon.contains(fullPath)) {
724 m_fullPathToIcon[fullPath] = QIcon(fullPath);
725 const QFileInfo fullInfo(fullPath);
726 m_fullPathToExists[fullPath] = fullInfo.exists();
729 emit resourceFileInserted(resourceFile);
735 if (resourceFile == beforeResourceFile)
745 const int idx = resourcePrefix->m_resourceFiles.indexOf(resourceFile);
747 int beforeIdx = resourcePrefix->m_resourceFiles.indexOf(beforeResourceFile);
749 beforeIdx = resourcePrefix->m_resourceFiles.size();
751 if (idx == beforeIdx - 1)
755 if (idx < resourcePrefix->m_resourceFiles.size() - 1)
756 oldBefore = resourcePrefix->m_resourceFiles.at(idx + 1);
758 resourcePrefix->m_resourceFiles.removeAt(idx);
762 resourcePrefix->m_resourceFiles.insert(beforeIdx, resourceFile);
764 emit resourceFileMoved(resourceFile, oldBefore);
772 const QString oldAlias = resourceFile->m_alias;
773 if (oldAlias == newAlias)
776 resourceFile->m_alias = newAlias;
778 emit resourceAliasChanged(resourceFile, oldAlias);
787 const int idx = resourcePrefix->m_resourceFiles.indexOf(resourceFile);
789 emit resourceFileRemoved(resourceFile);
791 resourcePrefix->m_resourceFiles.removeAt(idx);
792 m_fileToPrefix.remove(resourceFile);
793 const QString fullPath = resourceFile->fullPath();
794 m_fullPathToResourceFiles[fullPath].removeAll(resourceFile);
795 if (m_fullPathToResourceFiles[fullPath].isEmpty()) {
796 m_fullPathToResourceFiles.remove(fullPath);
797 m_fullPathToIcon.remove(fullPath);
798 m_fullPathToExists.remove(fullPath);
814 Q_DECLARE_PUBLIC(QtResourceEditorDialog)
871 const QString &title, QString dir,
const QString &filter,
const QString &extension)
const;
875 QDesignerFormEditorInterface *
m_core =
nullptr;
917 QMessageBox::StandardButton defaultButton)
const
919 return m_dlgGui->message(q_ptr, QDesignerDialogGuiInterface::ResourceEditorMessage, QMessageBox::Warning, title, text, buttons, defaultButton);
924 const QString path = qrcFile->path();
925 const QString fileName = qrcFile->fileName();
926 const QFileInfo fi(path);
927 if (fi.exists() && !fi.isWritable())
928 return QApplication::translate(
"QtResourceEditorDialog",
"%1 [read-only]").arg(fileName);
929 if (!m_qrcManager->exists(qrcFile))
930 return QApplication::translate(
"QtResourceEditorDialog",
"%1 [missing]").arg(fileName);
936 QListWidgetItem *currentItem = m_ui.qrcFileList->currentItem();
937 int idx = m_ui.qrcFileList->count();
939 QListWidgetItem *nextItem = m_qrcFileToItem.value(nextQrcFile);
941 const int row = m_ui.qrcFileList->row(nextItem);
945 const QString path = qrcFile->path();
946 QListWidgetItem *item =
new QListWidgetItem(qrcFileText(qrcFile));
947 item->setToolTip(path);
949 m_ui.qrcFileList->insertItem(idx, item);
950 m_ui.qrcFileList->setCurrentItem(currentItem);
952 m_qrcFileToItem[qrcFile] = item;
953 m_itemToQrcFile[item] = qrcFile;
955 item->setForeground(QBrush(Qt::red));
960 QListWidgetItem *currentItem = m_ui.qrcFileList->currentItem();
961 QListWidgetItem *item = m_qrcFileToItem.value(qrcFile);
963 m_ui.qrcFileList->takeItem(m_ui.qrcFileList->row(item));
965 int idx = m_ui.qrcFileList->count();
967 QListWidgetItem *nextItem = m_qrcFileToItem.value(nextQrcFile);
969 int row = m_ui.qrcFileList->row(nextItem);
973 m_ui.qrcFileList->insertItem(idx, item);
974 if (currentItem == item)
975 m_ui.qrcFileList->setCurrentItem(item);
981 QListWidgetItem *item = m_qrcFileToItem.value(qrcFile);
982 if (item == m_ui.qrcFileList->currentItem())
983 m_ui.qrcFileList->setCurrentItem(
nullptr);
987 m_itemToQrcFile.remove(item);
988 m_qrcFileToItem.remove(qrcFile);
997 QStandardItem *prevItem = m_resourcePrefixToPrefixItem.value(prevResourcePrefix);
1001 row = m_treeModel->indexFromItem(prevItem).row() + 1;
1003 QStandardItem *prefixItem =
new QStandardItem();
1004 QStandardItem *languageItem =
new QStandardItem();
1005 QList<QStandardItem *> items;
1006 items << prefixItem;
1007 items << languageItem;
1008 m_treeModel->insertRow(row, items);
1009 const QModelIndex newIndex = m_treeModel->indexFromItem(prefixItem);
1010 m_ui.resourceTreeView->setExpanded(newIndex,
true);
1011 prefixItem->setFlags(prefixItem->flags() | Qt::ItemIsEditable);
1012 languageItem->setFlags(languageItem->flags() | Qt::ItemIsEditable);
1013 m_resourcePrefixToPrefixItem[resourcePrefix] = prefixItem;
1014 m_resourcePrefixToLanguageItem[resourcePrefix] = languageItem;
1015 m_prefixItemToResourcePrefix[prefixItem] = resourcePrefix;
1016 m_languageItemToResourcePrefix[languageItem] = resourcePrefix;
1024 QStandardItem *prefixItem = m_resourcePrefixToPrefixItem.value(resourcePrefix);
1028 QStandardItem *languageItem = m_resourcePrefixToLanguageItem.value(resourcePrefix);
1032 const QModelIndex index = m_treeModel->indexFromItem(prefixItem);
1033 const bool expanded = m_ui.resourceTreeView->isExpanded(index);
1035 const auto items = m_treeModel->takeRow(index.row());
1037 int row = m_treeModel->rowCount();
1039 QStandardItem *nextItem = m_resourcePrefixToPrefixItem.value(nextResourcePrefix);
1041 row = m_treeModel->indexFromItem(nextItem).row();
1042 m_treeModel->insertRow(row, items);
1044 m_ui.resourceTreeView->setExpanded(m_treeModel->indexFromItem(items.at(0)), expanded);
1049 QStandardItem *item = m_resourcePrefixToPrefixItem.value(resourcePrefix);
1054 QString prefix = resourcePrefix->prefix();
1055 if (prefix.isEmpty())
1056 prefix = QCoreApplication::translate(
"QtResourceEditorDialog",
"<no prefix>");
1057 item->setText(prefix);
1058 item->setToolTip(prefix);
1064 QStandardItem *item = m_resourcePrefixToLanguageItem.value(resourcePrefix);
1069 const QString language = resourcePrefix->language();
1070 item->setText(language);
1071 item->setToolTip(language);
1078 QStandardItem *prefixItem = m_resourcePrefixToPrefixItem.value(resourcePrefix);
1082 QStandardItem *languageItem = m_resourcePrefixToLanguageItem.value(resourcePrefix);
1087 m_treeModel->takeRow(m_treeModel->indexFromItem(prefixItem).row());
1089 delete languageItem;
1091 m_prefixItemToResourcePrefix.remove(prefixItem);
1092 m_languageItemToResourcePrefix.remove(languageItem);
1093 m_resourcePrefixToPrefixItem.remove(resourcePrefix);
1094 m_resourcePrefixToLanguageItem.remove(resourcePrefix);
1104 QStandardItem *prevItem = m_resourceFileToPathItem.value(prevResourceFile);
1106 QStandardItem *pathItem =
new QStandardItem(resourceFile->path());
1107 QStandardItem *aliasItem =
new QStandardItem();
1108 QStandardItem *parentItem = m_resourcePrefixToPrefixItem.value(resourcePrefix);
1109 QList<QStandardItem *> items;
1115 row = m_treeModel->indexFromItem(prevItem).row() + 1;
1117 parentItem->insertRow(row, items);
1119 pathItem->setFlags(pathItem->flags() & ~Qt::ItemIsEditable);
1120 aliasItem->setFlags(aliasItem->flags() | Qt::ItemIsEditable);
1121 m_resourceFileToPathItem[resourceFile] = pathItem;
1122 m_resourceFileToAliasItem[resourceFile] = aliasItem;
1123 m_pathItemToResourceFile[pathItem] = resourceFile;
1124 m_aliasItemToResourceFile[aliasItem] = resourceFile;
1125 pathItem->setToolTip(resourceFile->path());
1126 pathItem->setIcon(
m_qrcManager->icon(resourceFile->fullPath()));
1128 pathItem->setText(QApplication::translate(
"QtResourceEditorDialog",
"%1 [missing]").arg(resourceFile->path()));
1129 QBrush redBrush(Qt::red);
1130 pathItem->setForeground(redBrush);
1131 aliasItem->setForeground(redBrush);
1138 QStandardItem *pathItem = m_resourceFileToPathItem.value(resourceFile);
1142 QStandardItem *aliasItem = m_resourceFileToAliasItem.value(resourceFile);
1146 QStandardItem *parentItem = pathItem->parent();
1148 const auto items = parentItem->takeRow(m_treeModel->indexFromItem(pathItem).row());
1150 int row = parentItem->rowCount();
1152 QStandardItem *nextItem = m_resourceFileToPathItem.value(nextResourceFile);
1154 row = m_treeModel->indexFromItem(nextItem).row();
1155 parentItem->insertRow(row, items);
1161 QStandardItem *item = m_resourceFileToAliasItem.value(resourceFile);
1166 const QString alias = resourceFile->alias();
1167 item->setText(alias);
1168 item->setToolTip(alias);
1175 QStandardItem *pathItem = m_resourceFileToPathItem.value(resourceFile);
1179 QStandardItem *aliasItem = m_resourceFileToAliasItem.value(resourceFile);
1183 QStandardItem *parentItem = pathItem->parent();
1186 parentItem->takeRow(m_treeModel->indexFromItem(pathItem).row());
1190 m_pathItemToResourceFile.remove(pathItem);
1191 m_aliasItemToResourceFile.remove(aliasItem);
1192 m_resourceFileToPathItem.remove(resourceFile);
1193 m_resourceFileToAliasItem.remove(resourceFile);
1202 QtQrcFile *newCurrentQrcFile = m_itemToQrcFile.value(item);
1208 QHash<QtResourcePrefix *, QStandardItem *> currentPrefixList = m_resourcePrefixToPrefixItem;
1209 for (
auto it = currentPrefixList.cbegin(), end = currentPrefixList.cend(); it != end; ++it) {
1211 const auto currentResourceFiles = resourcePrefix->resourceFiles();
1212 for (QtResourceFile *rf : currentResourceFiles)
1213 slotResourceFileRemoved(rf);
1219 slotCurrentTreeViewItemChanged(QModelIndex());
1220 QStandardItem *firstPrefix =
nullptr;
1223 for (QtResourcePrefix *resourcePrefix : newPrefixList) {
1224 if (QStandardItem *newPrefixItem = insertResourcePrefix(resourcePrefix))
1226 firstPrefix = newPrefixItem;
1227 const auto newResourceFiles = resourcePrefix->resourceFiles();
1228 for (QtResourceFile *rf : newResourceFiles)
1229 slotResourceFileInserted(rf);
1232 m_ui.resourceTreeView->setCurrentIndex(firstPrefix ? m_treeModel->indexFromItem(firstPrefix) : QModelIndex());
1234 m_removeQrcFileAction->setEnabled(m_currentQrcFile);
1235 m_moveUpQrcFileAction->setEnabled(m_currentQrcFile && m_qrcManager->prevQrcFile(m_currentQrcFile));
1236 m_moveDownQrcFileAction->setEnabled(m_currentQrcFile && m_qrcManager->nextQrcFile(m_currentQrcFile));
1241 QStandardItem *item = m_treeModel->itemFromIndex(index);
1242 QtResourceFile *resourceFile = m_pathItemToResourceFile.value(item);
1244 resourceFile = m_aliasItemToResourceFile.value(item);
1245 QtResourcePrefix *resourcePrefix = m_prefixItemToResourcePrefix.value(item);
1246 if (!resourcePrefix)
1247 resourcePrefix = m_languageItemToResourcePrefix.value(item);
1249 bool moveUpEnabled =
false;
1250 bool moveDownEnabled =
false;
1251 bool currentItem = resourceFile || resourcePrefix;
1255 moveUpEnabled =
true;
1257 moveDownEnabled =
true;
1258 }
else if (resourcePrefix) {
1260 moveUpEnabled =
true;
1262 moveDownEnabled =
true;
1265 m_newPrefixAction->setEnabled(m_currentQrcFile);
1266 m_addResourceFileAction->setEnabled(currentItem);
1267 m_changePrefixAction->setEnabled(currentItem);
1268 m_changeLanguageAction->setEnabled(currentItem);
1269 m_changeAliasAction->setEnabled(resourceFile);
1270 m_removeAction->setEnabled(currentItem);
1271 m_moveUpAction->setEnabled(moveUpEnabled);
1272 m_moveDownAction->setEnabled(moveDownEnabled);
1273 m_clonePrefixAction->setEnabled(currentItem);
1279 menu.addAction(m_newQrcFileAction);
1280 menu.addAction(m_importQrcFileAction);
1281 menu.addAction(m_removeQrcFileAction);
1282 menu.addSeparator();
1283 menu.addAction(m_moveUpQrcFileAction);
1284 menu.addAction(m_moveDownQrcFileAction);
1285 menu.exec(m_ui.qrcFileList->mapToGlobal(pos));
1291 menu.addAction(m_newPrefixAction);
1292 menu.addAction(m_addResourceFileAction);
1293 menu.addAction(m_removeAction);
1294 menu.addSeparator();
1295 menu.addAction(m_changePrefixAction);
1296 menu.addAction(m_changeLanguageAction);
1297 menu.addAction(m_changeAliasAction);
1298 menu.addSeparator();
1299 menu.addAction(m_clonePrefixAction);
1300 menu.addSeparator();
1301 menu.addAction(m_moveUpAction);
1302 menu.addAction(m_moveDownAction);
1303 menu.exec(m_ui.resourceTreeView->mapToGlobal(pos));
1311 const QString newValue = item->text();
1312 QtResourceFile *resourceFile = m_aliasItemToResourceFile.value(item);
1318 QtResourcePrefix *resourcePrefix = m_prefixItemToResourcePrefix.value(item);
1319 if (resourcePrefix) {
1324 resourcePrefix = m_languageItemToResourcePrefix.value(item);
1325 if (resourcePrefix) {
1332 const QString &title, QString dir,
const QString &filter,
const QString &extension)
const
1336 saveFile =
m_dlgGui->getSaveFileName(parent, title, dir, filter,
nullptr, QFileDialog::DontConfirmOverwrite);
1337 if (saveFile.isEmpty())
1340 const QFileInfo fInfo(saveFile);
1341 if (fInfo.suffix().isEmpty() && !fInfo.fileName().endsWith(u'.'))
1342 saveFile += u'.' + extension;
1344 const QFileInfo fi(saveFile);
1348 if (warning(title, msgOverwrite(fi.fileName()), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes)
1361 return dir.exists() ? dir.absolutePath() : QString();
1366 const QString qrcPath = getSaveFileNameWithExtension(q_ptr,
1367 QCoreApplication::translate(
"QtResourceEditorDialog",
"New Resource File"),
1368 m_firstQrcFileDialog ? qrcStartDirectory() : QString(),
1369 QCoreApplication::translate(
"QtResourceEditorDialog",
"Resource files (*.qrc)"),
1371 if (qrcPath.isEmpty())
1377 QListWidgetItem *item = m_qrcFileToItem.value(sameQrcFile);
1378 m_ui.qrcFileList->setCurrentItem(item);
1379 item->setSelected(
true);
1386 m_ui.qrcFileList->setCurrentItem(m_qrcFileToItem.value(qrcFile));
1391 const QString qrcPath = m_dlgGui->getOpenFileName(q_ptr,
1392 QCoreApplication::translate(
"QtResourceEditorDialog",
"Import Resource File"),
1393 m_firstQrcFileDialog ? qrcStartDirectory() : QString(),
1394 QCoreApplication::translate(
"QtResourceEditorDialog",
"Resource files (*.qrc)"));
1395 if (qrcPath.isEmpty())
1400 QListWidgetItem *item = m_qrcFileToItem.value(sameQrcFile);
1401 m_ui.qrcFileList->setCurrentItem(item);
1402 item->setSelected(
true);
1409 loadQrcFile(qrcPath, &qrcFileData);
1411 m_ui.qrcFileList->setCurrentItem(m_qrcFileToItem.value(qrcFile));
1420 if (!currentQrcFile)
1424 QListWidgetItem *item = m_qrcFileToItem.value(currentQrcFile);
1426 m_ui.qrcFileList->setCurrentItem(item);
1427 item->setSelected(
true);
1458 QStandardItem *currentItem = m_treeModel->itemFromIndex(m_treeSelection->currentIndex());
1463 currentResourceFile = m_pathItemToResourceFile.value(currentItem);
1464 if (!currentResourceFile)
1465 currentResourceFile = m_aliasItemToResourceFile.value(currentItem);
1467 return currentResourceFile;
1472 QStandardItem *currentItem = m_treeModel->itemFromIndex(m_treeSelection->currentIndex());
1476 currentResourcePrefix = m_prefixItemToResourcePrefix.value(currentItem);
1477 if (!currentResourcePrefix) {
1478 currentResourcePrefix = m_languageItemToResourcePrefix.value(currentItem);
1479 if (!currentResourcePrefix) {
1481 if (currentResourceFile)
1486 return currentResourcePrefix;
1491 const QModelIndex index = m_treeModel->indexFromItem(item);
1492 m_treeSelection->select(index, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);
1493 m_treeSelection->setCurrentIndex(index, QItemSelectionModel::Select);
1504 QCoreApplication::translate(
"QtResourceEditorDialog",
"newPrefix"),
1505 QString(), nextResourcePrefix);
1506 if (!newResourcePrefix)
1509 QStandardItem *newItem = m_resourcePrefixToPrefixItem.value(newResourcePrefix);
1513 const QModelIndex index = m_treeModel->indexFromItem(newItem);
1514 selectTreeRow(newItem);
1515 m_ui.resourceTreeView->edit(index);
1520 return QApplication::translate(
"QtResourceEditorDialog",
1521 "<p><b>Warning:</b> The file</p>"
1523 "<p>is outside of the current resource file's parent directory.</p>").arg(fname);
1528 return QApplication::translate(
"QtResourceEditorDialog",
1529 "<p>To resolve the issue, press:</p>"
1531 "<tr><th align=\"left\">Copy</th><td>to copy the file to the resource file's parent directory.</td></tr>"
1532 "<tr><th align=\"left\">Copy As...</th><td>to copy the file into a subdirectory of the resource file's parent directory.</td></tr>"
1533 "<tr><th align=\"left\">Keep</th><td>to use its current location.</td></tr></table>");
1543 if (!currentResourcePrefix)
1546 QString initialPath = m_currentQrcFile->path();
1547 if (currentResourceFile) {
1548 QFileInfo fi(currentResourceFile->fullPath());
1549 initialPath = fi.absolutePath();
1552 const QStringList resourcePaths =
m_dlgGui->getOpenImageFileNames(q_ptr,
1553 QCoreApplication::translate(
"QtResourceEditorDialog",
"Add Files"),
1555 if (resourcePaths.isEmpty())
1559 if (!currentResourceFile) {
1560 const auto resourceFiles = currentResourcePrefix->resourceFiles();
1561 if (!resourceFiles.isEmpty())
1562 nextResourceFile = resourceFiles.first();
1566 const QString destDir = fi.absolutePath();
1567 const QDir dir(fi.absolutePath());
1568 for (QString resourcePath : resourcePaths) {
1569 QString relativePath = dir.relativeFilePath(resourcePath);
1570 if (relativePath.startsWith(
".."_L1)) {
1571 QMessageBox msgBox(QMessageBox::Warning,
1572 QCoreApplication::translate(
"QtResourceEditorDialog",
"Incorrect Path"),
1573 outOfPathWarning(relativePath), QMessageBox::Cancel);
1574 msgBox.setInformativeText(outOfPathWarningInfo());
1575 QPushButton *copyButton = msgBox.addButton(QCoreApplication::translate(
"QtResourceEditorDialog",
1576 "Copy"), QMessageBox::ActionRole);
1577 QPushButton *copyAsButton = msgBox.addButton(QCoreApplication::translate(
"QtResourceEditorDialog",
1578 "Copy As..."), QMessageBox::ActionRole);
1579 QPushButton *keepButton = msgBox.addButton(QCoreApplication::translate(
"QtResourceEditorDialog",
1580 "Keep"), QMessageBox::ActionRole);
1581 QPushButton *skipButton = msgBox.addButton(QCoreApplication::translate(
"QtResourceEditorDialog",
1582 "Skip"), QMessageBox::ActionRole);
1583 msgBox.setEscapeButton(QMessageBox::Cancel);
1584 msgBox.setDefaultButton(copyButton);
1587 if (msgBox.clickedButton() == keepButton) {
1589 }
else if (msgBox.clickedButton() == copyButton) {
1590 QFileInfo resInfo(resourcePath);
1592 destPath = dd.absoluteFilePath(resInfo.fileName());
1593 if (dd.exists(resInfo.fileName())) {
1594 if (warning(QCoreApplication::translate(
"QtResourceEditorDialog",
"Copy"),
1595 msgOverwrite(resInfo.fileName()),
1596 QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Cancel) != QMessageBox::Yes)
1599 resourcePath = copyResourceFile(resourcePath, destPath);
1600 }
else if (msgBox.clickedButton() == copyAsButton) {
1601 destPath = browseForNewLocation(resourcePath, dir);
1602 if (destPath.isEmpty())
1604 resourcePath = copyResourceFile(resourcePath, destPath);
1605 }
else if (msgBox.clickedButton() == skipButton) {
1610 if (resourcePath.isEmpty())
1613 relativePath = dir.relativeFilePath(resourcePath);
1614 QtResourceFile *newResourceFile = m_qrcManager->insertResourceFile(currentResourcePrefix, relativePath, QString(), nextResourceFile);
1616 QStandardItem *newItem = m_resourceFileToPathItem.value(newResourceFile);
1618 selectTreeRow(newItem);
1625 if (!currentResourcePrefix)
1628 QStandardItem *item = m_resourcePrefixToPrefixItem.value(currentResourcePrefix);
1629 QModelIndex index = m_treeModel->indexFromItem(item);
1630 selectTreeRow(item);
1631 m_ui.resourceTreeView->scrollTo(index);
1632 m_ui.resourceTreeView->edit(index);
1638 if (!currentResourcePrefix)
1641 QStandardItem *item = m_resourcePrefixToLanguageItem.value(currentResourcePrefix);
1642 QModelIndex index = m_treeModel->indexFromItem(item);
1643 selectTreeRow(item);
1644 m_ui.resourceTreeView->scrollTo(index);
1645 m_ui.resourceTreeView->edit(index);
1651 if (!currentResourceFile)
1654 QStandardItem *item = m_resourceFileToAliasItem.value(currentResourceFile);
1655 QModelIndex index = m_treeModel->indexFromItem(item);
1656 selectTreeRow(item);
1657 m_ui.resourceTreeView->scrollTo(index);
1658 m_ui.resourceTreeView->edit(index);
1664 if (!currentResourcePrefix)
1668 QString suffix = QInputDialog::getText(q_ptr, QApplication::translate(
"QtResourceEditorDialog",
"Clone Prefix"),
1669 QCoreApplication::translate(
"QtResourceEditorDialog",
"Enter the suffix which you want to add to the names of the cloned files.\n"
1670 "This could for example be a language extension like \"_de\"."),
1671 QLineEdit::Normal, QString(), &ok);
1677 if (newResourcePrefix) {
1678 const auto files = currentResourcePrefix->resourceFiles();
1679 for (QtResourceFile *resourceFile : files) {
1680 QString path = resourceFile->path();
1683 QString oldSuffix = fi.completeSuffix();
1684 if (!oldSuffix.isEmpty())
1685 oldSuffix = u'.' + oldSuffix;
1686 const QString newBaseName = fi.baseName() + suffix + oldSuffix;
1687 const QString newPath = QDir::cleanPath(dir.filePath(newBaseName));
1688 m_qrcManager->insertResourceFile(newResourcePrefix, newPath,
1689 resourceFile->alias());
1696 QStandardItem *item = m_treeModel->itemFromIndex(m_treeSelection->currentIndex());
1700 QtResourceFile *resourceFile = m_pathItemToResourceFile.value(item);
1702 resourceFile = m_aliasItemToResourceFile.value(item);
1703 QtResourcePrefix *resourcePrefix = m_prefixItemToResourcePrefix.value(item);
1704 if (!resourcePrefix)
1705 resourcePrefix = m_languageItemToResourcePrefix.value(item);
1707 QStandardItem *newCurrentItem =
nullptr;
1713 newCurrentItem = m_resourceFileToPathItem.value(nextFile);
1714 if (!newCurrentItem)
1715 newCurrentItem = m_resourcePrefixToPrefixItem.value(m_qrcManager->resourcePrefixOf(resourceFile));
1717 if (!newCurrentItem) {
1721 newCurrentItem = m_resourcePrefixToPrefixItem.value(nextPrefix);
1724 selectTreeRow(newCurrentItem);
1728 else if (resourceFile)
1741 selectTreeRow(m_resourceFileToPathItem.value(resourceFile));
1749 selectTreeRow(m_resourcePrefixToPrefixItem.value(resourcePrefix));
1762 selectTreeRow(m_resourceFileToPathItem.value(resourceFile));
1770 selectTreeRow(m_resourcePrefixToPrefixItem.value(resourcePrefix));
1776 QFileInfo fi(resourceFile);
1777 const QString initialPath = rootDir.absoluteFilePath(fi.fileName());
1779 QString newPath = m_dlgGui->getSaveFileName(q_ptr,
1780 QCoreApplication::translate(
"QtResourceEditorDialog",
"Copy As"),
1782 QString relativePath = rootDir.relativeFilePath(newPath);
1783 if (relativePath.startsWith(
".."_L1)) {
1784 if (warning(QCoreApplication::translate(
"QtResourceEditorDialog",
"Copy As"),
1785 QCoreApplication::translate(
"QtResourceEditorDialog",
"<p>The selected file:</p>"
1786 "<p>%1</p><p>is outside of the current resource file's directory:</p><p>%2</p>"
1787 "<p>Please select another path within this directory.<p>").
1788 arg(relativePath, rootDir.absolutePath()),
1789 QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok) != QMessageBox::Ok)
1801 QFileInfo fi(destPath);
1803 while (fi.exists() && !QFile::remove(destPath)) {
1804 if (warning(QCoreApplication::translate(
"QtResourceEditorDialog",
"Copy"),
1805 QCoreApplication::translate(
"QtResourceEditorDialog",
"Could not overwrite %1.").arg(fi.fileName()),
1806 QMessageBox::Retry | QMessageBox::Cancel, QMessageBox::Cancel) != QMessageBox::Retry)
1810 while (!QFile::copy(resourceFile, destPath)) {
1811 if (warning(QCoreApplication::translate(
"QtResourceEditorDialog",
"Copy"),
1812 QCoreApplication::translate(
"QtResourceEditorDialog",
"Could not copy\n%1\nto\n%2")
1813 .arg(resourceFile, destPath),
1814 QMessageBox::Retry | QMessageBox::Cancel, QMessageBox::Cancel) != QMessageBox::Retry)
1821 QString errorMessage;
1822 const bool rc = loadQrcFile(path, qrcFileData, &errorMessage);
1832 qrcFileData->qrcPath = path;
1835 if (!file.open(QIODevice::ReadOnly)) {
1841 QByteArray dataArray = file.readAll();
1845 if (QDomDocument::ParseResult result = doc.setContent(dataArray)) {
1846 return loadQrcFileData(doc, path, qrcFileData, errorMessage);
1849 QCoreApplication::translate(
"QtResourceEditorDialog",
1850 "A parse error occurred at line %1, column %2 of %3:\n%4")
1851 .arg(result.errorLine).arg(result.errorColumn).arg(path, result.errorMessage);
1858 QFile file(qrcFileData.qrcPath);
1859 while (!file.open(QIODevice::WriteOnly)) {
1860 QMessageBox msgBox(QMessageBox::Warning,
1861 QCoreApplication::translate(
"QtResourceEditorDialog",
1862 "Save Resource File"),
1863 QCoreApplication::translate(
"QtResourceEditorDialog",
1864 "Could not write %1: %2")
1865 .arg(qrcFileData.qrcPath,
1866 file.errorString()),
1867 QMessageBox::Cancel|QMessageBox::Ignore|QMessageBox::Retry);
1868 msgBox.setEscapeButton(QMessageBox::Cancel);
1869 msgBox.setDefaultButton(QMessageBox::Ignore);
1870 switch (msgBox.exec()) {
1871 case QMessageBox::Retry:
1873 case QMessageBox::Ignore:
1880 QDomDocument doc = saveQrcFileData(qrcFileData);
1882 QByteArray dataArray = doc.toByteArray(2);
1883 file.write(dataArray);
1890 : QDialog(parent), d_ptr(
new QtResourceEditorDialogPrivate())
1892 d_ptr->q_ptr =
this;
1893 d_ptr->m_ui.setupUi(
this);
1894 d_ptr->m_qrcManager =
new QtQrcManager(
this);
1895 d_ptr->m_dlgGui = dlgGui;
1896 d_ptr->m_core = core;
1898 setWindowTitle(tr(
"Edit Resources"));
1900 connect(d_ptr->m_qrcManager, &QtQrcManager::qrcFileInserted,
1901 this, [
this](
QtQrcFile *file) { d_ptr->slotQrcFileInserted(file); });
1903 this, [
this](
QtQrcFile *file) { d_ptr->slotQrcFileMoved(file); });
1905 this, [
this](
QtQrcFile *file) { d_ptr->slotQrcFileRemoved(file); });
1908 this, [
this](
QtResourcePrefix *prefix) { d_ptr->slotResourcePrefixInserted(prefix); });
1910 this, [
this](
QtResourcePrefix *prefix) { d_ptr->slotResourcePrefixMoved(prefix); });
1912 this, [
this](
QtResourcePrefix *prefix) { d_ptr->slotResourcePrefixChanged(prefix); });
1914 this, [
this](
QtResourcePrefix *prefix) { d_ptr->slotResourceLanguageChanged(prefix); });
1916 this, [
this](
QtResourcePrefix *prefix) { d_ptr->slotResourcePrefixRemoved(prefix); });
1919 this, [
this](
QtResourceFile *file) { d_ptr->slotResourceFileInserted(file); });
1921 this, [
this](
QtResourceFile *file) { d_ptr->slotResourceFileMoved(file); });
1923 this, [
this](
QtResourceFile *file) { d_ptr->slotResourceAliasChanged(file); });
1925 this, [
this](
QtResourceFile *file) { d_ptr->slotResourceFileRemoved(file); });
1927 QIcon upIcon = qdesigner_internal::createIconSet(
"up.png"_L1);
1928 QIcon downIcon = qdesigner_internal::createIconSet(
"down.png"_L1);
1929 QIcon minusIcon = qdesigner_internal::createIconSet(
"minus-16.png"_L1);
1930 QIcon newIcon = qdesigner_internal::createIconSet(
"filenew-16.png"_L1);
1931 QIcon openIcon = qdesigner_internal::createIconSet(
"fileopen-16.png"_L1);
1932 QIcon removeIcon = qdesigner_internal::createIconSet(
"editdelete-16.png"_L1);
1933 QIcon addPrefixIcon = qdesigner_internal::createIconSet(
"prefix-add.png"_L1);
1935 d_ptr->m_newQrcFileAction =
new QAction(newIcon, tr(
"New..."),
this);
1936 d_ptr->m_newQrcFileAction->setToolTip(tr(
"New Resource File"));
1937 d_ptr->m_importQrcFileAction =
new QAction(openIcon, tr(
"Open..."),
this);
1938 d_ptr->m_importQrcFileAction->setToolTip(tr(
"Open Resource File"));
1939 d_ptr->m_removeQrcFileAction =
new QAction(removeIcon, tr(
"Remove"),
this);
1940 d_ptr->m_moveUpQrcFileAction =
new QAction(upIcon, tr(
"Move Up"),
this);
1941 d_ptr->m_moveDownQrcFileAction =
new QAction(downIcon, tr(
"Move Down"),
this);
1943 d_ptr->m_newPrefixAction =
new QAction(addPrefixIcon, tr(
"Add Prefix"),
this);
1944 d_ptr->m_newPrefixAction->setToolTip(tr(
"Add Prefix"));
1945 d_ptr->m_addResourceFileAction =
new QAction(openIcon, tr(
"Add Files..."),
this);
1946 d_ptr->m_changePrefixAction =
new QAction(tr(
"Change Prefix"),
this);
1947 d_ptr->m_changeLanguageAction =
new QAction(tr(
"Change Language"),
this);
1948 d_ptr->m_changeAliasAction =
new QAction(tr(
"Change Alias"),
this);
1949 d_ptr->m_clonePrefixAction =
new QAction(tr(
"Clone Prefix..."),
this);
1950 d_ptr->m_removeAction =
new QAction(minusIcon, tr(
"Remove"),
this);
1951 d_ptr->m_moveUpAction =
new QAction(upIcon, tr(
"Move Up"),
this);
1952 d_ptr->m_moveDownAction =
new QAction(downIcon, tr(
"Move Down"),
this);
1954 d_ptr->m_ui.newQrcButton->setDefaultAction(d_ptr->m_newQrcFileAction);
1955 d_ptr->m_ui.importQrcButton->setDefaultAction(d_ptr->m_importQrcFileAction);
1956 d_ptr->m_ui.removeQrcButton->setDefaultAction(d_ptr->m_removeQrcFileAction);
1958 d_ptr->m_ui.newResourceButton->setDefaultAction(d_ptr->m_newPrefixAction);
1959 d_ptr->m_ui.addResourceButton->setDefaultAction(d_ptr->m_addResourceFileAction);
1960 d_ptr->m_ui.removeResourceButton->setDefaultAction(d_ptr->m_removeAction);
1962 connect(d_ptr->m_newQrcFileAction, &QAction::triggered,
1963 this, [
this] { d_ptr->slotNewQrcFile(); });
1964 connect(d_ptr->m_importQrcFileAction, &QAction::triggered,
1965 this, [
this] { d_ptr->slotImportQrcFile(); });
1966 connect(d_ptr->m_removeQrcFileAction, &QAction::triggered,
1967 this, [
this] { d_ptr->slotRemoveQrcFile(); });
1968 connect(d_ptr->m_moveUpQrcFileAction, &QAction::triggered,
1969 this, [
this] { d_ptr->slotMoveUpQrcFile(); });
1970 connect(d_ptr->m_moveDownQrcFileAction, &QAction::triggered,
1971 this, [
this] { d_ptr->slotMoveDownQrcFile(); });
1973 connect(d_ptr->m_newPrefixAction, &QAction::triggered,
1974 this, [
this] { d_ptr->slotNewPrefix(); });
1975 connect(d_ptr->m_addResourceFileAction, &QAction::triggered,
1976 this, [
this] { d_ptr->slotAddFiles(); });
1977 connect(d_ptr->m_changePrefixAction, &QAction::triggered,
1978 this, [
this] { d_ptr->slotChangePrefix(); });
1979 connect(d_ptr->m_changeLanguageAction, &QAction::triggered,
1980 this, [
this] { d_ptr->slotChangeLanguage(); });
1981 connect(d_ptr->m_changeAliasAction, &QAction::triggered,
1982 this, [
this] { d_ptr->slotChangeAlias(); });
1983 connect(d_ptr->m_clonePrefixAction, &QAction::triggered,
1984 this, [
this] { d_ptr->slotClonePrefix(); });
1985 connect(d_ptr->m_removeAction, &QAction::triggered,
1986 this, [
this] { d_ptr->slotRemove(); });
1987 connect(d_ptr->m_moveUpAction, &QAction::triggered,
1988 this, [
this] { d_ptr->slotMoveUp(); });
1989 connect(d_ptr->m_moveDownAction, &QAction::triggered,
1990 this, [
this] { d_ptr->slotMoveDown(); });
1992 d_ptr->m_ui.qrcFileList->setContextMenuPolicy(Qt::CustomContextMenu);
1993 connect(d_ptr->m_ui.qrcFileList, &QListWidget::customContextMenuRequested,
1994 this, [
this](
const QPoint &point) { d_ptr->slotListWidgetContextMenuRequested(point); });
1995 connect(d_ptr->m_ui.qrcFileList, &QListWidget::currentItemChanged,
1996 this, [
this](QListWidgetItem *item) { d_ptr->slotCurrentQrcFileChanged(item); });
1998 d_ptr->m_treeModel =
new QStandardItemModel(
this);
1999 d_ptr->m_treeModel->setColumnCount(2);
2000 d_ptr->m_treeModel->setHorizontalHeaderItem(0,
new QStandardItem(tr(
"Prefix / Path")));
2001 d_ptr->m_treeModel->setHorizontalHeaderItem(1,
new QStandardItem(tr(
"Language / Alias")));
2002 d_ptr->m_ui.resourceTreeView->setModel(d_ptr->m_treeModel);
2003 d_ptr->m_ui.resourceTreeView->setContextMenuPolicy(Qt::CustomContextMenu);
2004 d_ptr->m_treeSelection = d_ptr->m_ui.resourceTreeView->selectionModel();
2005 connect(d_ptr->m_ui.resourceTreeView->header(), &QHeaderView::sectionDoubleClicked,
2006 d_ptr->m_ui.resourceTreeView, &QTreeView::resizeColumnToContents);
2007 d_ptr->m_ui.resourceTreeView->setTextElideMode(Qt::ElideLeft);
2009 connect(d_ptr->m_ui.resourceTreeView, &QTreeView::customContextMenuRequested,
2010 this, [
this](
const QPoint &point) { d_ptr->slotTreeViewContextMenuRequested(point); });
2011 connect(d_ptr->m_treeModel, &QStandardItemModel::itemChanged,
2012 this, [
this](QStandardItem *item) { d_ptr->slotTreeViewItemChanged(item); });
2013 connect(d_ptr->m_treeSelection, &QItemSelectionModel::currentChanged,
2014 this, [
this](
const QModelIndex &index) { d_ptr->slotCurrentTreeViewItemChanged(index); });
2016 d_ptr->m_ui.resourceTreeView->setColumnWidth(0, 200);
2018 d_ptr->slotCurrentTreeViewItemChanged(QModelIndex());
2019 d_ptr->m_removeQrcFileAction->setEnabled(
false);
2020 d_ptr->m_moveUpQrcFileAction->setEnabled(
false);
2021 d_ptr->m_moveDownQrcFileAction->setEnabled(
false);
2023 QDesignerSettingsInterface *settings = core->settingsManager();
2024 settings->beginGroup(QrcDialogC);
2026 d_ptr->m_ui.splitter->restoreState(settings->value(SplitterPosition).toByteArray());
2027 const QVariant geometry = settings->value(ResourceEditorGeometry);
2028 if (geometry.metaType().id() == QMetaType::QByteArray)
2029 restoreGeometry(geometry.toByteArray());
2031 settings->endGroup();
2036 QDesignerSettingsInterface *settings = d_ptr->m_core->settingsManager();
2037 settings->beginGroup(QrcDialogC);
2039 settings->setValue(SplitterPosition, d_ptr->m_ui.splitter->saveState());
2040 settings->setValue(ResourceEditorGeometry, saveGeometry());
2041 settings->endGroup();
2043 disconnect(d_ptr->m_qrcManager,
nullptr,
this,
nullptr);
2048 return d_ptr->m_resourceModel;
2053 d_ptr->m_resourceModel = model;
2055 QtResourceSet *resourceSet = d_ptr->m_resourceModel->currentResourceSet();
2061 d_ptr->m_initialState.clear();
2065 const QStringList paths = resourceSet->activeResourceFilePaths();
2066 for (
const QString &path : paths) {
2067 QtQrcFileData qrcFileData;
2068 d_ptr->loadQrcFile(path, &qrcFileData);
2069 d_ptr->m_initialState << qrcFileData;
2070 d_ptr->m_qrcManager->importQrcFile(qrcFileData);
2072 if (d_ptr->m_ui.qrcFileList->count() > 0) {
2073 d_ptr->m_ui.qrcFileList->item(0)->setSelected(
true);
2080 QtResourcePrefix *currentResourcePrefix = d_ptr->getCurrentResourcePrefix();
2081 if (!currentResourcePrefix)
2084 const QChar slash(u'/');
2085 QString resource = currentResourcePrefix->prefix();
2086 if (!resource.startsWith(slash))
2087 resource.prepend(slash);
2088 if (!resource.endsWith(slash))
2089 resource.append(slash);
2090 resource.prepend(u':');
2092 QtResourceFile *currentResourceFile = d_ptr->getCurrentResourceFile();
2093 if (!currentResourceFile)
2096 QString resourceEnding = currentResourceFile->path();
2097 if (!currentResourceFile->alias().isEmpty())
2098 resourceEnding = currentResourceFile->alias();
2100 const auto dotSlash =
"./"_L1;
2101 const auto dotDotSlash =
"../"_L1;
2103 if (resourceEnding.startsWith(slash))
2104 resourceEnding = resourceEnding.mid(1);
2105 else if (resourceEnding.startsWith(dotSlash))
2106 resourceEnding = resourceEnding.mid(dotSlash.size());
2107 else if (resourceEnding.startsWith(dotDotSlash))
2108 resourceEnding = resourceEnding.mid(dotDotSlash.size());
2113 resource.append(resourceEnding);
2120 const QString msg = tr(
"<html><p><b>Warning:</b> There have been problems while reloading the resources:</p><pre>%1</pre></html>").arg(logOutput);
2121 dlgGui->message(parent, QDesignerDialogGuiInterface::ResourceEditorMessage, QMessageBox::Warning,
2122 tr(
"Resource Warning"), msg);
2127 QStringList newQrcPaths;
2128 QList<QtQrcFileData> currentState;
2130 const auto qrcFiles = d_ptr->m_qrcManager->qrcFiles();
2131 for (QtQrcFile *qrcFile : qrcFiles) {
2132 QtQrcFileData qrcFileData;
2133 d_ptr->m_qrcManager->exportQrcFile(qrcFile, &qrcFileData);
2134 currentState << qrcFileData;
2135 if (qrcFileData == qrcFile->initialState()) {
2138 d_ptr->m_resourceModel->setWatcherEnabled(qrcFileData.qrcPath,
false);
2139 bool ok = d_ptr->saveQrcFile(qrcFileData);
2140 d_ptr->m_resourceModel->setWatcherEnabled(qrcFileData.qrcPath,
true);
2144 d_ptr->m_resourceModel->setModified(qrcFileData.qrcPath);
2146 newQrcPaths << qrcFileData.qrcPath;
2149 if (currentState == d_ptr->m_initialState) {
2153 QString errorMessages;
2154 d_ptr->m_resourceModel->currentResourceSet()->activateResourceFilePaths(newQrcPaths, &errorCount, &errorMessages);
2156 displayResourceFailures(errorMessages, d_ptr->m_dlgGui,
this);
2162 QtResourceModel *model,
2163 QDesignerDialogGuiInterface *dlgGui,
2168 if (dialog.exec() == QDialog::Accepted)
2169 return dialog.selectedResource();
2175#include "moc_qtresourceeditordialog_p.cpp"
2176#include "qtresourceeditordialog.moc"
QAction * m_importQrcFileAction
QHash< QListWidgetItem *, QtQrcFile * > m_itemToQrcFile
Ui::QtResourceEditorDialog m_ui
void slotQrcFileRemoved(QtQrcFile *qrcFile)
void selectTreeRow(QStandardItem *item)
void slotResourceAliasChanged(QtResourceFile *resourceFile)
void slotTreeViewContextMenuRequested(const QPoint &pos)
void slotResourcePrefixChanged(QtResourcePrefix *resourcePrefix)
bool loadQrcFile(const QString &path, QtQrcFileData *qrcFileData, QString *errorMessage)
QAction * m_newPrefixAction
QtResourceModel * m_resourceModel
QMessageBox::StandardButton warning(const QString &title, const QString &text, QMessageBox::StandardButtons buttons=QMessageBox::Ok, QMessageBox::StandardButton defaultButton=QMessageBox::NoButton) const
QtQrcFile * m_currentQrcFile
QString qrcStartDirectory() const
void slotTreeViewItemChanged(QStandardItem *item)
QHash< QStandardItem *, QtResourceFile * > m_pathItemToResourceFile
void slotResourcePrefixMoved(QtResourcePrefix *resourcePrefix)
void slotMoveDownQrcFile()
void slotResourceLanguageChanged(QtResourcePrefix *resourcePrefix)
void slotResourcePrefixRemoved(QtResourcePrefix *resourcePrefix)
QAction * m_changeLanguageAction
QAction * m_moveDownQrcFileAction
QHash< QtResourceFile *, QStandardItem * > m_resourceFileToAliasItem
QAction * m_moveDownAction
QAction * m_clonePrefixAction
void slotResourceFileMoved(QtResourceFile *resourceFile)
QAction * m_removeQrcFileAction
void slotChangeLanguage()
bool saveQrcFile(const QtQrcFileData &qrcFileData)
QAction * m_newQrcFileAction
QString copyResourceFile(const QString &resourceFile, const QString &destPath) const
QtResourcePrefix * getCurrentResourcePrefix() const
void slotQrcFileMoved(QtQrcFile *qrcFile)
void slotListWidgetContextMenuRequested(const QPoint &pos)
QAction * m_moveUpQrcFileAction
QAction * m_changeAliasAction
void slotCurrentQrcFileChanged(QListWidgetItem *item)
void slotResourceFileInserted(QtResourceFile *resourceFile)
QtQrcManager * m_qrcManager
QString getSaveFileNameWithExtension(QWidget *parent, const QString &title, QString dir, const QString &filter, const QString &extension) const
void slotResourceFileRemoved(QtResourceFile *resourceFile)
QAction * m_addResourceFileAction
bool loadQrcFile(const QString &path, QtQrcFileData *qrcFileData)
QDesignerFormEditorInterface * m_core
void slotQrcFileInserted(QtQrcFile *qrcFile)
QHash< QStandardItem *, QtResourcePrefix * > m_prefixItemToResourcePrefix
QAction * m_changePrefixAction
QList< QtQrcFileData > m_initialState
void slotCurrentTreeViewItemChanged(const QModelIndex &index)
void slotResourcePrefixInserted(QtResourcePrefix *resourcePrefix)
QHash< QtResourcePrefix *, QStandardItem * > m_resourcePrefixToPrefixItem
QStandardItemModel * m_treeModel
QtResourceFile * getCurrentResourceFile() const
QHash< QtQrcFile *, QListWidgetItem * > m_qrcFileToItem
QString browseForNewLocation(const QString &resourceFile, const QDir &rootDir) const
QDesignerDialogGuiInterface * m_dlgGui
QHash< QtResourceFile *, QStandardItem * > m_resourceFileToPathItem
QHash< QtResourcePrefix *, QStandardItem * > m_resourcePrefixToLanguageItem
bool m_firstQrcFileDialog
QString qrcFileText(QtQrcFile *qrcFile) const
QHash< QStandardItem *, QtResourcePrefix * > m_languageItemToResourcePrefix
QItemSelectionModel * m_treeSelection
QHash< QStandardItem *, QtResourceFile * > m_aliasItemToResourceFile
bool m_ignoreCurrentChanged
QStandardItem * insertResourcePrefix(QtResourcePrefix *resourcePrefix)
~QtResourceEditorDialog() override
QString selectedResource() const
void setResourceModel(QtResourceModel *model)
QtQrcFileData initialState() const
QList< QtResourcePrefix * > resourcePrefixList() const
QtQrcFile * qrcFileOf(const QString &path) const
QtQrcFile * qrcFileOf(QtResourcePrefix *resourcePrefix) const
void qrcFileMoved(qdesigner_internal::QtQrcFile *qrcFile, qdesigner_internal::QtQrcFile *oldBeforeQrcFile)
QtResourceFile * nextResourceFile(QtResourceFile *resourceFile) const
void resourcePrefixMoved(qdesigner_internal::QtResourcePrefix *resourcePrefix, qdesigner_internal::QtResourcePrefix *oldBeforeResourcePrefix)
QtResourcePrefix * resourcePrefixOf(QtResourceFile *resourceFile) const
void changeResourcePrefix(qdesigner_internal::QtResourcePrefix *resourcePrefix, const QString &newPrefix)
void changeResourceAlias(qdesigner_internal::QtResourceFile *resourceFile, const QString &newAlias)
bool exists(QtQrcFile *qrcFile) const
void exportQrcFile(QtQrcFile *qrcFile, QtQrcFileData *qrcFileData) const
QtQrcFile * nextQrcFile(QtQrcFile *qrcFile) const
QtResourceFile * insertResourceFile(qdesigner_internal::QtResourcePrefix *resourcePrefix, const QString &path, const QString &alias, qdesigner_internal::QtResourceFile *beforeResourceFile=nullptr)
QtQrcFile * importQrcFile(const QtQrcFileData &qrcFileData, QtQrcFile *beforeQrcFile=nullptr)
void removeResourcePrefix(qdesigner_internal::QtResourcePrefix *resourcePrefix)
void resourceAliasChanged(qdesigner_internal::QtResourceFile *resourceFile, const QString &oldAlias)
QtResourcePrefix * nextResourcePrefix(QtResourcePrefix *resourcePrefix) const
bool exists(const QString &resourceFullPath) const
void setInitialState(qdesigner_internal::QtQrcFile *qrcFile, const QtQrcFileData &initialState)
void resourceFileInserted(qdesigner_internal::QtResourceFile *resourceFile)
void resourcePrefixChanged(qdesigner_internal::QtResourcePrefix *resourcePrefix, const QString &oldPrefix)
void resourceLanguageChanged(qdesigner_internal::QtResourcePrefix *resourcePrefix, const QString &oldLanguage)
void resourceFileRemoved(qdesigner_internal::QtResourceFile *resourceFile)
void qrcFileRemoved(qdesigner_internal::QtQrcFile *qrcFile)
void removeQrcFile(qdesigner_internal::QtQrcFile *qrcFile)
void resourceFileMoved(qdesigner_internal::QtResourceFile *resourceFile, qdesigner_internal::QtResourceFile *oldBeforeResourceFile)
QtResourcePrefix * insertResourcePrefix(qdesigner_internal::QtQrcFile *qrcFile, const QString &prefix, const QString &language, QtResourcePrefix *beforeResourcePrefix=nullptr)
void removeResourceFile(qdesigner_internal::QtResourceFile *resourceFile)
void moveResourceFile(qdesigner_internal::QtResourceFile *resourceFile, qdesigner_internal::QtResourceFile *beforeResourceFile)
QIcon icon(const QString &resourceFullPath) const
void resourcePrefixInserted(qdesigner_internal::QtResourcePrefix *resourcePrefix)
void resourcePrefixRemoved(qdesigner_internal::QtResourcePrefix *resourcePrefix)
QtQrcFile * prevQrcFile(QtQrcFile *qrcFile) const
void moveResourcePrefix(qdesigner_internal::QtResourcePrefix *resourcePrefix, QtResourcePrefix *beforeResourcePrefix)
QtResourceFile * prevResourceFile(QtResourceFile *resourceFile) const
void changeResourceLanguage(qdesigner_internal::QtResourcePrefix *resourcePrefix, const QString &newLanguage)
QList< QtQrcFile * > qrcFiles() const
void moveQrcFile(QtQrcFile *qrcFile, qdesigner_internal::QtQrcFile *beforeQrcFile)
QtResourcePrefix * prevResourcePrefix(QtResourcePrefix *resourcePrefix) const
QList< QtResourceFile * > resourceFiles() const
Combined button and popup list for selecting options.
Auxiliary methods to store/retrieve settings.
static bool loadResourcePrefixData(const QDomElement &prefixElem, QtResourcePrefixData *prefixData, QString *errorMessage)
static QDomElement saveResourcePrefixData(QDomDocument &doc, const QtResourcePrefixData &prefixData)
qdesigner_internal::QtQrcManager QtQrcManager
qdesigner_internal::QtResourceFile QtResourceFile
static QDomElement saveResourceFileData(QDomDocument &doc, const QtResourceFileData &fileData)
static constexpr auto rccPrefixAttribute
static constexpr auto ResourceEditorGeometry
static QString outOfPathWarning(const QString &fname)
qdesigner_internal::QtResourceFileData QtResourceFileData
static bool loadQrcFileData(const QDomDocument &doc, const QString &path, QtQrcFileData *qrcFileData, QString *errorMessage)
static constexpr auto rccFileTag
static QString msgOverwrite(const QString &fname)
qdesigner_internal::QtResourcePrefix QtResourcePrefix
static bool loadResourceFileData(const QDomElement &fileElem, QtResourceFileData *fileData, QString *errorMessage)
static QString outOfPathWarningInfo()
static QString msgTagMismatch(const QString &got, const QString &expected)
static QDomDocument saveQrcFileData(const QtQrcFileData &qrcFileData)
qdesigner_internal::QtQrcFile QtQrcFile
qdesigner_internal::QtQrcFileData QtQrcFileData
static constexpr auto rccRootTag
static constexpr auto rccLangAttribute
static constexpr auto rccTag
static constexpr auto SplitterPosition
static constexpr auto rccAliasAttribute
qdesigner_internal::QtResourcePrefixData QtResourcePrefixData
static constexpr auto QrcDialogC
friend bool comparesEqual(const QtQrcFileData &lhs, const QtQrcFileData &rhs) noexcept
QList< QtResourcePrefixData > resourceList
friend bool comparesEqual(const QtResourceFileData &lhs, const QtResourceFileData &rhs) noexcept
friend bool comparesEqual(const QtResourcePrefixData &lhs, const QtResourcePrefixData &rhs) noexcept
QList< QtResourceFileData > resourceFileList