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);
|
aCtlRect.SetAccessibleRelationMemberOf(&aFlPosition);
|
||||||
aCtlAngle.SetAccessibleRelationLabeledBy(&aFtAnglePresets);
|
aCtlAngle.SetAccessibleRelationLabeledBy(&aFtAnglePresets);
|
||||||
aCtlAngle.SetAccessibleRelationMemberOf(&aFlAngle);
|
aCtlAngle.SetAccessibleRelationMemberOf(&aFlAngle);
|
||||||
aCtlAngle.SetLinkedField( &maNfAngle );
|
aCtlAngle.SetLinkedField( &maNfAngle, 2 );
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
@@ -390,8 +390,9 @@ TabPage RID_SVXPAGE_ANGLE
|
|||||||
Repeat = TRUE ;
|
Repeat = TRUE ;
|
||||||
Spin = TRUE ;
|
Spin = TRUE ;
|
||||||
Minimum = 0 ;
|
Minimum = 0 ;
|
||||||
Maximum = 359 ;
|
Maximum = 35999 ;
|
||||||
SpinSize = 5 ;
|
DecimalDigits = 2 ;
|
||||||
|
SpinSize = 10 ;
|
||||||
};
|
};
|
||||||
FixedText FT_ANGLEPRESETS
|
FixedText FT_ANGLEPRESETS
|
||||||
{
|
{
|
||||||
|
@@ -109,8 +109,13 @@ public:
|
|||||||
/** Sets the rotation to the passed value (in 1/100 degrees). */
|
/** Sets the rotation to the passed value (in 1/100 degrees). */
|
||||||
void SetRotation( sal_Int32 nAngle );
|
void SetRotation( sal_Int32 nAngle );
|
||||||
|
|
||||||
/** Links the passed numeric edit field to the control (bi-directional). */
|
/** Links the passed numeric edit field to the control (bi-directional).
|
||||||
void SetLinkedField( NumericField* pField );
|
* 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. */
|
/** Returns the linked numeric edit field, or 0. */
|
||||||
NumericField* GetLinkedField() const;
|
NumericField* GetLinkedField() const;
|
||||||
|
|
||||||
@@ -133,6 +138,7 @@ protected:
|
|||||||
::boost::scoped_ptr<DialControlBmp> mpBmpBuffered;
|
::boost::scoped_ptr<DialControlBmp> mpBmpBuffered;
|
||||||
Link maModifyHdl;
|
Link maModifyHdl;
|
||||||
NumericField* mpLinkField;
|
NumericField* mpLinkField;
|
||||||
|
sal_Int32 mnLinkedFieldValueMultiplyer;
|
||||||
Size maWinSize;
|
Size maWinSize;
|
||||||
Font maWinFont;
|
Font maWinFont;
|
||||||
sal_Int32 mnAngle;
|
sal_Int32 mnAngle;
|
||||||
|
@@ -388,8 +388,10 @@ void DialControl::SetRotation( sal_Int32 nAngle )
|
|||||||
SetRotation( nAngle, false );
|
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
|
// remove modify handler from old linked field
|
||||||
ImplSetFieldLink( Link() );
|
ImplSetFieldLink( Link() );
|
||||||
// remember the new linked field
|
// remember the new linked field
|
||||||
@@ -453,14 +455,15 @@ void DialControl::SetRotation( sal_Int32 nAngle, bool bBroadcast )
|
|||||||
bool bOldSel = mpImpl->mbNoRot;
|
bool bOldSel = mpImpl->mbNoRot;
|
||||||
mpImpl->mbNoRot = false;
|
mpImpl->mbNoRot = false;
|
||||||
|
|
||||||
while( nAngle < 0 ) nAngle += 36000;
|
while( nAngle < 0 )
|
||||||
nAngle = (((nAngle + 50) / 100) * 100) % 36000;
|
nAngle += 36000;
|
||||||
|
|
||||||
if( !bOldSel || (mpImpl->mnAngle != nAngle) )
|
if( !bOldSel || (mpImpl->mnAngle != nAngle) )
|
||||||
{
|
{
|
||||||
mpImpl->mnAngle = nAngle;
|
mpImpl->mnAngle = nAngle;
|
||||||
InvalidateControl();
|
InvalidateControl();
|
||||||
if( mpImpl->mpLinkField )
|
if( mpImpl->mpLinkField )
|
||||||
mpImpl->mpLinkField->SetValue( static_cast< long >( GetRotation() / 100 ) );
|
mpImpl->mpLinkField->SetValue( static_cast< long >( GetRotation() / mpImpl->mnLinkedFieldValueMultiplyer ) );
|
||||||
if( bBroadcast )
|
if( bBroadcast )
|
||||||
mpImpl->maModifyHdl.Call( this );
|
mpImpl->maModifyHdl.Call( this );
|
||||||
}
|
}
|
||||||
@@ -493,6 +496,8 @@ void DialControl::HandleMouseEvent( const Point& rPos, bool bInitial )
|
|||||||
nAngle = 36000 - nAngle;
|
nAngle = 36000 - nAngle;
|
||||||
if( bInitial ) // round to entire 15 degrees
|
if( bInitial ) // round to entire 15 degrees
|
||||||
nAngle = ((nAngle + 750) / 1500) * 1500;
|
nAngle = ((nAngle + 750) / 1500) * 1500;
|
||||||
|
// Round up to 1 degree
|
||||||
|
nAngle = (((nAngle + 50) / 100) * 100) % 36000;
|
||||||
SetRotation( nAngle, true );
|
SetRotation( nAngle, true );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -511,7 +516,7 @@ void DialControl::HandleEscapeEvent()
|
|||||||
IMPL_LINK( DialControl, LinkedFieldModifyHdl, NumericField*, pField )
|
IMPL_LINK( DialControl, LinkedFieldModifyHdl, NumericField*, pField )
|
||||||
{
|
{
|
||||||
if( pField )
|
if( pField )
|
||||||
SetRotation( static_cast< sal_Int32 >( pField->GetValue() * 100 ), false );
|
SetRotation( static_cast< sal_Int32 >( pField->GetValue() * mpImpl->mnLinkedFieldValueMultiplyer ), false );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user