00001
00002
00003
00004
00005
00006
00007 #include "CmdMediator.h"
00008 #include "CmdSettingsDigitizeCurve.h"
00009 #include "CursorFactory.h"
00010 #include "CursorSize.h"
00011 #include "DlgSettingsDigitizeCurve.h"
00012 #include "DocumentModelDigitizeCurve.h"
00013 #include "EngaugeAssert.h"
00014 #include "Logger.h"
00015 #include "MainWindow.h"
00016 #include "PointStyle.h"
00017 #include <QCheckBox>
00018 #include <QComboBox>
00019 #include <QGraphicsPixmapItem>
00020 #include <QGridLayout>
00021 #include <QGraphicsScene>
00022 #include <QGroupBox>
00023 #include <QLabel>
00024 #include <qmath.h>
00025 #include <QRadioButton>
00026 #include <QSpinBox>
00027 #include "Segment.h"
00028 #include "SegmentFactory.h"
00029 #include "ViewPreview.h"
00030
00031 const int IMAGE_WIDTH = 100;
00032 const int IMAGE_HEIGHT = 100;
00033
00034 const int INNER_RADIUS_MAX = 64;
00035 const int INNER_RADIUS_MIN = 0;
00036 const int LINE_LENGTH_MIN = 2;
00037 const int LINE_WIDTH_MAX = 32;
00038 const int LINE_WIDTH_MIN = 1;
00039
00040 DlgSettingsDigitizeCurve::DlgSettingsDigitizeCurve(MainWindow &mainWindow) :
00041 DlgSettingsAbstractBase (tr ("Digitize Curve"),
00042 "DlgSettingsDigitizeCurve",
00043 mainWindow),
00044 m_scenePreview (0),
00045 m_viewPreview (0),
00046 m_modelDigitizeCurveBefore (0),
00047 m_modelDigitizeCurveAfter (0)
00048 {
00049 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsDigitizeCurve::DlgSettingsDigitizeCurve";
00050
00051 QWidget *subPanel = createSubPanel ();
00052 finishPanel (subPanel);
00053 }
00054
00055 DlgSettingsDigitizeCurve::~DlgSettingsDigitizeCurve()
00056 {
00057 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsDigitizeCurve::~DlgSettingsDigitizeCurve";
00058 }
00059
00060 void DlgSettingsDigitizeCurve::createControls (QGridLayout *layout,
00061 int &row)
00062 {
00063 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsDigitizeCurve::createControls";
00064
00065 m_boxCursor = new QGroupBox (tr ("Cursor"));
00066 layout->addWidget (m_boxCursor, row++, 1, 1, 2);
00067
00068
00069 QGridLayout *layoutCursor = new QGridLayout;
00070 m_boxCursor->setLayout (layoutCursor);
00071 int rowCursor = 0;
00072
00073 QLabel *labelCursorType = new QLabel(tr ("Type:"));
00074 layoutCursor->addWidget (labelCursorType, rowCursor, 0);
00075
00076 m_btnStandard = new QRadioButton (tr ("Standard cross"));
00077 m_btnStandard->setWhatsThis (tr ("Selects the standard cross cursor"));
00078 layoutCursor->addWidget (m_btnStandard, rowCursor++, 1);
00079 connect (m_btnStandard, SIGNAL (toggled (bool)), this, SLOT (slotCursorStandard(bool)));
00080
00081 m_btnCustom = new QRadioButton (tr ("Custom cross"));
00082 m_btnCustom->setWhatsThis (tr ("Selects a custom cursor based on the settings selected below"));
00083 layoutCursor->addWidget (m_btnCustom, rowCursor++, 1);
00084 connect (m_btnCustom, SIGNAL (toggled (bool)), this, SLOT (slotCursorCustom(bool)));
00085
00086 QLabel *labelSize = new QLabel(tr ("Size (pixels):"));
00087 layoutCursor->addWidget (labelSize, rowCursor, 0);
00088
00089 m_cmbSize = new QComboBox;
00090 m_cmbSize->addItem (QString::number (CursorSizeToPixels (CURSOR_SIZE_16)), QVariant (CURSOR_SIZE_16));
00091 m_cmbSize->addItem (QString::number (CursorSizeToPixels (CURSOR_SIZE_32)), QVariant (CURSOR_SIZE_32));
00092 m_cmbSize->addItem (QString::number (CursorSizeToPixels (CURSOR_SIZE_48)), QVariant (CURSOR_SIZE_48));
00093 m_cmbSize->addItem (QString::number (CursorSizeToPixels (CURSOR_SIZE_64)), QVariant (CURSOR_SIZE_64));
00094 ENGAUGE_ASSERT (m_cmbSize->count() == NUM_CURSOR_SIZES);
00095 m_cmbSize->setWhatsThis (tr ("Horizontal and vertical size of the cursor in pixels"));
00096 layoutCursor->addWidget (m_cmbSize, rowCursor++, 1);
00097 connect (m_cmbSize, SIGNAL (currentIndexChanged (const QString &)), this, SLOT (slotCursorSize (const QString &)));
00098
00099 QLabel *labelInnerRadius = new QLabel(tr ("Inner radius (pixels):"));
00100 layoutCursor->addWidget (labelInnerRadius, rowCursor, 0);
00101
00102 m_spinInnerRadius = new QSpinBox;
00103 m_spinInnerRadius->setRange (INNER_RADIUS_MIN, INNER_RADIUS_MAX);
00104 m_spinInnerRadius->setWhatsThis (tr ("Radius of circle at the center of the cursor that will remain empty"));
00105 layoutCursor->addWidget (m_spinInnerRadius, rowCursor++, 1);
00106 connect (m_spinInnerRadius, SIGNAL (valueChanged(const QString &)), this, SLOT (slotCursorInnerRadius (const QString &)));
00107
00108 QLabel *labelLineWidth = new QLabel(tr ("Line width (pixels):"));
00109 layoutCursor->addWidget (labelLineWidth, rowCursor, 0);
00110
00111 m_spinLineWidth = new QSpinBox;
00112 m_spinLineWidth->setRange (LINE_WIDTH_MIN, LINE_WIDTH_MAX);
00113 m_spinLineWidth->setWhatsThis (tr ("Width of each arm of the cross of the cursor"));
00114 layoutCursor->addWidget (m_spinLineWidth, rowCursor++, 1);
00115 connect (m_spinLineWidth, SIGNAL (valueChanged(const QString &)), this, SLOT (slotCursorLineWidth (const QString &)));
00116 }
00117
00118 void DlgSettingsDigitizeCurve::createOptionalSaveDefault (QHBoxLayout * )
00119 {
00120 }
00121
00122 void DlgSettingsDigitizeCurve::createPreview (QGridLayout *layout,
00123 int &row)
00124 {
00125 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsDigitizeCurve::createPreview";
00126
00127 QLabel *labelPreview = new QLabel (tr ("Preview"));
00128 layout->addWidget (labelPreview, row++, 0, 1, 4);
00129
00130 m_scenePreview = new QGraphicsScene (this);
00131 m_scenePreview->setSceneRect(0,
00132 0,
00133 IMAGE_WIDTH,
00134 IMAGE_HEIGHT);
00135
00136 m_viewPreview = new ViewPreview (m_scenePreview,
00137 ViewPreview::VIEW_ASPECT_RATIO_VARIABLE,
00138 this);
00139 m_viewPreview->setWhatsThis (tr ("Preview window showing the currently selected cursor.\n\n"
00140 "Drag the cursor over this area to see the effects of the current settings on the cursor shape."));
00141 m_viewPreview->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
00142 m_viewPreview->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
00143 m_viewPreview->setMinimumHeight (MINIMUM_PREVIEW_HEIGHT);
00144
00145 layout->addWidget (m_viewPreview, row++, 0, 1, 4);
00146 }
00147
00148 QWidget *DlgSettingsDigitizeCurve::createSubPanel ()
00149 {
00150 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsDigitizeCurve::createSubPanel";
00151
00152 QWidget *subPanel = new QWidget ();
00153 QGridLayout *layout = new QGridLayout (subPanel);
00154 subPanel->setLayout (layout);
00155
00156 layout->setColumnStretch (0, 1);
00157 layout->setColumnStretch (1, 0);
00158 layout->setColumnStretch (2, 0);
00159 layout->setColumnStretch (3, 1);
00160
00161 int row = 0;
00162 createControls(layout, row);
00163 createPreview (layout, row);
00164
00165 return subPanel;
00166 }
00167
00168 void DlgSettingsDigitizeCurve::handleOk ()
00169 {
00170 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsDigitizeCurve::handleOk";
00171
00172 CmdSettingsDigitizeCurve *cmd = new CmdSettingsDigitizeCurve (mainWindow (),
00173 cmdMediator ().document(),
00174 *m_modelDigitizeCurveBefore,
00175 *m_modelDigitizeCurveAfter);
00176 cmdMediator ().push (cmd);
00177
00178 hide ();
00179 }
00180
00181 void DlgSettingsDigitizeCurve::load (CmdMediator &cmdMediator)
00182 {
00183 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsDigitizeCurve::load";
00184
00185 setCmdMediator (cmdMediator);
00186
00187
00188 if (m_modelDigitizeCurveBefore != 0) {
00189 delete m_modelDigitizeCurveBefore;
00190 }
00191 if (m_modelDigitizeCurveAfter != 0) {
00192 delete m_modelDigitizeCurveAfter;
00193 }
00194
00195
00196 m_modelDigitizeCurveBefore = new DocumentModelDigitizeCurve (cmdMediator.document());
00197 m_modelDigitizeCurveAfter = new DocumentModelDigitizeCurve (cmdMediator.document());
00198
00199
00200 ENGAUGE_ASSERT (INNER_RADIUS_MIN <= m_modelDigitizeCurveAfter->cursorInnerRadius ());
00201 ENGAUGE_ASSERT (INNER_RADIUS_MAX >= m_modelDigitizeCurveAfter->cursorInnerRadius ());
00202 ENGAUGE_ASSERT (LINE_WIDTH_MIN <= m_modelDigitizeCurveAfter->cursorLineWidth ());
00203 ENGAUGE_ASSERT (LINE_WIDTH_MAX >= m_modelDigitizeCurveAfter->cursorLineWidth ());
00204
00205
00206 m_btnStandard->setChecked (m_modelDigitizeCurveAfter->cursorStandardCross());
00207 m_btnCustom->setChecked (!m_modelDigitizeCurveAfter->cursorStandardCross());
00208 m_spinInnerRadius->setValue (m_modelDigitizeCurveAfter->cursorInnerRadius());
00209 int index = m_cmbSize->findData (QVariant (m_modelDigitizeCurveAfter->cursorSize()));
00210 m_cmbSize->setCurrentIndex (index);
00211 m_spinLineWidth->setValue (m_modelDigitizeCurveAfter->cursorLineWidth());
00212
00213 updateControls();
00214 enableOk (false);
00215 updatePreview();
00216 }
00217
00218 void DlgSettingsDigitizeCurve::slotCursorCustom (bool)
00219 {
00220 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsDigitizeCurve::slotCursorCustom";
00221
00222 m_modelDigitizeCurveAfter->setCursorStandardCross(false);
00223 updateControls();
00224 updatePreview();
00225 }
00226
00227 void DlgSettingsDigitizeCurve::slotCursorInnerRadius (const QString &)
00228 {
00229 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsDigitizeCurve::slotCursorInnerRadius";
00230
00231 m_modelDigitizeCurveAfter->setCursorInnerRadius (m_spinInnerRadius->value());
00232 updateControls();
00233 updatePreview();
00234 }
00235
00236 void DlgSettingsDigitizeCurve::slotCursorLineWidth (const QString &)
00237 {
00238 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsDigitizeCurve::slotCursorLineWidth";
00239
00240 m_modelDigitizeCurveAfter->setCursorLineWidth (m_spinLineWidth->value());
00241 updateControls();
00242 updatePreview();
00243 }
00244
00245 void DlgSettingsDigitizeCurve::slotCursorSize (const QString &)
00246 {
00247 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsDigitizeCurve::slotCursorSize";
00248
00249 m_modelDigitizeCurveAfter->setCursorSize ((CursorSize) m_cmbSize->currentData().toInt());
00250 updateControls();
00251 updatePreview();
00252 }
00253
00254 void DlgSettingsDigitizeCurve::slotCursorStandard (bool)
00255 {
00256 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsDigitizeCurve::slotCursorStandard";
00257
00258 m_modelDigitizeCurveAfter->setCursorStandardCross(true);
00259 updateControls();
00260 updatePreview();
00261 }
00262
00263 void DlgSettingsDigitizeCurve::updateControls()
00264 {
00265
00266 bool isGoodState = 2 * (m_modelDigitizeCurveAfter->cursorInnerRadius() + LINE_LENGTH_MIN) <=
00267 CursorSizeToPixels (m_modelDigitizeCurveAfter->cursorSize());
00268 enableOk (isGoodState);
00269
00270 m_spinInnerRadius->setEnabled (m_btnCustom->isChecked());
00271 m_cmbSize->setEnabled (m_btnCustom->isChecked());
00272 m_spinLineWidth->setEnabled (m_btnCustom->isChecked());
00273 }
00274
00275 void DlgSettingsDigitizeCurve::updatePreview()
00276 {
00277 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsDigitizeCurve::updatePreview";
00278
00279 CursorFactory cursorFactory;
00280 QCursor cursor = cursorFactory.generate (*m_modelDigitizeCurveAfter);
00281 m_viewPreview->setCursor (cursor);
00282 }