first commit

This commit is contained in:
2026-02-21 17:11:31 +09:00
commit 18b4338361
4001 changed files with 365464 additions and 0 deletions

View File

@@ -0,0 +1,170 @@
#ifndef FM_THUMBNAIL_H
#define FM_THUMBNAIL_H
#include "../rm_include.h"
#if (RM_MODEL == RM_MODEL_TYPE_TB4000)
#define DYNAMIC_THUMBNAIL 1
#define MULTI_THUMBNAIL_ONLY 1 // SINGLE 모드 제거
#define FIXED_SIZE_THUMBNAIL 1 // 고정 크기
#define THUMBNAIL_ITEM_CONNECT_EACH 1 // FMSIGNAL 로 연결
#define THUMBNAIL_DIALOG_SNAP 1 // 크기 조정
#include <QDialog>
#include <QObject>
#include <QWidget>
class QScrollArea;
class QVBoxLayout;
class RMVideoItem;
#include <QStyledItemDelegate>
#include <QDateTime>
class FMThumbnailDelegate;
class QItemSelection;
class FMButton;
class QTableWidget;
#if (DETECT_USB_CHANGE)
class rm_usb;
#endif
class FMThumbnailDialog : public QDialog
{
Q_OBJECT
public:
#if (USE_DATE_FILTER)
FMThumbnailDialog(QWidget *parent, QString folder);
#else // USE_DATE_FILTER
FMThumbnailDialog(QWidget *parent, bool bAll);
#endif // USE_DATE_FILTER
enum MODE {
MODE_SIMPLE, // 심플 아이템 표시
MODE_SUB // 심플 아이템에 포함된 모든 영상
};
QString selectedFile;
protected:
bool _bFirst;
#if (DETECT_USB_CHANGE)
rm_usb* _usb; // 메인 윈도우의 참조
#endif // #if (DETECT_USB_CHANGE)
#if (USE_DATE_FILTER)
QString _folder;
static QStringList _files;
QList<RMVideoItem*> _items; // 멀티에서만 사용
#endif // #if (USE_DATE_FILTER)
#if (USE_1HOUR_FILTER)
QDateTime _selectedDateTime; ///!< 선택된 영상 시간
static QList<RMVideoItem*> _items; ///!< 시간 및 재생처리를 위해..
static QList<QPair<QString,QString>> _thumbnails; ///!< 로딩된 Thumbnail 경로
FMButton* _backButton; ///!< 세부->1시간으로 돌아가기 버튼
QLabel* _titleBar; ///!< 1시간 및 세부 리스트에서 표시되는 타이틀
#endif
QModelIndex _lastIndex; // 1시간 리스트에서 전체 리스트로 이동시
//QString windowTitle;
MODE _mode;
QTableWidget* _tableView;
FMThumbnailDelegate* _delegate;
void createLayout(MODE mode,RMVideoItem* selected = NULL);
void closeEvent(QCloseEvent *event);
void showEvent(QShowEvent * event);
#if (USE_DATE_FILTER)
void loadThumbnails(QString folder);
#else
void loadThumbnails();
#endif // #if (USE_DATE_FILTER)
public slots:
void onLoadThumbnails();
//void onThumbnailLoaded(RMVideoItem* item); // FMThumbnail* thumbnail,
//void onProcessFinished();
#if (USE_1HOUR_FILTER)
void onBack();
#endif // #if (USE_1HOUR_FILTER)
void onSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
friend class FMThumbnailDelegate;
void scrollTo();
void onThumbnailUpdated(int);
void onDoubleClickItem(int row, int column);
void onEnableClick(); ///! 더블클릭 방지용
#if (DETECT_USB_CHANGE)
void onUSBChange(bool inserted, QString& drive);
#endif // #if (DETECT_USB_CHANGE)
};
class thumbnail_cache : public QObject
{
Q_OBJECT
private:
thumbnail_cache(QObject* parent = nullptr);
QMap<QString,QPixmap> cache;
QPixmap _load(QString path, const QSize& wh);
QPixmap _dummy;
public:
const QPixmap thumbnail(const QString path,int index, const QSize& wh);
static thumbnail_cache* instance() {
static thumbnail_cache _instance;
return &_instance;
}
void clear() {
cache.clear();
}
signals:
void thumbnailLoaded(int index);
};
class FMThumbnailDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
explicit FMThumbnailDelegate(QObject *parent = 0);
void paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const;
private:
QPersistentModelIndex currentEditedCellIndex;
FMThumbnailDialog* _dialog;
public slots:
void entered(const QModelIndex &index);
};
// PROCESS 강제 종료하기 위해 사용
class FMThumbnailSignal : public QObject {
Q_OBJECT
private:
static FMThumbnailSignal* _instance;
public:
enum SIGNAL_MODE {
MODE_REJECT, // 종료(닫기, 취소)
MODE_ACCEPT, // 선택됨
MODE_RESTART // 다른 썸네일 로딩
};
static FMThumbnailSignal* instance()
{
if(_instance == NULL)
{
_instance = new FMThumbnailSignal();
}
return _instance;
}
SIGNAL_MODE mode;
FMThumbnailDialog::MODE restartMode;
RMVideoItem* restartItem;
signals:
void finished();
void thumnbnailsLoaded(RMVideoItem* item);
};
#endif // #if (RM_MODEL == RM_MODEL_TYPE_TB4000)
#endif // FM_THUMBNAIL_H