PDF view performance:multiple pages selection

preferencesAboutTextFull
Anatoly Mihalchenko 12 years ago
parent 896383fd95
commit e6f84716f0
  1. 1742
      src/gui/UBThumbnailWidget.cpp
  2. 844
      src/gui/UBThumbnailWidget.h

File diff suppressed because it is too large Load Diff

@ -1,421 +1,423 @@
/*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef UBTHUMBNAILWIDGET_H_
#define UBTHUMBNAILWIDGET_H_
#include <QtGui>
#include <QtSvg>
#include <QTime>
#include <QGraphicsSceneHoverEvent>
#include "frameworks/UBCoreGraphicsScene.h"
#include "core/UBSettings.h"
#include "domain/UBItem.h"
#define STARTDRAGTIME 1000000
#define BUTTONSIZE 48
#define BUTTONSPACING 5
class UBDocumentProxy;
class UBThumbnailTextItem;
class UBThumbnail;
class UBThumbnailWidget : public QGraphicsView
{
Q_OBJECT;
public:
UBThumbnailWidget(QWidget* parent);
virtual ~UBThumbnailWidget();
QList<QGraphicsItem*> selectedItems();
void selectItemAt(int pIndex, bool extend = false);
void unselectItemAt(int pIndex);
qreal thumbnailWidth()
{
return mThumbnailWidth;
}
void setBackgroundBrush(const QBrush& brush)
{
mThumbnailsScene.setBackgroundBrush(brush);
}
public slots:
void setThumbnailWidth(qreal pThumbnailWidth);
void setSpacing(qreal pSpacing);
virtual void setGraphicsItems(const QList<QGraphicsItem*>& pGraphicsItems, const QList<QUrl>& pItemPaths, const QStringList pLabels = QStringList(), const QString& pMimeType = QString(""));
void refreshScene();
void sceneSelectionChanged();
signals:
void resized();
void selectionChanged();
void mouseDoubleClick(QGraphicsItem* item, int index);
void mouseClick(QGraphicsItem* item, int index);
protected:
virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseMoveEvent(QMouseEvent *event);
virtual void mouseReleaseEvent(QMouseEvent *event);
virtual void resizeEvent(QResizeEvent * event);
void mouseDoubleClickEvent(QMouseEvent * event);
virtual void keyPressEvent(QKeyEvent *event);
virtual void focusInEvent(QFocusEvent *event);
QList<QGraphicsItem*> mGraphicItems;
QList<UBThumbnailTextItem*> mLabelsItems;
QPointF mMousePressScenePos;
QPoint mMousePressPos;
protected:
qreal spacing() { return mSpacing; }
QList<QUrl> mItemsPaths;
QStringList mLabels;
bool bSelectionInProgress;
bool bCanDrag;
private:
void selectAll();
void unselectAll();
void selectItems(int startIndex, int count);
int rowCount() const;
int columnCount() const;
static bool thumbnailLessThan(QGraphicsItem* item1, QGraphicsItem* item2);
void deleteLasso();
UBCoreGraphicsScene mThumbnailsScene;
QString mMimeType;
qreal mThumbnailWidth;
qreal mThumbnailHeight;
qreal mSpacing;
UBThumbnail *mLastSelectedThumbnail;
int mSelectionSpan;
QGraphicsRectItem *mLassoRectItem;
QList<QGraphicsItem*> mSelectedThumbnailItems;
QTime mClickTime;
};
class UBThumbnail
{
public:
UBThumbnail();
virtual ~UBThumbnail();
QStyleOptionGraphicsItem muteStyleOption(const QStyleOptionGraphicsItem *option)
{
// Never draw the rubber band, we draw our custom selection with the DelegateFrame
QStyleOptionGraphicsItem styleOption = QStyleOptionGraphicsItem(*option);
styleOption.state &= ~QStyle::State_Selected;
return styleOption;
}
virtual void itemChange(QGraphicsItem *item, QGraphicsItem::GraphicsItemChange change, const QVariant &value)
{
Q_UNUSED(value);
if ((change == QGraphicsItem::ItemSelectedHasChanged
|| change == QGraphicsItem::ItemTransformHasChanged
|| change == QGraphicsItem::ItemPositionHasChanged)
&& item->scene())
{
if (item->isSelected())
{
if (!mSelectionItem->scene())
{
item->scene()->addItem(mSelectionItem);
mSelectionItem->setZValue(item->zValue() - 1);
// UBGraphicsItem::assignZValue(mSelectionItem, item->zValue() - 1);
mAddedToScene = true;
}
mSelectionItem->setRect(
item->sceneBoundingRect().x() - 5,
item->sceneBoundingRect().y() - 5,
item->sceneBoundingRect().width() + 10,
item->sceneBoundingRect().height() + 10);
mSelectionItem->show();
}
else
{
mSelectionItem->hide();
}
}
}
int column() { return mColumn; }
void setColumn(int column) { mColumn = column; }
int row() { return mRow; }
void setRow(int row) { mRow = row; }
protected:
QGraphicsRectItem *mSelectionItem;
private:
bool mAddedToScene;
int mColumn;
int mRow;
};
class UBThumbnailSvg : public QGraphicsSvgItem, public UBThumbnail
{
public:
UBThumbnailSvg(const QString& path)
: QGraphicsSvgItem(path)
{
setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
}
virtual ~UBThumbnailSvg()
{
// NOOP
}
virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
QStyleOptionGraphicsItem styleOption = UBThumbnail::muteStyleOption(option);
QGraphicsSvgItem::paint(painter, &styleOption, widget);
}
virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value)
{
UBThumbnail::itemChange(this, change, value);
return QGraphicsSvgItem::itemChange(change, value);
}
};
class UBThumbnailPixmap : public QGraphicsPixmapItem, public UBThumbnail
{
public:
UBThumbnailPixmap(const QPixmap& pix)
: QGraphicsPixmapItem(pix)
{
setTransformationMode(Qt::SmoothTransformation); // UB 4.3 may be expensive -- make configurable
setShapeMode(QGraphicsPixmapItem::BoundingRectShape);
setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
}
virtual ~UBThumbnailPixmap()
{
// NOOP
}
virtual QPainterPath shape () const
{
QPainterPath path;
path.addRect(boundingRect());
return path;
}
virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
QStyleOptionGraphicsItem styleOption = UBThumbnail::muteStyleOption(option);
QGraphicsPixmapItem::paint(painter, &styleOption, widget);
}
virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value)
{
UBThumbnail::itemChange(this, change, value);
return QGraphicsPixmapItem::itemChange(change, value);
}
};
class UBSceneThumbnailPixmap : public UBThumbnailPixmap
{
public:
UBSceneThumbnailPixmap(const QPixmap& pix, UBDocumentProxy* proxy, int pSceneIndex)
: UBThumbnailPixmap(pix)
, mProxy(proxy)
, mSceneIndex(pSceneIndex)
{
// NOOP
}
virtual ~UBSceneThumbnailPixmap()
{
// NOOP
}
UBDocumentProxy* proxy()
{
return mProxy;
}
int sceneIndex()
{
return mSceneIndex;
}
void highlight()
{
//NOOP
}
private:
UBDocumentProxy* mProxy;
int mSceneIndex;
};
class UBSceneThumbnailNavigPixmap : public UBSceneThumbnailPixmap
{
public:
UBSceneThumbnailNavigPixmap(const QPixmap& pix, UBDocumentProxy* proxy, int pSceneIndex);
~UBSceneThumbnailNavigPixmap();
protected:
void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
void mousePressEvent(QGraphicsSceneMouseEvent *event);
private:
void updateButtonsState();
void deletePage();
void moveUpPage();
void moveDownPage();
bool bButtonsVisible;
bool bCanDelete;
bool bCanMoveUp;
bool bCanMoveDown;
};
class UBThumbnailVideo : public UBThumbnailPixmap
{
public:
UBThumbnailVideo(const QUrl &path)
: UBThumbnailPixmap(QPixmap(":/images/movie.svg"))
, mPath(path)
{
// NOOP
}
virtual ~UBThumbnailVideo()
{
// NOOP
}
QUrl path()
{
return mPath;
}
private:
QUrl mPath;
};
class UBThumbnailTextItem : public QGraphicsTextItem
{
public:
UBThumbnailTextItem(const QString& text)
: QGraphicsTextItem(text)
, mUnelidedText(text)
, mIsHighlighted(false)
{
setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
}
QRectF boundingRect() const { return QRectF(QPointF(0.0, 0.0), QSize(mWidth, QFontMetricsF(font()).height() + 5));}
void setWidth(qreal pWidth)
{
if (mWidth != pWidth)
{
prepareGeometryChange();
mWidth = pWidth;
computeText();
}
};
qreal width() {return mWidth;}
void highlight()
{
if (!mIsHighlighted)
{
mIsHighlighted = true;
computeText();
}
}
void computeText()
{
QFontMetricsF fm(font());
QString elidedText = fm.elidedText(mUnelidedText, Qt::ElideRight, mWidth);
if (mIsHighlighted)
{
setHtml("<span style=\"color: #6682b5\">" + elidedText + "</span>");
}
else
{
setPlainText(elidedText);
}
}
private:
qreal mWidth;
QString mUnelidedText;
bool mIsHighlighted;
};
class UBImgTextThumbnailElement
{
private:
QGraphicsItem* thumbnail;
UBThumbnailTextItem* caption;
int border;
public:
UBImgTextThumbnailElement(QGraphicsItem* thumb, UBThumbnailTextItem* text): border(0)
{
this->thumbnail = thumb;
this->caption = text;
}
QGraphicsItem* getThumbnail() const { return this->thumbnail; }
void setThumbnail(QGraphicsItem* newGItem) { this->thumbnail = newGItem; }
UBThumbnailTextItem* getCaption() const { return this->caption; }
void setCaption(UBThumbnailTextItem* newcaption) { this->caption = newcaption; }
void Place(int row, int col, qreal width, qreal height);
int getBorder() const { return this->border; }
void setBorder(int newBorder) { this->border = newBorder; }
};
#endif /* UBTHUMBNAILWIDGET_H_ */
/*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef UBTHUMBNAILWIDGET_H_
#define UBTHUMBNAILWIDGET_H_
#include <QtGui>
#include <QtSvg>
#include <QTime>
#include <QGraphicsSceneHoverEvent>
#include "frameworks/UBCoreGraphicsScene.h"
#include "core/UBSettings.h"
#include "domain/UBItem.h"
#define STARTDRAGTIME 1000000
#define BUTTONSIZE 48
#define BUTTONSPACING 5
class UBDocumentProxy;
class UBThumbnailTextItem;
class UBThumbnail;
class UBThumbnailWidget : public QGraphicsView
{
Q_OBJECT;
public:
UBThumbnailWidget(QWidget* parent);
virtual ~UBThumbnailWidget();
QList<QGraphicsItem*> selectedItems();
void selectItemAt(int pIndex, bool extend = false);
void unselectItemAt(int pIndex);
qreal thumbnailWidth()
{
return mThumbnailWidth;
}
void setBackgroundBrush(const QBrush& brush)
{
mThumbnailsScene.setBackgroundBrush(brush);
}
public slots:
void setThumbnailWidth(qreal pThumbnailWidth);
void setSpacing(qreal pSpacing);
virtual void setGraphicsItems(const QList<QGraphicsItem*>& pGraphicsItems, const QList<QUrl>& pItemPaths, const QStringList pLabels = QStringList(), const QString& pMimeType = QString(""));
void refreshScene();
void sceneSelectionChanged();
signals:
void resized();
void selectionChanged();
void mouseDoubleClick(QGraphicsItem* item, int index);
void mouseClick(QGraphicsItem* item, int index);
protected:
virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseMoveEvent(QMouseEvent *event);
virtual void mouseReleaseEvent(QMouseEvent *event);
virtual void resizeEvent(QResizeEvent * event);
void mouseDoubleClickEvent(QMouseEvent * event);
virtual void keyPressEvent(QKeyEvent *event);
virtual void focusInEvent(QFocusEvent *event);
QList<QGraphicsItem*> mGraphicItems;
QList<UBThumbnailTextItem*> mLabelsItems;
QPointF mMousePressScenePos;
QPoint mMousePressPos;
protected:
qreal spacing() { return mSpacing; }
QList<QUrl> mItemsPaths;
QStringList mLabels;
bool bSelectionInProgress;
bool bCanDrag;
private:
void selectAll();
void selectItems(int startIndex, int count);
int rowCount() const;
int columnCount() const;
static bool thumbnailLessThan(QGraphicsItem* item1, QGraphicsItem* item2);
void deleteLasso();
UBCoreGraphicsScene mThumbnailsScene;
QString mMimeType;
QPointF prevMoveMousePos;
qreal mThumbnailWidth;
qreal mThumbnailHeight;
qreal mSpacing;
UBThumbnail *mLastSelectedThumbnail;
int mSelectionSpan;
QGraphicsRectItem *mLassoRectItem;
QSet<QGraphicsItem*> mSelectedThumbnailItems;
QSet<QGraphicsItem*> mPreviouslyIncrementalSelectedItems;
QTime mClickTime;
};
class UBThumbnail
{
public:
UBThumbnail();
virtual ~UBThumbnail();
QStyleOptionGraphicsItem muteStyleOption(const QStyleOptionGraphicsItem *option)
{
// Never draw the rubber band, we draw our custom selection with the DelegateFrame
QStyleOptionGraphicsItem styleOption = QStyleOptionGraphicsItem(*option);
styleOption.state &= ~QStyle::State_Selected;
return styleOption;
}
virtual void itemChange(QGraphicsItem *item, QGraphicsItem::GraphicsItemChange change, const QVariant &value)
{
Q_UNUSED(value);
if ((change == QGraphicsItem::ItemSelectedHasChanged
|| change == QGraphicsItem::ItemTransformHasChanged
|| change == QGraphicsItem::ItemPositionHasChanged)
&& item->scene())
{
if (item->isSelected())
{
if (!mSelectionItem->scene())
{
item->scene()->addItem(mSelectionItem);
mSelectionItem->setZValue(item->zValue() - 1);
// UBGraphicsItem::assignZValue(mSelectionItem, item->zValue() - 1);
mAddedToScene = true;
}
mSelectionItem->setRect(
item->sceneBoundingRect().x() - 5,
item->sceneBoundingRect().y() - 5,
item->sceneBoundingRect().width() + 10,
item->sceneBoundingRect().height() + 10);
mSelectionItem->show();
}
else
{
mSelectionItem->hide();
}
}
}
int column() { return mColumn; }
void setColumn(int column) { mColumn = column; }
int row() { return mRow; }
void setRow(int row) { mRow = row; }
protected:
QGraphicsRectItem *mSelectionItem;
private:
bool mAddedToScene;
int mColumn;
int mRow;
};
class UBThumbnailSvg : public QGraphicsSvgItem, public UBThumbnail
{
public:
UBThumbnailSvg(const QString& path)
: QGraphicsSvgItem(path)
{
setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
}
virtual ~UBThumbnailSvg()
{
// NOOP
}
virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
QStyleOptionGraphicsItem styleOption = UBThumbnail::muteStyleOption(option);
QGraphicsSvgItem::paint(painter, &styleOption, widget);
}
virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value)
{
UBThumbnail::itemChange(this, change, value);
return QGraphicsSvgItem::itemChange(change, value);
}
};
class UBThumbnailPixmap : public QGraphicsPixmapItem, public UBThumbnail
{
public:
UBThumbnailPixmap(const QPixmap& pix)
: QGraphicsPixmapItem(pix)
{
setTransformationMode(Qt::SmoothTransformation); // UB 4.3 may be expensive -- make configurable
setShapeMode(QGraphicsPixmapItem::BoundingRectShape);
setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
}
virtual ~UBThumbnailPixmap()
{
// NOOP
}
virtual QPainterPath shape () const
{
QPainterPath path;
path.addRect(boundingRect());
return path;
}
virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
QStyleOptionGraphicsItem styleOption = UBThumbnail::muteStyleOption(option);
QGraphicsPixmapItem::paint(painter, &styleOption, widget);
}
virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value)
{
UBThumbnail::itemChange(this, change, value);
return QGraphicsPixmapItem::itemChange(change, value);
}
};
class UBSceneThumbnailPixmap : public UBThumbnailPixmap
{
public:
UBSceneThumbnailPixmap(const QPixmap& pix, UBDocumentProxy* proxy, int pSceneIndex)
: UBThumbnailPixmap(pix)
, mProxy(proxy)
, mSceneIndex(pSceneIndex)
{
// NOOP
}
virtual ~UBSceneThumbnailPixmap()
{
// NOOP
}
UBDocumentProxy* proxy()
{
return mProxy;
}
int sceneIndex()
{
return mSceneIndex;
}
void highlight()
{
//NOOP
}
private:
UBDocumentProxy* mProxy;
int mSceneIndex;
};
class UBSceneThumbnailNavigPixmap : public UBSceneThumbnailPixmap
{
public:
UBSceneThumbnailNavigPixmap(const QPixmap& pix, UBDocumentProxy* proxy, int pSceneIndex);
~UBSceneThumbnailNavigPixmap();
protected:
void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
void mousePressEvent(QGraphicsSceneMouseEvent *event);
private:
void updateButtonsState();
void deletePage();
void moveUpPage();
void moveDownPage();
bool bButtonsVisible;
bool bCanDelete;
bool bCanMoveUp;
bool bCanMoveDown;
};
class UBThumbnailVideo : public UBThumbnailPixmap
{
public:
UBThumbnailVideo(const QUrl &path)
: UBThumbnailPixmap(QPixmap(":/images/movie.svg"))
, mPath(path)
{
// NOOP
}
virtual ~UBThumbnailVideo()
{
// NOOP
}
QUrl path()
{
return mPath;
}
private:
QUrl mPath;
};
class UBThumbnailTextItem : public QGraphicsTextItem
{
public:
UBThumbnailTextItem(const QString& text)
: QGraphicsTextItem(text)
, mUnelidedText(text)
, mIsHighlighted(false)
{
setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
}
QRectF boundingRect() const { return QRectF(QPointF(0.0, 0.0), QSize(mWidth, QFontMetricsF(font()).height() + 5));}
void setWidth(qreal pWidth)
{
if (mWidth != pWidth)
{
prepareGeometryChange();
mWidth = pWidth;
computeText();
}
};
qreal width() {return mWidth;}
void highlight()
{
if (!mIsHighlighted)
{
mIsHighlighted = true;
computeText();
}
}
void computeText()
{
QFontMetricsF fm(font());
QString elidedText = fm.elidedText(mUnelidedText, Qt::ElideRight, mWidth);
if (mIsHighlighted)
{
setHtml("<span style=\"color: #6682b5\">" + elidedText + "</span>");
}
else
{
setPlainText(elidedText);
}
}
private:
qreal mWidth;
QString mUnelidedText;
bool mIsHighlighted;
};
class UBImgTextThumbnailElement
{
private:
QGraphicsItem* thumbnail;
UBThumbnailTextItem* caption;
int border;
public:
UBImgTextThumbnailElement(QGraphicsItem* thumb, UBThumbnailTextItem* text): border(0)
{
this->thumbnail = thumb;
this->caption = text;
}
QGraphicsItem* getThumbnail() const { return this->thumbnail; }
void setThumbnail(QGraphicsItem* newGItem) { this->thumbnail = newGItem; }
UBThumbnailTextItem* getCaption() const { return this->caption; }
void setCaption(UBThumbnailTextItem* newcaption) { this->caption = newcaption; }
void Place(int row, int col, qreal width, qreal height);
int getBorder() const { return this->border; }
void setBorder(int newBorder) { this->border = newBorder; }
};
#endif /* UBTHUMBNAILWIDGET_H_ */

Loading…
Cancel
Save