mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-08-05 12:14:12 +02:00
Badge unreadable-qet_directory folders with a warning icon in the tree
@plc-user asked (review on #633) for a way to see a broken folder directly in the tree instead of only on tooltip hover, originally suggesting a "FixMe: " text prefix on the displayed name. That name is reused verbatim in dialog titles and status-bar messages elsewhere (elementscollectionwidget.cpp), so baking a prefix into it would leak into those too. An icon badge gets the same visibility without touching the name value. setUpIcon() overlays a small warning glyph on the folder icon when m_qet_directory_unreadable is set. Also drop the "already has an icon, skip" guard for directories specifically: that flag is only known once the async setUpData()/localName() job completes (QtConcurrent::map), so without this a directory painted before that finished would have its plain folder icon cached forever and never pick up the badge.
This commit is contained in:
@@ -22,7 +22,39 @@
|
||||
#include "../qeticons.h"
|
||||
#include "elementslocation.h"
|
||||
|
||||
#include <QApplication>
|
||||
#include <QDir>
|
||||
#include <QPainter>
|
||||
#include <QPixmap>
|
||||
#include <QStyle>
|
||||
|
||||
namespace {
|
||||
/**
|
||||
@return the folder icon overlaid with a small warning badge in the
|
||||
bottom-right corner. Used for a directory whose qet_directory could
|
||||
not be read (@see FileElementCollectionItem::m_qet_directory_unreadable),
|
||||
so the problem is visible in the tree itself and not only on hover
|
||||
via the tooltip. Built once: same folder icon, same badge, every time.
|
||||
*/
|
||||
const QIcon &unreadableFolderIcon()
|
||||
{
|
||||
static const QIcon icon = []() {
|
||||
QPixmap pixmap = QET::Icons::Folder.pixmap(16, 16);
|
||||
const QPixmap badge = QApplication::style()
|
||||
->standardIcon(QStyle::SP_MessageBoxWarning)
|
||||
.pixmap(9, 9);
|
||||
|
||||
QPainter painter(&pixmap);
|
||||
painter.drawPixmap(pixmap.width() - badge.width(),
|
||||
pixmap.height() - badge.height(),
|
||||
badge);
|
||||
painter.end();
|
||||
|
||||
return QIcon(pixmap);
|
||||
}();
|
||||
return icon;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@brief FileElementCollectionItem::FileElementCollectionItem
|
||||
@@ -398,7 +430,13 @@ void FileElementCollectionItem::setUpData()
|
||||
*/
|
||||
void FileElementCollectionItem::setUpIcon()
|
||||
{
|
||||
if (!icon().isNull())
|
||||
// Directories are cheap to (re-)decide: no early return for them.
|
||||
// setUpData() -- which resolves m_qet_directory_unreadable via
|
||||
// localName() -- runs asynchronously (QtConcurrent::map), so this can
|
||||
// be called for a directory before that result is known; without
|
||||
// this, the plain folder icon would get cached by the guard below
|
||||
// and the warning badge would never appear for that item.
|
||||
if (!isDir() && !icon().isNull())
|
||||
return;
|
||||
|
||||
if (isCollectionRoot()) {
|
||||
@@ -417,7 +455,8 @@ void FileElementCollectionItem::setUpIcon()
|
||||
else
|
||||
{
|
||||
if (isDir()) {
|
||||
setIcon(QET::Icons::Folder);
|
||||
setIcon(m_qet_directory_unreadable ? unreadableFolderIcon()
|
||||
: QET::Icons::Folder);
|
||||
} else {
|
||||
if (m_path.endsWith(".qetmak")) {
|
||||
setIcon(QIcon());
|
||||
|
||||
Reference in New Issue
Block a user