fdo#60120 Modify DialControl to store 100th degree angle.
DialControl internally stores the angle to a 100th of a degree percision, but when SetRotation is called, the value was always rounded to a 1 degree percision. This has now been modified to round only on DialControl mouse interaction. Additionally add add a parameter to SetLinkedField which states the number of decimal places the NumericField is set to. This change makes possible to set the NumericField to 100th of a Degree as the internal angle is represented in. Default value is 0, so no change is needed to existing DialControls. Change-Id: I1f0c20092cdfccbd0878d7eb620bfdad7825b0fb
This commit is contained in:
@@ -235,7 +235,7 @@ SvxAngleTabPage::SvxAngleTabPage( Window* pParent, const SfxItemSet& rInAttrs )
|
||||
aCtlRect.SetAccessibleRelationMemberOf(&aFlPosition);
|
||||
aCtlAngle.SetAccessibleRelationLabeledBy(&aFtAnglePresets);
|
||||
aCtlAngle.SetAccessibleRelationMemberOf(&aFlAngle);
|
||||
aCtlAngle.SetLinkedField( &maNfAngle );
|
||||
aCtlAngle.SetLinkedField( &maNfAngle, 2 );
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
|
@@ -390,8 +390,9 @@ TabPage RID_SVXPAGE_ANGLE
|
||||
Repeat = TRUE ;
|
||||
Spin = TRUE ;
|
||||
Minimum = 0 ;
|
||||
Maximum = 359 ;
|
||||
SpinSize = 5 ;
|
||||
Maximum = 35999 ;
|
||||
DecimalDigits = 2 ;
|
||||
SpinSize = 10 ;
|
||||
};
|
||||
FixedText FT_ANGLEPRESETS
|
||||
{
|
||||
|
@@ -109,8 +109,13 @@ public:
|
||||
/** Sets the rotation to the passed value (in 1/100 degrees). */
|
||||
void SetRotation( sal_Int32 nAngle );
|
||||
|
||||
/** Links the passed numeric edit field to the control (bi-directional). */
|
||||
void SetLinkedField( NumericField* pField );
|
||||
/** Links the passed numeric edit field to the control (bi-directional).
|
||||
* nDecimalPlaces:
|
||||
* field value is usign given decimal places
|
||||
* default is 0 which means field values are in degrees,
|
||||
* 2 means 100th of degree
|
||||
*/
|
||||
void SetLinkedField( NumericField* pField, sal_Int32 nDecimalPlaces = 0);
|
||||
/** Returns the linked numeric edit field, or 0. */
|
||||
NumericField* GetLinkedField() const;
|
||||
|
||||
@@ -133,6 +138,7 @@ protected:
|
||||
::boost::scoped_ptr<DialControlBmp> mpBmpBuffered;
|
||||
Link maModifyHdl;
|
||||
NumericField* mpLinkField;
|
||||
sal_Int32 mnLinkedFieldValueMultiplyer;
|
||||
Size maWinSize;
|
||||
Font maWinFont;
|
||||
sal_Int32 mnAngle;
|
||||
|
@@ -388,8 +388,10 @@ void DialControl::SetRotation( sal_Int32 nAngle )
|
||||
SetRotation( nAngle, false );
|
||||
}
|
||||
|
||||
void DialControl::SetLinkedField( NumericField* pField )
|
||||
void DialControl::SetLinkedField( NumericField* pField, sal_Int32 nDecimalPlaces )
|
||||
{
|
||||
mpImpl->mnLinkedFieldValueMultiplyer = 100 / pow(10, nDecimalPlaces);
|
||||
|
||||
// remove modify handler from old linked field
|
||||
ImplSetFieldLink( Link() );
|
||||
// remember the new linked field
|
||||
@@ -453,14 +455,15 @@ void DialControl::SetRotation( sal_Int32 nAngle, bool bBroadcast )
|
||||
bool bOldSel = mpImpl->mbNoRot;
|
||||
mpImpl->mbNoRot = false;
|
||||
|
||||
while( nAngle < 0 ) nAngle += 36000;
|
||||
nAngle = (((nAngle + 50) / 100) * 100) % 36000;
|
||||
while( nAngle < 0 )
|
||||
nAngle += 36000;
|
||||
|
||||
if( !bOldSel || (mpImpl->mnAngle != nAngle) )
|
||||
{
|
||||
mpImpl->mnAngle = nAngle;
|
||||
InvalidateControl();
|
||||
if( mpImpl->mpLinkField )
|
||||
mpImpl->mpLinkField->SetValue( static_cast< long >( GetRotation() / 100 ) );
|
||||
mpImpl->mpLinkField->SetValue( static_cast< long >( GetRotation() / mpImpl->mnLinkedFieldValueMultiplyer ) );
|
||||
if( bBroadcast )
|
||||
mpImpl->maModifyHdl.Call( this );
|
||||
}
|
||||
@@ -493,6 +496,8 @@ void DialControl::HandleMouseEvent( const Point& rPos, bool bInitial )
|
||||
nAngle = 36000 - nAngle;
|
||||
if( bInitial ) // round to entire 15 degrees
|
||||
nAngle = ((nAngle + 750) / 1500) * 1500;
|
||||
// Round up to 1 degree
|
||||
nAngle = (((nAngle + 50) / 100) * 100) % 36000;
|
||||
SetRotation( nAngle, true );
|
||||
}
|
||||
}
|
||||
@@ -511,7 +516,7 @@ void DialControl::HandleEscapeEvent()
|
||||
IMPL_LINK( DialControl, LinkedFieldModifyHdl, NumericField*, pField )
|
||||
{
|
||||
if( pField )
|
||||
SetRotation( static_cast< sal_Int32 >( pField->GetValue() * 100 ), false );
|
||||
SetRotation( static_cast< sal_Int32 >( pField->GetValue() * mpImpl->mnLinkedFieldValueMultiplyer ), false );
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user