Added boolean value update

This commit is contained in:
Christoph Holzheuer
2026-04-01 16:11:28 +02:00
parent 075aadc665
commit b9f515950a
10 changed files with 1213 additions and 101 deletions

View File

@@ -67,8 +67,18 @@ QWidget* BCValueDelegate::createEditor(QWidget *parent, const QStyleOptionViewIt
if( bcValue.isBoolean() )
{
auto* toogleSwitch = new BCToggleSwitch{parent};
return toogleSwitch;
auto* toggleSwitch = new BCToggleSwitch{parent};
toggleSwitch->setChecked(bcValue.isChecked() );
// Signal für sofortige Updates
connect(toggleSwitch, &BCToggleSwitch::toggled, this, [this, toggleSwitch](bool checked)
{
qDebug() << "--- toggled: " << checked;
// Commit data sofort bei Änderung
emit const_cast<BCValueDelegate*>(this)->commitData(toggleSwitch);
});
return toggleSwitch;
}
BCValue::ValueRange params;
@@ -86,6 +96,7 @@ QWidget* BCValueDelegate::createEditor(QWidget *parent, const QStyleOptionViewIt
emit const_cast<BCValueDelegate*>(this)->commitData(valueSlider);
});
/*
// Signal für sofortige Updates
connect(valueSlider, &BCValueSlider::valueCommited, this, [this, valueSlider](int newValue)
{
@@ -93,6 +104,7 @@ QWidget* BCValueDelegate::createEditor(QWidget *parent, const QStyleOptionViewIt
// Commit data sofort bei Änderung
emit const_cast<BCValueDelegate*>(this)->commitData(valueSlider);
});
*/
return valueSlider;
}
@@ -112,34 +124,44 @@ void BCValueDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptionVi
Q_UNUSED(index)
const BCValue& bcValue = *(_valueList[ index.row()].get());
QRect editorRect;
QRect editorRect = bcValue.isBoolean() ? adjustEditorRect(option.rect, 0, 6, -130, -6) : adjustEditorRect(option.rect, 0, 0, 8, 0);
/*
if( !bcValue.isBoolean())
{
editorRect = clipToSliderRect( option.rect );
editorRect = adjustEditorRect( option.rect,0,0,8,0 );
}
else
{
editorRect = option.rect.adjusted(option.rect.width() - cTextBlockOffset,4,0,0);
editorRect = adjustEditorRect(option.rect, 0, 6, -130, -6);
}
*/
editor->setGeometry(editorRect);
}
void BCValueDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex& index) const
{
if( index.column() == 1)
{
// Daten vom Editor zurück ins Model speichern (Beim Schließen)
BCValueSlider* slider = qobject_cast<BCValueSlider*>(editor);
if (slider)
{
int value = slider->value();
model->setData(index, value, Qt::EditRole);
}
if (index.column() != 1)
return;
}
QStyledItemDelegate::setModelData(editor, model, index);
QVariant reValue;
const BCValue& bcValue = *(_valueList[index.row()].get());
if (bcValue.isBoolean())
{
if (BCToggleSwitch* toggleSswitch = qobject_cast<BCToggleSwitch*>(editor))
reValue = toggleSswitch->isChecked() ? 1 : 0;
}
else
{
if (BCValueSlider* slider = qobject_cast<BCValueSlider*>(editor))
reValue = slider->value();
}
model->setData(index, reValue, Qt::EditRole);
return;
}
@@ -152,7 +174,7 @@ void BCValueDelegate::paint(QPainter *painter, const QStyleOptionViewItem& optio
QStyleOptionViewItem opt = option;
initStyleOption(&opt, index);
const BCValue& bcValue = *(_valueList[ index.row()].get());
const BCValue& bcValue = *(_valueList[ index.row()].get());
if( bcValue.isBoolean() )
{
@@ -208,56 +230,29 @@ void BCValueDelegate::paintBooleanValue( QPainter *painter, const QStyleOptionVi
text, // Der zu zeichnende String
textRole // Die ermittelte Farb-Rolle
);
return;
/*
// 1. Standard-Optionen für die Zelle holen
QStyleOptionViewItem opt = option;
//initStyleOption(&opt, index);
// 2. Den originalen Text ('0' oder '1') ausblenden, damit er nicht hinter der Checkbox steht
opt.text = "";
// Zuerst den Hintergrund der Zelle zeichnen (wichtig für Selektions-Farben etc.)
// Wir übergeben nullptr für das Widget, da QStyledItemDelegate ohnehin unabhängig zeichnet
QApplication::style()->drawControl(QStyle::CE_ItemViewItem, &opt, painter, nullptr);
// 4. Optionen für die Checkbox konfigurieren
QStyleOptionButton cbOpt;
cbOpt.state = isChecked ? QStyle::State_On : QStyle::State_Off;
cbOpt.state |= QStyle::State_Enabled; // Damit die Checkbox nicht ausgegraut/deaktiviert aussieht
// 5. Größe und Position berechnen (Zentriert in der Zelle)
// Wir fragen das System nach der korrekten Größe für eine Checkbox
QRect checkRect = QApplication::style()->subElementRect(QStyle::SE_CheckBoxIndicator, &cbOpt, nullptr);
// Checkbox exakt in der Mitte des zur Verfügung stehenden Zellenbereichs platzieren
cbOpt.rect = QStyle::alignedRect(option.direction, Qt::AlignLeft| Qt::AlignVCenter, checkRect.size(), option.rect);
// 6. Die native Checkbox zeichnen
QApplication::style()->drawPrimitive(QStyle::PE_IndicatorCheckBox, &cbOpt, painter, nullptr);
*/
}
QRect BCValueDelegate::clipToSliderRect( const QRect& rect, int buttonOffset ) const
QRect BCValueDelegate::adjustEditorRect( const QRect& rect, int x1, int y1, int x2, int y2 ) const
{
return rect.adjusted
(
rect.width() - cTextBlockOffset, // Von rechts: cTextBlockOffset (==130) px (Breite der Progress Bar)
0, // Oben: kein Offset
-buttonOffset, // Rechts: 8px Padding
0 // Unten: kein Offset
rect.width() - cTextBlockOffset + x1, // Von rechts: cTextBlockOffset (==130) px (Breite der Progress Bar)
y1, // Oben: kein Offset
x2, // Rechts: 8px Padding
y2 // Unten: kein Offset
);
}
// option.rect.adjusted(option.rect.width() - cTextBlockOffset,4,0,0);
/**
* @brief Zeichnet der 'Sliderindicator', also den Anteil des Gesamtwerts als Fortschrittsbalken
*/
void BCValueDelegate::paintPlainSliderIndicator(QPainter* painter, const QRect& rect, double ratio )const
{
QRect sliderRect = clipToSliderRect( rect, 35 );
//BCValueSliderOld::paintSliderIndicator(painter, sliderRect, ratio );
QRect sliderRect = adjustEditorRect( rect, 0, 0, -35, 0 );
// Kleinen Slider-Indikator zeichnen
painter->save();
painter->setRenderHint(QPainter::Antialiasing);