mirror of
https://github.com/leozide/leocad.git
synced 2026-10-26 22:10:32 +00:00
Replace manual piece-data retain/release bookkeeping with shared copyable asset-reference handles. Pieces, models, selection, minifigs, thumbnails, and stored insertion previews retain their dependencies explicitly, while transient queries continue to borrow pointers. Separate registered lookup and acquisition from asynchronous load requests and explicit readiness waits. Keep loader-held references through work and notification delivery, resetting shared request handles on the UI thread and guarding callback-triggered library teardown. Validated with the Qt 6.10 debug build and 26 offscreen lifecycle checks, including cancellation, stale requests, copy/move operations, model/preview teardown, undo, project merge/export, and loader shutdown.
60 lines
1.6 KiB
C++
60 lines
1.6 KiB
C++
#pragma once
|
|
|
|
#include "lc_assettypes.h"
|
|
|
|
class lcPiecesLibrary;
|
|
|
|
struct lcPartThumbnail
|
|
{
|
|
QPixmap Pixmap;
|
|
lcPieceData* PieceData;
|
|
std::vector<lcPieceDataRef> RequiredPieceData;
|
|
int ColorIndex;
|
|
int Size;
|
|
float DeviceScale;
|
|
int ReferenceCount;
|
|
};
|
|
|
|
enum class lcPartThumbnailId : uint32_t
|
|
{
|
|
Invalid = 0
|
|
};
|
|
|
|
class lcThumbnailManager : public QObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
lcThumbnailManager(lcPiecesLibrary* Library);
|
|
~lcThumbnailManager();
|
|
|
|
std::pair<lcPartThumbnailId, QPixmap> RequestThumbnail(lcPieceData* PieceData, int ColorIndex, int Size, float DeviceScale);
|
|
void ReleaseThumbnail(lcPartThumbnailId ThumbnailId);
|
|
void Clear();
|
|
void RefreshPieces(const std::vector<lcPieceData*>& ChangedPieces);
|
|
|
|
signals:
|
|
void ThumbnailReady(lcPartThumbnailId ThumbnailId, QPixmap Pixmap);
|
|
|
|
protected slots:
|
|
void PartLoaded(lcPieceData* PieceData);
|
|
void PartLoadFailed(lcPieceData* PieceData);
|
|
void GeneratedMeshSettled(lcPieceData* PieceData);
|
|
|
|
protected:
|
|
void RefreshRequiredPieces(lcPartThumbnail& Thumbnail);
|
|
void UpdateThumbnail(lcPartThumbnailId ThumbnailId, lcPartThumbnail& Thumbnail);
|
|
void DrawThumbnail(lcPartThumbnailId ThumbnailId, lcPartThumbnail& Thumbnail);
|
|
void DrawFailedThumbnail(lcPartThumbnailId ThumbnailId, lcPartThumbnail& Thumbnail);
|
|
void SchedulePendingThumbnails();
|
|
|
|
lcPiecesLibrary* mLibrary = nullptr;
|
|
std::map<lcPartThumbnailId, lcPartThumbnail> mThumbnails;
|
|
int mNextThumbnailId = 1;
|
|
|
|
std::unique_ptr<lcView> mView;
|
|
std::unique_ptr<lcModel> mModel;
|
|
std::map<lcPartThumbnailId, std::unique_ptr<lcModel>> mPendingGeneratedModels;
|
|
bool mRetryScheduled = false;
|
|
};
|