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