File indexing completed on 2024-04-21 03:50:56

0001 #include "container.h"
0002 #include "image/imagepainter.h"
0003 #include "image/polygon.h"
0004 #include "text/textpainter.h"
0005 #include "util/fileutils.h"
0006 
0007 #include <QGraphicsScene>
0008 #include <QMouseEvent>
0009 
0010 Container::Container(QWidget* parent) :
0011     QGraphicsView(parent),
0012     m_currentObject(new Polygon),
0013     m_painterType(PainterType::None)
0014 {
0015     QGraphicsScene *scene = new QGraphicsScene;
0016     scene->setItemIndexMethod(QGraphicsScene::NoIndex);
0017     setScene(scene);
0018     setMinimumSize(860, 600);
0019 
0020     installEventFilter(this);
0021 }
0022 
0023 Container::~Container()
0024 {
0025 }
0026 
0027 bool Container::eventFilter(QObject* watched, QEvent* event)
0028 {
0029     if (m_painterType == PainterType::None)
0030         return false;
0031 
0032     if (event->type() == QEvent::Wheel && m_painterType == PainterType::Image) {
0033         ImagePainter *imagePainter = static_cast<ImagePainter*>(m_painter.get());
0034         QWheelEvent *wheelEvent = static_cast<QWheelEvent*>(event);
0035         const int numDegrees = wheelEvent->angleDelta().y() / 8;
0036         const int numSteps = numDegrees / 15;
0037         if (numSteps > 0)
0038             imagePainter->zoomIn();
0039         else
0040             imagePainter->zoomOut();
0041         return true;
0042     }
0043 
0044     QMouseEvent *mouseEvent = dynamic_cast<QMouseEvent*>(event);
0045     if (mouseEvent == nullptr)
0046         return false;
0047 
0048     if (event->type() == QEvent::MouseButtonPress)
0049         m_painter->paint(mouseEvent->pos(), false);
0050     else if (event->type() == QEvent::MouseButtonDblClick) {
0051         if (m_painterType == PainterType::Text)
0052             m_painter->paint(mouseEvent->pos(), false);
0053     }
0054     else if (event->type() == QEvent::MouseMove)
0055         m_painter->paint(mouseEvent->pos(), true);
0056 
0057     return true;
0058 }
0059 
0060 void Container::changeItem(const QString& filepath)
0061 {
0062     reset();
0063 
0064     scene()->setSceneRect(0, 0, 850, 640);
0065     scene()->clear();
0066 
0067     if (m_painterType != PainterType::Text && FileUtils::isTextFile(filepath)) {
0068         m_painter = std::make_unique<TextPainter>(this);
0069         m_painterType = PainterType::Text;
0070         emit painterChanged(m_painterType);
0071     }
0072     else if (m_painterType != PainterType::Image && FileUtils::isImageFile(filepath)) {
0073         m_painter = std::make_unique<ImagePainter>(this);
0074         m_painterType = PainterType::Image;
0075         emit painterChanged(m_painterType);
0076     }
0077 
0078     m_painter->changeItem(filepath);
0079 }
0080 
0081 void Container::setObjClass(MarkedClass* objClass)
0082 {
0083     m_currentObject->setObjClass(objClass);
0084     repaint();
0085 }
0086 
0087 void Container::repaint()
0088 {
0089     if (m_painterType != PainterType::None)
0090         m_painter->repaint();
0091 }
0092 
0093 void Container::paintObject(MarkedObject* object)
0094 {
0095     m_painter->paintObject(object);
0096 }
0097 
0098 bool Container::importObjects(QVector<MarkedObject*> objects)
0099 {
0100     return m_painter->importObjects(objects);
0101 }
0102 
0103 void Container::appendObject(MarkedObject* object)
0104 {
0105     m_savedObjects << object;
0106     emit savedObjectsChanged();
0107 }
0108 
0109 void Container::undo()
0110 {
0111     m_painter->undo();
0112 }
0113 
0114 void Container::deleteObject()
0115 {
0116     m_painter->deleteCurrentObject();
0117 }
0118 
0119 void Container::reset()
0120 {
0121     m_savedObjects.clear();
0122     m_currentObject->clear();
0123     if (m_painterType != PainterType::None)
0124         m_painter->repaint();
0125 }
0126 
0127 void Container::clear()
0128 {
0129     reset();
0130     scene()->clear();
0131     m_painter.reset();
0132     m_painterType = PainterType::None;
0133     emit painterChanged(m_painterType);
0134 }
0135 
0136 #include "moc_container.cpp"