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