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