##// END OF EJS Templates
Parser refactoring (3)...
Parser refactoring (3) Implements properties reading and properties checking Implementation takes some of the basic parser, which will be deleted at the end

File last commit:

r877:e6294435151a
r987:49134789d5f3
Show More
DataSourceTreeWidgetItem.cpp
185 lines | 5.7 KiB | text/x-c | CppLexer
/ gui / src / DataSource / DataSourceTreeWidgetItem.cpp
Alexandre Leroux
Defines the QTreeWidgetItem for a data source item
r80 #include <DataSource/DataSourceItem.h>
Alexandre Leroux
Generates tree actions based on the item actions
r145 #include <DataSource/DataSourceItemAction.h>
Alexandre Leroux
Defines the QTreeWidgetItem for a data source item
r80 #include <DataSource/DataSourceTreeWidgetItem.h>
Alexandre Leroux
Adds actions for items in the DataSourceWidget...
r142 #include <QAction>
Alexandre Leroux
Defines the QTreeWidgetItem for a data source item
r80 Q_LOGGING_CATEGORY(LOG_DataSourceTreeWidgetItem, "DataSourceTreeWidgetItem")
Alexandre Leroux
Handles the icon of a DataSourceTreeWidgetItem (depending of the type of the data source item)
r81 namespace {
Alexandre Leroux
Updates references to DataSourceItem after changes
r343 // Column indexes
const auto NAME_COLUMN = 0;
Alexandre Leroux
Handles the icon of a DataSourceTreeWidgetItem (depending of the type of the data source item)
r81 QIcon itemIcon(const DataSourceItem *dataSource)
{
if (dataSource) {
auto dataSourceType = dataSource->type();
switch (dataSourceType) {
Alexandre Leroux
Changes data source item icons (2)...
r345 case DataSourceItemType::NODE: {
return dataSource->isRoot() ? QIcon{":/icones/dataSourceRoot.png"}
: QIcon{":/icones/dataSourceNode.png"};
}
Alexandre Leroux
Handles the icon of a DataSourceTreeWidgetItem (depending of the type of the data source item)
r81 case DataSourceItemType::PRODUCT:
Alexandre Leroux
Changes data source item icons (1)...
r344 return QIcon{":/icones/dataSourceProduct.png"};
case DataSourceItemType::COMPONENT:
return QIcon{":/icones/dataSourceComponent.png"};
Alexandre Leroux
Handles the icon of a DataSourceTreeWidgetItem (depending of the type of the data source item)
r81 default:
// No action
break;
}
Alexandre Leroux
Add warnings if the icon of a data source can't be set
r93
qCWarning(LOG_DataSourceTreeWidgetItem())
<< QObject::tr("Can't set data source icon : unknown data source type");
}
else {
Alexandre Leroux
Changes data source item icons (2)...
r345 qCCritical(LOG_DataSourceTreeWidgetItem())
Alexandre Leroux
Add warnings if the icon of a data source can't be set
r93 << QObject::tr("Can't set data source icon : the data source is null");
Alexandre Leroux
Handles the icon of a DataSourceTreeWidgetItem (depending of the type of the data source item)
r81 }
// Default cases
return QIcon{};
}
Alexandre Leroux
Handles tooltip for a data source item
r346 /// @return the tooltip text for a variant. The text depends on whether the data is a simple variant
/// or a list of variants
QString tooltipValue(const QVariant &variant) noexcept
{
// If the variant is a list of variants, the text of the tooltip is of the form: {val1, val2,
// ...}
if (variant.canConvert<QVariantList>()) {
auto valueString = QStringLiteral("{");
auto variantList = variant.value<QVariantList>();
for (auto it = variantList.cbegin(), end = variantList.cend(); it != end; ++it) {
valueString.append(it->toString());
if (std::distance(it, end) != 1) {
valueString.append(", ");
}
}
valueString.append(QStringLiteral("}"));
return valueString;
}
else {
return variant.toString();
}
}
QString itemTooltip(const DataSourceItem *dataSource) noexcept
{
// The tooltip displays all item's data
if (dataSource) {
auto result = QString{};
const auto &data = dataSource->data();
for (auto it = data.cbegin(), end = data.cend(); it != end; ++it) {
result.append(QString{"<b>%1:</b> %2<br/>"}.arg(it.key(), tooltipValue(it.value())));
}
return result;
}
else {
qCCritical(LOG_DataSourceTreeWidgetItem())
<< QObject::tr("Can't set data source tooltip : the data source is null");
return QString{};
}
}
Alexandre Leroux
Handles the icon of a DataSourceTreeWidgetItem (depending of the type of the data source item)
r81 } // namespace
Alexandre Leroux
Defines the QTreeWidgetItem for a data source item
r80 struct DataSourceTreeWidgetItem::DataSourceTreeWidgetItemPrivate {
explicit DataSourceTreeWidgetItemPrivate(const DataSourceItem *data) : m_Data{data} {}
/// Model used to retrieve data source information
const DataSourceItem *m_Data;
Alexandre Leroux
Adds actions for items in the DataSourceWidget...
r142 /// Actions associated to the item. The parent of the item (QTreeWidget) takes the ownership of
/// the actions
QList<QAction *> m_Actions;
Alexandre Leroux
Defines the QTreeWidgetItem for a data source item
r80 };
DataSourceTreeWidgetItem::DataSourceTreeWidgetItem(const DataSourceItem *data, int type)
: DataSourceTreeWidgetItem{nullptr, data, type}
{
}
DataSourceTreeWidgetItem::DataSourceTreeWidgetItem(QTreeWidget *parent, const DataSourceItem *data,
int type)
: QTreeWidgetItem{parent, type},
impl{spimpl::make_unique_impl<DataSourceTreeWidgetItemPrivate>(data)}
{
Alexandre Leroux
Handles tooltip for a data source item
r346 // Sets the icon and the tooltip depending on the data source
Alexandre Leroux
Handles the icon of a DataSourceTreeWidgetItem (depending of the type of the data source item)
r81 setIcon(0, itemIcon(impl->m_Data));
Alexandre Leroux
Handles tooltip for a data source item
r346 setToolTip(0, itemTooltip(impl->m_Data));
Alexandre Leroux
Adds actions for items in the DataSourceWidget...
r142
Alexandre Leroux
Generates tree actions based on the item actions
r145 // Generates tree actions based on the item actions
auto createTreeAction = [this, &parent](const auto &itemAction) {
auto treeAction = new QAction{itemAction->name(), parent};
// Executes item action when tree action is triggered
QObject::connect(treeAction, &QAction::triggered, itemAction,
&DataSourceItemAction::execute);
return treeAction;
};
auto itemActions = impl->m_Data->actions();
std::transform(std::cbegin(itemActions), std::cend(itemActions),
std::back_inserter(impl->m_Actions), createTreeAction);
Drop of product in variables
r877
// Sets the flags of the items
auto flags = Qt::ItemIsSelectable | Qt::ItemIsEnabled;
if (data->type() == DataSourceItemType::COMPONENT
|| data->type() == DataSourceItemType::PRODUCT) {
flags |= Qt::ItemIsDragEnabled;
}
setFlags(flags);
Alexandre Leroux
Defines the QTreeWidgetItem for a data source item
r80 }
Alexandre Leroux
Implements filter function for data source...
r477 const DataSourceItem *DataSourceTreeWidgetItem::data() const
{
return impl->m_Data;
}
Alexandre Leroux
Defines the QTreeWidgetItem for a data source item
r80 QVariant DataSourceTreeWidgetItem::data(int column, int role) const
{
if (role == Qt::DisplayRole) {
Alexandre Leroux
Updates references to DataSourceItem after changes
r343 if (impl->m_Data) {
switch (column) {
case NAME_COLUMN:
return impl->m_Data->name();
default:
// No action
break;
}
qCWarning(LOG_DataSourceTreeWidgetItem())
<< QObject::tr("Can't get data (unknown column %1)").arg(column);
}
else {
qCCritical(LOG_DataSourceTreeWidgetItem()) << QObject::tr("Can't get data (null item)");
}
return QVariant{};
Alexandre Leroux
Defines the QTreeWidgetItem for a data source item
r80 }
else {
return QTreeWidgetItem::data(column, role);
}
}
void DataSourceTreeWidgetItem::setData(int column, int role, const QVariant &value)
{
// Data can't be changed by edition
if (role != Qt::EditRole) {
QTreeWidgetItem::setData(column, role, value);
}
}
Alexandre Leroux
Adds actions for items in the DataSourceWidget...
r142
QList<QAction *> DataSourceTreeWidgetItem::actions() const noexcept
{
return impl->m_Actions;
}