/*********************************************************************** * This file is part of Scanned Image Extract. * * Scanned Image Extract 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. * * Scanned Image Extract 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 Scanned Image Extract. If not, see * * * Copyright (C) 2015, Dominik Rueß; info@dominik-ruess.de **********************************************************************/ #ifndef IMAGESCENE_H #define IMAGESCENE_H #include #include #include #include #include #include #include #include #include #include "imageboundary.h" #include "sourcefile.h" #include "preloadsource.h" #include "copytargets.h" #include "extracttargets.h" #define DISTANCE_GRAB_CORNER 10 #define DISTANCE_GRAB_EDGE 15 #define NEW_BOX_LINE_COLOR QColor(255,0,0,255) enum MouseState { MouseStateNotLoaded, MouseStateNone, MouseStateSelectItem, MouseStateReleaseItem, MouseStateNewItem, MouseStateNewItemRelease, MouseStateMoveItem, MouseStateRotateItem, MouseStateMoveCorner, MouseStateMoveEdge, MouseStateMoveEdgePre, }; class ImageScene : public QGraphicsScene { Q_OBJECT public: explicit ImageScene(QObject *parent = 0); ~ImageScene(); TargetImagePtr addBoundary(ImageBoundaryPtr); void init(); signals: void updateTargetDisplay(const QPixmap& pixmap); void rotation90(const Rotation90 rotation); void resetAspect(); void fileName(const QString&); void landscapeButton(bool landscape); void changed(bool hasChanges); void selectedAspect(float aspect); void newCrop(const double cropPerc); void noAspect(); // no unique aspect void noCrop(); void noRotation(); void reloadSettings(); void renewList(QFileInfoList,int); void extractTarget(int, int); void setTargetWaiting(bool); void filePosition(QString); void targetPosition(QString); void numSelected(int); void doneCopying(const QString&, const QString&); public slots: void newImageList(const QFileInfoList& images = QFileInfoList(), const int selectedIndex = 0); void loadPosition(const int newPosition = -1, const bool increment= false, const bool forceReload = false); void newRotation(const Rotation90); void newIndividualCrop(const double percentage); void deleteSelection(); void nextTarget(const int increment); void newAspectRatio(const double ratio); void zoom(double factor); void zoomFit(); void zoom1(); void saveCurrent(const bool noUpdate = false, const bool force = false); void updateMinMax(const int, const int); void getIsFirstLast(bool &isFirst, bool &isLast); void setEnforceAspect(const bool enforce); void setDestination(QString destination); void setPrefix(const QString prefix) { _copyTargetThread.setPrefix(prefix); } void setThresh(const double thresh) { if (hasLoader()) _backgroundLoader->setThresh(thresh); } void setMaxAspect(const double maxAspect) { if (hasLoader())_backgroundLoader->setMaxAspect(maxAspect); } void setLevels(const int levels) { if (hasLoader()) _backgroundLoader->setLevels(levels); } void setMaxOverlap(const double maxOverlap) { if (hasLoader()) _backgroundLoader->setMaxOverlap(maxOverlap); } void setMinArea(const double minArea) { if (hasLoader()) _backgroundLoader->setMinArea(minArea); } void setMinAreaWithinImage(const double minArea) { if (hasLoader()) _backgroundLoader->setMinAreaWithinImage(minArea); } void setSplitMaxOffset(const double maxOffset) { if (hasLoader()) _backgroundLoader->setSplitMaxOffset(maxOffset); } void setSplitMinCornerDist(const double minCornerDist) { if (hasLoader()) _backgroundLoader->setSplitMinCornerDist(minCornerDist); } void setSplitMinLengthFrac(const double minLengthFrac) { if (hasLoader()) _backgroundLoader->setSplitMinLengthFrac(minLengthFrac); } void setMaximumHierarchyLevel(const int level) { if (hasLoader()) _backgroundLoader->setMaxHierarchyLevel(level); } void setNumPreLoad(const int num) { _numNeighbours = num; } void reloadFromNewSettings(); void doneLoadingTarget(const TargetImagePtr& target); void refreshView(); void selectAll(); void initialCropChanged(const double val); protected: void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent); void mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent); void mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent); void keyPressEvent ( QKeyEvent * keyEvent ); void wheelEvent(QGraphicsSceneWheelEvent *event); private slots: void doneCopy(const QString&, const QString&); void onSelectionChanged(); void _doneLoading(const SourceFilePtr &, const int position); void _onCopyError(SourceFilePtr, TargetImagePtr); void updateSelection(); void clear(); void _extractTarget(const int fromImageId, const TargetImagePtr target, const bool highPriority = false); private: QList _findSelectedTarget(); inline double _norm(const QPointF&); inline double _dot(const QPointF&, const QPointF&); inline double _norm2(const QPointF& ); inline double _lineDist(const QPointF& l1, const QPointF& l2, const QPointF& p); void _updateTarget(const bool changed = false, bool dirty = false); bool _correctAspectRatio(TargetImagePtr target); MouseState _currentState; MouseState _currentMouseState; QGraphicsView* _view; int _currentCorner; int _currentEdge; TargetImagePtr _currentTarget; QPixmap _sizeChange; QPixmap _rotate; double _lastAngle; QPointF _rotationCenter; QTransform _lastTransformation; QPointF _lastCornerPos[4]; QVector _currentFiles; int _currentIndex; QGraphicsLineItem* _currLine; double _cropPercentage; Rotation90 _currGlobalRotation; double _aspectRatio; double _currAspectRatio; PreloadSource* _backgroundLoader; bool hasLoader() const { return _backgroundLoader != 0; } bool _isWaiting; CopyTargets _copyTargetThread; QTimer _timer; bool _enforceAspectForNew; QProgressBar* _waitBar; QMutex _extractMutex; ExtractTargets _targetExtractor; int _numNeighbours; }; #endif // IMAGESCENE_H