This commit is contained in:
Kellermorph
2026-04-16 12:47:02 +02:00
parent c4e05f817c
commit ee65142b65
13 changed files with 413 additions and 158 deletions

View File

@@ -264,10 +264,12 @@ bool ElementsCollectionModel::dropMimeData(const QMimeData *data,
@param projects : list of projects to load @param projects : list of projects to load
*/ */
void ElementsCollectionModel::loadCollections(bool common_collection, void ElementsCollectionModel::loadCollections(bool common_collection,
bool company_collection, bool company_collection,
bool custom_collection, bool custom_collection,
QList<QETProject *> projects) QList<QETProject *> projects)
{ {
clear();
m_items_list_to_setUp.clear(); m_items_list_to_setUp.clear();
if (common_collection) if (common_collection)
@@ -280,36 +282,64 @@ void ElementsCollectionModel::loadCollections(bool common_collection,
if (common_collection || company_collection || custom_collection) if (common_collection || company_collection || custom_collection)
m_items_list_to_setUp.append(items()); m_items_list_to_setUp.append(items());
for (QETProject *project : projects) for (QETProject *project : projects)
{ {
addProject(project, false); addProject(project, false);
m_items_list_to_setUp.append(projectItems(project)); m_items_list_to_setUp.append(projectItems(project));
} }
auto *watcher = new QFutureWatcher<void>(); auto *watcher = new QFutureWatcher<void>();
connect(watcher, &QFutureWatcher<void>::progressValueChanged, connect(watcher, &QFutureWatcher<void>::progressValueChanged,
this, &ElementsCollectionModel::loadingProgressValueChanged); this, &ElementsCollectionModel::loadingProgressValueChanged);
connect(watcher, &QFutureWatcher<void>::progressRangeChanged, connect(watcher, &QFutureWatcher<void>::progressRangeChanged,
this, &ElementsCollectionModel::loadingProgressRangeChanged); this, &ElementsCollectionModel::loadingProgressRangeChanged);
connect(watcher, &QFutureWatcher<void>::finished, connect(watcher, &QFutureWatcher<void>::finished,
this, &ElementsCollectionModel::loadingFinished); this, &ElementsCollectionModel::loadingFinished);
connect( connect(watcher, &QFutureWatcher<void>::finished, watcher, &QFutureWatcher<void>::deleteLater);
watcher,
&QFutureWatcher<void>::finished, #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
watcher,
&QFutureWatcher<void>::deleteLater);
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // ### Qt 6: remove
m_future = QtConcurrent::map(m_items_list_to_setUp, setUpData); m_future = QtConcurrent::map(m_items_list_to_setUp, setUpData);
#else #else
# if TODO_LIST qDebug() << "Help code for QT 6 or later";
# pragma message("@TODO remove code for QT 6 or later") #endif
# endif
qDebug() << "Help code for QT 6 or later"
<< "QtConcurrent::run its backwards now...function, object, args";
#endif
watcher->setFuture(m_future); watcher->setFuture(m_future);
} }
/**
* @brief ElementsCollectionModel::loadMacrosCollection
* Load the macros collection synchronously to avoid thread-collisions.
*/
void ElementsCollectionModel::loadMacrosCollection()
{
m_items_list_to_setUp.clear();
addMacrosCollection(true);
}
/**
* @brief ElementsCollectionModel::addMacrosCollection
* Add the user macros collection to this model
* @param set_data
*/
void ElementsCollectionModel::addMacrosCollection(bool set_data)
{
QString macrosPath = QETApp::userMacrosDir();
qDebug() << "=== MAKRO PFAD CHECK ===" << macrosPath;
if (macrosPath.endsWith("/")) {
macrosPath.remove(macrosPath.length() - 1, 1);
}
FileElementCollectionItem *feci = new FileElementCollectionItem();
if (feci->setRootPath(macrosPath,
set_data,
m_hide_element)) {
invisibleRootItem()->appendRow(feci);
if (set_data)
feci->setUpData();
}
else
delete feci;
}
/** /**
@brief ElementsCollectionModel::addCommonCollection @brief ElementsCollectionModel::addCommonCollection
Add the common elements collection to this model Add the common elements collection to this model
@@ -368,11 +398,11 @@ void ElementsCollectionModel::addCustomCollection(bool set_data)
} }
/** /**
@brief ElementsCollectionModel::addLocation * @brief ElementsCollectionModel::addLocation
Add the element or directory to this model. * Add the element or directory to this model.
If the location is already managed by this model, do nothing. * If the location is already managed by this model, do nothing.
@param location * @param location
*/ */
void ElementsCollectionModel::addLocation(const ElementsLocation& location) void ElementsCollectionModel::addLocation(const ElementsLocation& location)
{ {
QModelIndex index = indexFromLocation(location); QModelIndex index = indexFromLocation(location);
@@ -387,14 +417,15 @@ void ElementsCollectionModel::addLocation(const ElementsLocation& location)
if (project) { if (project) {
XmlProjectElementCollectionItem *xpeci = XmlProjectElementCollectionItem *xpeci =
m_project_hash.value(project); m_project_hash.value(project);
last_item = xpeci->lastItemForPath( last_item = xpeci->lastItemForPath(
location.collectionPath(false), location.collectionPath(false),
collection_name); collection_name);
} }
} }
else if (location.isCustomCollection()) { // ANPASSUNG: Makros und Custom Collection werden hier behandelt!
else if (location.isCustomCollection() || location.isMacrosCollection()) {
QList <ElementCollectionItem *> child_list; QList <ElementCollectionItem *> child_list;
for (int i=0 ; i<rowCount() ; i++) for (int i=0 ; i<rowCount() ; i++)
@@ -404,15 +435,18 @@ void ElementsCollectionModel::addLocation(const ElementsLocation& location)
if (eci->type() == FileElementCollectionItem::Type) { if (eci->type() == FileElementCollectionItem::Type) {
FileElementCollectionItem *feci = FileElementCollectionItem *feci =
static_cast<FileElementCollectionItem *>(eci); static_cast<FileElementCollectionItem *>(eci);
// Wir prüfen explizit, ob es Custom ODER Macros ist, und weisen es richtig zu.
if ((location.isCustomCollection() && feci->isCustomCollection()) ||
(location.isMacrosCollection() && feci->isMacrosCollection())) {
if (feci->isCustomCollection()) {
last_item = feci->lastItemForPath( last_item = feci->lastItemForPath(
location.collectionPath(false), location.collectionPath(false),
collection_name); collection_name);
if(last_item) if(last_item)
break; break;
} }
} }
} }
} }
@@ -574,14 +608,14 @@ void ElementsCollectionModel::hideElement()
} }
/** /**
@brief ElementsCollectionModel::indexFromLocation * @brief ElementsCollectionModel::indexFromLocation
Return the index who represent location. * Return the index who represent location.
Index can be non valid * Index can be non valid
@param location * @param location
@return * @return
*/ */
QModelIndex ElementsCollectionModel::indexFromLocation( QModelIndex ElementsCollectionModel::indexFromLocation(
const ElementsLocation &location) const ElementsLocation &location)
{ {
QList <ElementCollectionItem *> child_list; QList <ElementCollectionItem *> child_list;
@@ -589,30 +623,34 @@ QModelIndex ElementsCollectionModel::indexFromLocation(
child_list.append(static_cast<ElementCollectionItem *>(item(i))); child_list.append(static_cast<ElementCollectionItem *>(item(i)));
} }
foreach(ElementCollectionItem *eci, child_list) { foreach(ElementCollectionItem *eci, child_list) {
ElementCollectionItem *match_eci = nullptr; ElementCollectionItem *match_eci = nullptr;
if (eci->type() == FileElementCollectionItem::Type) { if (eci->type() == FileElementCollectionItem::Type) {
if (FileElementCollectionItem *feci = static_cast<FileElementCollectionItem *>(eci)) { if (FileElementCollectionItem *feci = static_cast<FileElementCollectionItem *>(eci)) {
if ( (location.isCommonCollection() && feci->isCommonCollection()) ||
(location.isCompanyCollection() && feci->isCompanyCollection()) || // ANPASSUNG: Makro-Prüfung hinzugefügt, damit das Modell den Pfad im Baum findet!
(location.isCustomCollection() && !feci->isCommonCollection()) ) { if ( (location.isCommonCollection() && feci->isCommonCollection()) ||
match_eci = feci->itemAtPath(location.collectionPath(false)); (location.isCompanyCollection() && feci->isCompanyCollection()) ||
(location.isMacrosCollection() && feci->isMacrosCollection()) ||
(location.isCustomCollection() && feci->isCustomCollection()) ) {
match_eci = feci->itemAtPath(location.collectionPath(false));
} }
}
} }
else if (eci->type() == XmlProjectElementCollectionItem::Type) { }
if (XmlProjectElementCollectionItem *xpeci = static_cast<XmlProjectElementCollectionItem *>(eci)) { else if (eci->type() == XmlProjectElementCollectionItem::Type) {
match_eci = xpeci->itemAtPath(location.collectionPath(false)); if (XmlProjectElementCollectionItem *xpeci = static_cast<XmlProjectElementCollectionItem *>(eci)) {
} match_eci = xpeci->itemAtPath(location.collectionPath(false));
} }
if (match_eci)
return indexFromItem(match_eci);
} }
return QModelIndex(); if (match_eci)
return indexFromItem(match_eci);
}
return QModelIndex();
} }
/** /**

View File

@@ -47,6 +47,8 @@ class ElementsCollectionModel : public QStandardItemModel
void addCommonCollection(bool set_data = true); void addCommonCollection(bool set_data = true);
void addCompanyCollection(bool set_data = true); void addCompanyCollection(bool set_data = true);
void addCustomCollection(bool set_data = true); void addCustomCollection(bool set_data = true);
void addMacrosCollection(bool set_data = true);
void loadMacrosCollection();
void addLocation(const ElementsLocation& location); void addLocation(const ElementsLocation& location);
void addProject(QETProject *project, bool set_data = true); void addProject(QETProject *project, bool set_data = true);

View File

@@ -176,16 +176,14 @@ void ElementsCollectionWidget::setUpAction()
*/ */
void ElementsCollectionWidget::setUpWidget() void ElementsCollectionWidget::setUpWidget()
{ {
//Setup the main layout
m_main_vlayout = new QVBoxLayout(this); m_main_vlayout = new QVBoxLayout(this);
this->setLayout(m_main_vlayout); m_main_vlayout->setContentsMargins(0, 0, 0, 0);
m_main_vlayout->setSpacing(2);
m_search_field = new QLineEdit(this); m_search_field = new QLineEdit(this);
m_search_field->setPlaceholderText(tr("Rechercher")); m_search_field->setPlaceholderText(tr("Rechercher..."));
m_search_field->setClearButtonEnabled(true); m_search_field->setClearButtonEnabled(true);
m_main_vlayout->addWidget(m_search_field);
//Setup the tree view
m_tree_view = new ElementsTreeView(this); m_tree_view = new ElementsTreeView(this);
m_tree_view->setHeaderHidden(true); m_tree_view->setHeaderHidden(true);
m_tree_view->setIconSize(QSize(50, 50)); m_tree_view->setIconSize(QSize(50, 50));
@@ -195,12 +193,29 @@ void ElementsCollectionWidget::setUpWidget()
m_tree_view->setAnimated(true); m_tree_view->setAnimated(true);
m_tree_view->setMouseTracking(true); m_tree_view->setMouseTracking(true);
m_tree_view->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); m_tree_view->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
m_main_vlayout->addWidget(m_tree_view);
//Setup the progress bar //Setup the macros tree view (DEV)
m_macros_tree_view = new ElementsTreeView(this);
m_macros_tree_view->setHeaderHidden(true);
m_macros_tree_view->setIconSize(QSize(50, 50));
m_macros_tree_view->setDragDropMode(QAbstractItemView::DragDrop);
m_macros_tree_view->setContextMenuPolicy(Qt::CustomContextMenu);
m_macros_tree_view->setAutoExpandDelay(500);
m_macros_tree_view->setAnimated(true);
m_macros_tree_view->setMouseTracking(true);
m_macros_tree_view->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
m_tab_widget = new QTabWidget(this);
m_tab_widget->setDocumentMode(true);
m_tab_widget->setTabPosition(QTabWidget::North);
m_tab_widget->addTab(m_tree_view, tr("Collections"));
m_tab_widget->addTab(m_macros_tree_view, tr("Modèles (DEV)"));
m_main_vlayout->addWidget(m_search_field);
m_main_vlayout->addWidget(m_tab_widget);
m_progress_bar = new QProgressBar(this); m_progress_bar = new QProgressBar(this);
m_progress_bar->setFormat(QObject::tr("chargement %p% (%v sur %m)")); m_progress_bar->setFormat(QObject::tr("chargement %p% (%v sur %m)"));
m_main_vlayout->addWidget(m_progress_bar); m_main_vlayout->addWidget(m_progress_bar);
m_progress_bar->hide(); m_progress_bar->hide();
@@ -256,22 +271,43 @@ void ElementsCollectionWidget::setUpConnection()
if (qde && eci) if (qde && eci)
qde->statusBar()->showMessage(eci->localName()); qde->statusBar()->showMessage(eci->localName());
}); });
connect(m_macros_tree_view, &QTreeView::customContextMenuRequested,
this, &ElementsCollectionWidget::customContextMenu);
connect(m_macros_tree_view, &QTreeView::doubleClicked,
[this](const QModelIndex &index)
{
this->m_index_at_context_menu = index ;
this->editElement();
});
connect(m_macros_tree_view, &QTreeView::entered,
[this] (const QModelIndex &index) {
QETDiagramEditor *qde = QETApp::diagramEditorAncestorOf(this);
ElementCollectionItem *eci = elementCollectionItemForIndex(index);
if (qde && eci)
qde->statusBar()->showMessage(eci->localName());
});
} }
/** /**
@brief ElementsCollectionWidget::customContextMenu * @brief ElementsCollectionWidget::customContextMenu
Display the context menu of this widget at point * Display the context menu of this widget at point
@param point * @param point
*/ */
void ElementsCollectionWidget::customContextMenu(const QPoint &point) void ElementsCollectionWidget::customContextMenu(const QPoint &point)
{ {
m_index_at_context_menu = m_tree_view->indexAt(point); QTreeView *clicked_tree = qobject_cast<QTreeView *>(sender());
if (!clicked_tree) clicked_tree = m_tree_view; // Fallback
m_index_at_context_menu = clicked_tree->indexAt(point);
if (!m_index_at_context_menu.isValid()) return; if (!m_index_at_context_menu.isValid()) return;
m_context_menu->clear(); m_context_menu->clear();
ElementCollectionItem *eci = elementCollectionItemForIndex( ElementCollectionItem *eci = elementCollectionItemForIndex(
m_index_at_context_menu); m_index_at_context_menu);
bool add_open_dir = false; bool add_open_dir = false;
if (eci->isElement()) if (eci->isElement())
@@ -281,12 +317,14 @@ void ElementsCollectionWidget::customContextMenu(const QPoint &point)
{ {
add_open_dir = true; add_open_dir = true;
FileElementCollectionItem *feci = FileElementCollectionItem *feci =
static_cast<FileElementCollectionItem*>(eci); static_cast<FileElementCollectionItem*>(eci);
if (!feci->isCommonCollection()) if (!feci->isCommonCollection())
{ {
if (feci->isDir()) if (feci->isDir())
{ {
m_context_menu->addAction(m_new_element); if (!feci->isMacrosCollection()) {
m_context_menu->addAction(m_new_element);
}
m_context_menu->addAction(m_new_directory); m_context_menu->addAction(m_new_directory);
if (!feci->isCollectionRoot()) if (!feci->isCollectionRoot())
{ {
@@ -301,7 +339,7 @@ void ElementsCollectionWidget::customContextMenu(const QPoint &point)
if (eci->type() == XmlProjectElementCollectionItem::Type) if (eci->type() == XmlProjectElementCollectionItem::Type)
{ {
XmlProjectElementCollectionItem *xpeci = XmlProjectElementCollectionItem *xpeci =
static_cast<XmlProjectElementCollectionItem *>(eci); static_cast<XmlProjectElementCollectionItem *>(eci);
if (xpeci->isCollectionRoot()) if (xpeci->isCollectionRoot())
add_open_dir = true; add_open_dir = true;
} }
@@ -320,7 +358,7 @@ void ElementsCollectionWidget::customContextMenu(const QPoint &point)
m_context_menu->addAction(m_open_dir); m_context_menu->addAction(m_open_dir);
m_context_menu->addAction(m_reload); m_context_menu->addAction(m_reload);
m_context_menu->popup(mapToGlobal(m_tree_view->mapToParent(point))); m_context_menu->popup(mapToGlobal(clicked_tree->mapToParent(point)));
} }
/** /**
@@ -400,9 +438,10 @@ void ElementsCollectionWidget::deleteElement()
QFile file(loc.fileSystemPath()); QFile file(loc.fileSystemPath());
if (file.remove()) if (file.remove())
{ {
m_model->removeRows(m_index_at_context_menu.row(), QAbstractItemModel *clicked_model = const_cast<QAbstractItemModel*>(m_index_at_context_menu.model());
1, if (clicked_model) {
m_index_at_context_menu.parent()); clicked_model->removeRows(m_index_at_context_menu.row(), 1, m_index_at_context_menu.parent());
}
} }
else else
{ {
@@ -445,9 +484,10 @@ void ElementsCollectionWidget::deleteDirectory()
QDir dir (loc.fileSystemPath()); QDir dir (loc.fileSystemPath());
if (dir.removeRecursively()) if (dir.removeRecursively())
{ {
m_model->removeRows(m_index_at_context_menu.row(), QAbstractItemModel *clicked_model = const_cast<QAbstractItemModel*>(m_index_at_context_menu.model());
1, if (clicked_model) {
m_index_at_context_menu.parent()); clicked_model->removeRows(m_index_at_context_menu.row(), 1, m_index_at_context_menu.parent());
}
} }
else else
{ {
@@ -489,19 +529,29 @@ void ElementsCollectionWidget::editDirectory()
*/ */
void ElementsCollectionWidget::newDirectory() void ElementsCollectionWidget::newDirectory()
{ {
ElementCollectionItem *eci = elementCollectionItemForIndex( ElementCollectionItem *eci = elementCollectionItemForIndex(m_index_at_context_menu);
m_index_at_context_menu);
if (eci->type() != FileElementCollectionItem::Type) return; if (!eci || eci->type() != FileElementCollectionItem::Type) return;
FileElementCollectionItem *feci = FileElementCollectionItem *feci = static_cast<FileElementCollectionItem*>(eci);
static_cast<FileElementCollectionItem*>(eci);
if(feci->isCommonCollection()) return; if(feci->isCommonCollection()) return;
ElementsLocation location(feci->collectionPath()); ElementsLocation location(feci->collectionPath());
ElementsCategoryEditor new_dir_editor(location, false, this); ElementsCategoryEditor new_dir_editor(location, false, this);
if (new_dir_editor.exec() == QDialog::Accepted)
m_model->addLocation(new_dir_editor.createdLocation()); if (new_dir_editor.exec() == QDialog::Accepted) {
ElementsLocation new_loc = new_dir_editor.createdLocation();
if (new_loc.isMacrosCollection()) {
if (m_macros_model) {
m_macros_model->addLocation(new_loc);
}
} else {
if (m_model) {
m_model->addLocation(new_loc);
}
}
}
} }
/** /**
@@ -662,12 +712,19 @@ void ElementsCollectionWidget::reload()
&ElementsCollectionWidget::loadingFinished); &ElementsCollectionWidget::loadingFinished);
m_new_model->loadCollections(true, true, true, project_list); m_new_model->loadCollections(true, true, true, project_list);
if (m_macros_model) {
m_macros_model->deleteLater();
}
m_macros_model = new ElementsCollectionModel(m_macros_tree_view);
m_macros_tree_view->setModel(m_macros_model);
m_macros_model->loadMacrosCollection();
} }
/** /**
@brief ElementsCollectionWidget::loadingFinished * @brief ElementsCollectionWidget::loadingFinished
Process when collection finished to be loaded * Process when collection finished to be loaded
*/ */
void ElementsCollectionWidget::loadingFinished() void ElementsCollectionWidget::loadingFinished()
{ {
if (m_new_model) if (m_new_model)
@@ -842,15 +899,21 @@ void ElementsCollectionWidget::showAndExpandItem(const QModelIndex &index,
} }
/** /**
@brief ElementsCollectionWidget::elementCollectionItemForIndex * @brief ElementsCollectionWidget::elementCollectionItemForIndex
@param index * @param index
@return The internal pointer of index casted to ElementCollectionItem; * @return The internal pointer of index casted to ElementCollectionItem;
*/ */
ElementCollectionItem *ElementsCollectionWidget::elementCollectionItemForIndex( ElementCollectionItem *ElementsCollectionWidget::elementCollectionItemForIndex(const QModelIndex &index)
const QModelIndex &index) { {
if (!index.isValid()) if (!index.isValid()) return nullptr;
return nullptr;
return static_cast<ElementCollectionItem*>( if (m_macros_model && index.model() == m_macros_model) {
m_model->itemFromIndex(index)); return static_cast<ElementCollectionItem *>(m_macros_model->itemFromIndex(index));
}
if (m_model && index.model() == m_model) {
return static_cast<ElementCollectionItem *>(m_model->itemFromIndex(index));
}
return nullptr;
} }

View File

@@ -25,6 +25,8 @@
#include <QTimer> #include <QTimer>
#include <QElapsedTimer> #include <QElapsedTimer>
#include <QScopedPointer> #include <QScopedPointer>
#include <QTabWidget>
#include <QTreeView>
class ElementsCollectionModel; class ElementsCollectionModel;
class QVBoxLayout; class QVBoxLayout;
@@ -90,9 +92,12 @@ class ElementsCollectionWidget : public QWidget
private: private:
ElementsCollectionModel *m_model = nullptr; ElementsCollectionModel *m_model = nullptr;
ElementsCollectionModel *m_new_model = nullptr; ElementsCollectionModel *m_new_model = nullptr;
ElementsCollectionModel *m_macros_model = nullptr;
QLineEdit *m_search_field; QLineEdit *m_search_field;
QTimer m_search_timer; QTimer m_search_timer;
ElementsTreeView *m_tree_view; ElementsTreeView *m_tree_view;
ElementsTreeView *m_macros_tree_view = nullptr;
QTabWidget *m_tab_widget = nullptr;
QVBoxLayout *m_main_vlayout; QVBoxLayout *m_main_vlayout;
QMenu *m_context_menu; QMenu *m_context_menu;
QModelIndex m_index_at_context_menu; QModelIndex m_index_at_context_menu;

View File

@@ -181,7 +181,7 @@ QString ElementsLocation::collectionPath(bool protocol) const
else else
{ {
QString path = m_collection_path; QString path = m_collection_path;
return path.remove(QRegularExpression("common://|company://|custom://|embed://")); return path.remove(QRegularExpression("common://|company://|custom://|macros://|embed://"));
} }
} }
@@ -232,54 +232,34 @@ QString ElementsLocation::path() const
(start by common://, company://, custom:// or embed://) or not. (start by common://, company://, custom:// or embed://) or not.
@param path @param path
*/ */
void ElementsLocation::setPath(const QString &path) void ElementsLocation::setPath(const QString &path)
{ {
QString tmp_path = path; QString tmp_path = path;
#ifdef Q_OS_WIN32 #ifdef Q_OS_WIN32
//On windows, we convert backslash to slash
tmp_path = QDir::fromNativeSeparators(path); tmp_path = QDir::fromNativeSeparators(path);
#endif
#endif QString macrosPath = QETApp::userMacrosDir();
if (macrosPath.endsWith("/")) macrosPath.remove(macrosPath.length() - 1, 1);
//There is a project, the path is for an embedded coolection.
if (m_project) if (m_project)
{ {
m_collection_path = path; m_collection_path = path;
//Add the protocol to the collection path
if (!path.startsWith("embed://")) if (!path.startsWith("embed://"))
m_collection_path.prepend("embed://"); m_collection_path.prepend("embed://");
} }
//The path start with project, we get the project and the path from the string
else if (tmp_path.startsWith("project")) else if (tmp_path.startsWith("project"))
{ {
QRegularExpression re QRegularExpression re ("^project(?<project_id>[0-9])\\+(?<collection_path>embed://*.*)$");
("^project(?<project_id>[0-9])\\+(?<collection_path>embed://*.*)$"); if (!re.isValid()) return;
if (!re.isValid())
{
qWarning() <<QObject::tr("this is an error in the code")
<< re.errorString()
<< re.patternErrorOffset();
return;
}
QRegularExpressionMatch match = re.match(tmp_path); QRegularExpressionMatch match = re.match(tmp_path);
if (!match.hasMatch()) if (!match.hasMatch()) return;
{
qDebug()<<"no Match => return"
<<tmp_path;
return;
}
bool conv_ok; bool conv_ok;
uint project_id = match.captured("project_id").toUInt(&conv_ok); uint project_id = match.captured("project_id").toUInt(&conv_ok);
if (!conv_ok) if (!conv_ok) return;
{
qWarning()<<"toUint failed"
<<match.captured("project_id")
<<re
<<tmp_path;
return;
}
QETProject *project = QETApp::project(project_id); QETProject *project = QETApp::project(project_id);
if (project) if (project)
{ {
@@ -287,10 +267,7 @@ void ElementsLocation::setPath(const QString &path)
m_project = project; m_project = project;
} }
} }
else if (path.startsWith("common://") || path.startsWith("company://") || path.startsWith("custom://") || path.startsWith("macros://"))
// The path is in file system,
// the given path is relative to common or custom collection
else if (path.startsWith("common://") || path.startsWith("company://") || path.startsWith("custom://"))
{ {
QString p; QString p;
if (path.startsWith("common://")) if (path.startsWith("common://"))
@@ -303,6 +280,11 @@ void ElementsLocation::setPath(const QString &path)
tmp_path.remove("company://"); tmp_path.remove("company://");
p = QETApp::companyElementsDirN() % "/" % tmp_path; p = QETApp::companyElementsDirN() % "/" % tmp_path;
} }
else if (path.startsWith("macros://"))
{
tmp_path.remove("macros://");
p = macrosPath % "/" % tmp_path;
}
else else
{ {
tmp_path.remove("custom://"); tmp_path.remove("custom://");
@@ -312,7 +294,6 @@ void ElementsLocation::setPath(const QString &path)
m_file_system_path = p; m_file_system_path = p;
m_collection_path = path; m_collection_path = path;
} }
//In this case, the path is supposed to be relative to the file system.
else else
{ {
QString path_ = path; QString path_ = path;
@@ -331,6 +312,13 @@ void ElementsLocation::setPath(const QString &path)
path_.prepend("company://"); path_.prepend("company://");
m_collection_path = path_; m_collection_path = path_;
} }
else if (path_.startsWith(macrosPath))
{
QString matchPath = macrosPath + "/";
path_.remove(matchPath);
path_.prepend("macros://");
m_collection_path = path_;
}
else if (path_.startsWith(QETApp::customElementsDirN())) else if (path_.startsWith(QETApp::customElementsDirN()))
{ {
path_.remove(QETApp::customElementsDirN()+="/"); path_.remove(QETApp::customElementsDirN()+="/");
@@ -353,6 +341,13 @@ void ElementsLocation::setPath(const QString &path)
path_.prepend("company://"); path_.prepend("company://");
m_collection_path = path_; m_collection_path = path_;
} }
else if (path_.startsWith(macrosPath))
{
QString matchPath = macrosPath + "/";
path_.remove(matchPath);
path_.prepend("macros://");
m_collection_path = path_;
}
else if (path_.startsWith(QETApp::customElementsDirN())) else if (path_.startsWith(QETApp::customElementsDirN()))
{ {
path_.remove(QETApp::customElementsDirN()+="/"); path_.remove(QETApp::customElementsDirN()+="/");
@@ -942,3 +937,14 @@ QDebug operator<< (QDebug debug, const ElementsLocation &location)
return debug; return debug;
} }
/**
* @brief ElementsLocation::isMacrosCollection
* @return True if this location represent an item from the macros collection
*/
bool ElementsLocation::isMacrosCollection() const
{
QString macrosPath = QETApp::userMacrosDir();
if (macrosPath.endsWith("/")) macrosPath.remove(macrosPath.length() - 1, 1);
return fileSystemPath().startsWith(macrosPath);
}

View File

@@ -78,6 +78,7 @@ class ElementsLocation
bool isCommonCollection() const; bool isCommonCollection() const;
bool isCompanyCollection() const; bool isCompanyCollection() const;
bool isCustomCollection() const; bool isCustomCollection() const;
bool isMacrosCollection() const;
bool isProject() const; bool isProject() const;
bool exist() const; bool exist() const;
bool isWritable() const; bool isWritable() const;

View File

@@ -110,9 +110,9 @@ bool FileElementCollectionItem::isElement() const
} }
/** /**
@brief FileElementCollectionItem::localName * @brief FileElementCollectionItem::localName
@return the located name of this item * @return the located name of this item
*/ */
QString FileElementCollectionItem::localName() QString FileElementCollectionItem::localName()
{ {
if (!text().isNull()) if (!text().isNull())
@@ -120,12 +120,18 @@ QString FileElementCollectionItem::localName()
else if (isDir()) { else if (isDir()) {
if (isCollectionRoot()) { if (isCollectionRoot()) {
// --- NEU: Makro-Pfad laden ---
QString macrosPath = QETApp::userMacrosDir();
if (macrosPath.endsWith("/")) macrosPath.remove(macrosPath.length() - 1, 1);
if (m_path == QETApp::commonElementsDirN()) if (m_path == QETApp::commonElementsDirN())
setText(QObject::tr("Collection QET")); setText(QObject::tr("Collection QET"));
else if (m_path == QETApp::companyElementsDirN()) else if (m_path == QETApp::companyElementsDirN())
setText(QObject::tr("Collection Company")); setText(QObject::tr("Collection Company"));
else if (m_path == QETApp::customElementsDirN()) else if (m_path == QETApp::customElementsDirN())
setText(QObject::tr("Collection utilisateur")); setText(QObject::tr("Collection utilisateur"));
else if (m_path == macrosPath) // <-- NEU: Name des Ordners zuweisen
setText(QObject::tr("Makros"));
else else
setText(QObject::tr("Collection inconnue")); setText(QObject::tr("Collection inconnue"));
} }
@@ -136,7 +142,7 @@ QString FileElementCollectionItem::localName()
if(docu.load_file(str.toStdString().c_str())) if(docu.load_file(str.toStdString().c_str()))
{ {
if (QString(docu.document_element().name()) if (QString(docu.document_element().name())
== "qet-directory") == "qet-directory")
{ {
NamesList nl; NamesList nl;
nl.fromXml(docu.document_element()); nl.fromXml(docu.document_element());
@@ -194,24 +200,29 @@ QString FileElementCollectionItem::name() const
QString FileElementCollectionItem::collectionPath() const QString FileElementCollectionItem::collectionPath() const
{ {
if (isCollectionRoot()) { if (isCollectionRoot()) {
QString macrosPath = QETApp::userMacrosDir();
if (macrosPath.endsWith("/")) macrosPath.remove(macrosPath.length() - 1, 1);
if (m_path == QETApp::commonElementsDirN()) if (m_path == QETApp::commonElementsDirN())
return "common://"; return "common://";
else if (m_path == QETApp::companyElementsDirN()) else if (m_path == QETApp::companyElementsDirN())
return "company://"; return "company://";
else else if (m_path == macrosPath)
return "custom://"; return "macros://"; // <-- NEU: Protokoll für Makros zuweisen
else
return "custom://";
} }
else if (parent() && parent()->type() else if (parent() && parent()->type()
== FileElementCollectionItem::Type) { == FileElementCollectionItem::Type) {
ElementCollectionItem *eci = ElementCollectionItem *eci =
static_cast<ElementCollectionItem*>(parent()); static_cast<ElementCollectionItem*>(parent());
if (eci->isCollectionRoot()) if (eci->isCollectionRoot())
return eci->collectionPath() + m_path; return eci->collectionPath() + m_path;
else else
return eci->collectionPath() % "/" % m_path; return eci->collectionPath() % "/" % m_path;
} }
else else
return QString(); return QString();
} }
/** /**
@@ -220,10 +231,14 @@ QString FileElementCollectionItem::collectionPath() const
*/ */
bool FileElementCollectionItem::isCollectionRoot() const bool FileElementCollectionItem::isCollectionRoot() const
{ {
QString macrosPath = QETApp::userMacrosDir();
if (macrosPath.endsWith("/")) macrosPath.remove(macrosPath.length() - 1, 1);
if (m_path == QETApp::commonElementsDirN() if (m_path == QETApp::commonElementsDirN()
|| m_path == QETApp::companyElementsDirN() || m_path == QETApp::companyElementsDirN()
|| m_path == QETApp::customElementsDirN()) || m_path == QETApp::customElementsDirN()
return true; || m_path == macrosPath) // <-- NEU: Makros sind jetzt ein echtes Root-Verzeichnis
return true;
else else
return false; return false;
} }
@@ -318,12 +333,17 @@ void FileElementCollectionItem::setUpIcon()
return; return;
if (isCollectionRoot()) { if (isCollectionRoot()) {
QString macrosPath = QETApp::userMacrosDir();
if (macrosPath.endsWith("/")) macrosPath.remove(macrosPath.length() - 1, 1);
if (m_path == QETApp::commonElementsDirN()) if (m_path == QETApp::commonElementsDirN())
setIcon(QIcon(":/ico/16x16/qet.png")); setIcon(QIcon(":/ico/16x16/qet.png"));
else if (m_path == QETApp::companyElementsDirN()) else if (m_path == QETApp::companyElementsDirN())
setIcon(QIcon(":/ico/16x16/go-company.png")); setIcon(QIcon(":/ico/16x16/go-company.png"));
else else if (m_path == macrosPath)
setIcon(QIcon(":/ico/16x16/go-home.png")); setIcon(QIcon(":/ico/16x16/go-home.png")); // <-- NEU: Icon für Makros (z.B. go-home)
else
setIcon(QIcon(":/ico/16x16/go-home.png"));
} }
else else
{ {
@@ -393,3 +413,15 @@ void FileElementCollectionItem::populate(bool set_data, bool hide_element)
feci->setUpData(); feci->setUpData();
} }
} }
/**
* @brief FileElementCollectionItem::isMacrosCollection
* @return True if this item represent the macros collection
*/
bool FileElementCollectionItem::isMacrosCollection() const
{
QString macrosPath = QETApp::userMacrosDir();
if (macrosPath.endsWith("/")) macrosPath.remove(macrosPath.length() - 1, 1);
return fileSystemPath().startsWith(macrosPath);
}

View File

@@ -50,6 +50,7 @@ class FileElementCollectionItem : public ElementCollectionItem
bool isCommonCollection() const; bool isCommonCollection() const;
bool isCompanyCollection() const; bool isCompanyCollection() const;
bool isCustomCollection() const; bool isCustomCollection() const;
bool isMacrosCollection() const;
void addChildAtPath(const QString &collection_name) override; void addChildAtPath(const QString &collection_name) override;
void setUpData() override; void setUpData() override;

View File

@@ -91,6 +91,8 @@ QString QETApp::m_user_company_tbt_dir = QString();
QString QETApp::m_user_custom_tbt_dir = QString(); QString QETApp::m_user_custom_tbt_dir = QString();
QString QETApp::m_user_macros_dir = QString();
QETApp *QETApp::m_qetapp = nullptr; QETApp *QETApp::m_qetapp = nullptr;
bool lang_is_set = false; bool lang_is_set = false;
@@ -724,6 +726,8 @@ void QETApp::resetCollectionsPath()
m_user_company_tbt_dir.clear(); m_user_company_tbt_dir.clear();
m_user_custom_tbt_dir.clear(); m_user_custom_tbt_dir.clear();
m_user_macros_dir.clear();
} }
/** /**
@@ -822,6 +826,38 @@ QString QETApp::customTitleBlockTemplatesDir()
return(dataDir() + "/titleblocks/"); return(dataDir() + "/titleblocks/");
} }
/**
* @brief QETApp::userMacrosDir
* @return the path of the directory containing the user macros collection.
*/
QString QETApp::userMacrosDir()
{
if (m_user_macros_dir.isEmpty())
{
QSettings settings;
QString path = settings.value(
"elements-collections/macros-path",
"default").toString();
if (path != "default" && !path.isEmpty())
{
QDir dir(path);
if (dir.exists())
{
m_user_macros_dir = path;
return m_user_macros_dir;
}
}
else {
m_user_macros_dir = "default";
}
}
else if (m_user_macros_dir != "default") {
return m_user_macros_dir;
}
return(dataDir() + "/macros/");
}
/** /**
@brief QETApp::configDir @brief QETApp::configDir
Return the QET configuration folder, i.e. the path to the folder in Return the QET configuration folder, i.e. the path to the folder in
@@ -938,6 +974,8 @@ QString QETApp::realPath(const QString &sym_path) {
directory = commonElementsDir(); directory = commonElementsDir();
} else if (sym_path.startsWith("company://")) { } else if (sym_path.startsWith("company://")) {
directory = companyElementsDir(); directory = companyElementsDir();
} else if (sym_path.startsWith("macros://")) {
directory = userMacrosDir();
} else if (sym_path.startsWith("company://")) { } else if (sym_path.startsWith("company://")) {
directory = companyElementsDir(); directory = companyElementsDir();
} else if (sym_path.startsWith("custom://")) { } else if (sym_path.startsWith("custom://")) {
@@ -976,6 +1014,7 @@ QString QETApp::symbolicPath(const QString &real_path) {
QString commond = commonElementsDir(); QString commond = commonElementsDir();
QString companyd = companyElementsDir(); QString companyd = companyElementsDir();
QString customd = customElementsDir(); QString customd = customElementsDir();
QString macrosd = userMacrosDir();
QString chemin; QString chemin;
// analyzes the file path passed in parameter // analyzes the file path passed in parameter
// analyse le chemin de fichier passe en parametre // analyse le chemin de fichier passe en parametre
@@ -987,6 +1026,10 @@ QString QETApp::symbolicPath(const QString &real_path) {
chemin = "company://" chemin = "company://"
+ real_path.right( + real_path.right(
real_path.length() - companyd.length()); real_path.length() - companyd.length());
} else if (real_path.startsWith(macrosd)) {
chemin = "macros://"
+ real_path.right(
real_path.length() - macrosd.length());
} else if (real_path.startsWith(customd)) { } else if (real_path.startsWith(customd)) {
chemin = "custom://" chemin = "custom://"
+ real_path.right( + real_path.right(
@@ -2212,6 +2255,10 @@ void QETApp::initConfiguration()
if (!custom_tbt_dir.exists()) if (!custom_tbt_dir.exists())
custom_tbt_dir.mkpath(QETApp::customTitleBlockTemplatesDir()); custom_tbt_dir.mkpath(QETApp::customTitleBlockTemplatesDir());
QDir macros_dir(QETApp::userMacrosDir());
if (!macros_dir.exists())
macros_dir.mkpath(QETApp::userMacrosDir());
/* recent files /* recent files
* note: * note:
* icons must be initialized before these instructions * icons must be initialized before these instructions

View File

@@ -91,6 +91,7 @@ class QETApp : public QObject
static QString commonTitleBlockTemplatesDir(); static QString commonTitleBlockTemplatesDir();
static QString companyTitleBlockTemplatesDir(); static QString companyTitleBlockTemplatesDir();
static QString customTitleBlockTemplatesDir(); static QString customTitleBlockTemplatesDir();
static QString userMacrosDir();
static bool registerProject(QETProject *); static bool registerProject(QETProject *);
static bool unregisterProject(QETProject *); static bool unregisterProject(QETProject *);
static QMap<uint, QETProject *> registeredProjects(); static QMap<uint, QETProject *> registeredProjects();
@@ -242,7 +243,7 @@ class QETApp : public QObject
static QString m_user_company_tbt_dir; static QString m_user_company_tbt_dir;
static QString m_user_custom_tbt_dir; static QString m_user_custom_tbt_dir;
static QString m_user_macros_dir;
public slots: public slots:
void systray(QSystemTrayIcon::ActivationReason); void systray(QSystemTrayIcon::ActivationReason);

View File

@@ -177,6 +177,15 @@ GeneralConfigurationPage::GeneralConfigurationPage(QWidget *parent) :
ui->m_custom_tbt_path_cb->blockSignals(false); ui->m_custom_tbt_path_cb->blockSignals(false);
} }
path = settings.value("elements-collections/macros-path", "default").toString();
if (path != "default")
{
ui->m_user_macros_path_cb->blockSignals(true);
ui->m_user_macros_path_cb->setCurrentIndex(1);
ui->m_user_macros_path_cb->setItemData(1, path, Qt::DisplayRole);
ui->m_user_macros_path_cb->blockSignals(false);
}
fillLang(); fillLang();
} }
@@ -321,6 +330,21 @@ void GeneralConfigurationPage::applyConf()
if (path != settings.value("elements-collections/custom-tbt-path").toString()) { if (path != settings.value("elements-collections/custom-tbt-path").toString()) {
QETApp::resetCollectionsPath(); QETApp::resetCollectionsPath();
} }
path = settings.value("elements-collections/macros-path").toString();
if (ui->m_user_macros_path_cb->currentIndex() == 1)
{
QString path = ui->m_user_macros_path_cb->currentText();
QDir dir(path);
settings.setValue("elements-collections/macros-path",
dir.exists() ? path : "default");
}
else {
settings.setValue("elements-collections/macros-path", "default");
}
if (path != settings.value("elements-collections/macros-path").toString()) {
QETApp::resetCollectionsPath();
}
} }
/** /**
@@ -512,6 +536,19 @@ void GeneralConfigurationPage::on_m_custom_tbt_path_cb_currentIndexChanged(int i
} }
} }
void GeneralConfigurationPage::on_m_user_macros_path_cb_currentIndexChanged(int index)
{
if (index == 1)
{
QString path = QFileDialog::getExistingDirectory(this, tr("Chemin des macros utilisateur (DEV)"), QETApp::documentDir());
if (!path.isEmpty()) {
ui->m_user_macros_path_cb->setItemData(1, path, Qt::DisplayRole);
}
else {
ui->m_user_macros_path_cb->setCurrentIndex(0);
}
}
}
void GeneralConfigurationPage::on_m_indi_text_font_pb_clicked() void GeneralConfigurationPage::on_m_indi_text_font_pb_clicked()
{ {

View File

@@ -46,6 +46,7 @@ class GeneralConfigurationPage : public ConfigPage
void on_m_custom_elmt_path_cb_currentIndexChanged(int index); void on_m_custom_elmt_path_cb_currentIndexChanged(int index);
void on_m_company_tbt_path_cb_currentIndexChanged(int index); void on_m_company_tbt_path_cb_currentIndexChanged(int index);
void on_m_custom_tbt_path_cb_currentIndexChanged(int index); void on_m_custom_tbt_path_cb_currentIndexChanged(int index);
void on_m_user_macros_path_cb_currentIndexChanged(int index);
void on_m_indi_text_font_pb_clicked(); void on_m_indi_text_font_pb_clicked();
void on_MaxPartsElementEditorList_sb_valueChanged(int value); void on_MaxPartsElementEditorList_sb_valueChanged(int value);
void on_DiagramEditor_Grid_PointSize_min_sb_valueChanged(int value); void on_DiagramEditor_Grid_PointSize_min_sb_valueChanged(int value);

View File

@@ -349,6 +349,27 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="7" column="0">
<widget class="QLabel" name="label_11">
<property name="text">
<string>Macros utilisateur (DEV)</string>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="QComboBox" name="m_user_macros_path_cb">
<item>
<property name="text">
<string>Par defaut</string>
</property>
</item>
<item>
<property name="text">
<string>Parcourir...</string>
</property>
</item>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>