示例#1
0
Qt::ItemFlags TodoNode::flags(int column) const
{
    if (m_rowSourceIndex.isValid()) {
        QAbstractItemModel *model = const_cast<QAbstractItemModel*>(m_rowSourceIndex.model());
        return model->flags(m_rowSourceIndex.sibling(m_rowSourceIndex.row(), column));
    } else {
        return m_flags;
    }
}
void QtlCheckableHeaderView::updateAllRows()
{
    QAbstractItemModel* model = this->model();
    if (model != 0) {
        const Qt::CheckState state = (_checkState == Qt::Unchecked) ? Qt::Unchecked : Qt::Checked;
        for (int row = 0; row < model->rowCount(); row++) {
            const QModelIndex index = model->index(row, 0);
            if (index.isValid() && (model->flags(index) & Qt::ItemIsUserCheckable) != 0) {
                model->setData(index, state, Qt::CheckStateRole);
            }
        }
    }
}
void QtlCheckableHeaderView::paintSection(QPainter* painter, const QRect& rect, int logicalIndex) const
{
    // Invoke the superclass to do the main job.
    painter->save();
    QHeaderView::paintSection(painter, rect, logicalIndex);
    painter->restore();

    // We need to paint the checkbox when we are in section 0 only.
    // We also need a model (sanity check).
    QAbstractItemModel* model = this->model();
    if (model == 0 || logicalIndex != 0) {
        return;
    }

    // Count the total number of checkable and checked items in the first column.
    int checkableCount = 0;
    int checkedCount = 0;
    for (int row = 0; row < model->rowCount(); row++) {
        const QModelIndex index = model->index(row, 0);
        if (index.isValid() && (model->flags(index) & Qt::ItemIsUserCheckable) != 0) {
            checkableCount++;
            const Qt::CheckState state= model->data(index, Qt::CheckStateRole).value<Qt::CheckState>();
            if (state != Qt::Unchecked) {
                checkedCount++;
            }
        }
    }

    // Final position and size of the checkbox.
    QStyleOptionButton option;
    option.rect = checkBoxRect(rect.topLeft());
    option.state |= QStyle::State_Enabled;

    // Compute the new check state.
    Qt::CheckState newCheckState = _checkState;
    if (_forceCheck) {
        // Force either checked or unchecked. Do it once only.
        _forceCheck = false;
        if (_checkState == Qt::Unchecked) {
            option.state |= QStyle::State_Off;
            newCheckState = Qt::Unchecked;
        }
        else {
            option.state |= QStyle::State_On;
            newCheckState = Qt::Checked;
        }
    }
    else if (checkedCount == 0) {
        option.state |= QStyle::State_Off;
        newCheckState = Qt::Unchecked;
    }
    else if (checkedCount < checkableCount) {
        option.state |= QStyle::State_NoChange;
        newCheckState = Qt::PartiallyChecked;
    }
    else if (checkedCount == checkableCount) {
        option.state |= QStyle::State_On;
        newCheckState = Qt::Checked;
    }
    else {
        // Should not get there.
        Q_ASSERT(false);
        option.state |= QStyle::State_None;
    }

    // Now draw the checkbox.
    style()->drawControl(QStyle::CE_CheckBox, &option, painter);

    // Finally report change in state.
    if (_checkState != newCheckState) {
        _checkState = newCheckState;
        const_cast<QtlCheckableHeaderView*>(this)->processCheckStateChanged();
    }
}
示例#4
0
QWidget *OBSPropertiesView::AddList(obs_property_t *prop, bool &warning)
{
	const char       *name  = obs_property_name(prop);
	QComboBox        *combo = new QComboBox();
	obs_combo_type   type   = obs_property_list_type(prop);
	obs_combo_format format = obs_property_list_format(prop);
	size_t           count  = obs_property_list_item_count(prop);
	int              idx    = -1;

	for (size_t i = 0; i < count; i++)
		AddComboItem(combo, prop, format, i);

	if (type == OBS_COMBO_TYPE_EDITABLE)
		combo->setEditable(true);

	string value = from_obs_data(settings, name, format);

	if (format == OBS_COMBO_FORMAT_STRING &&
			type == OBS_COMBO_TYPE_EDITABLE)
		combo->lineEdit()->setText(QT_UTF8(value.c_str()));
	else
		idx = combo->findData(QT_UTF8(value.c_str()));

	if (type == OBS_COMBO_TYPE_EDITABLE)
		return NewWidget(prop, combo,
				SIGNAL(editTextChanged(const QString &)));

	if (idx != -1)
		combo->setCurrentIndex(idx);
	
	if (obs_data_has_autoselect_value(settings, name)) {
		string autoselect =
			from_obs_data_autoselect(settings, name, format);
		int id = combo->findData(QT_UTF8(autoselect.c_str()));

		if (id != -1 && id != idx) {
			QString actual   = combo->itemText(id);
			QString selected = combo->itemText(idx);
			QString combined = QTStr(
				"Basic.PropertiesWindow.AutoSelectFormat");
			combo->setItemText(idx,
					combined.arg(selected).arg(actual));
		}
	}


	QAbstractItemModel *model = combo->model();
	warning = idx != -1 &&
		model->flags(model->index(idx, 0)) == Qt::NoItemFlags;

	WidgetInfo *info = new WidgetInfo(this, prop, combo);
	connect(combo, SIGNAL(currentIndexChanged(int)), info,
				SLOT(ControlChanged()));
	children.push_back(std::move(unique_ptr<WidgetInfo>(info)));

	/* trigger a settings update if the index was not found */
	if (idx == -1)
		info->ControlChanged();

	return combo;
}