mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-08-06 05:14:13 +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 "../qeticons.h"
|
||||||
#include "elementslocation.h"
|
#include "elementslocation.h"
|
||||||
|
|
||||||
|
#include <QApplication>
|
||||||
#include <QDir>
|
#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
|
@brief FileElementCollectionItem::FileElementCollectionItem
|
||||||
@@ -398,7 +430,13 @@ void FileElementCollectionItem::setUpData()
|
|||||||
*/
|
*/
|
||||||
void FileElementCollectionItem::setUpIcon()
|
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;
|
return;
|
||||||
|
|
||||||
if (isCollectionRoot()) {
|
if (isCollectionRoot()) {
|
||||||
@@ -417,7 +455,8 @@ void FileElementCollectionItem::setUpIcon()
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (isDir()) {
|
if (isDir()) {
|
||||||
setIcon(QET::Icons::Folder);
|
setIcon(m_qet_directory_unreadable ? unreadableFolderIcon()
|
||||||
|
: QET::Icons::Folder);
|
||||||
} else {
|
} else {
|
||||||
if (m_path.endsWith(".qetmak")) {
|
if (m_path.endsWith(".qetmak")) {
|
||||||
setIcon(QIcon());
|
setIcon(QIcon());
|
||||||
|
|||||||
Reference in New Issue
Block a user