From 783ede0a0340b321485b491b0f8b17a10d47e0e7 Mon Sep 17 00:00:00 2001 From: Jim Evins Date: Thu, 14 Apr 2016 23:10:38 -0400 Subject: [PATCH] PropertiesView and View now follow Settings::units. --- glabels/ObjectEditor.cpp | 70 ++------- glabels/ObjectEditor.h | 5 +- glabels/PreferencesDialog.cpp | 20 +-- glabels/PropertiesView.cpp | 19 ++- glabels/PropertiesView.h | 5 +- glabels/Settings.cpp | 12 +- glabels/Settings.h | 4 +- glabels/View.cpp | 60 ++++++++ glabels/View.h | 3 + libglabels/CMakeLists.txt | 1 + libglabels/Constants.h | 2 +- libglabels/Distance.cpp | 207 +++++++++++---------------- libglabels/Distance.h | 19 +-- libglabels/Distance.inl | 1 + libglabels/Frame.h | 2 +- libglabels/FrameCd.cpp | 8 +- libglabels/FrameCd.h | 2 +- libglabels/FrameEllipse.cpp | 8 +- libglabels/FrameEllipse.h | 2 +- libglabels/FrameRect.cpp | 8 +- libglabels/FrameRect.h | 2 +- libglabels/FrameRound.cpp | 8 +- libglabels/FrameRound.h | 2 +- libglabels/Units.cpp | 258 ++++++++++++++++++++++++++++++++++ libglabels/Units.h | 69 +++++++++ libglabels/XmlUtil.cpp | 12 +- libglabels/XmlUtil.h | 6 +- libglabels/privateConstants.h | 2 +- 28 files changed, 559 insertions(+), 258 deletions(-) create mode 100644 libglabels/Units.cpp create mode 100644 libglabels/Units.h diff --git a/glabels/ObjectEditor.cpp b/glabels/ObjectEditor.cpp index 0f77ac4..6c5d528 100644 --- a/glabels/ObjectEditor.cpp +++ b/glabels/ObjectEditor.cpp @@ -97,11 +97,11 @@ void ObjectEditor::loadPositionPage() posXSpin->setDecimals( mSpinDigits ); posXSpin->setSingleStep( mSpinStep ); - posXSpin->setSuffix( " " + glabels::Distance::toId(mUnits) ); + posXSpin->setSuffix( " " + mUnits.toIdString() ); posYSpin->setDecimals( mSpinDigits ); posYSpin->setSingleStep( mSpinStep ); - posYSpin->setSuffix( " " + glabels::Distance::toId(mUnits) ); + posYSpin->setSuffix( " " + mUnits.toIdString() ); posXSpin->setValue( mObject->x0().inUnits(mUnits) ); posYSpin->setValue( mObject->y0().inUnits(mUnits) ); @@ -119,11 +119,11 @@ void ObjectEditor::loadRectSizePage() sizeWSpin->setDecimals( mSpinDigits ); sizeWSpin->setSingleStep( mSpinStep ); - sizeWSpin->setSuffix( " " + glabels::Distance::toId(mUnits) ); + sizeWSpin->setSuffix( " " + mUnits.toIdString() ); sizeHSpin->setDecimals( mSpinDigits ); sizeHSpin->setSingleStep( mSpinStep ); - sizeHSpin->setSuffix( " " + glabels::Distance::toId(mUnits) ); + sizeHSpin->setSuffix( " " + mUnits.toIdString() ); sizeWSpin->setValue( mObject->w().inUnits(mUnits) ); sizeHSpin->setValue( mObject->h().inUnits(mUnits) ); @@ -141,11 +141,11 @@ void ObjectEditor::loadShadowPage() shadowXSpin->setDecimals( mSpinDigits ); shadowXSpin->setSingleStep( mSpinStep ); - shadowXSpin->setSuffix( " " + glabels::Distance::toId(mUnits) ); + shadowXSpin->setSuffix( " " + mUnits.toIdString() ); shadowYSpin->setDecimals( mSpinDigits ); shadowYSpin->setSingleStep( mSpinStep ); - shadowYSpin->setSuffix( " " + glabels::Distance::toId(mUnits) ); + shadowYSpin->setSuffix( " " + mUnits.toIdString() ); shadowEnableCheck->setChecked( mObject->shadow() ); shadowXSpin->setValue( mObject->shadowX().inUnits(mUnits) ); @@ -158,65 +158,11 @@ void ObjectEditor::loadShadowPage() } -int ObjectEditor::spinDigits( glabels::Distance::Units units ) -{ - int digits; - - switch (units) - { - case glabels::Distance::Units::PT: - digits = 2; - break; - case glabels::Distance::Units::IN: - digits = 3; - break; - case glabels::Distance::Units::MM: - digits = 2; - break; - case glabels::Distance::Units::CM: - digits = 3; - break; - case glabels::Distance::Units::PC: - digits = 2; - break; - } - - return digits; -} - - -double ObjectEditor::spinStep( glabels::Distance::Units units ) -{ - double step; - - switch (units) - { - case glabels::Distance::Units::PT: - step = 0.01; - break; - case glabels::Distance::Units::IN: - step = 0.001; - break; - case glabels::Distance::Units::MM: - step = 0.01; - break; - case glabels::Distance::Units::CM: - step = 0.001; - break; - case glabels::Distance::Units::PC: - step = 0.01; - break; - } - - return step; -} - - void ObjectEditor::onSettingsChanged() { mUnits = Settings::units(); - mSpinDigits = spinDigits( mUnits ); - mSpinStep = spinStep( mUnits ); + mSpinDigits = mUnits.resolutionDigits(); + mSpinStep = mUnits.resolution(); /* Must now update limits and reload any active pages with appropriate units . */ onLabelSizeChanged(); diff --git a/glabels/ObjectEditor.h b/glabels/ObjectEditor.h index c1f494a..1ea6293 100644 --- a/glabels/ObjectEditor.h +++ b/glabels/ObjectEditor.h @@ -60,9 +60,6 @@ private: void loadRectSizePage(); void loadShadowPage(); - int spinDigits( glabels::Distance::Units units ); - double spinStep( glabels::Distance::Units units ); - ///////////////////////////////// // Slots @@ -89,7 +86,7 @@ private: LabelModel* mModel; LabelModelObject* mObject; - glabels::Distance::Units mUnits; + glabels::Units mUnits; int mSpinDigits; double mSpinStep; diff --git a/glabels/PreferencesDialog.cpp b/glabels/PreferencesDialog.cpp index d6ab019..ab2587e 100644 --- a/glabels/PreferencesDialog.cpp +++ b/glabels/PreferencesDialog.cpp @@ -31,18 +31,18 @@ PreferencesDialog::PreferencesDialog( QWidget *parent ) { setupUi( this ); - switch ( Settings::units() ) + switch ( Settings::units().toEnum() ) { - case glabels::Distance::Units::IN: + case glabels::Units::IN: unitsInchesRadio->setChecked( true ); break; - case glabels::Distance::Units::MM: + case glabels::Units::MM: unitsMillimetersRadio->setChecked( true ); break; - case glabels::Distance::Units::CM: + case glabels::Units::CM: unitsCentimetersRadio->setChecked( true ); break; - case glabels::Distance::Units::PC: + case glabels::Units::PC: unitsPicasRadio->setChecked( true ); break; default: @@ -59,22 +59,22 @@ void PreferencesDialog::onUnitsRadiosChanged() { if ( unitsInchesRadio->isChecked() ) { - Settings::setUnits( glabels::Distance::Units::IN ); + Settings::setUnits( glabels::Units::in() ); } else if ( unitsMillimetersRadio->isChecked() ) { - Settings::setUnits( glabels::Distance::Units::MM ); + Settings::setUnits( glabels::Units::mm() ); } else if ( unitsCentimetersRadio->isChecked() ) { - Settings::setUnits( glabels::Distance::Units::CM ); + Settings::setUnits( glabels::Units::cm() ); } else if ( unitsPicasRadio->isChecked() ) { - Settings::setUnits( glabels::Distance::Units::PC ); + Settings::setUnits( glabels::Units::pc() ); } else { - Settings::setUnits( glabels::Distance::Units::PT ); + Settings::setUnits( glabels::Units::pt() ); } } diff --git a/glabels/PropertiesView.cpp b/glabels/PropertiesView.cpp index d5845b7..d2e051e 100644 --- a/glabels/PropertiesView.cpp +++ b/glabels/PropertiesView.cpp @@ -21,6 +21,7 @@ #include "PropertiesView.h" #include "LabelModel.h" +#include "Settings.h" #include "libglabels/Db.h" #include "SelectProductDialog.h" @@ -37,6 +38,9 @@ PropertiesView::PropertiesView( QWidget *parent ) similarBrowser->setAttribute(Qt::WA_TranslucentBackground); similarBrowser->viewport()->setAutoFillBackground(false); + + connect( Settings::instance(), SIGNAL(changed()), this, SLOT(onSettingsChanged()) ); + onSettingsChanged(); } @@ -61,6 +65,19 @@ void PropertiesView::setModel( LabelModel* model ) } +/// +/// Settings changed handler +/// +void PropertiesView::onSettingsChanged() +{ + mUnits = Settings::units(); + if (mModel) + { + onLabelSizeChanged(); + } +} + + /// /// Label size changed handler /// @@ -99,7 +116,7 @@ void PropertiesView::onLabelSizeChanged() QString pgSizeString = glabels::Db::lookupPaperNameFromId( tmplate->paperId() ); pageSizeLabel->setText( pgSizeString ); - QString labelSizeString = frame->sizeDescription( glabels::Distance::Units::IN ); + QString labelSizeString = frame->sizeDescription( mUnits ); labelSizeLabel->setText( labelSizeString ); QString layoutString = frame->layoutDescription(); diff --git a/glabels/PropertiesView.h b/glabels/PropertiesView.h index e527001..04f9dde 100644 --- a/glabels/PropertiesView.h +++ b/glabels/PropertiesView.h @@ -23,6 +23,7 @@ #include "ui_PropertiesView.h" +#include "libglabels/Units.h" class LabelModel; // Forward reference @@ -53,6 +54,7 @@ public: // Slots ///////////////////////////////// private slots: + void onSettingsChanged(); void onLabelSizeChanged(); void onFormChanged(); void onChangeProductButtonClicked(); @@ -62,7 +64,8 @@ private slots: // Private Data ///////////////////////////////// private: - LabelModel* mModel; + LabelModel* mModel; + glabels::Units mUnits; }; diff --git a/glabels/Settings.cpp b/glabels/Settings.cpp index cce9ff1..e730209 100644 --- a/glabels/Settings.cpp +++ b/glabels/Settings.cpp @@ -50,30 +50,30 @@ Settings* Settings::instance() } -glabels::Distance::Units Settings::units() +glabels::Units Settings::units() { // Guess at a suitable default QString defaultIdString; if ( QLocale::system().measurementSystem() == QLocale::ImperialSystem ) { - defaultIdString = glabels::Distance::toId( glabels::Distance::Units::IN ); + defaultIdString = glabels::Units(glabels::Units::IN).toIdString(); } else { - defaultIdString = glabels::Distance::toId( glabels::Distance::Units::MM ); + defaultIdString = glabels::Units(glabels::Units::MM).toIdString(); } mInstance->beginGroup( "Locale" ); QString idString = mInstance->value( "units", defaultIdString ).toString(); mInstance->endGroup(); - return glabels::Distance::toUnits( idString ); + return glabels::Units( idString ); } -void Settings::setUnits( glabels::Distance::Units units ) +void Settings::setUnits( const glabels::Units& units ) { - QString idString = glabels::Distance::toId( units ); + QString idString = units.toIdString(); mInstance->beginGroup( "Locale" ); mInstance->setValue( "units", idString ); diff --git a/glabels/Settings.h b/glabels/Settings.h index bded513..1cb6bc0 100644 --- a/glabels/Settings.h +++ b/glabels/Settings.h @@ -60,8 +60,8 @@ signals: // Accessors ///////////////////////////////// public: - static glabels::Distance::Units units(); - static void setUnits( glabels::Distance::Units units ); + static glabels::Units units(); + static void setUnits( const glabels::Units& units ); static bool searchIsoPaperSizes(); static void setSearchIsoPaperSizes( bool searchIsoPaperSizes ); diff --git a/glabels/View.cpp b/glabels/View.cpp index 653526a..21c0c6c 100644 --- a/glabels/View.cpp +++ b/glabels/View.cpp @@ -28,6 +28,7 @@ #include "LabelModel.h" #include "LabelModelObject.h" #include "LabelModelBoxObject.h" +#include "Settings.h" #include "Cursors.h" #include "libglabels/Markup.h" @@ -85,6 +86,10 @@ View::View( QScrollArea* scrollArea, QWidget* parent ) mGridSpacing = 18; setMouseTracking( true ); + setFocusPolicy(Qt::StrongFocus); + + connect( Settings::instance(), SIGNAL(changed()), this, SLOT(onSettingsChanged()) ); + onSettingsChanged(); } @@ -851,6 +856,50 @@ View::handleResizeMotion( const glabels::Distance& xWorld, } +/// +/// Key Press Event Handler +void +View::keyPressEvent( QKeyEvent* event ) +{ + if ( mState == IdleState ) + { + switch (event->key()) + { + + case Qt::Key_Left: + mModel->moveSelection( -mStepSize, glabels::Distance(0) ); + break; + + case Qt::Key_Up: + mModel->moveSelection( glabels::Distance(0), -mStepSize ); + break; + + case Qt::Key_Right: + mModel->moveSelection( mStepSize, glabels::Distance(0) ); + break; + + case Qt::Key_Down: + mModel->moveSelection( glabels::Distance(0), mStepSize ); + break; + + case Qt::Key_Delete: + mModel->deleteSelection(); + setCursor( Qt::ArrowCursor ); + break; + + default: + QWidget::keyPressEvent( event ); + break; + + } + } + else + { + QWidget::keyPressEvent( event ); + } +} + + /// /// Paint Event Handler /// @@ -1092,6 +1141,17 @@ View::drawSelectRegionLayer( QPainter* painter ) } +/// +/// Settings changed handler +/// +void View::onSettingsChanged() +{ + glabels::Units units = Settings::units(); + + mStepSize = glabels::Distance( units.resolution(), units ); +} + + /// /// Model changed handler /// diff --git a/glabels/View.h b/glabels/View.h index 90131e2..045c242 100644 --- a/glabels/View.h +++ b/glabels/View.h @@ -119,6 +119,7 @@ protected: void mouseMoveEvent( QMouseEvent* event ); void mouseReleaseEvent( QMouseEvent* event ); void leaveEvent( QEvent* event ); + void keyPressEvent( QKeyEvent* event ); void paintEvent( QPaintEvent* event ); @@ -142,6 +143,7 @@ private: // Private slots ///////////////////////////////////// private slots: + void onSettingsChanged(); void onModelChanged(); void onModelSizeChanged(); @@ -180,6 +182,7 @@ private: bool mGridVisible; double mGridSpacing; + glabels::Distance mStepSize; LabelModel* mModel; diff --git a/libglabels/CMakeLists.txt b/libglabels/CMakeLists.txt index 4cd6b9b..6473b92 100644 --- a/libglabels/CMakeLists.txt +++ b/libglabels/CMakeLists.txt @@ -26,6 +26,7 @@ set (libglabels_sources XmlTemplateCreator.cpp XmlUtil.cpp MiniPreviewPixmap.cpp + Units.cpp Distance.cpp ) diff --git a/libglabels/Constants.h b/libglabels/Constants.h index 3695b22..eddf5fe 100644 --- a/libglabels/Constants.h +++ b/libglabels/Constants.h @@ -29,7 +29,7 @@ namespace glabels const double PTS_PER_INCH = 72.0; const double PTS_PER_MM = 2.83464566929; const double PTS_PER_CM = (10.0*PTS_PER_MM); - const double PTS_PER_PICA = (1.0/12.0); + const double PTS_PER_PICA = 12.0; } diff --git a/libglabels/Distance.cpp b/libglabels/Distance.cpp index dc45e0c..268659f 100644 --- a/libglabels/Distance.cpp +++ b/libglabels/Distance.cpp @@ -27,125 +27,9 @@ namespace glabels { - QString Distance::toId( Units units ) + Distance::Distance( double d, Units::Enum unitsEnum ) { - QString idString; - - switch (units) - { - case Units::PT: - idString = "pt"; - break; - case Units::IN: - idString = "in"; - break; - case Units::MM: - idString = "mm"; - break; - case Units::CM: - idString = "cm"; - break; - case Units::PC: - idString = "pc"; - break; - } - - return idString; - } - - - QString Distance::toTrName( Units units ) - { - QString nameString; - - switch (units) - { - case Units::PT: - nameString = tr("points"); - break; - case Units::IN: - nameString = tr("inches"); - break; - case Units::MM: - nameString = tr("mm"); - break; - case Units::CM: - nameString = tr("cm"); - break; - case Units::PC: - nameString = tr("picas"); - break; - } - - return nameString; - } - - - bool Distance::isIdValid( const QString& unitsId ) - { - bool retValue = false; - - if ( unitsId == "pt" ) - { - retValue = true; - } - else if ( unitsId == "in" ) - { - retValue = true; - } - else if ( unitsId == "mm" ) - { - retValue = true; - } - else if ( unitsId == "cm" ) - { - retValue = true; - } - else if ( unitsId == "pc" ) - { - retValue = true; - } - - return retValue; - } - - - Distance::Units Distance::toUnits( const QString& unitsId ) - { - Units units; - - if ( unitsId == "pt" ) - { - units = Units::PT; - } - else if ( unitsId == "in" ) - { - units = Units::IN; - } - else if ( unitsId == "mm" ) - { - units = Units::MM; - } - else if ( unitsId == "cm" ) - { - units = Units::CM; - } - else if ( unitsId == "pc" ) - { - units = Units::PC; - } - else - { - units = Units::PT; - } - - return units; - } - - - Distance::Distance( double d, Units units ) - { - switch (units) + switch (unitsEnum) { case Units::PT: mDPts = d; @@ -162,15 +46,44 @@ namespace glabels case Units::PC: mDPts = d * PTS_PER_PICA; break; + default: + mDPts = d; + break; + } + } + + + Distance::Distance( double d, const Units& units ) + { + switch (units.toEnum()) + { + case Units::PT: + mDPts = d; + break; + case Units::IN: + mDPts = d * PTS_PER_INCH; + break; + case Units::MM: + mDPts = d * PTS_PER_MM; + break; + case Units::CM: + mDPts = d * PTS_PER_CM; + break; + case Units::PC: + mDPts = d * PTS_PER_PICA; + break; + default: + mDPts = d; + break; } } Distance::Distance( double d, const QString& unitsId ) { - Units units = toUnits( unitsId ); + Units units = Units( unitsId ); - switch (units) + switch (units.toEnum()) { case Units::PT: mDPts = d; @@ -187,6 +100,9 @@ namespace glabels case Units::PC: mDPts = d * PTS_PER_PICA; break; + default: + mDPts = d; + break; } } @@ -200,20 +116,47 @@ namespace glabels QString unitsString; valueStream >> value >> unitsString; - if ( !unitsString.isEmpty() && !isIdValid( unitsString ) ) + if ( !unitsString.isEmpty() && !Units::isIdValid( unitsString ) ) { - qWarning() << "Error: invalid Distance::Units \"" << string << "\""; + qWarning() << "Invalid Units in string: \"" << string << "\""; } return Distance( value, unitsString ); } - double Distance::inUnits( Units units ) const + double Distance::inUnits( const Units& units ) const { double d; - switch (units) + switch (units.toEnum()) + { + case Units::PT: + d = pt(); + break; + case Units::IN: + d = in(); + break; + case Units::MM: + d = mm(); + break; + case Units::CM: + d = cm(); + break; + case Units::PC: + d = pc(); + break; + } + + return d; + } + + + double Distance::inUnits( Units::Enum unitsEnum ) const + { + double d; + + switch (unitsEnum) { case Units::PT: d = pt(); @@ -238,18 +181,26 @@ namespace glabels double Distance::inUnits( const QString& unitsId ) const { - return inUnits( toUnits( unitsId ) ); + return inUnits( Units( unitsId ) ); } - QString Distance::toString( Units units ) const + QString Distance::toString( const Units& units ) const { - return QString::number( inUnits(units) ) + toId(units); + return QString::number( inUnits(units) ) + units.toIdString(); + } + + + QString Distance::toString( Units::Enum unitsEnum ) const + { + Units units(unitsEnum); + return QString::number( inUnits(units) ) + units.toIdString(); } QString Distance::toString( const QString& unitsId ) const { - return QString::number( inUnits(unitsId) ) + unitsId; + Units units(unitsId); + return QString::number( inUnits(units) ) + units.toIdString(); } } diff --git a/libglabels/Distance.h b/libglabels/Distance.h index fb35bc1..505e35e 100644 --- a/libglabels/Distance.h +++ b/libglabels/Distance.h @@ -24,7 +24,7 @@ #include #include -#include "Constants.h" +#include "Units.h" namespace glabels @@ -36,16 +36,9 @@ namespace glabels Q_DECLARE_TR_FUNCTIONS(Distance) public: - enum class Units { PT, IN, MM, CM, PC }; - - static QString toId( Units units ); - static QString toTrName( Units units ); - static bool isIdValid( const QString& unitsId ); - static Units toUnits( const QString& unitsId ); - - Distance(); - Distance( double d, Units units = Units::PT ); + Distance( double d, Units::Enum unitsEnum = Units::PT ); + Distance( double d, const Units& units ); Distance( double d, const QString& unitsId ); static Distance pt( double dPts ); @@ -61,11 +54,13 @@ namespace glabels double mm() const; double cm() const; double pc() const; - double inUnits( Units units ) const; + double inUnits( const Units& units ) const; + double inUnits( Units::Enum unitsEnum ) const; double inUnits( const QString& unitsId ) const; - QString toString( Units units ) const; + QString toString( const Units& units ) const; + QString toString( Units::Enum unitsEnum ) const; QString toString( const QString& unitsId ) const; diff --git a/libglabels/Distance.inl b/libglabels/Distance.inl index 0317941..f10d34c 100644 --- a/libglabels/Distance.inl +++ b/libglabels/Distance.inl @@ -19,6 +19,7 @@ */ +#include "Constants.h" #include diff --git a/libglabels/Frame.h b/libglabels/Frame.h index 7a97ae4..5aa7391 100644 --- a/libglabels/Frame.h +++ b/libglabels/Frame.h @@ -62,7 +62,7 @@ namespace glabels virtual Distance w() const = 0; virtual Distance h() const = 0; - virtual const QString sizeDescription( Distance::Units units ) const = 0; + virtual const QString sizeDescription( const Units& units ) const = 0; virtual bool isSimilarTo( Frame* other ) const = 0; virtual const QPainterPath& path() const = 0; diff --git a/libglabels/FrameCd.cpp b/libglabels/FrameCd.cpp index 48054a6..6dce429 100644 --- a/libglabels/FrameCd.cpp +++ b/libglabels/FrameCd.cpp @@ -85,22 +85,22 @@ namespace glabels } - const QString FrameCd::sizeDescription( Distance::Units units ) const + const QString FrameCd::sizeDescription( const Units& units ) const { - if ( units == Distance::Units::IN ) + if ( units.toEnum() == Units::IN ) { QString dStr = StrUtil::formatFraction( 2 * mR1.in() ); return QString().sprintf( "%s %s %s", qPrintable(dStr), - qPrintable(Distance::toTrName(units)), + qPrintable(units.toTrName()), qPrintable(tr("diameter")) ); } else { return QString().sprintf( "%.5g %s %s", 2 * mR1.inUnits(units), - qPrintable(Distance::toTrName(units)), + qPrintable(units.toTrName()), qPrintable(tr("diameter")) ); } } diff --git a/libglabels/FrameCd.h b/libglabels/FrameCd.h index e006020..4efdf21 100644 --- a/libglabels/FrameCd.h +++ b/libglabels/FrameCd.h @@ -48,7 +48,7 @@ namespace glabels Distance w() const; Distance h() const; - const QString sizeDescription( Distance::Units units ) const; + const QString sizeDescription( const Units& units ) const; bool isSimilarTo( Frame* other ) const; const QPainterPath& path() const; diff --git a/libglabels/FrameEllipse.cpp b/libglabels/FrameEllipse.cpp index 1aa9aaf..704e081 100644 --- a/libglabels/FrameEllipse.cpp +++ b/libglabels/FrameEllipse.cpp @@ -62,9 +62,9 @@ namespace glabels } - const QString FrameEllipse::sizeDescription( Distance::Units units ) const + const QString FrameEllipse::sizeDescription( const Units& units ) const { - if ( units == Distance::Units::IN ) + if ( units.toEnum() == Units::IN ) { QString wStr = StrUtil::formatFraction( mW.in() ); QString hStr = StrUtil::formatFraction( mH.in() ); @@ -72,14 +72,14 @@ namespace glabels return QString().sprintf( "%s x %s %s", qPrintable(wStr), qPrintable(hStr), - qPrintable(Distance::toTrName(units)) ); + qPrintable(units.toTrName()) ); } else { return QString().sprintf( "%.5g x %.5g %s", mW.inUnits(units), mH.inUnits(units), - qPrintable(Distance::toTrName(units)) ); + qPrintable(units.toTrName()) ); } } diff --git a/libglabels/FrameEllipse.h b/libglabels/FrameEllipse.h index 0cace5e..4af5069 100644 --- a/libglabels/FrameEllipse.h +++ b/libglabels/FrameEllipse.h @@ -45,7 +45,7 @@ namespace glabels Distance w() const; Distance h() const; - const QString sizeDescription( Distance::Units units ) const; + const QString sizeDescription( const Units& units ) const; bool isSimilarTo( Frame* other ) const; const QPainterPath& path() const; diff --git a/libglabels/FrameRect.cpp b/libglabels/FrameRect.cpp index d2f1039..3f3b255 100644 --- a/libglabels/FrameRect.cpp +++ b/libglabels/FrameRect.cpp @@ -66,9 +66,9 @@ namespace glabels } - const QString FrameRect::sizeDescription( Distance::Units units ) const + const QString FrameRect::sizeDescription( const Units& units ) const { - if ( units == Distance::Units::IN ) + if ( units.toEnum() == Units::IN ) { QString wStr = StrUtil::formatFraction( mW.in() ); QString hStr = StrUtil::formatFraction( mH.in() ); @@ -76,14 +76,14 @@ namespace glabels return QString().sprintf( "%s x %s %s", qPrintable(wStr), qPrintable(hStr), - qPrintable(Distance::toTrName(units)) ); + qPrintable(units.toTrName()) ); } else { return QString().sprintf( "%.5g x %.5g %s", mW.inUnits(units), mH.inUnits(units), - qPrintable(Distance::toTrName(units)) ); + qPrintable(units.toTrName()) ); } } diff --git a/libglabels/FrameRect.h b/libglabels/FrameRect.h index 11f4ca2..c36a626 100644 --- a/libglabels/FrameRect.h +++ b/libglabels/FrameRect.h @@ -48,7 +48,7 @@ namespace glabels Distance w() const; Distance h() const; - const QString sizeDescription( Distance::Units units ) const; + const QString sizeDescription( const Units& units ) const; bool isSimilarTo( Frame* other ) const; diff --git a/libglabels/FrameRound.cpp b/libglabels/FrameRound.cpp index d429bcc..62042eb 100644 --- a/libglabels/FrameRound.cpp +++ b/libglabels/FrameRound.cpp @@ -62,22 +62,22 @@ namespace glabels } - const QString FrameRound::sizeDescription( Distance::Units units ) const + const QString FrameRound::sizeDescription( const Units& units ) const { - if ( units == Distance::Units::IN ) + if ( units.toEnum() == Units::IN ) { QString dStr = StrUtil::formatFraction( 2 * mR.in() ); return QString().sprintf( "%s %s %s", qPrintable(dStr), - qPrintable(Distance::toTrName(units)), + qPrintable(units.toTrName()), qPrintable(tr("diameter")) ); } else { return QString().sprintf( "%.5g %s %s", 2 * mR.inUnits(units), - qPrintable(Distance::toTrName(units)), + qPrintable(units.toTrName()), qPrintable(tr("diameter")) ); } } diff --git a/libglabels/FrameRound.h b/libglabels/FrameRound.h index e8ae5bd..be939ff 100644 --- a/libglabels/FrameRound.h +++ b/libglabels/FrameRound.h @@ -45,7 +45,7 @@ namespace glabels Distance w() const; Distance h() const; - const QString sizeDescription( Distance::Units units ) const; + const QString sizeDescription( const Units& units ) const; bool isSimilarTo( Frame* other ) const; const QPainterPath& path() const; diff --git a/libglabels/Units.cpp b/libglabels/Units.cpp new file mode 100644 index 0000000..8fb940f --- /dev/null +++ b/libglabels/Units.cpp @@ -0,0 +1,258 @@ +/* Units.cpp + * + * Copyright (C) 2016 Jim Evins + * + * This file is part of gLabels-qt. + * + * gLabels-qt is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * gLabels-qt is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with gLabels-qt. If not, see . + */ + +#include "Units.h" + +#include +#include + + +namespace glabels +{ + + + Units::Units() : mEnumValue(PT) + { + } + + + Units::Units( Units::Enum enumValue ) : mEnumValue(enumValue) + { + switch (enumValue) + { + case PT: + case IN: + case MM: + case CM: + case PC: + /* Catch all valid enum values. */ + break; + default: + /* Catch invalid enum values, reset to PT. */ + qWarning() << "Bad Units::Enum value = " << enumValue << "."; + mEnumValue = PT; + break; + } + } + + + Units::Units( const QString& idString ) + { + if ( idString == "pt" ) + { + mEnumValue = PT; + } + else if ( idString == "in" ) + { + mEnumValue = IN; + } + else if ( idString == "mm" ) + { + mEnumValue = MM; + } + else if ( idString == "cm" ) + { + mEnumValue = CM; + } + else if ( idString == "pc" ) + { + mEnumValue = PC; + } + else + { + mEnumValue = PT; + } + } + + + Units Units::pt() + { + return Units(PT); + } + + + Units Units::in() + { + return Units(IN); + } + + + Units Units::mm() + { + return Units(MM); + } + + + Units Units::cm() + { + return Units(CM); + } + + + Units Units::pc() + { + return Units(PC); + } + + + Units::Enum Units::toEnum() const + { + return mEnumValue; + } + + + QString Units::toIdString() const + { + QString idString; + + switch (mEnumValue) + { + case Units::PT: + idString = "pt"; + break; + case Units::IN: + idString = "in"; + break; + case Units::MM: + idString = "mm"; + break; + case Units::CM: + idString = "cm"; + break; + case Units::PC: + idString = "pc"; + break; + } + + return idString; + } + + + QString Units::toTrName() const + { + QString nameString; + + switch (mEnumValue) + { + case Units::PT: + nameString = tr("points"); + break; + case Units::IN: + nameString = tr("inches"); + break; + case Units::MM: + nameString = tr("mm"); + break; + case Units::CM: + nameString = tr("cm"); + break; + case Units::PC: + nameString = tr("picas"); + break; + } + + return nameString; + } + + + double Units::resolution() const + { + double value; + + switch (mEnumValue) + { + case glabels::Units::PT: + value = 0.01; + break; + case glabels::Units::IN: + value = 0.001; + break; + case glabels::Units::MM: + value = 0.01; + break; + case glabels::Units::CM: + value = 0.001; + break; + case glabels::Units::PC: + value = 0.01; + break; + } + + return value; + } + + + int Units::resolutionDigits() const + { + int digits; + + switch (mEnumValue) + { + case glabels::Units::PT: + digits = 2; + break; + case glabels::Units::IN: + digits = 3; + break; + case glabels::Units::MM: + digits = 2; + break; + case glabels::Units::CM: + digits = 3; + break; + case glabels::Units::PC: + digits = 2; + break; + } + + return digits; + } + + + bool Units::isIdValid( const QString& idString ) + { + bool retValue = false; + + if ( idString == "pt" ) + { + retValue = true; + } + else if ( idString == "in" ) + { + retValue = true; + } + else if ( idString == "mm" ) + { + retValue = true; + } + else if ( idString == "cm" ) + { + retValue = true; + } + else if ( idString == "pc" ) + { + retValue = true; + } + + return retValue; + } + + +} diff --git a/libglabels/Units.h b/libglabels/Units.h new file mode 100644 index 0000000..c0f48d7 --- /dev/null +++ b/libglabels/Units.h @@ -0,0 +1,69 @@ +/* Units.h + * + * Copyright (C) 2016 Jim Evins + * + * This file is part of gLabels-qt. + * + * gLabels-qt is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * gLabels-qt is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with gLabels-qt. If not, see . + */ + +#ifndef glabels_Units_h +#define glabels_Units_h + + +#include +#include + + +namespace glabels +{ + + + class Units + { + Q_DECLARE_TR_FUNCTIONS(Units) + + public: + enum Enum { PT, IN, MM, CM, PC }; + + Units(); + Units( Enum enumValue ); + Units( const QString& idString ); + + static Units pt(); + static Units in(); + static Units mm(); + static Units cm(); + static Units pc(); + + Enum toEnum() const; + + QString toIdString() const; + QString toTrName() const; + + double resolution() const; + int resolutionDigits() const; + + static bool isIdValid( const QString& unitsId ); + + + private: + Enum mEnumValue; + + }; + +} + + +#endif // glabels_Units_h diff --git a/libglabels/XmlUtil.cpp b/libglabels/XmlUtil.cpp index 547bdcf..528e328 100644 --- a/libglabels/XmlUtil.cpp +++ b/libglabels/XmlUtil.cpp @@ -27,12 +27,12 @@ namespace glabels { - Distance::Units XmlUtil::mUnits; + Units XmlUtil::mUnits; XmlUtil::XmlUtil() { - mUnits = Distance::Units::PT; + mUnits = Units(Units::PT); } @@ -42,7 +42,7 @@ namespace glabels } - Distance::Units XmlUtil::units() + Units XmlUtil::units() { init(); @@ -50,7 +50,7 @@ namespace glabels } - void XmlUtil::setUnits( Distance::Units units ) + void XmlUtil::setUnits( const Units& units ) { init(); @@ -215,7 +215,7 @@ namespace glabels valueStream >> value >> unitsString; - if ( !unitsString.isEmpty() && !Distance::isIdValid( unitsString ) ) + if ( !unitsString.isEmpty() && !Units::isIdValid( unitsString ) ) { qWarning() << "Error: bad length value in attribute " << node.tagName() << ":" << name << "=" << valueString; @@ -284,7 +284,7 @@ namespace glabels { init(); - node.setAttribute( name, QString::number(value.inUnits(mUnits)) + Distance::toId(mUnits) ); + node.setAttribute( name, QString::number(value.inUnits(mUnits)) + mUnits.toIdString() ); } } diff --git a/libglabels/XmlUtil.h b/libglabels/XmlUtil.h index 334c54a..73f64d9 100644 --- a/libglabels/XmlUtil.h +++ b/libglabels/XmlUtil.h @@ -41,8 +41,8 @@ namespace glabels static void init(); - static Distance::Units units(); - static void setUnits( Distance::Units units ); + static Units units(); + static void setUnits( const Units& units ); static QString getStringAttr( const QDomElement& node, const QString& name, @@ -97,7 +97,7 @@ namespace glabels const Distance& value ); private: - static Distance::Units mUnits; + static Units mUnits; }; diff --git a/libglabels/privateConstants.h b/libglabels/privateConstants.h index 2f8c368..f9b3392 100644 --- a/libglabels/privateConstants.h +++ b/libglabels/privateConstants.h @@ -31,7 +31,7 @@ namespace glabels namespace Constants { - const Distance EPSILON( 0.5, Distance::Units::PT ); + const Distance EPSILON( 0.5, Units::PT ); }