##// END OF EJS Templates
Fixed untimely update of the range to be displayed in the variable widget
Fixed untimely update of the range to be displayed in the variable widget

File last commit:

r440:eab21078feec
r611:aff19a50babf
Show More
DataSourceTreeWidgetItem.cpp
176 lines | 5.4 KiB | text/x-c | CppLexer
/ gui / src / DataSource / DataSourceTreeWidgetItem.cpp
Alexandre Leroux
Defines the QTreeWidgetItem for a data source item
r79 #include <DataSource/DataSourceItem.h>
Alexandre Leroux
Generates tree actions based on the item actions
r136 #include <DataSource/DataSourceItemAction.h>
Alexandre Leroux
Defines the QTreeWidgetItem for a data source item
r79 #include <DataSource/DataSourceTreeWidgetItem.h>
Alexandre Leroux
Adds actions for items in the DataSourceWidget...
r133 #include <QAction>
Alexandre Leroux
Defines the QTreeWidgetItem for a data source item
r79 Q_LOGGING_CATEGORY(LOG_DataSourceTreeWidgetItem, "DataSourceTreeWidgetItem")
Alexandre Leroux
Handles the icon of a DataSourceTreeWidgetItem (depending of the type of the data source item)
r80 namespace {
Alexandre Leroux
Updates references to DataSourceItem after changes
r316 // Column indexes
const auto NAME_COLUMN = 0;
Alexandre Leroux
Handles the icon of a DataSourceTreeWidgetItem (depending of the type of the data source item)
r80 QIcon itemIcon(const DataSourceItem *dataSource)
{
if (dataSource) {
auto dataSourceType = dataSource->type();
switch (dataSourceType) {
Alexandre Leroux
Changes data source item icons (2)...
r318 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)
r80 case DataSourceItemType::PRODUCT:
Alexandre Leroux
Changes data source item icons (1)...
r317 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)
r80 default:
// No action
break;
}
Alexandre Leroux
Add warnings if the icon of a data source can't be set
r91
qCWarning(LOG_DataSourceTreeWidgetItem())
<< QObject::tr("Can't set data source icon : unknown data source type");
}
else {
Alexandre Leroux
Changes data source item icons (2)...
r318 qCCritical(LOG_DataSourceTreeWidgetItem())
Alexandre Leroux
Add warnings if the icon of a data source can't be set
r91 << 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)
r80 }
// Default cases
return QIcon{};
}
Alexandre Leroux
Handles tooltip for a data source item
r319 /// @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)
r80 } // namespace
Alexandre Leroux
Defines the QTreeWidgetItem for a data source item
r79 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...
r133 /// 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
r79 };
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
r319 // 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)
r80 setIcon(0, itemIcon(impl->m_Data));
Alexandre Leroux
Handles tooltip for a data source item
r319 setToolTip(0, itemTooltip(impl->m_Data));
Alexandre Leroux
Adds actions for items in the DataSourceWidget...
r133
Alexandre Leroux
Generates tree actions based on the item actions
r136 // 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);
Alexandre Leroux
Defines the QTreeWidgetItem for a data source item
r79 }
Alexandre Leroux
Implements filter function for data source...
r440 const DataSourceItem *DataSourceTreeWidgetItem::data() const
{
return impl->m_Data;
}
Alexandre Leroux
Defines the QTreeWidgetItem for a data source item
r79 QVariant DataSourceTreeWidgetItem::data(int column, int role) const
{
if (role == Qt::DisplayRole) {
Alexandre Leroux
Updates references to DataSourceItem after changes
r316 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
r79 }
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...
r133
QList<QAction *> DataSourceTreeWidgetItem::actions() const noexcept
{
return impl->m_Actions;
}