3 #include <Core/Utils/Color.hpp>
4 #include <Gui/RaGui.hpp>
5 #include <Gui/Widgets/ConstrainedNumericSpinBox.hpp>
6 #include <Gui/Widgets/VectorEditor.hpp>
33 explicit ControlPanel(
const std::string& name,
bool hline =
true, QWidget* parent =
nullptr );
54 void beginLayout( QBoxLayout::Direction dir = QBoxLayout::LeftToRight );
60 void endLayout(
bool separator =
false );
71 void addStretch(
int stretch = 0 );
79 void addOption(
const std::string& name,
80 std::function<
void(
bool )> callback,
82 const std::string& tooltip =
"" );
88 void addLabel(
const std::string& text );
96 void addButton(
const std::string& name,
97 std::function<
void()> callback,
98 const std::string& tooltip =
"" );
110 void addColorInput(
const std::string& name,
113 bool withAlpha =
true,
114 const std::string& tooltip =
"" );
127 template <
typename T = Scalar>
128 void addNumberInput(
const std::string& name,
129 std::function<
void( T )> callback,
131 T min = std::numeric_limits<T>::lowest(),
132 T max = std::numeric_limits<T>::max(),
133 const std::string& tooltip =
"",
146 template <
typename T = Scalar>
147 void addConstrainedNumberInput(
const std::string& name,
148 std::function<
void( T )> callback,
150 std::function<
bool( T )> predicate,
151 const std::string& tooltip =
"",
164 void addSliderInput(
const std::string& name,
165 std::function<
void(
int )> callback,
169 const std::string& tooltip =
"" );
181 void addPowerSliderInput(
const std::string& name,
182 std::function<
void(
double )> callback,
186 const std::string& tooltip =
"" );
196 template <
typename T = Scalar>
197 void addVectorInput(
const std::string& name,
198 std::function<
void(
const std::vector<T>& )> callback,
199 const std::vector<T>& initial,
200 const std::string& tooltip =
"" );
210 void addMatrixInput(
const std::string& name,
211 std::function<
void(
const Ra::Core::MatrixN& )> callback,
212 const Ra::Core::MatrixN& initial,
214 const std::string& tooltip =
"" );
224 void addFileInput(
const std::string& name,
225 std::function<
void( std::string )> callback,
226 const std::string& rootDirectory,
227 const std::string& filters,
228 const std::string& tooltip =
"" );
238 void addFileOutput(
const std::string& name,
239 std::function<
void( std::string )> callback,
240 const std::string& rootDirectory,
241 const std::string& filters,
242 const std::string& tooltip =
"" );
252 void addComboBox(
const std::string& name,
253 std::function<
void(
int )> callback,
255 const std::vector<std::string>& items,
256 const std::string& tooltip =
"" );
257 void addComboBox(
const std::string& name,
258 std::function<
void(
const QString& )> callback,
259 const std::string& initial,
260 const std::vector<std::string>& items,
261 const std::string& tooltip =
"" );
266 void addWidget( QWidget* newWidget );
272 QVBoxLayout* m_contentLayout;
275 QBoxLayout* m_currentLayout;
278 std::stack<QBoxLayout*> m_layouts;
281 template <
typename T>
283 std::function<
void( T )> callback,
285 std::function<
bool( T )> predicate,
286 const std::string& tooltip,
288 auto inputLayout =
new QHBoxLayout();
289 auto inputLabel =
new QLabel( tr( name.c_str() ),
this );
292 inputField->setValue( initial );
293 inputField->setMinimum( std::numeric_limits<T>::lowest() );
294 inputField->setMaximum( std::numeric_limits<T>::max() );
296 qOverload<
typename QtSpinBox::getType<T>::SignalType>(
298 std::move( callback ) );
299 inputField->setPredicate( predicate );
301 if constexpr ( std::is_floating_point_v<T> ) { inputField->setDecimals( dec ); }
303 if ( !tooltip.empty() ) {
304 inputLabel->setToolTip(
305 QString(
"<qt>%1</qt>" ).arg( QString( tooltip.c_str() ).toHtmlEscaped() ) );
308 inputLayout->addWidget( inputLabel );
310 inputLayout->addWidget( inputField );
312 m_currentLayout->addLayout( inputLayout );
315 template <
typename T>
317 std::function<
void( T )> callback,
321 const std::string& tooltip,
323 auto inputLayout =
new QHBoxLayout();
325 auto inputLabel =
new QLabel( tr( name.c_str() ),
this );
327 using WidgetType =
typename QtSpinBox::getType<T>::Type;
328 auto inputField =
new WidgetType(
this );
330 inputField->setRange(
332 std::min( T( std::numeric_limits<
typename QtSpinBox::getType<T>::SignalType>::max() ),
334 inputField->setValue( initial );
336 qOverload<
typename QtSpinBox::getType<T>::SignalType>( &WidgetType::valueChanged ),
337 std::move( callback ) );
338 if constexpr ( std::is_floating_point_v<T> ) { inputField->setDecimals( dec ); }
340 if ( !tooltip.empty() ) {
341 inputLabel->setToolTip(
342 QString(
"<qt>%1</qt>" ).arg( QString( tooltip.c_str() ).toHtmlEscaped() ) );
344 inputLayout->addWidget( inputLabel );
346 inputLayout->addWidget( inputField );
347 m_currentLayout->addLayout( inputLayout );
350 template <
typename T>
352 std::function<
void(
const std::vector<T>& )> callback,
353 const std::vector<T>& initial,
354 const std::string& tooltip ) {
355 auto inputLayout =
new QHBoxLayout();
357 auto inputLabel =
new QLabel( tr( name.c_str() ),
this );
360 if ( !tooltip.empty() ) {
361 inputLabel->setToolTip(
362 QString(
"<qt>%1</qt>" ).arg( QString( tooltip.c_str() ).toHtmlEscaped() ) );
364 inputLayout->addWidget( inputLabel );
365 inputLayout->addWidget( inputField );
367 QOverload<
const std::vector<T>&>::of( &VectorEditorSignals::valueChanged ),
368 std::move( callback ) );
369 m_currentLayout->addLayout( inputLayout );