code_app/app/scanner2/HGImgThumb.h

263 lines
9.2 KiB
C
Raw Normal View History

2022-05-03 10:25:52 +00:00
#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);
2022-05-03 10:25:52 +00:00
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();
2022-05-03 10:25:52 +00:00
HGResult selectItem(int index, bool select);
HGResult itemIsSelect(int index, bool *select);
2023-08-09 04:02:41 +00:00
HGResult updateItem(int index, const QString &newFileName, bool refresh);
HGResult updateItem(const QString &fileName, const QString &newFileName, bool refresh);
2022-05-03 10:25:52 +00:00
HGResult refreshItem(int index);
HGResult refreshItem(const QString &fileName);
HGResult refreshAllItems();
2022-06-02 10:27:14 +00:00
void notify_mouse_leave(void);
2022-05-03 10:25:52 +00:00
signals:
2023-08-14 03:53:48 +00:00
void keyDeleteDown();
2022-05-03 10:25:52 +00:00
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);
2022-05-03 10:25:52 +00:00
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();
2022-10-12 03:51:41 +00:00
static void HGAPI ThreadFunc(HGThread thread, HGPointer param);
2022-05-03 10:25:52 +00:00
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__ */