#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 #include #include class QScrollArea; class QVBoxLayout; class RMVideoItem; #include #include 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 _items; // 멀티에서만 사용 #endif // #if (USE_DATE_FILTER) #if (USE_1HOUR_FILTER) QDateTime _selectedDateTime; ///!< 선택된 영상 시간 static QList _items; ///!< 시간 및 재생처리를 위해.. static QList> _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 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