[WIP] fixes to geometry

master
Rogier 2015-07-04 09:16:35 +02:00
parent 99cdc1c8b7
commit ddb26b4cd3
2 changed files with 77 additions and 65 deletions

View File

@ -8,20 +8,28 @@ QMap<QString, Geometry::Format> Geometry::geometryNameIdMap;
Geometry::InitStatics::InitStatics()
{
### Complete
Geometry::geometryIdNameMap[Geometry::FormatUnknown] = "unknown";
Geometry::geometryIdNameMap[Geometry::FormatNone] = "none";
Geometry::geometryIdNameMap[Geometry::CenterDimensions] = "center-dimensions";
Geometry::geometryIdNameMap[Geometry::CornerDimensions] = "corner-dimensions";
Geometry::geometryIdNameMap[Geometry::Corners] = "corners";
Geometry::geometryIdNameMap[Geometry::Custom] = "custom";
for (int i = Geometry::FormatNone; i < Geometry::FormatMax; i++)
Geometry::geometryNameIdMap[Geometry::geometryIdNameMap[static_cast<Format>(i)]] = static_cast<Format>(i);
}
bool Geometry::set(const char *s)
Geometry::Format Geometry::set(const char *s)
{
char sign[2];
Geometry::Format result
if (4 == sscanf(s," %d , %d : %d , %d", corner[0]+0, corner[0]+1, corner[1]+0, corner[1]+1)) {
adjustCorners();
// Order is important here!
computeDimensions();
computeCenter();
//GeometryWidget::setFormat(Corners);
//todo select correct dropdown entry in widget
result = Corners;
}
else if (4 == sscanf(s," %d , %d : %d x %d", center+0, center+1, dimension+0, dimension+1)) {
computeCorner0();
@ -31,9 +39,7 @@ bool Geometry::set(const char *s)
computeDimensions();
computeCenter();
}
//GeometryWidget::setFormat(CornerDimensions);
//todo select correct dropdown entry in widget
result = CenterDimensions;
}
else if (4 == sscanf(s," %d , %d %c %d %c %d", corner[0]+0, corner[0]+1, sign+0, dimension+0, sign+1, dimension+1)) {
for (int i = 0; i < 2; i++)
@ -45,8 +51,7 @@ bool Geometry::set(const char *s)
computeDimensions();
computeCenter();
}
//GeometryWidget::setFormat(CornerDimensions);
//todo select correct dropdown entry in widget
result = CornerDimensions;
}
else if (4 == sscanf(s," %d x %d %c %d %c %d", dimension+0, dimension+1, sign+0, corner[0]+0, sign+1, corner[0]+1)) {
for (int i = 0; i < 2; i++)
@ -58,8 +63,7 @@ bool Geometry::set(const char *s)
computeDimensions();
computeCenter();
}
//GeometryWidget::setFormat(CornerDimensions);
//todo select correct dropdown entry in widget
result = CornerDimensions;
}
else if (2 == sscanf(s," %d x %d", dimension+0, dimension+1)) {
center[0] = 0;
@ -71,17 +75,13 @@ bool Geometry::set(const char *s)
computeDimensions();
computeCenter();
}
//GeometryWidget::setFormat(CenterDimensions);
//todo select correct dropdown entry in widget
result = CenterDimensions;
}
else {
ui->geometry_FormatCustom->setText(s);
//GeometryWidget::setFormat(FormatCustom);
//todo
return false;
ui->geometry_FormatCustom->setText(s);
result = FormatCustom;
}
return true;
return result;
}
void Geometry::setMax(void)
@ -155,8 +155,6 @@ QString Geometry::getString(Geometry::Format format)
case CornerDimensions:
n = snprintf(buffer, BUFSIZE, "%d,%d+%d+%d", corner[0][0], corner[0][1], dimension[0], dimension[1]);
break;
case FormatCustom:
return ui->geometry_FormatCustom->text();
case Corners:
default:
n = snprintf(buffer, BUFSIZE, "%d,%d:%d,%d", corner[0][0], corner[0][1], corner[1][0], corner[1][1]);
@ -217,13 +215,21 @@ static void setQWidgetValue(Q *object, V value)
object->blockSignals(false);
}
// Is it possible to parameterize the method ??
template<class Q, class I>
static void setQWidgetIndex(Q *object, I index)
{
object->blockSignals(true);
object->setIndex(index);
object->blockSignals(false);
}
GeometryWidget::GeometryWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::GeometryWidget)
{
ui->setupUi(this);
m_ui_stack = ui->geometryStackedWidget;
m_ui_CD_center[0] = ui->geometry_CD_CenterX;
m_ui_CD_center[1] = ui->geometry_CD_CenterY;
m_ui_CD_dimension[0] = ui->geometry_CD_DimensionX;
@ -245,36 +251,43 @@ GeometryWidget::~GeometryWidget()
// Return true when parsing succeeded
// false when not (string was still accepted, mode was set to custom)
bool GeometryWidget::_set(const char *gstr)
bool GeometryWidget::set(const char *geomStr, Geometry::Format requestedFormat)
{
Geometry g;
bool result = true;
if (!gstr || !*gstr) {
g.setMax();
Geometry geometry;
Geometry:Format parsedFormat;
if (!geomStr || !*geomStr) {
geometry.setMax();
setQWidgetIndex(ui->geometryStackedWidget, Geometry::FormatNone);
}
else if (!g.set(gstr)) {
result = false;
// TODO (??): verify if string contains '#' or '.' - if not, the problem is serious...
####### Move this to mainwindow...
QMessageBox::warning(this, tr("Failure Loading Settings"),
tr("WARNING: Failed to parse the geometry string<br>"
"geometry string: <i>%1</i>").arg(gstr));
else if (Geometry::FormatCustom == (parsedFormat = geometry.set(geomStr))) {
// TODO (??): verify if string contains '#' or '.' - if not, the problem is serious...
if (requestedFormat != Geometry::FormatKeep) {
ui->geometry_FormatCustom->setText(geomStr);
setQWidgetIndex(ui->geometryStackedWidget, parsedFormat);
}
return false;
}
for (int i=0; i<2; i++) {
setQWidgetValue(m_ui_CD_center[i], g.center[i]);
setQWidgetValue(m_ui_CD_dimension[i], g.dimension[i]);
setQWidgetValue(m_ui_C0D_corner[i], g.corner[0][i]);
setQWidgetValue(m_ui_C0D_dimension[i], g.dimension[i]);
setQWidgetValue(m_ui_C01_corner[0][i], g.corner[0][i]);
setQWidgetValue(m_ui_C01_corner[1][i], g.corner[1][i]);
setQWidgetValue(m_ui_CD_center[i], geometry.center[i]);
setQWidgetValue(m_ui_CD_dimension[i], geometry.dimension[i]);
setQWidgetValue(m_ui_C0D_corner[i], geometry.corner[0][i]);
setQWidgetValue(m_ui_C0D_dimension[i], geometry.dimension[i]);
setQWidgetValue(m_ui_C01_corner[0][i], geometry.corner[0][i]);
setQWidgetValue(m_ui_C01_corner[1][i], geometry.corner[1][i]);
}
return result;
if (requestedFormat == Geometry::FormatKeep)
{} // Don't change anything
if (requestedFormat == Geometry::FormatUnknown)
setQWidgetIndex(ui->geometryStackedWidget, parsedFormat);
else
setQWidgetIndex(ui->geometryStackedWidget, requestedFormat);
return true;
}
QString GeometryWidget::getGeometry()
{
Geometry geometry;
int format = m_ui_stack->currentIndex();
int format = ui->geometryStackedWidget->currentIndex();
switch (format) {
case Geometry::FormatNone:
case Geometry::CenterDimensions:
@ -298,32 +311,31 @@ QString GeometryWidget::getGeometry()
m_ui_C01_corner[1][0]->value(),
m_ui_C01_corner[1][1]->value());
break;
case Geometry::FormatCustom:
return ui->geometry_FormatCustom->text();
default:
//exception ?
return "";
break;
}
return geometry.getString();
}
void GeometryWidget::setFormat(Geometry::Format format)
bool GeometryWidget::setFormat(Geometry::Format format)
{
if (format < Geometry::FormatNone || format >= Geometry::FormatMax)
{ return; } //Exception ???
Geometry::Format prevFormat = static_cast<Geometry::Format>(m_ui_stack->currentIndex());
if (format != prevFormat) {
if (!set(getGeometry())) {
####### Print a dialog & revert to FormatCustom...
m_ui_stack->setCurrentIndex(Geoemtry::FormatCustom);
}
else {
m_ui_stack->setCurrentIndex(format);
}
}
return false;
Geometry::Format prevFormat = static_cast<Geometry::Format>(ui->geometryStackedWidget->currentIndex());
if (format != prevFormat)
// Update all invisible widgets
return set(getGeometry(), format));
else
return true;
}
Geometry::Format GeometryWidget::getFormat(void)
{
Geometry::Format format = static_cast<Geometry::Format>(m_ui_stack->currentIndex());
Geometry::Format format = static_cast<Geometry::Format>(ui->geometryStackedWidget->currentIndex());
// Usage of '0' instead of a symbolic value is intentional. The currentIndex() should never be less than 0.
if (format < 0 || format >= Geometry::FormatMax)
format = Geometry::FormatUnknown;
return format;

View File

@ -13,12 +13,13 @@ class Geometry
{
public:
enum Format {
FormatKeep = -2, // Special value used when setting geometry: don't change current format.
FormatUnknown = -1,
FormatNone = 0,
CenterDimensions = 1,
CornerDimensions = 2,
Corners = 3,
FormatCustom,
FormatCustom,
FormatMax
};
static QMap<Geometry::Format, QString> geometryIdNameMap;
@ -62,12 +63,12 @@ public:
explicit GeometryWidget(QWidget *parent = 0);
~GeometryWidget();
bool set(const chat *gstr) { return _set(gstr); }
bool set(const QString gstr) { return _set(gstr.toStdString().c_str()); }
bool setDefault(void) { return _set(""); }
void setFormat(int i) { setFormat(static_cast<Geometry::Format>(i)); }
void setFormat(Geometry::Format t);
void setFormat(QString s) { setFormat(Geometry::formatId(s)); }
bool set(const char *geomStr, Geometry::Format format = Geometry::FormatUnknown);
bool set(const QString geomStr, Geometry::Format format = Geometry::FormatUnknown) { return set(geomStr.toStdString().c_str(), format); }
bool setDefault(void) { return set(""); }
bool setFormat(int i) { setFormat(static_cast<Geometry::Format>(i)); }
bool setFormat(Geometry::Format format);
bool setFormat(QString formatStr) { setFormat(Geometry::formatId(formatStr)); }
Geometry::Format getFormat(void);
QString getFormatStr(void) { return Geometry::formatName(getFormat()); }
QString getGeometry();
@ -95,7 +96,6 @@ private:
QSpinBox *m_ui_C0D_dimension[2];
QSpinBox *m_ui_C01_corner[2][2];
bool _set(const char *gstr);
};
#endif // GEOMETRYWIDGET_H