2023-12-31 21:55:35 +01:00
# include "lc_global.h"
# include "lc_propertieswidget.h"
2024-01-15 02:41:01 +01:00
# include "lc_keyframewidget.h"
2023-12-31 21:55:35 +01:00
# include "object.h"
# include "piece.h"
# include "camera.h"
# include "light.h"
# include "pieceinf.h"
# include "lc_mainwindow.h"
# include "lc_collapsiblewidget.h"
# include "lc_colorpicker.h"
# include "lc_qutils.h"
lcPropertiesWidget : : lcPropertiesWidget ( QWidget * Parent )
: QWidget ( Parent )
{
2024-01-07 02:33:43 +01:00
CreateWidgets ( ) ;
SetLayoutMode ( LayoutMode : : Empty ) ;
2023-12-31 21:55:35 +01:00
}
2024-01-15 02:41:01 +01:00
lcObjectPropertyId lcPropertiesWidget : : GetEditorWidgetPropertyId ( QWidget * Widget ) const
2023-12-31 21:55:35 +01:00
{
if ( ! Widget )
2024-01-07 20:39:34 +01:00
return lcObjectPropertyId : : Count ;
2023-12-31 21:55:35 +01:00
for ( size_t Index = 0 ; Index < mPropertyWidgets . size ( ) ; Index + + )
2024-01-15 02:41:01 +01:00
if ( mPropertyWidgets [ Index ] . Editor = = Widget )
return static_cast < lcObjectPropertyId > ( Index ) ;
return lcObjectPropertyId : : Count ;
}
lcObjectPropertyId lcPropertiesWidget : : GetKeyFrameWidgetPropertyId ( QWidget * Widget ) const
{
if ( ! Widget )
return lcObjectPropertyId : : Count ;
for ( size_t Index = 0 ; Index < mPropertyWidgets . size ( ) ; Index + + )
if ( mPropertyWidgets [ Index ] . KeyFrame = = Widget )
2024-01-07 20:39:34 +01:00
return static_cast < lcObjectPropertyId > ( Index ) ;
2023-12-31 21:55:35 +01:00
2024-01-07 20:39:34 +01:00
return lcObjectPropertyId : : Count ;
2023-12-31 21:55:35 +01:00
}
2023-12-31 23:00:33 +01:00
void lcPropertiesWidget : : CategoryStateChanged ( bool Expanded )
2023-12-31 21:55:35 +01:00
{
2023-12-31 23:00:33 +01:00
QObject * Button = sender ( ) ;
2023-12-31 21:55:35 +01:00
2024-01-07 02:33:43 +01:00
for ( CategoryWidgets & Category : mCategoryWidgets )
2023-12-31 23:00:33 +01:00
{
2024-01-07 02:33:43 +01:00
if ( Category . Button = = Button )
2023-12-31 23:00:33 +01:00
{
2024-01-07 02:33:43 +01:00
SetCategoryWidgetsVisible ( Category , Expanded ) ;
2023-12-31 23:00:33 +01:00
break ;
}
}
}
2023-12-31 21:55:35 +01:00
2024-01-07 02:33:43 +01:00
void lcPropertiesWidget : : AddCategory ( CategoryIndex Index , const QString & Title )
2023-12-31 23:00:33 +01:00
{
2024-01-07 02:33:43 +01:00
mCurrentCategory = & mCategoryWidgets [ static_cast < int > ( Index ) ] ;
2023-12-31 23:00:33 +01:00
lcCollapsibleWidgetButton * CategoryButton = new lcCollapsibleWidgetButton ( Title ) ;
mLayout - > addWidget ( CategoryButton , mLayoutRow , 0 , 1 , - 1 ) ;
mCurrentCategory - > Button = CategoryButton ;
connect ( CategoryButton , & lcCollapsibleWidgetButton : : StateChanged , this , & lcPropertiesWidget : : CategoryStateChanged ) ;
2023-12-31 21:55:35 +01:00
2023-12-31 23:00:33 +01:00
mLayoutRow + + ;
2023-12-31 21:55:35 +01:00
}
2023-12-31 23:00:33 +01:00
void lcPropertiesWidget : : AddSpacing ( )
2023-12-31 21:55:35 +01:00
{
2023-12-31 23:00:33 +01:00
mLayout - > setRowMinimumHeight ( mLayoutRow , 5 ) ;
mCurrentCategory - > SpacingRows . push_back ( mLayoutRow ) ;
mLayoutRow + + ;
2023-12-31 21:55:35 +01:00
}
2024-01-07 20:39:34 +01:00
void lcPropertiesWidget : : AddLabel ( lcObjectPropertyId PropertyId , const QString & Text , const QString & ToolTip )
2023-12-31 21:55:35 +01:00
{
QLabel * Label = new QLabel ( Text , this ) ;
Label - > setAlignment ( Qt : : AlignRight | Qt : : AlignVCenter ) ;
Label - > setToolTip ( ToolTip ) ;
2023-12-31 23:00:33 +01:00
mLayout - > addWidget ( Label , mLayoutRow , 1 ) ;
2024-01-07 02:33:43 +01:00
2024-01-07 20:39:34 +01:00
mPropertyWidgets [ static_cast < int > ( PropertyId ) ] . Label = Label ;
2023-12-31 21:55:35 +01:00
}
2024-01-15 02:41:01 +01:00
void lcPropertiesWidget : : KeyFrameChanged ( )
{
QCheckBox * Widget = qobject_cast < QCheckBox * > ( sender ( ) ) ;
lcObjectPropertyId PropertyId = GetKeyFrameWidgetPropertyId ( Widget ) ;
if ( PropertyId = = lcObjectPropertyId : : Count )
return ;
lcModel * Model = gMainWindow - > GetActiveModel ( ) ;
if ( ! Model )
return ;
2024-01-21 21:53:18 +01:00
if ( mFocusObject )
Model - > SetObjectsKeyFrame ( { mFocusObject } , PropertyId , Widget - > isChecked ( ) ) ;
else
Model - > SetObjectsKeyFrame ( mSelection , PropertyId , Widget - > isChecked ( ) ) ;
2024-01-15 02:41:01 +01:00
}
void lcPropertiesWidget : : UpdateKeyFrameWidget ( lcObjectPropertyId PropertyId )
{
lcKeyFrameWidget * Widget = mPropertyWidgets [ static_cast < int > ( PropertyId ) ] . KeyFrame ;
if ( Widget )
{
QSignalBlocker Blocker ( Widget ) ;
lcModel * Model = gMainWindow - > GetActiveModel ( ) ;
2024-01-21 21:53:18 +01:00
if ( Model )
{
const lcStep Step = Model - > GetCurrentStep ( ) ;
if ( mFocusObject )
Widget - > setChecked ( mFocusObject - > HasKeyFrame ( PropertyId , Step ) ) ;
else
{
int KeyFrameCount = 0 , NonKeyFrameCount = 0 ;
for ( const lcObject * Object : mSelection )
{
if ( Object - > HasKeyFrame ( PropertyId , Step ) )
KeyFrameCount + + ;
else
NonKeyFrameCount + + ;
}
if ( KeyFrameCount & & NonKeyFrameCount )
Widget - > setCheckState ( Qt : : PartiallyChecked ) ;
else
Widget - > setCheckState ( KeyFrameCount ! = 0 ? Qt : : Checked : Qt : : Unchecked ) ;
}
}
2024-01-15 02:41:01 +01:00
}
}
void lcPropertiesWidget : : AddKeyFrameWidget ( lcObjectPropertyId PropertyId )
{
lcKeyFrameWidget * Widget = new lcKeyFrameWidget ( this ) ;
Widget - > setToolTip ( tr ( " Toggle Key Frame " ) ) ;
2024-01-21 21:53:18 +01:00
connect ( Widget , & QCheckBox : : stateChanged , this , & lcPropertiesWidget : : KeyFrameChanged ) ;
2024-01-15 02:41:01 +01:00
mLayout - > addWidget ( Widget , mLayoutRow , 3 ) ;
mPropertyWidgets [ static_cast < int > ( PropertyId ) ] . KeyFrame = Widget ;
}
2024-01-06 03:56:43 +01:00
void lcPropertiesWidget : : BoolChanged ( )
{
QCheckBox * Widget = qobject_cast < QCheckBox * > ( sender ( ) ) ;
2024-01-15 02:41:01 +01:00
lcObjectPropertyId PropertyId = GetEditorWidgetPropertyId ( Widget ) ;
2024-01-06 03:56:43 +01:00
2024-01-07 20:39:34 +01:00
if ( PropertyId = = lcObjectPropertyId : : Count )
2024-01-06 03:56:43 +01:00
return ;
lcModel * Model = gMainWindow - > GetActiveModel ( ) ;
if ( ! Model )
return ;
lcLight * Light = dynamic_cast < lcLight * > ( mFocusObject ) ;
bool Value = Widget - > isChecked ( ) ;
if ( Light )
{
2024-01-07 20:39:34 +01:00
if ( PropertyId = = lcObjectPropertyId : : LightCastShadow )
2024-01-06 03:56:43 +01:00
{
Model - > SetLightCastShadow ( Light , Value ) ;
}
}
}
2024-01-07 20:39:34 +01:00
void lcPropertiesWidget : : UpdateBool ( lcObjectPropertyId PropertyId , bool Value )
2024-01-06 03:56:43 +01:00
{
2024-01-15 02:41:01 +01:00
QCheckBox * Widget = qobject_cast < QCheckBox * > ( mPropertyWidgets [ static_cast < int > ( PropertyId ) ] . Editor ) ;
2024-01-06 03:56:43 +01:00
if ( Widget )
{
QSignalBlocker Blocker ( Widget ) ;
Widget - > setChecked ( Value ) ;
}
2024-01-15 02:41:01 +01:00
UpdateKeyFrameWidget ( PropertyId ) ;
2024-01-06 03:56:43 +01:00
}
2024-01-15 02:41:01 +01:00
void lcPropertiesWidget : : AddBoolProperty ( lcObjectPropertyId PropertyId , const QString & Text , const QString & ToolTip , bool SupportsKeyFrames )
2023-12-31 21:55:35 +01:00
{
2024-01-07 20:39:34 +01:00
AddLabel ( PropertyId , Text , ToolTip ) ;
2023-12-31 21:55:35 +01:00
QCheckBox * Widget = new QCheckBox ( this ) ;
Widget - > setToolTip ( ToolTip ) ;
2024-01-06 03:56:43 +01:00
connect ( Widget , & QCheckBox : : toggled , this , & lcPropertiesWidget : : BoolChanged ) ;
2023-12-31 21:55:35 +01:00
2023-12-31 23:00:33 +01:00
mLayout - > addWidget ( Widget , mLayoutRow , 2 ) ;
2023-12-31 21:55:35 +01:00
2024-01-07 20:39:34 +01:00
mCurrentCategory - > Properties . push_back ( PropertyId ) ;
2024-01-15 02:41:01 +01:00
mPropertyWidgets [ static_cast < int > ( PropertyId ) ] . Editor = Widget ;
if ( SupportsKeyFrames )
AddKeyFrameWidget ( PropertyId ) ;
2023-12-31 21:55:35 +01:00
2023-12-31 23:00:33 +01:00
mLayoutRow + + ;
2023-12-31 21:55:35 +01:00
}
void lcPropertiesWidget : : FloatChanged ( )
{
QLineEdit * Widget = qobject_cast < QLineEdit * > ( sender ( ) ) ;
2024-01-15 02:41:01 +01:00
lcObjectPropertyId PropertyId = GetEditorWidgetPropertyId ( Widget ) ;
2023-12-31 21:55:35 +01:00
2024-01-07 20:39:34 +01:00
if ( PropertyId = = lcObjectPropertyId : : Count )
2023-12-31 21:55:35 +01:00
return ;
lcModel * Model = gMainWindow - > GetActiveModel ( ) ;
2024-01-06 03:56:43 +01:00
if ( ! Model )
return ;
2023-12-31 21:55:35 +01:00
lcPiece * Piece = dynamic_cast < lcPiece * > ( mFocusObject ) ;
2024-01-02 03:57:54 +01:00
lcCamera * Camera = dynamic_cast < lcCamera * > ( mFocusObject ) ;
2023-12-31 21:55:35 +01:00
lcLight * Light = dynamic_cast < lcLight * > ( mFocusObject ) ;
float Value = lcParseValueLocalized ( Widget - > text ( ) ) ;
// todo: mouse drag
2024-01-02 03:57:54 +01:00
if ( Piece | | Light )
2023-12-31 21:55:35 +01:00
{
2024-01-07 20:39:34 +01:00
if ( PropertyId = = lcObjectPropertyId : : ObjectPositionX | | PropertyId = = lcObjectPropertyId : : ObjectPositionY | | PropertyId = = lcObjectPropertyId : : ObjectPositionZ )
2024-01-02 03:57:54 +01:00
{
lcVector3 Center ;
lcMatrix33 RelativeRotation ;
Model - > GetMoveRotateTransform ( Center , RelativeRotation ) ;
lcVector3 Position = Center ;
2024-01-07 20:39:34 +01:00
if ( PropertyId = = lcObjectPropertyId : : ObjectPositionX )
2024-01-02 03:57:54 +01:00
Position [ 0 ] = Value ;
2024-01-07 20:39:34 +01:00
else if ( PropertyId = = lcObjectPropertyId : : ObjectPositionY )
2024-01-02 03:57:54 +01:00
Position [ 1 ] = Value ;
2024-01-07 20:39:34 +01:00
else if ( PropertyId = = lcObjectPropertyId : : ObjectPositionZ )
2024-01-02 03:57:54 +01:00
Position [ 2 ] = Value ;
lcVector3 Distance = Position - Center ;
Model - > MoveSelectedObjects ( Distance , Distance , false , true , true , true ) ;
}
2024-01-07 20:39:34 +01:00
else if ( PropertyId = = lcObjectPropertyId : : ObjectRotationX | | PropertyId = = lcObjectPropertyId : : ObjectRotationY | | PropertyId = = lcObjectPropertyId : : ObjectRotationZ )
2024-01-02 03:57:54 +01:00
{
lcVector3 InitialRotation ( 0.0f , 0.0f , 0.0f ) ;
2023-12-31 21:55:35 +01:00
2024-01-02 03:57:54 +01:00
if ( Piece )
InitialRotation = lcMatrix44ToEulerAngles ( Piece - > mModelWorld ) * LC_RTOD ;
else if ( Light )
InitialRotation = lcMatrix44ToEulerAngles ( Light - > GetWorldMatrix ( ) ) * LC_RTOD ;
2023-12-31 21:55:35 +01:00
2024-01-02 03:57:54 +01:00
lcVector3 Rotation = InitialRotation ;
2023-12-31 21:55:35 +01:00
2024-01-07 20:39:34 +01:00
if ( PropertyId = = lcObjectPropertyId : : ObjectRotationX )
2024-01-02 03:57:54 +01:00
Rotation [ 0 ] = Value ;
2024-01-07 20:39:34 +01:00
else if ( PropertyId = = lcObjectPropertyId : : ObjectRotationY )
2024-01-02 03:57:54 +01:00
Rotation [ 1 ] = Value ;
2024-01-07 20:39:34 +01:00
else if ( PropertyId = = lcObjectPropertyId : : ObjectRotationZ )
2024-01-02 03:57:54 +01:00
Rotation [ 2 ] = Value ;
Model - > RotateSelectedObjects ( Rotation - InitialRotation , true , false , true , true ) ;
}
2023-12-31 21:55:35 +01:00
}
2024-01-02 03:57:54 +01:00
if ( Camera )
2023-12-31 21:55:35 +01:00
{
2024-01-07 20:39:34 +01:00
if ( PropertyId = = lcObjectPropertyId : : CameraPositionX | | PropertyId = = lcObjectPropertyId : : CameraPositionY | | PropertyId = = lcObjectPropertyId : : CameraPositionZ )
2024-01-02 03:57:54 +01:00
{
lcVector3 Center = Camera - > mPosition ;
lcVector3 Position = Center ;
2023-12-31 21:55:35 +01:00
2024-01-07 20:39:34 +01:00
if ( PropertyId = = lcObjectPropertyId : : CameraPositionX )
2024-01-02 03:57:54 +01:00
Position [ 0 ] = Value ;
2024-01-07 20:39:34 +01:00
else if ( PropertyId = = lcObjectPropertyId : : CameraPositionY )
2024-01-02 03:57:54 +01:00
Position [ 1 ] = Value ;
2024-01-07 20:39:34 +01:00
else if ( PropertyId = = lcObjectPropertyId : : CameraPositionZ )
2024-01-02 03:57:54 +01:00
Position [ 2 ] = Value ;
2023-12-31 21:55:35 +01:00
2024-01-02 03:57:54 +01:00
lcVector3 Distance = Position - Center ;
2023-12-31 21:55:35 +01:00
2024-01-02 03:57:54 +01:00
Model - > MoveSelectedObjects ( Distance , Distance , false , false , true , true ) ;
}
2024-01-07 20:39:34 +01:00
else if ( PropertyId = = lcObjectPropertyId : : CameraTargetX | | PropertyId = = lcObjectPropertyId : : CameraTargetY | | PropertyId = = lcObjectPropertyId : : CameraTargetZ )
2024-01-02 03:57:54 +01:00
{
lcVector3 Center = Camera - > mTargetPosition ;
lcVector3 Position = Center ;
2023-12-31 21:55:35 +01:00
2024-01-07 20:39:34 +01:00
if ( PropertyId = = lcObjectPropertyId : : CameraTargetX )
2024-01-02 03:57:54 +01:00
Position [ 0 ] = Value ;
2024-01-07 20:39:34 +01:00
else if ( PropertyId = = lcObjectPropertyId : : CameraTargetY )
2024-01-02 03:57:54 +01:00
Position [ 1 ] = Value ;
2024-01-07 20:39:34 +01:00
else if ( PropertyId = = lcObjectPropertyId : : CameraTargetZ )
2024-01-02 03:57:54 +01:00
Position [ 2 ] = Value ;
lcVector3 Distance = Position - Center ;
Model - > MoveSelectedObjects ( Distance , Distance , false , false , true , true ) ;
}
2024-01-07 20:39:34 +01:00
else if ( PropertyId = = lcObjectPropertyId : : CameraUpX | | PropertyId = = lcObjectPropertyId : : CameraUpY | | PropertyId = = lcObjectPropertyId : : CameraUpZ )
2024-01-02 03:57:54 +01:00
{
lcVector3 Center = Camera - > mUpVector ;
lcVector3 Position = Center ;
2024-01-07 20:39:34 +01:00
if ( PropertyId = = lcObjectPropertyId : : CameraUpX )
2024-01-02 03:57:54 +01:00
Position [ 0 ] = Value ;
2024-01-07 20:39:34 +01:00
else if ( PropertyId = = lcObjectPropertyId : : CameraUpY )
2024-01-02 03:57:54 +01:00
Position [ 1 ] = Value ;
2024-01-07 20:39:34 +01:00
else if ( PropertyId = = lcObjectPropertyId : : CameraUpZ )
2024-01-02 03:57:54 +01:00
Position [ 2 ] = Value ;
lcVector3 Distance = Position - Center ;
Model - > MoveSelectedObjects ( Distance , Distance , false , false , true , true ) ;
}
2024-01-07 20:39:34 +01:00
else if ( PropertyId = = lcObjectPropertyId : : CameraFOV )
2024-01-02 03:57:54 +01:00
{
Model - > SetCameraFOV ( Camera , Value ) ;
}
2024-01-07 20:39:34 +01:00
else if ( PropertyId = = lcObjectPropertyId : : CameraNear )
2024-01-02 03:57:54 +01:00
{
Model - > SetCameraZNear ( Camera , Value ) ;
}
2024-01-07 20:39:34 +01:00
else if ( PropertyId = = lcObjectPropertyId : : CameraFar )
2024-01-02 03:57:54 +01:00
{
Model - > SetCameraZFar ( Camera , Value ) ;
}
2023-12-31 21:55:35 +01:00
}
2024-01-06 03:56:43 +01:00
if ( Light )
{
2024-01-07 20:39:34 +01:00
if ( PropertyId = = lcObjectPropertyId : : LightPower )
2024-01-06 03:56:43 +01:00
{
Model - > SetLightPower ( Light , Value ) ;
}
2024-01-07 20:39:34 +01:00
else if ( PropertyId = = lcObjectPropertyId : : LightAttenuationDistance )
2024-01-06 03:56:43 +01:00
{
Model - > SetLightAttenuationDistance ( Light , Value ) ;
}
2024-01-07 20:39:34 +01:00
else if ( PropertyId = = lcObjectPropertyId : : LightAttenuationPower )
2024-01-06 03:56:43 +01:00
{
Model - > SetLightAttenuationPower ( Light , Value ) ;
}
2024-01-07 20:39:34 +01:00
else if ( PropertyId = = lcObjectPropertyId : : LightPointSize | | PropertyId = = lcObjectPropertyId : : LightSpotSize | | PropertyId = = lcObjectPropertyId : : LightDirectionalSize | | PropertyId = = lcObjectPropertyId : : LightAreaSizeX )
2024-01-06 03:56:43 +01:00
{
lcVector2 LightSize = Light - > GetSize ( ) ;
LightSize [ 0 ] = Value ;
Model - > SetLightSize ( Light , LightSize ) ;
}
2024-01-07 20:39:34 +01:00
else if ( PropertyId = = lcObjectPropertyId : : LightAreaSizeY )
2024-01-06 03:56:43 +01:00
{
lcVector2 LightSize = Light - > GetSize ( ) ;
LightSize [ 1 ] = Value ;
Model - > SetLightSize ( Light , LightSize ) ;
}
2024-01-07 20:39:34 +01:00
else if ( PropertyId = = lcObjectPropertyId : : LightSpotConeAngle )
2024-01-06 03:56:43 +01:00
{
Model - > SetSpotLightConeAngle ( Light , Value ) ;
}
2024-01-07 20:39:34 +01:00
else if ( PropertyId = = lcObjectPropertyId : : LightSpotPenumbraAngle )
2024-01-06 03:56:43 +01:00
{
Model - > SetSpotLightPenumbraAngle ( Light , Value ) ;
}
2024-01-07 20:39:34 +01:00
else if ( PropertyId = = lcObjectPropertyId : : LightSpotTightness )
2024-01-06 03:56:43 +01:00
{
Model - > SetSpotLightTightness ( Light , Value ) ;
}
}
2023-12-31 21:55:35 +01:00
}
2024-01-07 20:39:34 +01:00
void lcPropertiesWidget : : UpdateFloat ( lcObjectPropertyId PropertyId , float Value )
2023-12-31 21:55:35 +01:00
{
2024-01-15 02:41:01 +01:00
QLineEdit * Widget = qobject_cast < QLineEdit * > ( mPropertyWidgets [ static_cast < int > ( PropertyId ) ] . Editor ) ;
2023-12-31 21:55:35 +01:00
if ( Widget )
{
QSignalBlocker Blocker ( Widget ) ;
Widget - > setText ( lcFormatValueLocalized ( Value ) ) ;
}
2024-01-15 02:41:01 +01:00
UpdateKeyFrameWidget ( PropertyId ) ;
2023-12-31 21:55:35 +01:00
}
2024-01-15 02:41:01 +01:00
void lcPropertiesWidget : : AddFloatProperty ( lcObjectPropertyId PropertyId , const QString & Text , const QString & ToolTip , bool SupportsKeyFrames , float Min , float Max )
2023-12-31 21:55:35 +01:00
{
2024-01-07 20:39:34 +01:00
AddLabel ( PropertyId , Text , ToolTip ) ;
2023-12-31 21:55:35 +01:00
QLineEdit * Widget = new QLineEdit ( this ) ;
Widget - > setToolTip ( ToolTip ) ;
Widget - > setValidator ( new QDoubleValidator ( Min , Max , 1 , Widget ) ) ;
connect ( Widget , & QLineEdit : : editingFinished , this , & lcPropertiesWidget : : FloatChanged ) ;
2023-12-31 23:00:33 +01:00
mLayout - > addWidget ( Widget , mLayoutRow , 2 ) ;
2023-12-31 21:55:35 +01:00
2024-01-07 20:39:34 +01:00
mCurrentCategory - > Properties . push_back ( PropertyId ) ;
2024-01-15 02:41:01 +01:00
mPropertyWidgets [ static_cast < int > ( PropertyId ) ] . Editor = Widget ;
if ( SupportsKeyFrames )
AddKeyFrameWidget ( PropertyId ) ;
2023-12-31 21:55:35 +01:00
2023-12-31 23:00:33 +01:00
mLayoutRow + + ;
2023-12-31 21:55:35 +01:00
}
2024-01-06 03:56:43 +01:00
void lcPropertiesWidget : : IntegerChanged ( )
{
QLineEdit * Widget = qobject_cast < QLineEdit * > ( sender ( ) ) ;
2024-01-15 02:41:01 +01:00
lcObjectPropertyId PropertyId = GetEditorWidgetPropertyId ( Widget ) ;
2024-01-06 03:56:43 +01:00
2024-01-07 20:39:34 +01:00
if ( PropertyId = = lcObjectPropertyId : : Count )
2024-01-06 03:56:43 +01:00
return ;
lcModel * Model = gMainWindow - > GetActiveModel ( ) ;
if ( ! Model )
return ;
lcLight * Light = dynamic_cast < lcLight * > ( mFocusObject ) ;
int Value = Widget - > text ( ) . toInt ( ) ;
// todo: mouse drag
if ( Light )
{
2024-01-07 20:39:34 +01:00
if ( PropertyId = = lcObjectPropertyId : : LightAreaGridX )
2024-01-06 03:56:43 +01:00
{
lcVector2i AreaGrid = Light - > GetAreaGrid ( ) ;
AreaGrid . x = Value ;
Model - > SetLightAreaGrid ( Light , AreaGrid ) ;
}
2024-01-07 20:39:34 +01:00
else if ( PropertyId = = lcObjectPropertyId : : LightAreaGridY )
2024-01-06 03:56:43 +01:00
{
lcVector2i AreaGrid = Light - > GetAreaGrid ( ) ;
AreaGrid . y = Value ;
Model - > SetLightAreaGrid ( Light , AreaGrid ) ;
}
}
}
2024-01-07 20:39:34 +01:00
void lcPropertiesWidget : : UpdateInteger ( lcObjectPropertyId PropertyId , int Value )
2024-01-06 03:56:43 +01:00
{
2024-01-15 02:41:01 +01:00
QLineEdit * Widget = qobject_cast < QLineEdit * > ( mPropertyWidgets [ static_cast < int > ( PropertyId ) ] . Editor ) ;
2024-01-06 03:56:43 +01:00
if ( Widget )
{
QSignalBlocker Blocker ( Widget ) ;
Widget - > setText ( lcFormatValueLocalized ( Value ) ) ;
}
2024-01-15 02:41:01 +01:00
UpdateKeyFrameWidget ( PropertyId ) ;
2024-01-06 03:56:43 +01:00
}
2024-01-15 02:41:01 +01:00
void lcPropertiesWidget : : AddIntegerProperty ( lcObjectPropertyId PropertyId , const QString & Text , const QString & ToolTip , bool SupportsKeyFrames , int Min , int Max )
2023-12-31 21:55:35 +01:00
{
2024-01-07 20:39:34 +01:00
AddLabel ( PropertyId , Text , ToolTip ) ;
2023-12-31 21:55:35 +01:00
2024-01-06 03:56:43 +01:00
QLineEdit * Widget = new QLineEdit ( this ) ;
2023-12-31 21:55:35 +01:00
Widget - > setToolTip ( ToolTip ) ;
2024-01-06 03:56:43 +01:00
Widget - > setValidator ( new QIntValidator ( Min , Max , Widget ) ) ;
connect ( Widget , & QLineEdit : : editingFinished , this , & lcPropertiesWidget : : IntegerChanged ) ;
2023-12-31 23:00:33 +01:00
mLayout - > addWidget ( Widget , mLayoutRow , 2 ) ;
2023-12-31 21:55:35 +01:00
2024-01-07 20:39:34 +01:00
mCurrentCategory - > Properties . push_back ( PropertyId ) ;
2024-01-15 02:41:01 +01:00
mPropertyWidgets [ static_cast < int > ( PropertyId ) ] . Editor = Widget ;
if ( SupportsKeyFrames )
AddKeyFrameWidget ( PropertyId ) ;
2023-12-31 21:55:35 +01:00
2023-12-31 23:00:33 +01:00
mLayoutRow + + ;
2023-12-31 21:55:35 +01:00
}
void lcPropertiesWidget : : StepNumberChanged ( )
{
QLineEdit * Widget = qobject_cast < QLineEdit * > ( sender ( ) ) ;
2024-01-15 02:41:01 +01:00
lcObjectPropertyId PropertyId = GetEditorWidgetPropertyId ( Widget ) ;
2023-12-31 21:55:35 +01:00
2024-01-07 20:39:34 +01:00
if ( PropertyId = = lcObjectPropertyId : : Count )
2023-12-31 21:55:35 +01:00
return ;
lcModel * Model = gMainWindow - > GetActiveModel ( ) ;
if ( ! Model )
return ;
bool Ok = true ;
QString Text = Widget - > text ( ) ;
2024-01-07 20:39:34 +01:00
lcStep Step = Text . isEmpty ( ) & & PropertyId = = lcObjectPropertyId : : PieceStepHide ? LC_STEP_MAX : Text . toUInt ( & Ok ) ;
2023-12-31 21:55:35 +01:00
if ( ! Ok )
return ;
2024-01-07 20:39:34 +01:00
if ( PropertyId = = lcObjectPropertyId : : PieceStepShow )
2023-12-31 21:55:35 +01:00
{
Model - > SetSelectedPiecesStepShow ( Step ) ;
}
2024-01-07 20:39:34 +01:00
else if ( PropertyId = = lcObjectPropertyId : : PieceStepHide )
2023-12-31 21:55:35 +01:00
{
Model - > SetSelectedPiecesStepHide ( Step ) ;
}
}
2024-01-07 20:39:34 +01:00
void lcPropertiesWidget : : UpdateStepNumber ( lcObjectPropertyId PropertyId , lcStep Step , lcStep Min , lcStep Max )
2023-12-31 21:55:35 +01:00
{
2024-01-15 02:41:01 +01:00
QLineEdit * Widget = qobject_cast < QLineEdit * > ( mPropertyWidgets [ static_cast < int > ( PropertyId ) ] . Editor ) ;
2023-12-31 21:55:35 +01:00
if ( Widget )
{
QSignalBlocker Blocker ( Widget ) ;
2024-01-07 20:39:34 +01:00
Widget - > setValidator ( new lcStepValidator ( Min , Max , PropertyId = = lcObjectPropertyId : : PieceStepHide , Widget ) ) ;
2023-12-31 21:55:35 +01:00
Widget - > setText ( Step = = LC_STEP_MAX ? QString ( ) : QString : : number ( Step ) ) ;
}
2024-01-15 02:41:01 +01:00
UpdateKeyFrameWidget ( PropertyId ) ;
2023-12-31 21:55:35 +01:00
}
2024-01-15 02:41:01 +01:00
void lcPropertiesWidget : : AddStepNumberProperty ( lcObjectPropertyId PropertyId , const QString & Text , const QString & ToolTip , bool SupportsKeyFrames )
2023-12-31 21:55:35 +01:00
{
2024-01-07 20:39:34 +01:00
AddLabel ( PropertyId , Text , ToolTip ) ;
2023-12-31 21:55:35 +01:00
QLineEdit * Widget = new QLineEdit ( this ) ;
Widget - > setToolTip ( ToolTip ) ;
connect ( Widget , & QLineEdit : : editingFinished , this , & lcPropertiesWidget : : StepNumberChanged ) ;
2023-12-31 23:00:33 +01:00
mLayout - > addWidget ( Widget , mLayoutRow , 2 ) ;
2023-12-31 21:55:35 +01:00
2024-01-07 20:39:34 +01:00
mCurrentCategory - > Properties . push_back ( PropertyId ) ;
2024-01-15 02:41:01 +01:00
mPropertyWidgets [ static_cast < int > ( PropertyId ) ] . Editor = Widget ;
if ( SupportsKeyFrames )
AddKeyFrameWidget ( PropertyId ) ;
2023-12-31 21:55:35 +01:00
2023-12-31 23:00:33 +01:00
mLayoutRow + + ;
2023-12-31 21:55:35 +01:00
}
2024-01-02 03:57:54 +01:00
void lcPropertiesWidget : : StringChanged ( )
{
QLineEdit * Widget = qobject_cast < QLineEdit * > ( sender ( ) ) ;
2024-01-15 02:41:01 +01:00
lcObjectPropertyId PropertyId = GetEditorWidgetPropertyId ( Widget ) ;
2024-01-02 03:57:54 +01:00
2024-01-07 20:39:34 +01:00
if ( PropertyId = = lcObjectPropertyId : : Count )
2024-01-02 03:57:54 +01:00
return ;
lcModel * Model = gMainWindow - > GetActiveModel ( ) ;
2024-01-06 03:56:43 +01:00
if ( ! Model )
2024-01-02 03:57:54 +01:00
return ;
2024-01-06 03:56:43 +01:00
lcCamera * Camera = dynamic_cast < lcCamera * > ( mFocusObject ) ;
lcLight * Light = dynamic_cast < lcLight * > ( mFocusObject ) ;
2024-01-02 03:57:54 +01:00
QString Text = Widget - > text ( ) ;
2024-01-06 03:56:43 +01:00
if ( Camera )
2024-01-02 03:57:54 +01:00
{
2024-01-07 20:39:34 +01:00
if ( PropertyId = = lcObjectPropertyId : : CameraName )
2024-01-06 03:56:43 +01:00
{
Model - > SetCameraName ( Camera , Text ) ;
}
}
else if ( Light )
{
2024-01-07 20:39:34 +01:00
if ( PropertyId = = lcObjectPropertyId : : LightName )
2024-01-06 03:56:43 +01:00
{
Model - > SetLightName ( Light , Text ) ;
}
2024-01-02 03:57:54 +01:00
}
}
2024-01-07 20:39:34 +01:00
void lcPropertiesWidget : : UpdateString ( lcObjectPropertyId PropertyId , const QString & Text )
2024-01-02 03:57:54 +01:00
{
2024-01-15 02:41:01 +01:00
QLineEdit * Widget = qobject_cast < QLineEdit * > ( mPropertyWidgets [ static_cast < int > ( PropertyId ) ] . Editor ) ;
2024-01-02 03:57:54 +01:00
if ( Widget )
{
QSignalBlocker Blocker ( Widget ) ;
Widget - > setText ( Text ) ;
}
2024-01-15 02:41:01 +01:00
UpdateKeyFrameWidget ( PropertyId ) ;
2024-01-02 03:57:54 +01:00
}
2024-01-15 02:41:01 +01:00
void lcPropertiesWidget : : AddStringProperty ( lcObjectPropertyId PropertyId , const QString & Text , const QString & ToolTip , bool SupportsKeyFrames )
2023-12-31 21:55:35 +01:00
{
2024-01-07 20:39:34 +01:00
AddLabel ( PropertyId , Text , ToolTip ) ;
2023-12-31 21:55:35 +01:00
QLineEdit * Widget = new QLineEdit ( this ) ;
Widget - > setToolTip ( ToolTip ) ;
2024-01-02 03:57:54 +01:00
connect ( Widget , & QLineEdit : : editingFinished , this , & lcPropertiesWidget : : StringChanged ) ;
2023-12-31 23:00:33 +01:00
mLayout - > addWidget ( Widget , mLayoutRow , 2 ) ;
2023-12-31 21:55:35 +01:00
2024-01-07 20:39:34 +01:00
mCurrentCategory - > Properties . push_back ( PropertyId ) ;
2024-01-15 02:41:01 +01:00
mPropertyWidgets [ static_cast < int > ( PropertyId ) ] . Editor = Widget ;
if ( SupportsKeyFrames )
AddKeyFrameWidget ( PropertyId ) ;
2023-12-31 21:55:35 +01:00
2023-12-31 23:00:33 +01:00
mLayoutRow + + ;
2023-12-31 21:55:35 +01:00
}
2024-01-02 03:57:54 +01:00
void lcPropertiesWidget : : StringListChanged ( int Value )
{
QComboBox * Widget = qobject_cast < QComboBox * > ( sender ( ) ) ;
2024-01-15 02:41:01 +01:00
lcObjectPropertyId PropertyId = GetEditorWidgetPropertyId ( Widget ) ;
2024-01-02 03:57:54 +01:00
2024-01-07 20:39:34 +01:00
if ( PropertyId = = lcObjectPropertyId : : Count )
2024-01-02 03:57:54 +01:00
return ;
lcModel * Model = gMainWindow - > GetActiveModel ( ) ;
2024-01-06 03:56:43 +01:00
if ( ! Model )
2024-01-02 03:57:54 +01:00
return ;
2024-01-06 03:56:43 +01:00
lcCamera * Camera = dynamic_cast < lcCamera * > ( mFocusObject ) ;
lcLight * Light = dynamic_cast < lcLight * > ( mFocusObject ) ;
if ( Camera )
2024-01-02 03:57:54 +01:00
{
2024-01-07 20:39:34 +01:00
if ( PropertyId = = lcObjectPropertyId : : CameraType )
2024-01-06 03:56:43 +01:00
{
Model - > SetCameraOrthographic ( Camera , Value = = 1 ) ;
}
}
else if ( Light )
{
2024-01-07 20:39:34 +01:00
if ( PropertyId = = lcObjectPropertyId : : LightType )
2024-01-06 03:56:43 +01:00
{
Model - > SetLightType ( Light , static_cast < lcLightType > ( Value ) ) ;
}
2024-01-07 20:39:34 +01:00
else if ( PropertyId = = lcObjectPropertyId : : LightAreaShape )
2024-01-06 03:56:43 +01:00
{
Model - > SetLightAreaShape ( Light , static_cast < lcLightAreaShape > ( Value ) ) ;
}
2024-01-02 03:57:54 +01:00
}
}
2024-01-07 20:39:34 +01:00
void lcPropertiesWidget : : UpdateStringList ( lcObjectPropertyId PropertyId , int ListIndex )
2024-01-02 03:57:54 +01:00
{
2024-01-15 02:41:01 +01:00
QComboBox * Widget = qobject_cast < QComboBox * > ( mPropertyWidgets [ static_cast < int > ( PropertyId ) ] . Editor ) ;
2024-01-02 03:57:54 +01:00
if ( Widget )
{
QSignalBlocker Blocker ( Widget ) ;
Widget - > setCurrentIndex ( ListIndex ) ;
}
2024-01-15 02:41:01 +01:00
UpdateKeyFrameWidget ( PropertyId ) ;
2024-01-02 03:57:54 +01:00
}
2024-01-15 02:41:01 +01:00
void lcPropertiesWidget : : AddStringListProperty ( lcObjectPropertyId PropertyId , const QString & Text , const QString & ToolTip , bool SupportsKeyFrames , const QStringList & Strings )
2023-12-31 21:55:35 +01:00
{
2024-01-07 20:39:34 +01:00
AddLabel ( PropertyId , Text , ToolTip ) ;
2023-12-31 21:55:35 +01:00
QComboBox * Widget = new QComboBox ( this ) ;
Widget - > setToolTip ( ToolTip ) ;
Widget - > addItems ( Strings ) ;
2024-01-02 20:28:04 +01:00
connect ( Widget , QOverload < int > : : of ( & QComboBox : : currentIndexChanged ) , this , & lcPropertiesWidget : : StringListChanged ) ;
2023-12-31 21:55:35 +01:00
2023-12-31 23:00:33 +01:00
mLayout - > addWidget ( Widget , mLayoutRow , 2 ) ;
2023-12-31 21:55:35 +01:00
2024-01-07 20:39:34 +01:00
mCurrentCategory - > Properties . push_back ( PropertyId ) ;
2024-01-15 02:41:01 +01:00
mPropertyWidgets [ static_cast < int > ( PropertyId ) ] . Editor = Widget ;
if ( SupportsKeyFrames )
AddKeyFrameWidget ( PropertyId ) ;
2023-12-31 21:55:35 +01:00
2023-12-31 23:00:33 +01:00
mLayoutRow + + ;
2023-12-31 21:55:35 +01:00
}
2024-01-06 03:56:43 +01:00
void lcPropertiesWidget : : ColorButtonClicked ( )
{
lcLight * Light = dynamic_cast < lcLight * > ( mFocusObject ) ;
QToolButton * ColorButton = qobject_cast < QToolButton * > ( sender ( ) ) ;
lcModel * Model = gMainWindow - > GetActiveModel ( ) ;
if ( ! ColorButton | | ! Light | | ! Model )
return ;
QColor Color = QColorDialog : : getColor ( lcQColorFromVector3 ( Light - > GetColor ( ) ) , this , tr ( " Select Light Color " ) ) ;
if ( ! Color . isValid ( ) )
return ;
Model - > SetLightColor ( Light , lcVector3FromQColor ( Color ) ) ;
}
2024-01-07 20:39:34 +01:00
void lcPropertiesWidget : : UpdateColor ( lcObjectPropertyId PropertyId , QColor Color )
2024-01-06 03:56:43 +01:00
{
2024-01-15 02:41:01 +01:00
QToolButton * ColorButton = qobject_cast < QToolButton * > ( mPropertyWidgets [ static_cast < int > ( PropertyId ) ] . Editor ) ;
2024-01-06 03:56:43 +01:00
if ( ! ColorButton )
return ;
QPixmap Pixmap ( 14 , 14 ) ;
Pixmap . fill ( Color ) ;
ColorButton - > setIcon ( Pixmap ) ;
ColorButton - > setText ( QString ( " " ) + Color . name ( ) ) ;
2024-01-15 02:41:01 +01:00
UpdateKeyFrameWidget ( PropertyId ) ;
2024-01-06 03:56:43 +01:00
}
2024-01-15 02:41:01 +01:00
void lcPropertiesWidget : : AddColorProperty ( lcObjectPropertyId PropertyId , const QString & Text , const QString & ToolTip , bool SupportsKeyFrames )
2023-12-31 21:55:35 +01:00
{
2024-01-07 20:39:34 +01:00
AddLabel ( PropertyId , Text , ToolTip ) ;
2023-12-31 21:55:35 +01:00
2024-01-06 03:56:43 +01:00
QToolButton * Widget = new QToolButton ( this ) ;
2023-12-31 21:55:35 +01:00
Widget - > setToolTip ( ToolTip ) ;
2024-01-06 03:56:43 +01:00
Widget - > setAutoRaise ( true ) ;
Widget - > setToolButtonStyle ( Qt : : ToolButtonTextBesideIcon ) ;
Widget - > setSizePolicy ( QSizePolicy : : Expanding , QSizePolicy : : Preferred ) ;
2023-12-31 21:55:35 +01:00
2024-01-06 03:56:43 +01:00
connect ( Widget , & QToolButton : : clicked , this , & lcPropertiesWidget : : ColorButtonClicked ) ;
2023-12-31 21:55:35 +01:00
2023-12-31 23:00:33 +01:00
mLayout - > addWidget ( Widget , mLayoutRow , 2 ) ;
2023-12-31 21:55:35 +01:00
2024-01-07 20:39:34 +01:00
mCurrentCategory - > Properties . push_back ( PropertyId ) ;
2024-01-15 02:41:01 +01:00
mPropertyWidgets [ static_cast < int > ( PropertyId ) ] . Editor = Widget ;
if ( SupportsKeyFrames )
AddKeyFrameWidget ( PropertyId ) ;
2023-12-31 21:55:35 +01:00
2023-12-31 23:00:33 +01:00
mLayoutRow + + ;
2023-12-31 21:55:35 +01:00
}
void lcPropertiesWidget : : PieceColorChanged ( int ColorIndex )
{
if ( ! mFocusObject | | ! mFocusObject - > IsPiece ( ) )
return ;
lcModel * Model = gMainWindow - > GetActiveModel ( ) ;
Model - > SetSelectedPiecesColorIndex ( ColorIndex ) ;
}
void lcPropertiesWidget : : PieceColorButtonClicked ( )
{
QToolButton * ColorButton = qobject_cast < QToolButton * > ( sender ( ) ) ;
if ( ! ColorButton | | ! mFocusObject | | ! mFocusObject - > IsPiece ( ) )
return ;
int ColorIndex = reinterpret_cast < lcPiece * > ( mFocusObject ) - > GetColorIndex ( ) ;
lcColorPickerPopup * Popup = new lcColorPickerPopup ( ColorButton , ColorIndex ) ;
connect ( Popup , & lcColorPickerPopup : : Selected , this , & lcPropertiesWidget : : PieceColorChanged ) ;
# if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
QScreen * Screen = Button - > screen ( ) ;
const QRect ScreenRect = Screen ? Screen - > geometry ( ) : QRect ( ) ;
# elif (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
QScreen * Screen = QGuiApplication : : screenAt ( ColorButton - > mapToGlobal ( ColorButton - > rect ( ) . bottomLeft ( ) ) ) ;
const QRect ScreenRect = Screen ? Screen - > geometry ( ) : QApplication : : desktop ( ) - > geometry ( ) ;
# else
const QRect ScreenRect = QApplication : : desktop ( ) - > geometry ( ) ;
# endif
QPoint Pos = ColorButton - > mapToGlobal ( ColorButton - > rect ( ) . bottomLeft ( ) ) ;
if ( Pos . x ( ) < ScreenRect . left ( ) )
Pos . setX ( ScreenRect . left ( ) ) ;
if ( Pos . y ( ) < ScreenRect . top ( ) )
Pos . setY ( ScreenRect . top ( ) ) ;
Popup - > adjustSize ( ) ;
if ( Pos . x ( ) + Popup - > width ( ) > ScreenRect . right ( ) )
Pos . setX ( ScreenRect . right ( ) - Popup - > width ( ) ) ;
if ( Pos . y ( ) + Popup - > height ( ) > ScreenRect . bottom ( ) )
Pos . setY ( ScreenRect . bottom ( ) - Popup - > height ( ) ) ;
Popup - > move ( Pos ) ;
Popup - > setFocus ( ) ;
Popup - > show ( ) ;
}
2024-01-07 20:39:34 +01:00
void lcPropertiesWidget : : UpdatePieceColor ( lcObjectPropertyId PropertyId , int ColorIndex )
2023-12-31 21:55:35 +01:00
{
2024-01-15 02:41:01 +01:00
QToolButton * ColorButton = qobject_cast < QToolButton * > ( mPropertyWidgets [ static_cast < int > ( PropertyId ) ] . Editor ) ;
2023-12-31 21:55:35 +01:00
if ( ! ColorButton )
return ;
QPixmap Pixmap ( 14 , 14 ) ;
Pixmap . fill ( QColor : : fromRgbF ( gColorList [ ColorIndex ] . Value [ 0 ] , gColorList [ ColorIndex ] . Value [ 1 ] , gColorList [ ColorIndex ] . Value [ 2 ] ) ) ;
ColorButton - > setIcon ( Pixmap ) ;
ColorButton - > setText ( QString ( " " ) + gColorList [ ColorIndex ] . Name ) ;
2024-01-15 02:41:01 +01:00
UpdateKeyFrameWidget ( PropertyId ) ;
2023-12-31 21:55:35 +01:00
}
2024-01-15 02:41:01 +01:00
void lcPropertiesWidget : : AddPieceColorProperty ( lcObjectPropertyId PropertyId , const QString & Text , const QString & ToolTip , bool SupportsKeyFrames )
2023-12-31 21:55:35 +01:00
{
2024-01-07 20:39:34 +01:00
AddLabel ( PropertyId , Text , ToolTip ) ;
2023-12-31 21:55:35 +01:00
QToolButton * Widget = new QToolButton ( this ) ;
Widget - > setToolTip ( ToolTip ) ;
Widget - > setAutoRaise ( true ) ;
Widget - > setToolButtonStyle ( Qt : : ToolButtonTextBesideIcon ) ;
Widget - > setSizePolicy ( QSizePolicy : : Expanding , QSizePolicy : : Preferred ) ;
connect ( Widget , & QToolButton : : clicked , this , & lcPropertiesWidget : : PieceColorButtonClicked ) ;
2023-12-31 23:00:33 +01:00
mLayout - > addWidget ( Widget , mLayoutRow , 2 ) ;
2023-12-31 21:55:35 +01:00
2024-01-07 20:39:34 +01:00
mCurrentCategory - > Properties . push_back ( PropertyId ) ;
2024-01-15 02:41:01 +01:00
mPropertyWidgets [ static_cast < int > ( PropertyId ) ] . Editor = Widget ;
if ( SupportsKeyFrames )
AddKeyFrameWidget ( PropertyId ) ;
2023-12-31 21:55:35 +01:00
2023-12-31 23:00:33 +01:00
mLayoutRow + + ;
2023-12-31 21:55:35 +01:00
}
2024-01-07 20:39:34 +01:00
void lcPropertiesWidget : : UpdatePieceId ( lcObjectPropertyId PropertyId , const QString & Name )
2023-12-31 21:55:35 +01:00
{
2024-01-15 02:41:01 +01:00
lcElidableToolButton * PieceIdButton = qobject_cast < lcElidableToolButton * > ( mPropertyWidgets [ static_cast < int > ( PropertyId ) ] . Editor ) ;
2023-12-31 21:55:35 +01:00
if ( ! PieceIdButton )
return ;
PieceIdButton - > setText ( Name ) ;
2024-01-15 02:41:01 +01:00
UpdateKeyFrameWidget ( PropertyId ) ;
2023-12-31 21:55:35 +01:00
}
void lcPropertiesWidget : : PieceIdButtonClicked ( )
{
QToolButton * PieceIdButton = qobject_cast < QToolButton * > ( sender ( ) ) ;
lcPiece * Piece = dynamic_cast < lcPiece * > ( mFocusObject ) ;
if ( ! PieceIdButton | | ! Piece )
return ;
QMenu * Menu = new QMenu ( ) ;
QWidgetAction * Action = new QWidgetAction ( Menu ) ;
lcPieceIdPickerPopup * Popup = new lcPieceIdPickerPopup ( gMainWindow - > GetActiveModel ( ) , Piece - > mPieceInfo , Menu ) ;
Action - > setDefaultWidget ( Popup ) ;
Menu - > addAction ( Action ) ;
connect ( Popup , & lcPieceIdPickerPopup : : PieceIdSelected , this , & lcPropertiesWidget : : PieceIdChanged ) ;
Menu - > exec ( PieceIdButton - > mapToGlobal ( PieceIdButton - > rect ( ) . bottomLeft ( ) ) ) ;
delete Menu ;
}
void lcPropertiesWidget : : PieceIdChanged ( PieceInfo * Info )
{
lcModel * Model = gMainWindow - > GetActiveModel ( ) ;
if ( ! Model | | ! Info )
return ;
Model - > SetSelectedPiecesPieceInfo ( Info ) ;
}
2024-01-15 02:41:01 +01:00
void lcPropertiesWidget : : AddPieceIdProperty ( lcObjectPropertyId PropertyId , const QString & Text , const QString & ToolTip , bool SupportsKeyFrames )
2023-12-31 21:55:35 +01:00
{
2024-01-07 20:39:34 +01:00
AddLabel ( PropertyId , Text , ToolTip ) ;
2023-12-31 21:55:35 +01:00
lcElidableToolButton * Widget = new lcElidableToolButton ( this ) ;
Widget - > setToolTip ( ToolTip ) ;
Widget - > setAutoRaise ( true ) ;
Widget - > setToolButtonStyle ( Qt : : ToolButtonTextBesideIcon ) ;
Widget - > setSizePolicy ( QSizePolicy : : Expanding , QSizePolicy : : Preferred ) ;
QPixmap Pixmap ( 1 , 1 ) ;
Pixmap . fill ( QColor : : fromRgba64 ( 0 , 0 , 0 , 0 ) ) ;
Widget - > setIcon ( Pixmap ) ;
connect ( Widget , & QToolButton : : clicked , this , & lcPropertiesWidget : : PieceIdButtonClicked ) ;
2023-12-31 23:00:33 +01:00
mLayout - > addWidget ( Widget , mLayoutRow , 2 ) ;
2023-12-31 21:55:35 +01:00
2024-01-07 20:39:34 +01:00
mCurrentCategory - > Properties . push_back ( PropertyId ) ;
2024-01-15 02:41:01 +01:00
mPropertyWidgets [ static_cast < int > ( PropertyId ) ] . Editor = Widget ;
if ( SupportsKeyFrames )
AddKeyFrameWidget ( PropertyId ) ;
2023-12-31 21:55:35 +01:00
2023-12-31 23:00:33 +01:00
mLayoutRow + + ;
2023-12-31 21:55:35 +01:00
}
2024-01-07 02:33:43 +01:00
void lcPropertiesWidget : : CreateWidgets ( )
2023-12-31 21:55:35 +01:00
{
2023-12-31 23:00:33 +01:00
mLayout = new QGridLayout ( this ) ;
mLayout - > setVerticalSpacing ( 1 ) ;
2023-12-31 21:55:35 +01:00
2024-01-07 02:33:43 +01:00
AddCategory ( CategoryIndex : : Piece , tr ( " Piece " ) ) ;
2024-01-15 02:41:01 +01:00
AddPieceIdProperty ( lcObjectPropertyId : : PieceId , tr ( " Part " ) , tr ( " Part Id " ) , false ) ;
AddPieceColorProperty ( lcObjectPropertyId : : PieceColor , tr ( " Color " ) , tr ( " Piece color " ) , false ) ;
2024-01-07 02:33:43 +01:00
AddSpacing ( ) ;
2024-01-15 02:41:01 +01:00
AddStepNumberProperty ( lcObjectPropertyId : : PieceStepShow , tr ( " Show " ) , tr ( " Step when piece is added to the model " ) , false ) ;
AddStepNumberProperty ( lcObjectPropertyId : : PieceStepHide , tr ( " Hide " ) , tr ( " Step when piece is hidden " ) , false ) ;
2024-01-07 02:33:43 +01:00
AddCategory ( CategoryIndex : : Camera , tr ( " Camera " ) ) ;
2024-01-15 02:41:01 +01:00
AddStringProperty ( lcObjectPropertyId : : CameraName , tr ( " Name " ) , tr ( " Camera name " ) , false ) ;
AddStringListProperty ( lcObjectPropertyId : : CameraType , tr ( " Type " ) , tr ( " Camera type " ) , false , { tr ( " Perspective " ) , tr ( " Orthographic " ) } ) ;
2024-01-07 02:33:43 +01:00
AddSpacing ( ) ;
2024-01-15 02:41:01 +01:00
AddFloatProperty ( lcObjectPropertyId : : CameraFOV , tr ( " FOV " ) , tr ( " Field of view in degrees " ) , false , 0.1f , 179.9f ) ;
AddFloatProperty ( lcObjectPropertyId : : CameraNear , tr ( " Near " ) , tr ( " Near clipping distance " ) , false , 0.001f , FLT_MAX ) ;
AddFloatProperty ( lcObjectPropertyId : : CameraFar , tr ( " Far " ) , tr ( " Far clipping distance " ) , false , 0.001f , FLT_MAX ) ;
2024-01-07 02:33:43 +01:00
AddCategory ( CategoryIndex : : CameraTransform , tr ( " Transform " ) ) ;
2024-01-15 02:41:01 +01:00
AddFloatProperty ( lcObjectPropertyId : : CameraPositionX , tr ( " Position X " ) , tr ( " Camera position " ) , true , - FLT_MAX , FLT_MAX ) ;
AddFloatProperty ( lcObjectPropertyId : : CameraPositionY , tr ( " Y " ) , tr ( " Camera position " ) , true , - FLT_MAX , FLT_MAX ) ;
AddFloatProperty ( lcObjectPropertyId : : CameraPositionZ , tr ( " Z " ) , tr ( " Camera position " ) , true , - FLT_MAX , FLT_MAX ) ;
2024-01-07 02:33:43 +01:00
AddSpacing ( ) ;
2024-01-15 02:41:01 +01:00
AddFloatProperty ( lcObjectPropertyId : : CameraTargetX , tr ( " Target X " ) , tr ( " Camera target position " ) , true , - FLT_MAX , FLT_MAX ) ;
AddFloatProperty ( lcObjectPropertyId : : CameraTargetY , tr ( " Y " ) , tr ( " Camera target position " ) , true , - FLT_MAX , FLT_MAX ) ;
AddFloatProperty ( lcObjectPropertyId : : CameraTargetZ , tr ( " Z " ) , tr ( " Camera target position " ) , true , - FLT_MAX , FLT_MAX ) ;
2024-01-07 02:33:43 +01:00
AddSpacing ( ) ;
2024-01-15 02:41:01 +01:00
AddFloatProperty ( lcObjectPropertyId : : CameraUpX , tr ( " Up X " ) , tr ( " Camera up direction " ) , true , - FLT_MAX , FLT_MAX ) ;
AddFloatProperty ( lcObjectPropertyId : : CameraUpY , tr ( " Y " ) , tr ( " Camera up direction " ) , true , - FLT_MAX , FLT_MAX ) ;
AddFloatProperty ( lcObjectPropertyId : : CameraUpZ , tr ( " Z " ) , tr ( " Camera up direction " ) , true , - FLT_MAX , FLT_MAX ) ;
2024-01-07 02:33:43 +01:00
AddCategory ( CategoryIndex : : Light , tr ( " Light " ) ) ;
2024-01-15 02:41:01 +01:00
AddStringProperty ( lcObjectPropertyId : : LightName , tr ( " Name " ) , tr ( " Light name " ) , false ) ;
AddStringListProperty ( lcObjectPropertyId : : LightType , tr ( " Type " ) , tr ( " Light type " ) , false , lcLight : : GetLightTypeStrings ( ) ) ;
2024-01-07 02:33:43 +01:00
AddSpacing ( ) ;
2024-01-15 02:41:01 +01:00
AddColorProperty ( lcObjectPropertyId : : LightColor , tr ( " Color " ) , tr ( " Light color " ) , true ) ;
AddFloatProperty ( lcObjectPropertyId : : LightPower , tr ( " Power " ) , tr ( " Power of the light (Watts in Blender, multiplicative factor in POV-Ray) " ) , true , 0.0f , FLT_MAX ) ;
AddFloatProperty ( lcObjectPropertyId : : LightAttenuationDistance , tr ( " Fade Distance " ) , tr ( " The distance at which the full light intensity arrives (POV-Ray only) " ) , true , 0.0f , FLT_MAX ) ;
AddFloatProperty ( lcObjectPropertyId : : LightAttenuationPower , tr ( " Fade Power " ) , tr ( " Light falloff rate (POV-Ray only) " ) , true , 0.0f , FLT_MAX ) ;
AddBoolProperty ( lcObjectPropertyId : : LightCastShadow , tr ( " Cast Shadow " ) , tr ( " Cast a shadow from this light " ) , false ) ;
2024-01-07 02:33:43 +01:00
AddSpacing ( ) ;
2024-01-15 02:41:01 +01:00
AddFloatProperty ( lcObjectPropertyId : : LightPointSize , tr ( " Radius " ) , tr ( " Shadow soft size (Blender only) " ) , true , 0.0f , FLT_MAX ) ;
2024-01-07 02:33:43 +01:00
2024-01-15 02:41:01 +01:00
AddFloatProperty ( lcObjectPropertyId : : LightSpotSize , tr ( " Radius " ) , tr ( " Shadow soft size (Blender only) " ) , true , 0.0f , FLT_MAX ) ;
AddFloatProperty ( lcObjectPropertyId : : LightSpotConeAngle , tr ( " Spot Cone Angle " ) , tr ( " Angle in degrees of the spot light's beam " ) , true , 0.0f , 179.9f ) ;
AddFloatProperty ( lcObjectPropertyId : : LightSpotPenumbraAngle , tr ( " Spot Penumbra Angle " ) , tr ( " Angle in degrees over which the intensity of the spot light falls off to zero " ) , true , 0.0f , 179.9f ) ;
AddFloatProperty ( lcObjectPropertyId : : LightSpotTightness , tr ( " Spot Tightness " ) , tr ( " Additional exponential spot light edge softening (POV-Ray only) " ) , true , 0.0f , FLT_MAX ) ;
2024-01-07 02:33:43 +01:00
2024-01-15 02:41:01 +01:00
AddFloatProperty ( lcObjectPropertyId : : LightDirectionalSize , tr ( " Angle " ) , tr ( " Angular diameter of the light (Blender only) " ) , true , 0.0f , 180.0f ) ;
2024-01-07 02:33:43 +01:00
2024-01-15 02:41:01 +01:00
AddStringListProperty ( lcObjectPropertyId : : LightAreaShape , tr ( " Area Shape " ) , tr ( " The shape of the area light " ) , false , lcLight : : GetAreaShapeStrings ( ) ) ;
AddFloatProperty ( lcObjectPropertyId : : LightAreaSizeX , tr ( " Size X " ) , tr ( " The width of the area light " ) , true , 0.0f , FLT_MAX ) ;
AddFloatProperty ( lcObjectPropertyId : : LightAreaSizeY , tr ( " Y " ) , tr ( " The height of the area light " ) , true , 0.0f , FLT_MAX ) ;
AddFloatProperty ( lcObjectPropertyId : : LightAreaSize , tr ( " Size " ) , tr ( " The size of the area light " ) , true , 0.0f , FLT_MAX ) ;
AddIntegerProperty ( lcObjectPropertyId : : LightAreaGridX , tr ( " Grid X " ) , tr ( " Number of point sources along the X axis (POV-Ray only) " ) , true , 1 , INT_MAX ) ;
AddIntegerProperty ( lcObjectPropertyId : : LightAreaGridY , tr ( " Y " ) , tr ( " Number of point sources along the Y axis (POV-Ray only) " ) , true , 1 , INT_MAX ) ;
2024-01-07 02:33:43 +01:00
AddCategory ( CategoryIndex : : ObjectTransform , tr ( " Transform " ) ) ;
2023-12-31 21:55:35 +01:00
2024-01-15 02:41:01 +01:00
AddFloatProperty ( lcObjectPropertyId : : ObjectPositionX , tr ( " Position X " ) , tr ( " Position of the object " ) , true , - FLT_MAX , FLT_MAX ) ;
AddFloatProperty ( lcObjectPropertyId : : ObjectPositionY , tr ( " Y " ) , tr ( " Position of the object " ) , true , - FLT_MAX , FLT_MAX ) ;
AddFloatProperty ( lcObjectPropertyId : : ObjectPositionZ , tr ( " Z " ) , tr ( " Position of the object " ) , true , - FLT_MAX , FLT_MAX ) ;
2024-01-07 02:33:43 +01:00
2023-12-31 23:00:33 +01:00
AddSpacing ( ) ;
2024-01-07 02:33:43 +01:00
2024-01-15 02:41:01 +01:00
AddFloatProperty ( lcObjectPropertyId : : ObjectRotationX , tr ( " Rotation X " ) , tr ( " Rotation of the object in degrees " ) , true , - FLT_MAX , FLT_MAX ) ;
AddFloatProperty ( lcObjectPropertyId : : ObjectRotationY , tr ( " Y " ) , tr ( " Rotation of the object in degrees " ) , true , - FLT_MAX , FLT_MAX ) ;
AddFloatProperty ( lcObjectPropertyId : : ObjectRotationZ , tr ( " Z " ) , tr ( " Rotation of the object in degrees " ) , true , - FLT_MAX , FLT_MAX ) ;
2023-12-31 21:55:35 +01:00
2023-12-31 23:00:33 +01:00
mLayout - > setRowStretch ( mLayout - > rowCount ( ) , 1 ) ;
2023-12-31 21:55:35 +01:00
}
2024-01-07 02:33:43 +01:00
void lcPropertiesWidget : : SetLayoutMode ( LayoutMode Mode )
2023-12-31 21:55:35 +01:00
{
2024-01-07 02:33:43 +01:00
if ( mLayoutMode = = Mode )
return ;
2023-12-31 21:55:35 +01:00
2024-01-07 02:33:43 +01:00
mLayoutMode = Mode ;
const bool IsPiece = ( mLayoutMode = = LayoutMode : : Piece ) ;
const bool IsCamera = ( mLayoutMode = = LayoutMode : : Camera ) ;
const bool IsLight = ( mLayoutMode = = LayoutMode : : Light ) ;
SetCategoryVisible ( CategoryIndex : : Piece , IsPiece ) ;
SetCategoryVisible ( CategoryIndex : : Camera , IsCamera ) ;
SetCategoryVisible ( CategoryIndex : : CameraTransform , IsCamera ) ;
SetCategoryVisible ( CategoryIndex : : Light , IsLight ) ;
SetCategoryVisible ( CategoryIndex : : ObjectTransform , IsPiece | | IsLight ) ;
2023-12-31 21:55:35 +01:00
}
2024-01-07 02:33:43 +01:00
void lcPropertiesWidget : : SetCategoryWidgetsVisible ( CategoryWidgets & Category , bool Visible )
2023-12-31 21:55:35 +01:00
{
2024-01-07 20:39:34 +01:00
for ( lcObjectPropertyId PropertyId : Category . Properties )
SetPropertyVisible ( PropertyId , Visible ) ;
2023-12-31 21:55:35 +01:00
2024-01-07 02:33:43 +01:00
for ( int Row : Category . SpacingRows )
mLayout - > setRowMinimumHeight ( Row , Visible ? 5 : 0 ) ;
}
2023-12-31 21:55:35 +01:00
2024-01-07 20:39:34 +01:00
void lcPropertiesWidget : : SetPropertyVisible ( lcObjectPropertyId PropertyId , bool Visible )
2024-01-07 02:33:43 +01:00
{
2024-01-07 20:39:34 +01:00
PropertyWidgets & Property = mPropertyWidgets [ static_cast < int > ( PropertyId ) ] ;
2023-12-31 21:55:35 +01:00
2024-01-07 02:33:43 +01:00
if ( Property . Label )
Property . Label - > setVisible ( Visible ) ;
2023-12-31 21:55:35 +01:00
2024-01-15 02:41:01 +01:00
if ( Property . Editor )
Property . Editor - > setVisible ( Visible ) ;
if ( Property . KeyFrame )
Property . KeyFrame - > setVisible ( Visible ) ;
2024-01-07 02:33:43 +01:00
}
2023-12-31 21:55:35 +01:00
2024-01-07 02:33:43 +01:00
void lcPropertiesWidget : : SetCategoryVisible ( CategoryIndex Index , bool Visible )
{
CategoryWidgets & Category = mCategoryWidgets [ static_cast < int > ( Index ) ] ;
Category . Button - > setVisible ( Visible ) ;
SetCategoryWidgetsVisible ( Category , Visible & & Category . Button - > IsExpanded ( ) ) ;
}
2023-12-31 21:55:35 +01:00
2024-01-07 02:33:43 +01:00
void lcPropertiesWidget : : SetEmpty ( )
{
SetLayoutMode ( LayoutMode : : Empty ) ;
2023-12-31 21:55:35 +01:00
2024-01-07 02:33:43 +01:00
mFocusObject = nullptr ;
2024-01-21 21:53:18 +01:00
mSelection . RemoveAll ( ) ;
2023-12-31 21:55:35 +01:00
}
void lcPropertiesWidget : : SetPiece ( const lcArray < lcObject * > & Selection , lcObject * Focus )
{
2024-01-07 02:33:43 +01:00
SetLayoutMode ( LayoutMode : : Piece ) ;
2023-12-31 21:55:35 +01:00
lcPiece * Piece = dynamic_cast < lcPiece * > ( Focus ) ;
2024-01-21 21:53:18 +01:00
mSelection = Selection ;
2023-12-31 21:55:35 +01:00
mFocusObject = Piece ;
lcVector3 Position ;
lcMatrix33 RelativeRotation ;
2024-01-07 02:33:43 +01:00
lcModel * Model = gMainWindow - > GetActiveModel ( ) ;
2023-12-31 21:55:35 +01:00
2024-01-07 02:33:43 +01:00
if ( Model )
Model - > GetMoveRotateTransform ( Position , RelativeRotation ) ;
2023-12-31 21:55:35 +01:00
2024-01-07 20:39:34 +01:00
UpdateFloat ( lcObjectPropertyId : : ObjectPositionX , Position [ 0 ] ) ;
UpdateFloat ( lcObjectPropertyId : : ObjectPositionY , Position [ 1 ] ) ;
UpdateFloat ( lcObjectPropertyId : : ObjectPositionZ , Position [ 2 ] ) ;
2023-12-31 21:55:35 +01:00
lcVector3 Rotation ;
if ( Piece )
Rotation = lcMatrix44ToEulerAngles ( Piece - > mModelWorld ) * LC_RTOD ;
else
Rotation = lcVector3 ( 0.0f , 0.0f , 0.0f ) ;
2024-01-07 20:39:34 +01:00
UpdateFloat ( lcObjectPropertyId : : ObjectRotationX , Rotation [ 0 ] ) ;
UpdateFloat ( lcObjectPropertyId : : ObjectRotationY , Rotation [ 1 ] ) ;
UpdateFloat ( lcObjectPropertyId : : ObjectRotationZ , Rotation [ 2 ] ) ;
2023-12-31 21:55:35 +01:00
lcStep StepShow = 1 ;
lcStep StepHide = LC_STEP_MAX ;
PieceInfo * Info = nullptr ;
int ColorIndex = gDefaultColor ;
if ( Piece )
{
StepShow = Piece - > GetStepShow ( ) ;
StepHide = Piece - > GetStepHide ( ) ;
ColorIndex = Piece - > GetColorIndex ( ) ;
Info = Piece - > mPieceInfo ;
}
else
{
bool FirstPiece = true ;
for ( int ObjectIdx = 0 ; ObjectIdx < Selection . GetSize ( ) ; ObjectIdx + + )
{
lcObject * Object = Selection [ ObjectIdx ] ;
if ( ! Object - > IsPiece ( ) )
continue ;
lcPiece * SelectedPiece = ( lcPiece * ) Object ;
if ( FirstPiece )
{
StepShow = SelectedPiece - > GetStepShow ( ) ;
StepHide = SelectedPiece - > GetStepHide ( ) ;
ColorIndex = SelectedPiece - > GetColorIndex ( ) ;
Info = SelectedPiece - > mPieceInfo ;
FirstPiece = false ;
}
else
{
if ( SelectedPiece - > GetStepShow ( ) ! = StepShow )
StepShow = 0 ;
if ( SelectedPiece - > GetStepHide ( ) ! = StepHide )
StepHide = 0 ;
if ( SelectedPiece - > GetColorIndex ( ) ! = ColorIndex )
ColorIndex = gDefaultColor ;
if ( SelectedPiece - > mPieceInfo ! = Info )
Info = nullptr ;
}
}
}
2024-01-07 20:39:34 +01:00
UpdatePieceId ( lcObjectPropertyId : : PieceId , Info ? Info - > m_strDescription : QString ( ) ) ;
UpdatePieceColor ( lcObjectPropertyId : : PieceColor , ColorIndex ) ;
UpdateStepNumber ( lcObjectPropertyId : : PieceStepShow , StepShow ? StepShow : LC_STEP_MAX , 1 , StepHide - 1 ) ;
UpdateStepNumber ( lcObjectPropertyId : : PieceStepHide , StepHide ? StepHide : LC_STEP_MAX , StepShow + 1 , LC_STEP_MAX ) ;
2023-12-31 21:55:35 +01:00
}
2024-01-21 21:53:18 +01:00
void lcPropertiesWidget : : SetCamera ( const lcArray < lcObject * > & Selection , lcObject * Focus )
2023-12-31 21:55:35 +01:00
{
2024-01-07 02:33:43 +01:00
SetLayoutMode ( LayoutMode : : Camera ) ;
2024-01-02 03:57:54 +01:00
lcCamera * Camera = dynamic_cast < lcCamera * > ( Focus ) ;
2024-01-21 21:53:18 +01:00
mSelection = Selection ;
2024-01-02 03:57:54 +01:00
mFocusObject = Camera ;
lcVector3 Position ( 0.0f , 0.0f , 0.0f ) ;
lcVector3 Target ( 0.0f , 0.0f , 0.0f ) ;
lcVector3 UpVector ( 0.0f , 0.0f , 0.0f ) ;
bool Ortho = false ;
float FoV = 60.0f ;
float ZNear = 1.0f ;
float ZFar = 100.0f ;
QString Name ;
if ( Camera )
{
Position = Camera - > mPosition ;
Target = Camera - > mTargetPosition ;
UpVector = Camera - > mUpVector ;
Ortho = Camera - > IsOrtho ( ) ;
FoV = Camera - > m_fovy ;
ZNear = Camera - > m_zNear ;
ZFar = Camera - > m_zFar ;
Name = Camera - > GetName ( ) ;
}
2024-01-07 20:39:34 +01:00
UpdateString ( lcObjectPropertyId : : CameraName , Name ) ;
UpdateStringList ( lcObjectPropertyId : : CameraType , Ortho ? 1 : 0 ) ;
2024-01-02 03:57:54 +01:00
2024-01-07 20:39:34 +01:00
UpdateFloat ( lcObjectPropertyId : : CameraFOV , FoV ) ;
UpdateFloat ( lcObjectPropertyId : : CameraNear , ZNear ) ;
UpdateFloat ( lcObjectPropertyId : : CameraFar , ZFar ) ;
2024-01-02 03:57:54 +01:00
2024-01-07 20:39:34 +01:00
UpdateFloat ( lcObjectPropertyId : : CameraPositionX , Position [ 0 ] ) ;
UpdateFloat ( lcObjectPropertyId : : CameraPositionY , Position [ 1 ] ) ;
UpdateFloat ( lcObjectPropertyId : : CameraPositionZ , Position [ 2 ] ) ;
2024-01-02 03:57:54 +01:00
2024-01-07 20:39:34 +01:00
UpdateFloat ( lcObjectPropertyId : : CameraTargetX , Target [ 0 ] ) ;
UpdateFloat ( lcObjectPropertyId : : CameraTargetY , Target [ 1 ] ) ;
UpdateFloat ( lcObjectPropertyId : : CameraTargetZ , Target [ 2 ] ) ;
2024-01-02 03:57:54 +01:00
2024-01-07 20:39:34 +01:00
UpdateFloat ( lcObjectPropertyId : : CameraUpX , UpVector [ 0 ] ) ;
UpdateFloat ( lcObjectPropertyId : : CameraUpY , UpVector [ 1 ] ) ;
UpdateFloat ( lcObjectPropertyId : : CameraUpZ , UpVector [ 2 ] ) ;
2023-12-31 21:55:35 +01:00
}
2024-01-21 21:53:18 +01:00
void lcPropertiesWidget : : SetLight ( const lcArray < lcObject * > & Selection , lcObject * Focus )
2023-12-31 21:55:35 +01:00
{
2024-01-07 02:33:43 +01:00
SetLayoutMode ( LayoutMode : : Light ) ;
2024-01-06 03:56:43 +01:00
lcLight * Light = dynamic_cast < lcLight * > ( Focus ) ;
2024-01-21 21:53:18 +01:00
mSelection = Selection ;
2024-01-06 03:56:43 +01:00
mFocusObject = Light ;
2023-12-31 21:55:35 +01:00
2024-01-06 03:56:43 +01:00
QString Name ;
lcLightType LightType = lcLightType : : Point ;
QColor Color ( Qt : : white ) ;
lcLightAreaShape LightAreaShape = lcLightAreaShape : : Rectangle ;
lcVector2 LightSize ( 0.0f , 0.0f ) ;
lcVector2i AreaGrid ( 2 , 2 ) ;
float Power = 0.0f ;
float AttenuationDistance = 0.0f ;
float AttenuationPower = 0.0f ;
bool CastShadow = true ;
lcVector3 Position ( 0.0f , 0.0f , 0.0f ) ;
lcVector3 Rotation = lcVector3 ( 0.0f , 0.0f , 0.0f ) ;
float SpotConeAngle = 0.0f , SpotPenumbraAngle = 0.0f , SpotTightness = 0.0f ;
if ( Light )
{
Name = Light - > GetName ( ) ;
LightType = Light - > GetLightType ( ) ;
Color = lcQColorFromVector3 ( Light - > GetColor ( ) ) ;
CastShadow = Light - > GetCastShadow ( ) ;
Position = Light - > GetPosition ( ) ;
Rotation = lcMatrix44ToEulerAngles ( Light - > GetWorldMatrix ( ) ) * LC_RTOD ;
Power = Light - > GetPower ( ) ;
AttenuationDistance = Light - > GetAttenuationDistance ( ) ;
AttenuationPower = Light - > GetAttenuationPower ( ) ;
SpotConeAngle = Light - > GetSpotConeAngle ( ) ;
SpotPenumbraAngle = Light - > GetSpotPenumbraAngle ( ) ;
SpotTightness = Light - > GetSpotTightness ( ) ;
LightAreaShape = Light - > GetAreaShape ( ) ;
LightSize = Light - > GetSize ( ) ;
AreaGrid = Light - > GetAreaGrid ( ) ;
}
2024-01-07 20:39:34 +01:00
UpdateString ( lcObjectPropertyId : : LightName , Name ) ;
UpdateStringList ( lcObjectPropertyId : : LightType , static_cast < int > ( LightType ) ) ;
UpdateColor ( lcObjectPropertyId : : LightColor , Color ) ;
2024-01-06 03:56:43 +01:00
2024-01-07 20:39:34 +01:00
UpdateFloat ( lcObjectPropertyId : : LightPower , Power ) ;
UpdateBool ( lcObjectPropertyId : : LightCastShadow , CastShadow ) ;
2024-01-06 03:56:43 +01:00
2024-01-07 20:39:34 +01:00
UpdateFloat ( lcObjectPropertyId : : LightAttenuationDistance , AttenuationDistance ) ;
UpdateFloat ( lcObjectPropertyId : : LightAttenuationPower , AttenuationPower ) ;
2024-01-06 03:56:43 +01:00
2024-01-07 02:33:43 +01:00
const bool IsPointLight = Light & & Light - > IsPointLight ( ) ;
2024-01-07 20:39:34 +01:00
SetPropertyVisible ( lcObjectPropertyId : : LightPointSize , IsPointLight ) ;
2024-01-07 02:33:43 +01:00
2024-01-07 02:42:47 +01:00
if ( IsPointLight )
2024-01-07 20:39:34 +01:00
UpdateFloat ( lcObjectPropertyId : : LightPointSize , LightSize . x ) ;
2024-01-07 02:42:47 +01:00
2024-01-07 02:33:43 +01:00
const bool IsSpotLight = Light & & Light - > IsSpotLight ( ) ;
2024-01-07 20:39:34 +01:00
SetPropertyVisible ( lcObjectPropertyId : : LightSpotSize , IsSpotLight ) ;
SetPropertyVisible ( lcObjectPropertyId : : LightSpotConeAngle , IsSpotLight ) ;
SetPropertyVisible ( lcObjectPropertyId : : LightSpotPenumbraAngle , IsSpotLight ) ;
SetPropertyVisible ( lcObjectPropertyId : : LightSpotTightness , IsSpotLight ) ;
2024-01-07 02:33:43 +01:00
2024-01-07 02:42:47 +01:00
if ( IsSpotLight )
{
2024-01-07 20:39:34 +01:00
UpdateFloat ( lcObjectPropertyId : : LightSpotSize , LightSize . x ) ;
UpdateFloat ( lcObjectPropertyId : : LightSpotConeAngle , SpotConeAngle ) ;
UpdateFloat ( lcObjectPropertyId : : LightSpotPenumbraAngle , SpotPenumbraAngle ) ;
UpdateFloat ( lcObjectPropertyId : : LightSpotTightness , SpotTightness ) ;
2024-01-07 02:42:47 +01:00
}
2024-01-07 02:33:43 +01:00
const bool IsDirectionalLight = Light & & Light - > IsDirectionalLight ( ) ;
2024-01-07 20:39:34 +01:00
SetPropertyVisible ( lcObjectPropertyId : : LightDirectionalSize , IsDirectionalLight ) ;
2024-01-07 02:33:43 +01:00
2024-01-07 02:42:47 +01:00
if ( IsDirectionalLight )
2024-01-07 20:39:34 +01:00
UpdateFloat ( lcObjectPropertyId : : LightDirectionalSize , LightSize . x ) ;
2024-01-07 02:42:47 +01:00
2024-01-07 02:33:43 +01:00
const bool IsAreaLight = Light & & Light - > IsAreaLight ( ) ;
2024-01-07 20:39:34 +01:00
SetPropertyVisible ( lcObjectPropertyId : : LightAreaShape , IsAreaLight ) ;
2024-01-07 02:33:43 +01:00
const bool IsSquare = IsAreaLight & & ( LightAreaShape = = lcLightAreaShape : : Square | | LightAreaShape = = lcLightAreaShape : : Disk ) ;
2024-01-07 20:39:34 +01:00
SetPropertyVisible ( lcObjectPropertyId : : LightAreaSize , IsSquare ) ;
SetPropertyVisible ( lcObjectPropertyId : : LightAreaSizeX , ! IsSquare ) ;
SetPropertyVisible ( lcObjectPropertyId : : LightAreaSizeY , ! IsSquare ) ;
2024-01-07 02:33:43 +01:00
2024-01-07 20:39:34 +01:00
SetPropertyVisible ( lcObjectPropertyId : : LightAreaGridX , IsAreaLight ) ;
SetPropertyVisible ( lcObjectPropertyId : : LightAreaGridY , IsAreaLight ) ;
2024-01-06 03:56:43 +01:00
2024-01-07 02:42:47 +01:00
if ( IsAreaLight )
2024-01-06 03:56:43 +01:00
{
2024-01-07 20:39:34 +01:00
UpdateStringList ( lcObjectPropertyId : : LightAreaShape , static_cast < int > ( LightAreaShape ) ) ;
UpdateFloat ( lcObjectPropertyId : : LightAreaSize , LightSize . x ) ;
UpdateFloat ( lcObjectPropertyId : : LightAreaSizeX , LightSize . x ) ;
UpdateFloat ( lcObjectPropertyId : : LightAreaSizeY , LightSize . y ) ;
UpdateInteger ( lcObjectPropertyId : : LightAreaGridX , AreaGrid . x ) ;
UpdateInteger ( lcObjectPropertyId : : LightAreaGridY , AreaGrid . y ) ;
2024-01-06 03:56:43 +01:00
}
2024-01-07 20:39:34 +01:00
UpdateFloat ( lcObjectPropertyId : : ObjectPositionX , Position [ 0 ] ) ;
UpdateFloat ( lcObjectPropertyId : : ObjectPositionY , Position [ 1 ] ) ;
UpdateFloat ( lcObjectPropertyId : : ObjectPositionZ , Position [ 2 ] ) ;
2024-01-06 03:56:43 +01:00
2024-01-07 20:39:34 +01:00
UpdateFloat ( lcObjectPropertyId : : ObjectRotationX , Rotation [ 0 ] ) ;
UpdateFloat ( lcObjectPropertyId : : ObjectRotationY , Rotation [ 1 ] ) ;
UpdateFloat ( lcObjectPropertyId : : ObjectRotationZ , Rotation [ 2 ] ) ;
2023-12-31 21:55:35 +01:00
}
void lcPropertiesWidget : : Update ( const lcArray < lcObject * > & Selection , lcObject * Focus )
{
2024-01-21 21:53:18 +01:00
mFocusObject = nullptr ;
mSelection . RemoveAll ( ) ;
2023-12-31 21:55:35 +01:00
LayoutMode Mode = LayoutMode : : Empty ;
if ( Focus )
{
switch ( Focus - > GetType ( ) )
{
case lcObjectType : : Piece :
Mode = LayoutMode : : Piece ;
break ;
case lcObjectType : : Camera :
Mode = LayoutMode : : Camera ;
break ;
case lcObjectType : : Light :
Mode = LayoutMode : : Light ;
break ;
}
}
else
{
for ( int ObjectIdx = 0 ; ObjectIdx < Selection . GetSize ( ) ; ObjectIdx + + )
{
switch ( Selection [ ObjectIdx ] - > GetType ( ) )
{
case lcObjectType : : Piece :
if ( Mode = = LayoutMode : : Empty )
Mode = LayoutMode : : Piece ;
else if ( Mode ! = LayoutMode : : Piece )
{
Mode = LayoutMode : : Multiple ;
ObjectIdx = Selection . GetSize ( ) ;
}
break ;
case lcObjectType : : Camera :
if ( Mode ! = LayoutMode : : Empty )
{
Mode = LayoutMode : : Multiple ;
ObjectIdx = Selection . GetSize ( ) ;
}
else
{
Mode = LayoutMode : : Camera ;
Focus = Selection [ ObjectIdx ] ;
}
break ;
case lcObjectType : : Light :
if ( Mode ! = LayoutMode : : Empty )
{
Mode = LayoutMode : : Multiple ;
ObjectIdx = Selection . GetSize ( ) ;
}
else
{
Mode = LayoutMode : : Light ;
Focus = Selection [ ObjectIdx ] ;
}
break ;
}
}
}
switch ( Mode )
{
case LayoutMode : : Empty :
2024-01-06 03:56:43 +01:00
case LayoutMode : : Multiple :
2024-01-07 02:33:43 +01:00
case LayoutMode : : Count :
2023-12-31 21:55:35 +01:00
SetEmpty ( ) ;
break ;
case LayoutMode : : Piece :
SetPiece ( Selection , Focus ) ;
break ;
case LayoutMode : : Camera :
2024-01-21 21:53:18 +01:00
SetCamera ( Selection , Focus ) ;
2023-12-31 21:55:35 +01:00
break ;
case LayoutMode : : Light :
2024-01-21 21:53:18 +01:00
SetLight ( Selection , Focus ) ;
2023-12-31 21:55:35 +01:00
break ;
}
}