00001
00002
00003
00004
00005
00006
00007 #include "CmdMediator.h"
00008 #include "CmdMoveBy.h"
00009 #include "DataKey.h"
00010 #include "DigitizeStateContext.h"
00011 #include "DigitizeStateSelect.h"
00012 #include "EngaugeAssert.h"
00013 #include "GraphicsItemType.h"
00014 #include "GraphicsScene.h"
00015 #include "GraphicsView.h"
00016 #include "Logger.h"
00017 #include "MainWindow.h"
00018 #include <QCursor>
00019 #include <QGraphicsItem>
00020 #include <QImage>
00021 #include <QObject>
00022 #include <QtToString.h>
00023
00024 const QString MOVE_TEXT_DOWN (QObject::tr ("Move down"));
00025 const QString MOVE_TEXT_LEFT (QObject::tr ("Move left"));
00026 const QString MOVE_TEXT_RIGHT (QObject::tr ("Move right"));
00027 const QString MOVE_TEXT_UP (QObject::tr ("Move up"));
00028
00029 DigitizeStateSelect::DigitizeStateSelect (DigitizeStateContext &context) :
00030 DigitizeStateAbstractBase (context)
00031 {
00032 }
00033
00034 DigitizeStateSelect::~DigitizeStateSelect ()
00035 {
00036 }
00037
00038 QString DigitizeStateSelect::activeCurve () const
00039 {
00040 return context().mainWindow().selectedGraphCurve();
00041 }
00042
00043 void DigitizeStateSelect::begin (CmdMediator *cmdMediator,
00044 DigitizeState )
00045 {
00046 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateSelect::begin";
00047
00048 setCursor(cmdMediator);
00049 context().setDragMode(QGraphicsView::RubberBandDrag);
00050
00051 setCursorForPoints ();
00052 context().mainWindow().updateViewsOfSettings(activeCurve ());
00053 }
00054
00055 QCursor DigitizeStateSelect::cursor(CmdMediator * ) const
00056 {
00057 LOG4CPP_DEBUG_S ((*mainCat)) << "DigitizeStateSelect::cursor";
00058
00059 return QCursor (Qt::ArrowCursor);
00060 }
00061
00062 void DigitizeStateSelect::end ()
00063 {
00064 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateSelect::end";
00065
00066 unsetCursorForPoints ();
00067 }
00068
00069 void DigitizeStateSelect::handleCurveChange(CmdMediator * )
00070 {
00071 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateSelect::handleCurveChange";
00072 }
00073
00074 void DigitizeStateSelect::handleKeyPress (CmdMediator *cmdMediator,
00075 Qt::Key key,
00076 bool atLeastOneSelectedItem)
00077 {
00078 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateSelect::handleKeyPress"
00079 << " key=" << QKeySequence (key).toString ().toLatin1 ().data ();
00080
00081 if (atLeastOneSelectedItem) {
00082
00083 if (key == Qt::Key_Down ||
00084 key == Qt::Key_Up ||
00085 key == Qt::Key_Left ||
00086 key == Qt::Key_Right) {
00087
00088 keyPressArrow (cmdMediator,
00089 key);
00090
00091 }
00092 }
00093 }
00094
00095 void DigitizeStateSelect::handleMouseMove (CmdMediator * ,
00096 QPointF )
00097 {
00098
00099 }
00100
00101 void DigitizeStateSelect::handleMousePress (CmdMediator * ,
00102 QPointF posScreen)
00103 {
00104 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateSelect::handleMousePress"
00105 << " posScreen=" << QPointFToString (posScreen).toLatin1 ().data ();
00106
00107
00108
00109 m_movingStart = posScreen;
00110 }
00111
00112 void DigitizeStateSelect::handleMouseRelease (CmdMediator *cmdMediator,
00113 QPointF posScreen)
00114 {
00115 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateSelect::handleMouseRelease"
00116 << " posScreen=" << QPointFToString (posScreen).toLatin1 ().data ();
00117
00118 QPointF deltaScreen = posScreen - m_movingStart;
00119 QStringList positionHasChangedIdentifers = context().mainWindow().scene().positionHasChangedPointIdentifiers();
00120
00121 bool positionHasChanged = (positionHasChangedIdentifers.count () > 0);
00122
00123 if (positionHasChanged && (
00124 deltaScreen.x () != 0 ||
00125 deltaScreen.y () != 0)) {
00126
00127 QString moveText = moveTextFromDeltaScreen (deltaScreen);
00128
00129
00130 CmdMoveBy *cmd = new CmdMoveBy (context().mainWindow(),
00131 cmdMediator->document(),
00132 deltaScreen,
00133 moveText,
00134 positionHasChangedIdentifers);
00135 context().appendNewCmd (cmdMediator,
00136 cmd);
00137
00138 } else {
00139
00140
00141 context().mainWindow().updateAfterMouseRelease();
00142
00143 }
00144 }
00145
00146 void DigitizeStateSelect::keyPressArrow (CmdMediator *cmdMediator,
00147 Qt::Key key)
00148 {
00149 QPointF deltaScreen;
00150 QString moveText;
00151 switch (key) {
00152 case Qt::Key_Down:
00153 deltaScreen = QPointF (0, zoomedToUnzoomedScreenY ());
00154 moveText = MOVE_TEXT_DOWN;
00155 break;
00156
00157 case Qt::Key_Left:
00158 deltaScreen = QPointF (-1 * zoomedToUnzoomedScreenX (), 0);
00159 moveText = MOVE_TEXT_LEFT;
00160 break;
00161
00162 case Qt::Key_Right:
00163 deltaScreen = QPointF (zoomedToUnzoomedScreenX (), 0);
00164 moveText = MOVE_TEXT_RIGHT;
00165 break;
00166
00167 case Qt::Key_Up:
00168 deltaScreen = QPointF (0, -1 * zoomedToUnzoomedScreenY ());
00169 moveText = MOVE_TEXT_UP;
00170 break;
00171
00172 default:
00173 ENGAUGE_ASSERT (false);
00174 }
00175
00176
00177 CmdMoveBy *cmd = new CmdMoveBy (context().mainWindow(),
00178 cmdMediator->document(),
00179 deltaScreen,
00180 moveText,
00181 context().mainWindow().scene ().selectedPointIdentifiers ());
00182 context().appendNewCmd (cmdMediator,
00183 cmd);
00184 }
00185
00186 QString DigitizeStateSelect::moveTextFromDeltaScreen (const QPointF &deltaScreen)
00187 {
00188 QString moveText;
00189
00190
00191
00192
00193
00194
00195 bool downOrRight = (deltaScreen.y () > -1.0 * deltaScreen.x ());
00196 bool upOrRight = (deltaScreen.y () < deltaScreen.x ());
00197 if (downOrRight && upOrRight) {
00198 moveText = MOVE_TEXT_RIGHT;
00199 } else if (downOrRight && !upOrRight) {
00200 moveText = MOVE_TEXT_DOWN;
00201 } else if (!downOrRight && upOrRight) {
00202 moveText = MOVE_TEXT_UP;
00203 } else {
00204 moveText = MOVE_TEXT_LEFT;
00205 }
00206
00207 return moveText;
00208 }
00209
00210 void DigitizeStateSelect::setCursorForPoints()
00211 {
00212 QCursor cursor (Qt::OpenHandCursor);
00213
00214 QList<QGraphicsItem*> items = context().mainWindow().scene().items();
00215 QList<QGraphicsItem*>::iterator itr;
00216 for (itr = items.begin (); itr != items.end (); itr++) {
00217
00218 QGraphicsItem *item = *itr;
00219 if (item->data (DATA_KEY_GRAPHICS_ITEM_TYPE) == GRAPHICS_ITEM_TYPE_POINT) {
00220 item->setCursor (cursor);
00221 }
00222 }
00223 }
00224
00225 QString DigitizeStateSelect::state() const
00226 {
00227 return "DigitizeStateSelect";
00228 }
00229
00230 void DigitizeStateSelect::unsetCursorForPoints()
00231 {
00232 QList<QGraphicsItem*> items = context().mainWindow().scene().items();
00233 QList<QGraphicsItem*>::iterator itr;
00234 for (itr = items.begin (); itr != items.end (); itr++) {
00235
00236 QGraphicsItem *item = *itr;
00237 if (item->data (DATA_KEY_GRAPHICS_ITEM_TYPE) == GRAPHICS_ITEM_TYPE_POINT) {
00238 item->unsetCursor ();
00239 }
00240 }
00241 }
00242
00243 void DigitizeStateSelect::updateModelDigitizeCurve (CmdMediator * ,
00244 const DocumentModelDigitizeCurve & )
00245 {
00246 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateSelect::updateModelDigitizeCurve";
00247 }
00248
00249 void DigitizeStateSelect::updateModelSegments(const DocumentModelSegments & )
00250 {
00251 LOG4CPP_INFO_S ((*mainCat)) << "DigitizeStateSelect::updateModelSegments";
00252 }
00253
00254 double DigitizeStateSelect::zoomedToUnzoomedScreenX () const
00255 {
00256 double m11 = context().mainWindow ().view ().transform().m11 ();
00257 return 1.0 / m11;
00258 }
00259
00260 double DigitizeStateSelect::zoomedToUnzoomedScreenY () const
00261 {
00262 double m22 = context().mainWindow ().view ().transform().m22 ();
00263 return 1.0 / m22;
00264 }