From fa96cc5a17888604531e9be2b439cc08aea8a283 Mon Sep 17 00:00:00 2001 From: Jaye Evins Date: Thu, 14 Aug 2025 15:47:22 -0400 Subject: [PATCH] Add grid settings to preferences (#224) - Allow origin to be either at the top-left corner or center of label (#174) - For non-rectangular labels (cd, round, etc.) the origin will still always be at the center of the label. - User controllable grid spacing --- glabels/LabelEditor.cpp | 22 ++-- glabels/PreferencesDialog.cpp | 89 ++++++++++++++- glabels/PreferencesDialog.h | 4 + glabels/ui/PreferencesDialog.ui | 189 +++++++++++++++++++++++++++++--- model/Distance.h | 1 - model/Settings.cpp | 64 +++++++++++ model/Settings.h | 10 +- translations/glabels_C.ts | 28 +++++ 8 files changed, 378 insertions(+), 29 deletions(-) diff --git a/glabels/LabelEditor.cpp b/glabels/LabelEditor.cpp index 5acc43b..d489d75 100644 --- a/glabels/LabelEditor.cpp +++ b/glabels/LabelEditor.cpp @@ -68,7 +68,6 @@ namespace glabels const QColor gridLineColor( 192, 192, 192 ); const double gridLineWidthPixels = 1; - const model::Distance gridSpacing = model::Distance::pt(9); // TODO: determine from locale. const QColor markupLineColor( 240, 99, 99 ); const double markupLineWidthPixels = 1; @@ -93,7 +92,6 @@ namespace glabels mScale = 1; mMarkupVisible = true; mGridVisible = true; - mGridSpacing = 18; mState = IdleState; @@ -1161,18 +1159,20 @@ namespace glabels { if ( mGridVisible ) { + auto gridSpacing = model::Settings::gridSpacing(); + auto gridOrigin = model::Settings::gridOrigin(); + + bool isRectangular = dynamic_cast( mModel->frame() ); + model::Distance w = mModel->frame()->w(); model::Distance h = mModel->frame()->h(); - model::Distance x0, y0; - if ( dynamic_cast( mModel->frame() ) ) + // Set origin of grid. For non-rectangular labels (e.g. round, cd, etc.), + // ignore the gridOrigin setting and always use the center of the label. + auto x0 = gridSpacing; + auto y0 = gridSpacing; + if ( gridOrigin == model::Settings::ORIGIN_CENTER || !isRectangular ) { - x0 = gridSpacing; - y0 = gridSpacing; - } - else - { - /* round labels, adjust grid to line up with center of label. */ x0 = fmod( w/2, gridSpacing ); y0 = fmod( h/2, gridSpacing ); } @@ -1325,6 +1325,8 @@ namespace glabels model::Units units = model::Settings::units(); mStepSize = model::Distance( units.resolution(), units ); + + update(); } diff --git a/glabels/PreferencesDialog.cpp b/glabels/PreferencesDialog.cpp index d8237ea..f59def9 100644 --- a/glabels/PreferencesDialog.cpp +++ b/glabels/PreferencesDialog.cpp @@ -34,7 +34,10 @@ namespace glabels { setupUi( this ); - switch ( model::Settings::units().toEnum() ) + + auto units = model::Settings::units(); + + switch ( units.toEnum() ) { case model::Units::IN: unitsInchesRadio->setChecked( true ); @@ -52,6 +55,33 @@ namespace glabels unitsPointsRadio->setChecked( true ); break; } + + + switch ( model::Settings::gridOrigin() ) + { + case model::Settings::ORIGIN_CENTER: + gridOriginCenterRadio->setChecked( true ); + break; + case model::Settings::ORIGIN_TL: + gridOriginTlRadio->setChecked( true ); + break; + default: + gridOriginTlRadio->setChecked( true ); + break; + } + + + auto gridSpacing = model::Settings::gridSpacing(); + + gridSpacingSpin->setDecimals( units.resolutionDigits() ); + gridSpacingSpin->setSingleStep( units.resolution() ); + gridSpacingSpin->setMinimum( units.resolution() ); + gridSpacingSpin->setSuffix( " " + units.toIdString() ); + gridSpacingSpin->setValue( gridSpacing.inUnits( units ) ); + + + connect( model::Settings::instance(), SIGNAL(changed()), + this, SLOT(onSettingsChanged()) ); } @@ -82,4 +112,61 @@ namespace glabels } } + + /// + /// Grid Origin Radios Changed + /// + void PreferencesDialog::onGridOriginRadiosChanged() + { + if ( gridOriginTlRadio->isChecked() ) + { + model::Settings::setGridOrigin( model::Settings::ORIGIN_TL ); + } + else if ( gridOriginCenterRadio->isChecked() ) + { + model::Settings::setGridOrigin( model::Settings::ORIGIN_CENTER ); + } + } + + + /// + /// Grid Spacing Spin Changed + /// + void PreferencesDialog::onGridSpacingSpinChanged() + { + auto units = model::Settings::units(); + + auto spacing = model::Distance( gridSpacingSpin->value(), units ); + + model::Settings::setGridSpacing( spacing ); + } + + + /// + /// Grid Spacing Reset Button Clicked + /// + void PreferencesDialog::onGridSpacingResetButtonClicked() + { + model::Settings::resetGridSpacing(); + } + + + /// + /// Settings Changed + /// + void PreferencesDialog::onSettingsChanged() + { + auto units = model::Settings::units(); + auto gridSpacing = model::Settings::gridSpacing(); + + gridSpacingSpin->blockSignals( true ); + gridSpacingSpin->setDecimals( units.resolutionDigits() ); + gridSpacingSpin->setSingleStep( units.resolution() ); + gridSpacingSpin->setMinimum( units.resolution() ); + gridSpacingSpin->setSuffix( " " + units.toIdString() ); + gridSpacingSpin->setValue( gridSpacing.inUnits( units ) ); + gridSpacingSpin->blockSignals( false ); + } + + } // namespace glabels diff --git a/glabels/PreferencesDialog.h b/glabels/PreferencesDialog.h index cec6f83..4d12869 100644 --- a/glabels/PreferencesDialog.h +++ b/glabels/PreferencesDialog.h @@ -47,6 +47,10 @@ namespace glabels ///////////////////////////////// private slots: void onUnitsRadiosChanged(); + void onGridOriginRadiosChanged(); + void onGridSpacingSpinChanged(); + void onGridSpacingResetButtonClicked(); + void onSettingsChanged(); }; diff --git a/glabels/ui/PreferencesDialog.ui b/glabels/ui/PreferencesDialog.ui index 5b908e6..a2871d3 100644 --- a/glabels/ui/PreferencesDialog.ui +++ b/glabels/ui/PreferencesDialog.ui @@ -7,14 +7,14 @@ 0 0 318 - 295 + 357 gLabels - Preferences - + 0 @@ -90,9 +90,100 @@ + + + Grid + + + + + + + + Configure grid behavior. + + + + + + + Origin + + + + + + Top left corner + + + + + + + Center + + + + + + + + + + + + Spacing + + + + + + + + + + Qt::NoFocus + + + Reset + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + - + Qt::Horizontal @@ -113,8 +204,8 @@ close() - 289 - 368 + 298 + 347 298 @@ -129,8 +220,8 @@ onUnitsRadiosChanged() - 269 - 184 + 285 + 246 298 @@ -145,8 +236,8 @@ onUnitsRadiosChanged() - 269 - 102 + 285 + 144 298 @@ -161,8 +252,8 @@ onUnitsRadiosChanged() - 269 - 131 + 285 + 178 298 @@ -177,8 +268,8 @@ onUnitsRadiosChanged() - 264 - 154 + 285 + 212 295 @@ -193,8 +284,8 @@ onUnitsRadiosChanged() - 243 - 215 + 266 + 280 295 @@ -202,9 +293,75 @@ + + gridSpacingSpin + valueChanged(double) + PreferencesDialog + onGridSpacingSpinChanged() + + + 114 + 206 + + + 7 + 240 + + + + + gridOriginTlRadio + toggled(bool) + PreferencesDialog + onGridOriginRadiosChanged() + + + 264 + 128 + + + 311 + 36 + + + + + gridOriginCenterRadio + toggled(bool) + PreferencesDialog + onGridOriginRadiosChanged() + + + 129 + 156 + + + 318 + 235 + + + + + gridSpacingResetButton + clicked() + PreferencesDialog + onGridSpacingResetButtonClicked() + + + 177 + 213 + + + 313 + 267 + + + onUnitsRadiosChanged() - onPreferedPaperSizesRadiosChanged() + onGridSpacingSpinChanged() + onGridOriginRadiosChanged() + onGridSpacingResetButtonClicked() diff --git a/model/Distance.h b/model/Distance.h index 4d01cbb..0f7f2c3 100644 --- a/model/Distance.h +++ b/model/Distance.h @@ -66,7 +66,6 @@ namespace glabels QString toString( Units::Enum unitsEnum ) const; QString toString( const QString& unitsId ) const; - Distance& operator+=( const Distance& d ); Distance& operator-=( const Distance& d ); Distance& operator*=( double f ); diff --git a/model/Settings.cpp b/model/Settings.cpp index 2219bb6..07098c7 100644 --- a/model/Settings.cpp +++ b/model/Settings.cpp @@ -375,5 +375,69 @@ namespace glabels mInstance->endGroup(); } + + Settings::GridOrigin Settings::gridOrigin() + { + mInstance->beginGroup( "Grid" ); + QString value = mInstance->value( "origin", "top_left" ).toString(); + mInstance->endGroup(); + + return (value == "top_left") ? ORIGIN_TL : ORIGIN_CENTER; + } + + + void Settings::setGridOrigin( GridOrigin origin ) + { + mInstance->beginGroup( "Grid" ); + mInstance->setValue( "origin", origin == ORIGIN_TL ? "top_left" : "center" ); + mInstance->endGroup(); + + emit mInstance->changed(); + } + + + Distance Settings::gridSpacing() + { + // Guess at a suitable default + QString defaultSpacingString; + if ( QLocale::system().measurementSystem() == QLocale::ImperialSystem ) + { + defaultSpacingString = Distance::in(0.125).toString( Units::IN ); + } + else + { + defaultSpacingString = Distance::mm(5).toString( Units::MM ); + } + + mInstance->beginGroup( "Grid" ); + QString spacingString = mInstance->value( "spacing", defaultSpacingString ).toString(); + mInstance->endGroup(); + + return Distance::fromString( spacingString ); + } + + + void Settings::setGridSpacing( Distance spacing ) + { + QString spacingString = spacing.toString( Settings::units() ); + + mInstance->beginGroup( "Grid" ); + mInstance->setValue( "spacing", spacingString ); + mInstance->endGroup(); + + emit mInstance->changed(); + } + + + void Settings::resetGridSpacing() + { + mInstance->beginGroup( "Grid" ); + mInstance->remove( "spacing" ); + mInstance->endGroup(); + + emit mInstance->changed(); + } + + } } diff --git a/model/Settings.h b/model/Settings.h index 815e936..be2c5e4 100644 --- a/model/Settings.h +++ b/model/Settings.h @@ -43,7 +43,8 @@ namespace glabels public: enum PageSizeFamily { ISO, US, }; - + enum GridOrigin { ORIGIN_TL, ORIGIN_CENTER }; + ///////////////////////////////// // Life Cycle @@ -101,6 +102,13 @@ namespace glabels static QString recentPrinter(); static void setRecentPrinter( const QString& printer ); + static GridOrigin gridOrigin(); + static void setGridOrigin( GridOrigin origin ); + + static Distance gridSpacing(); + static void setGridSpacing( Distance spacing ); + static void resetGridSpacing(); + private: static Settings* mInstance; diff --git a/translations/glabels_C.ts b/translations/glabels_C.ts index df9a6f8..62ddde6 100644 --- a/translations/glabels_C.ts +++ b/translations/glabels_C.ts @@ -528,6 +528,34 @@ Picas + + Grid + + + + Configure grid behavior. + + + + Origin + + + + Center + + + + Spacing + + + + Top left corner + + + + Reset + + PrintView