00001
00002
00003
00004
00005
00006
00007 #include "CallbackSceneUpdateAfterCommand.h"
00008 #include "Curve.h"
00009 #include "CurvesGraphs.h"
00010 #include "CurveStyles.h"
00011 #include "DataKey.h"
00012 #include "EngaugeAssert.h"
00013 #include "EnumsToQt.h"
00014 #include "GeometryWindow.h"
00015 #include "GraphicsItemType.h"
00016 #include "GraphicsPoint.h"
00017 #include "GraphicsPointFactory.h"
00018 #include "GraphicsScene.h"
00019 #include "Logger.h"
00020 #include "MainWindow.h"
00021 #include "Point.h"
00022 #include "PointStyle.h"
00023 #include <QApplication>
00024 #include <QGraphicsItem>
00025 #include "QtToString.h"
00026 #include "Transformation.h"
00027
00028 GraphicsScene::GraphicsScene(MainWindow *mainWindow) :
00029 QGraphicsScene(mainWindow)
00030 {
00031 }
00032
00033 void GraphicsScene::addTemporaryPoint (const QString &identifier,
00034 GraphicsPoint *point)
00035 {
00036 LOG4CPP_INFO_S ((*mainCat)) << "GraphicsScene::addTemporaryPoint"
00037 << " identifer=" << identifier.toLatin1().data();
00038
00039 m_graphicsLinesForCurves.addPoint (AXIS_CURVE_NAME,
00040 identifier,
00041 Point::UNDEFINED_ORDINAL (),
00042 *point);
00043 }
00044
00045 void GraphicsScene::addTemporaryScaleBar (GraphicsPoint *point0,
00046 GraphicsPoint *point1,
00047 const QString &pointIdentifier0,
00048 const QString &pointIdentifier1)
00049 {
00050 LOG4CPP_INFO_S ((*mainCat)) << "GraphicsScene::addTemporaryScaleBar";
00051
00052 const double ORDINAL_0 = 0, ORDINAL_1 = 1;
00053
00054 m_graphicsLinesForCurves.addPoint (AXIS_CURVE_NAME,
00055 pointIdentifier0,
00056 ORDINAL_0,
00057 *point0);
00058 m_graphicsLinesForCurves.addPoint (AXIS_CURVE_NAME,
00059 pointIdentifier1,
00060 ORDINAL_1,
00061 *point1);
00062 }
00063
00064 GraphicsPoint *GraphicsScene::createPoint (const QString &identifier,
00065 const PointStyle &pointStyle,
00066 const QPointF &posScreen,
00067 GeometryWindow *geometryWindow)
00068 {
00069 LOG4CPP_INFO_S ((*mainCat)) << "GraphicsScene::createPoint"
00070 << " identifier=" << identifier.toLatin1().data();
00071
00072
00073
00074
00075
00076 GraphicsPointFactory pointFactory;
00077 GraphicsPoint *point = pointFactory.createPoint (*this,
00078 identifier,
00079 posScreen,
00080 pointStyle,
00081 geometryWindow);
00082
00083 point->setData (DATA_KEY_GRAPHICS_ITEM_TYPE, GRAPHICS_ITEM_TYPE_POINT);
00084
00085 return point;
00086 }
00087
00088 QString GraphicsScene::dumpCursors () const
00089 {
00090 QString cursorOverride = (QApplication::overrideCursor () != 0) ?
00091 QtCursorToString (QApplication::overrideCursor ()->shape ()) :
00092 "<null>";
00093 QString cursorImage = QtCursorToString (image()->cursor().shape ());
00094
00095 QString dump = QString ("overrideCursor=%1 imageCursor=%2")
00096 .arg (cursorOverride)
00097 .arg (cursorImage);
00098
00099 return dump;
00100 }
00101
00102 void GraphicsScene::hideAllItemsExceptImage()
00103 {
00104 LOG4CPP_INFO_S ((*mainCat)) << "GraphicsScene::hideAllItemsExceptImage";
00105
00106 for (int index = 0; index < QGraphicsScene::items().count(); index++) {
00107 QGraphicsItem *item = QGraphicsScene::items().at(index);
00108
00109 if (item->data (DATA_KEY_GRAPHICS_ITEM_TYPE).toInt() == GRAPHICS_ITEM_TYPE_IMAGE) {
00110
00111 item->show();
00112
00113 } else {
00114
00115 item->hide();
00116
00117 }
00118 }
00119 }
00120
00121 const QGraphicsPixmapItem *GraphicsScene::image () const
00122 {
00123
00124 QList<QGraphicsItem*> items = QGraphicsScene::items();
00125 QList<QGraphicsItem*>::iterator itr;
00126 for (itr = items.begin(); itr != items.end(); itr++) {
00127
00128 QGraphicsItem* item = *itr;
00129 if (item->data (DATA_KEY_GRAPHICS_ITEM_TYPE).toInt () == GRAPHICS_ITEM_TYPE_IMAGE) {
00130
00131 return (QGraphicsPixmapItem *) item;
00132 }
00133 }
00134
00135 return 0;
00136 }
00137
00138 QStringList GraphicsScene::positionHasChangedPointIdentifiers () const
00139 {
00140 LOG4CPP_INFO_S ((*mainCat)) << "GraphicsScene::positionHasChangedPointIdentifiers";
00141
00142 QStringList movedIds;
00143
00144 const QList<QGraphicsItem*> &items = QGraphicsScene::items();
00145 QList<QGraphicsItem*>::const_iterator itr;
00146 for (itr = items.begin(); itr != items.end(); itr++) {
00147
00148 const QGraphicsItem *item = *itr;
00149
00150
00151 bool isPoint = (item->data (DATA_KEY_GRAPHICS_ITEM_TYPE).toInt () == GRAPHICS_ITEM_TYPE_POINT);
00152 if (isPoint) {
00153
00154 QString identifier = item->data (DATA_KEY_IDENTIFIER).toString ();
00155 bool positionHasChanged = item->data (DATA_KEY_POSITION_HAS_CHANGED).toBool ();
00156
00157 LOG4CPP_DEBUG_S ((*mainCat)) << "GraphicsScene::positionHasChangedPointIdentifiers"
00158 << " identifier=" << identifier.toLatin1().data()
00159 << " positionHasChanged=" << (positionHasChanged ? "yes" : "no");
00160
00161 if (isPoint && positionHasChanged) {
00162
00163
00164 movedIds << item->data(DATA_KEY_IDENTIFIER).toString ();
00165
00166 }
00167 }
00168 }
00169
00170 return movedIds;
00171 }
00172
00173 void GraphicsScene::printStream (QString indentation,
00174 QTextStream &str)
00175 {
00176 m_graphicsLinesForCurves.printStream (indentation,
00177 str);
00178 }
00179
00180 void GraphicsScene::removePoint (const QString &identifier)
00181 {
00182 LOG4CPP_INFO_S ((*mainCat)) << "GraphicsScene::removePoint identifier=" << identifier.toLatin1().data();
00183
00184 m_graphicsLinesForCurves.removePoint (identifier);
00185 }
00186
00187 void GraphicsScene::removeTemporaryPointIfExists ()
00188 {
00189 LOG4CPP_INFO_S ((*mainCat)) << "GraphicsScene::removeTemporaryPointIfExists";
00190
00191 m_graphicsLinesForCurves.removeTemporaryPointIfExists ();
00192 }
00193
00194 void GraphicsScene::removeTemporaryScaleBarIfExists ()
00195 {
00196 LOG4CPP_INFO_S ((*mainCat)) << "GraphicsScene::removeTemporaryScaleBarIfExists";
00197 }
00198
00199 void GraphicsScene::resetOnLoad()
00200 {
00201
00202
00203 int itemsBefore = items().count();
00204
00205 m_graphicsLinesForCurves.resetOnLoad();
00206
00207 int itemsAfter = items().count();
00208
00209 LOG4CPP_INFO_S ((*mainCat)) << "GraphicsScene::resetOnLoad"
00210 << " itemsBefore=" << itemsBefore
00211 << " itemsAfter=" << itemsAfter;
00212 }
00213
00214 void GraphicsScene::resetPositionHasChangedFlags()
00215 {
00216 LOG4CPP_INFO_S ((*mainCat)) << "GraphicsScene::resetPositionHasChangedFlags";
00217
00218 QList<QGraphicsItem*> itms = items ();
00219 QList<QGraphicsItem*>::const_iterator itr;
00220 for (itr = itms.begin (); itr != itms.end (); itr++) {
00221
00222 QGraphicsItem *item = *itr;
00223 item->setData (DATA_KEY_POSITION_HAS_CHANGED, false);
00224 }
00225 }
00226
00227 void GraphicsScene::showCurves (bool show,
00228 bool showAll,
00229 const QString &curveNameWanted)
00230 {
00231 LOG4CPP_INFO_S ((*mainCat)) << "GraphicsScene::showCurves"
00232 << " show=" << (show ? "true" : "false")
00233 << " showAll=" << (showAll ? "true" : "false")
00234 << " curve=" << curveNameWanted.toLatin1().data();
00235
00236 const QList<QGraphicsItem*> &items = QGraphicsScene::items();
00237 QList<QGraphicsItem*>::const_iterator itr;
00238 for (itr = items.begin(); itr != items.end(); itr++) {
00239
00240 QGraphicsItem* item = *itr;
00241
00242
00243 bool isPoint = (item->data (DATA_KEY_GRAPHICS_ITEM_TYPE).toInt () == GRAPHICS_ITEM_TYPE_POINT);
00244 bool isCurve = (item->data (DATA_KEY_GRAPHICS_ITEM_TYPE).toInt () == GRAPHICS_ITEM_TYPE_LINE);
00245
00246 if (isPoint || isCurve) {
00247
00248 bool showThis = show;
00249 if (show && !showAll) {
00250 QString identifier = item->data (DATA_KEY_IDENTIFIER).toString ();
00251
00252 if (isPoint) {
00253
00254 QString curveNameGot = Point::curveNameFromPointIdentifier (identifier);
00255 showThis = (curveNameWanted == curveNameGot);
00256
00257 } else {
00258
00259 showThis = (curveNameWanted == identifier);
00260
00261 }
00262 }
00263
00264 item->setVisible (showThis);
00265
00266 }
00267 }
00268 }
00269
00270 void GraphicsScene::updateAfterCommand (CmdMediator &cmdMediator,
00271 double highlightOpacity,
00272 GeometryWindow *geometryWindow)
00273 {
00274 LOG4CPP_INFO_S ((*mainCat)) << "GraphicsScene::updateAfterCommand";
00275
00276 m_graphicsLinesForCurves.updateHighlightOpacity (highlightOpacity);
00277
00278 updateCurves (cmdMediator);
00279
00280
00281 updatePointMembership (cmdMediator,
00282 geometryWindow);
00283 }
00284
00285 void GraphicsScene::updateCurves (CmdMediator &cmdMediator)
00286 {
00287 LOG4CPP_INFO_S ((*mainCat)) << "GraphicsScene::updateCurves";
00288
00289
00290 QStringList curveNames;
00291 curveNames << AXIS_CURVE_NAME;
00292 curveNames << cmdMediator.document().curvesGraphsNames();
00293
00294 m_graphicsLinesForCurves.addRemoveCurves (*this,
00295 curveNames);
00296 }
00297
00298 void GraphicsScene::updateCurveStyles (const CurveStyles &modelCurveStyles)
00299 {
00300 LOG4CPP_INFO_S ((*mainCat)) << "GraphicsScene::updateCurveStyles";
00301
00302 m_graphicsLinesForCurves.updateCurveStyles (modelCurveStyles);
00303 }
00304
00305 void GraphicsScene::updateGraphicsLinesToMatchGraphicsPoints (const CurveStyles &curveStyles,
00306 const Transformation &transformation)
00307 {
00308 LOG4CPP_INFO_S ((*mainCat)) << "GraphicsScene::updateGraphicsLinesToMatchGraphicsPoints";
00309
00310 if (transformation.transformIsDefined()) {
00311
00312
00313 m_graphicsLinesForCurves.updatePointOrdinalsAfterDrag (curveStyles,
00314 transformation);
00315
00316
00317 m_graphicsLinesForCurves.updateGraphicsLinesToMatchGraphicsPoints (curveStyles);
00318 }
00319 }
00320
00321 void GraphicsScene::updatePointMembership (CmdMediator &cmdMediator,
00322 GeometryWindow *geometryWindow)
00323 {
00324 LOG4CPP_INFO_S ((*mainCat)) << "GraphicsScene::updatePointMembership";
00325
00326 CallbackSceneUpdateAfterCommand ftor (m_graphicsLinesForCurves,
00327 *this,
00328 cmdMediator.document (),
00329 geometryWindow);
00330 Functor2wRet<const QString &, const Point &, CallbackSearchReturn> ftorWithCallback = functor_ret (ftor,
00331 &CallbackSceneUpdateAfterCommand::callback);
00332
00333
00334
00335 m_graphicsLinesForCurves.lineMembershipReset ();
00336
00337
00338
00339
00340 cmdMediator.iterateThroughCurvePointsAxes (ftorWithCallback);
00341 cmdMediator.iterateThroughCurvesPointsGraphs (ftorWithCallback);
00342
00343
00344
00345 m_graphicsLinesForCurves.lineMembershipPurge (cmdMediator.document().modelCurveStyles());
00346 }