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"