263 lines
9.2 KiB
C++
263 lines
9.2 KiB
C++
#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 <QWidget>
|
|
|
|
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<int> &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();
|
|
|
|
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<HGImgThumbItem *> m_frontItems;
|
|
std::list<QString> 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__ */
|