00001
00002
00003
00004
00005
00006
00007 #include "Checker.h"
00008 #include "CmdMediator.h"
00009 #include "CmdSettingsAxesChecker.h"
00010 #include "CoordScale.h"
00011 #include "DlgSettingsAxesChecker.h"
00012 #include "EngaugeAssert.h"
00013 #include "Logger.h"
00014 #include "MainWindow.h"
00015 #include <QButtonGroup>
00016 #include <QComboBox>
00017 #include <QGraphicsRectItem>
00018 #include <QGraphicsScene>
00019 #include <QGridLayout>
00020 #include <QGroupBox>
00021 #include <QLabel>
00022 #include <QLineEdit>
00023 #include <qmath.h>
00024 #include <QRadioButton>
00025 #include "ViewPreview.h"
00026
00027 const int AXIS_WIDTH = 4;
00028 const int RECT_WIDTH = 640;
00029 const int RECT_HEIGHT = 480;
00030 const int X_LEFT = RECT_WIDTH / 8;
00031 const int X_RIGHT = RECT_WIDTH * 7 / 8;
00032 const int Y_TOP = RECT_HEIGHT / 8;
00033 const int Y_BOTTOM = RECT_HEIGHT * 7 / 8;
00034 const int TICKS_PER_AXIS = 6;
00035 const int TICK_MARK_LENGTH = 8;
00036
00037 DlgSettingsAxesChecker::DlgSettingsAxesChecker(MainWindow &mainWindow) :
00038 DlgSettingsAbstractBase (tr ("Axes Checker"),
00039 "DlgSettingsAxesChecker",
00040 mainWindow),
00041 m_checker (0),
00042 m_modelAxesCheckerBefore (0),
00043 m_modelAxesCheckerAfter (0),
00044 m_modelCoords (0)
00045 {
00046 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsAxesChecker::DlgSettingsAxesChecker";
00047
00048 QWidget *subPanel = createSubPanel ();
00049 finishPanel (subPanel);
00050 }
00051
00052 DlgSettingsAxesChecker::~DlgSettingsAxesChecker()
00053 {
00054 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsAxesChecker::~DlgSettingsAxesChecker";
00055 }
00056
00057 void DlgSettingsAxesChecker::createControls (QGridLayout *layout,
00058 int &row)
00059 {
00060 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsAxesChecker::createControls";
00061
00062 QGroupBox *groupBox = new QGroupBox (tr ("Axes Checker Lifetime"));
00063 layout->addWidget (groupBox, row++, 1, 1, 2);
00064
00065 QGridLayout *layoutLifetime = new QGridLayout;
00066 groupBox->setLayout (layoutLifetime);
00067
00068 int rowLifetime = 0;
00069 m_btnNever = new QRadioButton (tr ("Do not show"), groupBox);
00070 m_btnNever->setWhatsThis (tr ("Never show axes checker."));
00071 layoutLifetime->addWidget (m_btnNever, rowLifetime++, 0, 1, 2);
00072
00073 m_btnNSeconds = new QRadioButton (tr ("Show for a number of seconds"), groupBox);
00074 m_btnNSeconds->setWhatsThis (tr ("Show axes checker for a number of seconds after changing axes points."));
00075 layoutLifetime->addWidget (m_btnNSeconds, rowLifetime, 0, 1, 1);
00076
00077 m_cmbSeconds = new QComboBox;
00078 for (int seconds = 1; seconds <= 10; seconds++) {
00079 m_cmbSeconds->addItem (QString::number (seconds), QVariant (seconds));
00080 }
00081 layoutLifetime->addWidget (m_cmbSeconds, rowLifetime++, 1);
00082 connect (m_cmbSeconds, SIGNAL (activated (const QString &)), this, SLOT (slotSeconds (const QString &)));
00083
00084 m_btnForever = new QRadioButton (tr ("Show always"), groupBox);
00085 m_btnForever->setWhatsThis (tr ("Always show axes checker."));
00086 layoutLifetime->addWidget (m_btnForever, rowLifetime++, 0, 1, 2);
00087
00088 m_groupMode = new QButtonGroup;
00089 m_groupMode->addButton (m_btnNever);
00090 m_groupMode->addButton (m_btnNSeconds);
00091 m_groupMode->addButton (m_btnForever);
00092 connect (m_groupMode, SIGNAL (buttonReleased (QAbstractButton*)), this, SLOT (slotGroupMode (QAbstractButton*)));
00093
00094 QLabel *labelLineColor = new QLabel (tr ("Line color:"));
00095 layout->addWidget (labelLineColor, row, 1);
00096
00097 m_cmbLineColor = new QComboBox;
00098 m_cmbLineColor->setWhatsThis (tr ("Select a color for the highlight lines drawn at each axis point"));
00099 populateColorComboWithoutTransparent (*m_cmbLineColor);
00100 connect (m_cmbLineColor, SIGNAL (activated (const QString &)), this, SLOT (slotLineColor (const QString &)));
00101 layout->addWidget (m_cmbLineColor, row++, 2);
00102 }
00103
00104 void DlgSettingsAxesChecker::createOptionalSaveDefault (QHBoxLayout * )
00105 {
00106 }
00107
00108 void DlgSettingsAxesChecker::createPoints ()
00109 {
00110 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsAxesChecker::createPoints";
00111
00112 QBrush AXES_BRUSH (Qt::gray);
00113
00114 m_checker = new Checker (*m_scenePreview);
00115
00116
00117
00118 QGraphicsRectItem *itemRect = new QGraphicsRectItem (0,
00119 0,
00120 RECT_WIDTH,
00121 RECT_HEIGHT);
00122 itemRect->setPen (Qt::NoPen);
00123 m_scenePreview->addItem (itemRect);
00124
00125
00126 QGraphicsRectItem *frameBox = new QGraphicsRectItem (X_LEFT,
00127 Y_BOTTOM,
00128 X_RIGHT - X_LEFT,
00129 Y_TOP - Y_BOTTOM);
00130 frameBox->setPen (QPen (AXES_BRUSH, AXIS_WIDTH));
00131 frameBox->setZValue (-1);
00132 m_scenePreview->addItem (frameBox);
00133 for (int x = X_LEFT; x < X_RIGHT; x += (X_RIGHT - X_LEFT) / TICKS_PER_AXIS) {
00134 QGraphicsLineItem *tick = new QGraphicsLineItem (x, Y_BOTTOM, x, Y_BOTTOM + TICK_MARK_LENGTH);
00135 tick->setPen (QPen (AXES_BRUSH, AXIS_WIDTH));
00136 tick->setZValue (-1);
00137 m_scenePreview->addItem (tick);
00138 }
00139 for (int y = Y_TOP; y < Y_BOTTOM; y += (Y_BOTTOM - Y_TOP) / TICKS_PER_AXIS) {
00140 QGraphicsLineItem *tick = new QGraphicsLineItem (X_LEFT, y, X_LEFT + TICK_MARK_LENGTH, y);
00141 tick->setPen (QPen (AXES_BRUSH, AXIS_WIDTH));
00142 tick->setZValue (-1);
00143 m_scenePreview->addItem (tick);
00144 }
00145 }
00146
00147 void DlgSettingsAxesChecker::createPreview (QGridLayout *layout,
00148 int &row)
00149 {
00150 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsAxesChecker::createPreview";
00151
00152 QLabel *labelPreview = new QLabel (tr ("Preview"));
00153 layout->addWidget (labelPreview, row++, 0, 1, 4);
00154
00155 m_scenePreview = new QGraphicsScene (this);
00156 m_viewPreview = new ViewPreview (m_scenePreview,
00157 ViewPreview::VIEW_ASPECT_RATIO_VARIABLE,
00158 this);
00159 m_viewPreview->setWhatsThis (tr ("Preview window that shows how current settings affect the displayed axes checker"));
00160 m_viewPreview->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
00161 m_viewPreview->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
00162 m_viewPreview->setMinimumHeight (MINIMUM_PREVIEW_HEIGHT);
00163
00164 layout->addWidget (m_viewPreview, row++, 0, 1, 4);
00165 }
00166
00167 QWidget *DlgSettingsAxesChecker::createSubPanel ()
00168 {
00169 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsAxesChecker::createSubPanel";
00170
00171 QWidget *subPanel = new QWidget ();
00172 QGridLayout *layout = new QGridLayout (subPanel);
00173 subPanel->setLayout (layout);
00174
00175 layout->setColumnStretch(0, 1);
00176 layout->setColumnStretch(1, 0);
00177 layout->setColumnStretch(2, 0);
00178 layout->setColumnStretch(3, 1);
00179
00180 int row = 0;
00181 createControls (layout, row);
00182 createPreview (layout, row);
00183
00184 createPoints ();
00185
00186 return subPanel;
00187 }
00188
00189 void DlgSettingsAxesChecker::handleOk ()
00190 {
00191 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsAxesChecker::handleOk";
00192
00193 CmdSettingsAxesChecker *cmd = new CmdSettingsAxesChecker (mainWindow (),
00194 cmdMediator ().document(),
00195 *m_modelAxesCheckerBefore,
00196 *m_modelAxesCheckerAfter);
00197 cmdMediator ().push (cmd);
00198
00199 hide ();
00200 }
00201
00202 void DlgSettingsAxesChecker::load (CmdMediator &cmdMediator)
00203 {
00204 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsAxesChecker::load";
00205
00206 setCmdMediator (cmdMediator);
00207
00208
00209 if (m_modelAxesCheckerBefore != 0) {
00210 delete m_modelAxesCheckerBefore;
00211 }
00212 if (m_modelAxesCheckerAfter != 0) {
00213 delete m_modelAxesCheckerAfter;
00214 }
00215 if (m_modelCoords != 0) {
00216 delete m_modelCoords;
00217 }
00218
00219
00220 m_modelAxesCheckerBefore = new DocumentModelAxesChecker (cmdMediator.document());
00221 m_modelAxesCheckerAfter = new DocumentModelAxesChecker (cmdMediator.document());
00222 m_modelCoords = new DocumentModelCoords (cmdMediator.document());
00223
00224
00225 CheckerMode checkerMode = m_modelAxesCheckerAfter->checkerMode();
00226 m_btnNever->setChecked (checkerMode == CHECKER_MODE_NEVER);
00227 m_btnNSeconds->setChecked (checkerMode == CHECKER_MODE_N_SECONDS);
00228 m_btnForever->setChecked (checkerMode == CHECKER_MODE_FOREVER);
00229 int indexSeconds = m_cmbSeconds->findData (QVariant (m_modelAxesCheckerAfter->checkerSeconds()));
00230 ENGAUGE_ASSERT (indexSeconds >= 0);
00231 m_cmbSeconds->setCurrentIndex(indexSeconds);
00232
00233 int indexLineColor = m_cmbLineColor->findData (QVariant (m_modelAxesCheckerAfter->lineColor()));
00234 ENGAUGE_ASSERT (indexLineColor >= 0);
00235 m_cmbLineColor->setCurrentIndex (indexLineColor);
00236
00237 updateControls ();
00238 enableOk (false);
00239 updatePreview();
00240 }
00241
00242 void DlgSettingsAxesChecker::slotGroupMode (QAbstractButton*)
00243 {
00244 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsAxesChecker::slotGroupMode";
00245
00246 if (m_btnNever->isChecked ()) {
00247 m_modelAxesCheckerAfter->setCheckerMode(CHECKER_MODE_NEVER);
00248 } else if (m_btnNSeconds->isChecked ()) {
00249 m_modelAxesCheckerAfter->setCheckerMode(CHECKER_MODE_N_SECONDS);
00250 } else {
00251 m_modelAxesCheckerAfter->setCheckerMode(CHECKER_MODE_FOREVER);
00252 }
00253
00254 updateControls ();
00255 updatePreview();
00256 }
00257
00258 void DlgSettingsAxesChecker::slotLineColor(const QString &)
00259 {
00260 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsAxesChecker::slotLineColor";
00261
00262 m_modelAxesCheckerAfter->setLineColor ((ColorPalette) m_cmbLineColor->currentData().toInt());
00263 updateControls();
00264 updatePreview();
00265 }
00266
00267 void DlgSettingsAxesChecker::slotSeconds (const QString &)
00268 {
00269 LOG4CPP_INFO_S ((*mainCat)) << "DlgSettingsAxesChecker::slotLineColor";
00270
00271 m_modelAxesCheckerAfter->setCheckerSeconds(m_cmbSeconds->currentData().toInt());
00272 updateControls();
00273 }
00274
00275 void DlgSettingsAxesChecker::updateControls ()
00276 {
00277 enableOk (true);
00278
00279 m_cmbSeconds->setEnabled (m_btnNSeconds->isChecked ());
00280 }
00281
00282 void DlgSettingsAxesChecker::updatePreview()
00283 {
00284 const int ZERO_RADIUS_SINCE_NO_POINTS = 0;
00285
00286 QVector<QPointF> points;
00287 points.push_back (QPointF (X_LEFT, Y_TOP));
00288 points.push_back (QPointF (X_LEFT, Y_BOTTOM));
00289 points.push_back (QPointF (X_RIGHT, Y_BOTTOM));
00290
00291 QPolygonF polygon (points);
00292
00293 ENGAUGE_ASSERT (m_checker != 0);
00294 m_checker->prepareForDisplay (polygon,
00295 ZERO_RADIUS_SINCE_NO_POINTS,
00296 *m_modelAxesCheckerAfter,
00297 *m_modelCoords,
00298 mainWindow().cmdMediator()->document().documentAxesPointsRequired());
00299 }