#ifndef __HGIMGTHUMB_H__ #define __HGIMGTHUMB_H__ #include "base/HGDef.h" #include "base/HGBaseErr.h" #include "base/HGLock.h" #include "base/HGEvent.h" #include "base/HGThread.h" #include "base/HGImage.h" #include class HGImgThumb : public QWidget { Q_OBJECT public: HGImgThumb(QWidget* parent = nullptr); virtual ~HGImgThumb(); enum ThumbType { ThumbType_Hori = 0, // 水平, item垂直居中 ThumbType_Vert = 1, // 垂直, item水平居中 ThumbType_Grid = 2 // 网格, 可以放大缩小 }; enum ThumbRemoveFlag { ThumbRemoveFlag_NULL = 0, // 仅仅从列表中删除,文件不处理 ThumbRemoveFlag_AllowUndo = 1, // 从列表中删除,并将文件放入回收站 ThumbRemoveFlag_Delete = 2 // 从列表中删除,并删除文件 }; HGResult setGapSize(int size); HGResult setScrollSize(int size); HGResult setMinScrollSliderSize(int size); HGResult setItemSize(int size); HGResult setItemTextHeight(int height); HGResult setDefItemImage(const QImage *image); HGResult setHScrollLeftImage(const QImage *normalImage, const QImage *hotImage, const QImage *pushImage); HGResult setHScrollRightImage(const QImage *normalImage, const QImage *hotImage, const QImage *pushImage); HGResult setVScrollTopImage(const QImage *normalImage, const QImage *hotImage, const QImage *pushImage); HGResult setVScrollBottomImage(const QImage *normalImage, const QImage *hotImage, const QImage *pushImage); HGResult setHScrollImage(const QImage *image, const HGRect *stretch); HGResult setHScrollSliderImage(const QImage *normalImage, const HGRect *normalStretch, const QImage *hotImage, const HGRect *hotStretch, const QImage *pushImage, const HGRect *pushStretch); HGResult setVScrollImage(const QImage *image, const HGRect *stretch); HGResult setVScrollSliderImage(const QImage *normalImage, const HGRect *normalStretch, const QImage *hotImage, const HGRect *hotStretch, const QImage *pushImage, const HGRect *pushStretch); HGResult setNullScrollImage(const QImage *image); HGResult setType(ThumbType type); HGResult zoomIn(); HGResult zoomOut(); HGResult getItemCount(int *count); HGResult addItem(const QString &fileName, bool notifyCurrentItem = true); HGResult addItems(const QStringList &fileNames, bool notifyCurrentItem = true); HGResult insertItem(const QString &fileName, int pos, bool notifyCurrentItem = true); HGResult insertItems(const QStringList &fileNames, int pos, bool append = false, bool notifyCurrentItem = true); HGResult moveItems(const QStringList &fileNames, int pos); HGResult moveItemsTo(const QStringList &fileNames, int index); HGResult getItemFileName(int index, QString &fileName); HGResult getCurrItem(int *index); HGResult setCurrItem(int index); HGResult resetCurrItem(); HGResult removeItem(int index, ThumbRemoveFlag flag); HGResult removeItems(const std::vector &indexs, ThumbRemoveFlag flag); HGResult removeAllItems(ThumbRemoveFlag flag); HGResult bookSort(); HGResult selectItem(int index, bool select); HGResult itemIsSelect(int index, bool *select); HGResult updateItem(int index, const QString &newFileName, bool refresh); HGResult updateItem(const QString &fileName, const QString &newFileName, bool refresh); HGResult refreshItem(int index); HGResult refreshItem(const QString &fileName); HGResult refreshAllItems(); HGResult reloadAllItems(); void notify_mouse_leave(void); signals: void keyDeleteDown(); void currItemChanged(int index); void itemDoubleClicked(int index); void itemCountChanged(int count); void itemSelectingChanged(); void contextMenuEvent(int index); void drop(const QObject *source, const QStringList &fileNames, int pos); private: struct HGImgThumbItem { HGImgThumbItem() { width = 0; height = 0; image = NULL; selected = false; } ~HGImgThumbItem() { if (NULL != image) { delete image; image = NULL; } } QString fileName; int width; // 实际宽 int height; // 实际高 QImage *image; // 缩略图 bool selected; }; struct ThumbRect { double left; double top; double right; double bottom; }; enum MouseStatus { MouseStatus_Null = 0, MouseStatus_HScroll, MouseStatus_HScrollSlider, MouseStatus_HScrollLeft, MouseStatus_HScrollRight, MouseStatus_VScroll, MouseStatus_VScrollSlider, MouseStatus_VScrollTop, MouseStatus_VScrollBottom, MouseStatus_NullScroll }; protected: virtual void mousePressEvent(QMouseEvent *e); virtual void mouseMoveEvent(QMouseEvent* e); virtual void mouseReleaseEvent(QMouseEvent *e); virtual void enterEvent(QEvent *e); virtual void leaveEvent(QEvent *e); virtual void paintEvent(QPaintEvent* e); virtual void wheelEvent(QWheelEvent* e); virtual void resizeEvent(QResizeEvent* e); virtual void keyPressEvent(QKeyEvent *e); virtual void keyReleaseEvent(QKeyEvent *e); virtual void focusInEvent(QFocusEvent *e); virtual void focusOutEvent(QFocusEvent *e); virtual void contextMenuEvent(QContextMenuEvent* e); virtual void dragEnterEvent(QDragEnterEvent *e); virtual void dragMoveEvent(QDragMoveEvent *e); virtual void dragLeaveEvent(QDragLeaveEvent *e); virtual void dropEvent(QDropEvent *e); virtual void mouseDoubleClickEvent(QMouseEvent *e); signals: void updateItem(); private slots: void on_updateItem(); private: static QImage* createItemImage(const QImage *srcImage, int itemSize); static QImage* createItemImage(HGImage srcImage, int itemSize); static void DrawImage(QPainter &painter, const QRect &destRect, const QImage *image, const QRect &stretchRect); static void calcShowSize(int wndWidth, int wndHeight, int gapSize, int scrollSize, int itemSize, int itemTextHeight, ThumbType type, int itemCount, int &showWidth, int &showHeight, bool &hScroll, bool &vScroll); static void recalcShowRect(int wndWidth, int wndHeight, int scrollSize, ThumbType type, bool hScroll, bool vScroll, bool showThumb, ThumbRect &thumbRect); void DrawScroll(QPainter &painter); void reset(); QPoint getItemPos(int index); // 返回的坐标是相对于thumb区域的 void locateItem(int index); void locateInsert(const QPoint &pt1, const QPoint &pt2); // pt1和pt2是相对于thumb区域的 int getItemRow(int index); int getItemCol(int index); int getTotalRows(); int getTotalCols(); int getRowCount(int row); // 获取每行的个数 int getItemIndex(const QPoint &pt, MouseStatus &mouseStatus); // pt是相对于窗口的 int getInsertPos(const QPoint &pt, bool &get, QPoint &pt1, QPoint &pt2); // pt是相对于窗口的, 返回的pt1和pt2是相对于thumb区域的 int findIndex(const QString &fileName); QRect getHScrollLeftPos(); QRect getHScrollRightPos(); QRect getHScrollPos(); QRect getHScrollSliderPos(); QRect getVScrollTopPos(); QRect getVScrollBottomPos(); QRect getVScrollPos(); QRect getVScrollSliderPos(); QRect getNullScrollPos(); void Show(); static void HGAPI ThreadFunc(HGThread thread, HGPointer param); private: HGLock m_lockFront; HGLock m_lockBack; HGLock m_lockItemSize; HGEvent m_event; int m_gapSize; int m_scrollSize; int m_minScrollSliderSize; int m_itemSize; int m_itemTextHeight; QImage *m_defItemImage; QImage *m_itemImage; QImage *m_hScrollLeftImage[3]; QImage *m_hScrollRightImage[3]; QImage *m_vScrollTopImage[3]; QImage *m_vScrollBottomImage[3]; QImage *m_hScrollImage; QRect m_hScrollImageStretch; QImage *m_hScrollSliderImage[3]; QRect m_hScrollSliderImageStretch[3]; QImage *m_vScrollImage; QRect m_vScrollImageStretch; QImage *m_vScrollSliderImage[3]; QRect m_vScrollSliderImageStretch[3]; QImage *m_nullScrollImage; ThumbType m_type; bool m_mouseOn; int m_curItemIndex; int m_hotItemIndex; int m_pushItemIndex; int m_signItemIndex; bool m_stopThread; HGThread m_thread; std::vector m_frontItems; std::list m_backList; bool m_hScroll; bool m_vScroll; bool m_showThumb; ThumbRect m_thumbRect; MouseStatus m_mouseMoveStatus; MouseStatus m_mousePressStatus; int m_mousePressBeginX; int m_mousePressBeginY; Qt::MouseButtons m_hitMouseButtons; Qt::KeyboardModifiers m_hitKeyboardModifiers; int m_hitItemIndex; // 点击的索引 int m_operate; // 0, 1-拖动 2-框选 int m_operateStartX; int m_operateStartY; bool m_draging; // 进入拖动 bool m_insertPtValid; QPoint m_insertPt1; QPoint m_insertPt2; int m_curInsertPos; bool m_frameSelection; // 进入框选 bool m_frameSelectionRectValid; int m_frameSelectionStartX; // 相对于thumb区域 int m_frameSelectionStartY; // 相对于thumb区域 HGRect m_frameSelectionRect; // 该区域是相对于thumb区域的 }; #endif /* __HGIMGTHUMB_HPP__ */