mirror of
https://github.com/leozide/leocad.git
synced 2026-07-28 04:07:11 +00:00
Fixed blurry thumbnails on retina displays.
This commit is contained in:
@@ -399,7 +399,7 @@ void lcPartSelectionListModel::RequestThumbnail(int PartIndex)
|
||||
|
||||
int ColorIndex = mParts[PartIndex].ColorIndex == -1 ? mColorIndex : mParts[PartIndex].ColorIndex;
|
||||
|
||||
auto [ThumbnailId, Thumbnail] = lcGetPiecesLibrary()->GetThumbnailManager()->RequestThumbnail(Info, ColorIndex, mIconSize);
|
||||
auto [ThumbnailId, Thumbnail] = lcGetPiecesLibrary()->GetThumbnailManager()->RequestThumbnail(Info, ColorIndex, mIconSize, mDeviceScale);
|
||||
|
||||
mParts[PartIndex].ThumbnailId = ThumbnailId;
|
||||
|
||||
@@ -486,12 +486,13 @@ void lcPartSelectionListModel::SetPartDescriptionFilter(bool Option)
|
||||
SetFilter(mFilterString);
|
||||
}
|
||||
|
||||
void lcPartSelectionListModel::SetIconSize(int Size)
|
||||
void lcPartSelectionListModel::SetIconSize(int Size, float DeviceScale)
|
||||
{
|
||||
if (Size == mIconSize)
|
||||
if (Size == mIconSize && DeviceScale == mDeviceScale)
|
||||
return;
|
||||
|
||||
mIconSize = Size;
|
||||
mDeviceScale = DeviceScale;
|
||||
|
||||
beginResetModel();
|
||||
|
||||
@@ -770,7 +771,14 @@ void lcPartSelectionListView::SetIconSize(int Size)
|
||||
{
|
||||
setIconSize(QSize(Size, Size));
|
||||
lcSetProfileInt(LC_PROFILE_PARTS_LIST_ICONS, Size);
|
||||
mListModel->SetIconSize(Size);
|
||||
|
||||
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
|
||||
float DeviceScale = devicePixelRatioF();
|
||||
#else
|
||||
float DeviceScale = devicePixelRatio();
|
||||
#endif
|
||||
|
||||
mListModel->SetIconSize(Size, DeviceScale);
|
||||
UpdateViewMode();
|
||||
|
||||
int Width = Size + 2 * frameWidth() + 6;
|
||||
|
||||
@@ -159,7 +159,7 @@ public:
|
||||
void SetCaseSensitiveFilter(bool Option);
|
||||
void SetFileNameFilter(bool Option);
|
||||
void SetPartDescriptionFilter(bool Option);
|
||||
void SetIconSize(int Size);
|
||||
void SetIconSize(int Size, float DeviceScale);
|
||||
void SetShowPartNames(bool Show);
|
||||
|
||||
protected slots:
|
||||
@@ -172,6 +172,7 @@ protected:
|
||||
std::vector<lcPartSelectionListModelEntry> mParts;
|
||||
lcPartFilterType mPartFilterType;
|
||||
int mIconSize;
|
||||
float mDeviceScale = 1.0f;
|
||||
bool mColorLocked;
|
||||
int mColorIndex;
|
||||
bool mShowPartNames;
|
||||
|
||||
@@ -19,10 +19,10 @@ lcThumbnailManager::~lcThumbnailManager()
|
||||
mLibrary->ReleasePieceInfo(Thumbnail.Info);
|
||||
}
|
||||
|
||||
std::pair<lcPartThumbnailId, QPixmap> lcThumbnailManager::RequestThumbnail(PieceInfo* Info, int ColorIndex, int Size)
|
||||
std::pair<lcPartThumbnailId, QPixmap> lcThumbnailManager::RequestThumbnail(PieceInfo* Info, int ColorIndex, int Size, float DeviceScale)
|
||||
{
|
||||
for (auto &[ThumbnailId, Thumbnail] : mThumbnails)
|
||||
if (Thumbnail.Info == Info && Thumbnail.ColorIndex == ColorIndex && Thumbnail.Size == Size)
|
||||
if (Thumbnail.Info == Info && Thumbnail.ColorIndex == ColorIndex && Thumbnail.Size == Size && Thumbnail.DeviceScale == DeviceScale)
|
||||
return { ThumbnailId, Thumbnail.Pixmap };
|
||||
|
||||
lcPartThumbnailId ThumbnailId = static_cast<lcPartThumbnailId>(mNextThumbnailId++);
|
||||
@@ -31,6 +31,7 @@ std::pair<lcPartThumbnailId, QPixmap> lcThumbnailManager::RequestThumbnail(Piece
|
||||
Thumbnail.Info = Info;
|
||||
Thumbnail.ColorIndex = ColorIndex;
|
||||
Thumbnail.Size = Size;
|
||||
Thumbnail.DeviceScale = DeviceScale;
|
||||
Thumbnail.ReferenceCount = 1;
|
||||
|
||||
mLibrary->LoadPieceInfo(Info, false, false);
|
||||
@@ -70,8 +71,8 @@ void lcThumbnailManager::PartLoaded(PieceInfo* Info)
|
||||
|
||||
void lcThumbnailManager::DrawThumbnail(lcPartThumbnailId ThumbnailId, lcPartThumbnail& Thumbnail)
|
||||
{
|
||||
const int Width = Thumbnail.Size * 2;
|
||||
const int Height = Thumbnail.Size * 2;
|
||||
const int Width = Thumbnail.Size * 2 * Thumbnail.DeviceScale;
|
||||
const int Height = Thumbnail.Size * 2 * Thumbnail.DeviceScale;
|
||||
|
||||
if (mView && (mView->GetWidth() != Width || mView->GetHeight() != Height))
|
||||
mView.reset();
|
||||
@@ -145,8 +146,12 @@ void lcThumbnailManager::DrawThumbnail(lcPartThumbnailId ThumbnailId, lcPartThum
|
||||
Painter.drawImage(QPoint(0, 0), Icon);
|
||||
Painter.end();
|
||||
}
|
||||
|
||||
Thumbnail.Pixmap = QPixmap::fromImage(Image).scaled(Thumbnail.Size, Thumbnail.Size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
|
||||
|
||||
Image.setDevicePixelRatio(Thumbnail.DeviceScale);
|
||||
|
||||
float ScaledSize = Thumbnail.Size * Thumbnail.DeviceScale;
|
||||
|
||||
Thumbnail.Pixmap = QPixmap::fromImage(Image).scaled(ScaledSize, ScaledSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
|
||||
|
||||
mLibrary->ReleasePieceInfo(Info);
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ struct lcPartThumbnail
|
||||
PieceInfo* Info;
|
||||
int ColorIndex;
|
||||
int Size;
|
||||
float DeviceScale;
|
||||
int ReferenceCount;
|
||||
};
|
||||
|
||||
@@ -24,7 +25,7 @@ public:
|
||||
lcThumbnailManager(lcPiecesLibrary* Library);
|
||||
~lcThumbnailManager();
|
||||
|
||||
std::pair<lcPartThumbnailId, QPixmap> RequestThumbnail(PieceInfo* Info, int ColorIndex, int Size);
|
||||
std::pair<lcPartThumbnailId, QPixmap> RequestThumbnail(PieceInfo* Info, int ColorIndex, int Size, float DeviceScale);
|
||||
void ReleaseThumbnail(lcPartThumbnailId ThumbnailId);
|
||||
|
||||
signals:
|
||||
|
||||
Reference in New Issue
Block a user