/* Copyright 2006-2015 The QElectroTech Team This file is part of QElectroTech. QElectroTech is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. QElectroTech is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with QElectroTech. If not, see . */ #include "shapegraphicsitempropertieswidget.h" #include "ui_shapegraphicsitempropertieswidget.h" #include "qetshapeitem.h" #include "diagram.h" #include "itemresizercommand.h" #include "changeshapestylecommand.h" /** * @brief ShapeGraphicsItemPropertiesWidget::ShapeGraphicsItemPropertiesWidget * Constructor * @param item : shape to edit * @param parent : parent widget */ ShapeGraphicsItemPropertiesWidget::ShapeGraphicsItemPropertiesWidget(QetShapeItem *item, QWidget *parent) : PropertiesEditorWidget(parent), ui(new Ui::ShapeGraphicsItemPropertiesWidget), m_shape(nullptr) { ui->setupUi(this); setItem(item); } /** * @brief ShapeGraphicsItemPropertiesWidget::~ShapeGraphicsItemPropertiesWidget * Destructor */ ShapeGraphicsItemPropertiesWidget::~ShapeGraphicsItemPropertiesWidget() { delete ui; } /** * @brief ShapeGraphicsItemPropertiesWidget::setItem * Set @shape as the current edited item * @param shape */ void ShapeGraphicsItemPropertiesWidget::setItem(QetShapeItem *shape) { if (!shape) return; if (shape == m_shape) return; if (m_shape) { disconnect(m_shape, &QGraphicsObject::scaleChanged, this, &ShapeGraphicsItemPropertiesWidget::updateUi); disconnect(m_shape, &QetShapeItem::styleChanged, this, &ShapeGraphicsItemPropertiesWidget::updateUi); } m_shape = shape; connect(m_shape, &QGraphicsObject::scaleChanged, this, &ShapeGraphicsItemPropertiesWidget::updateUi); connect(m_shape, &QetShapeItem::styleChanged, this, &ShapeGraphicsItemPropertiesWidget::updateUi); m_old_pen_style = m_shape->penStyle(); m_old_scale = m_shape->scale(); updateUi(); } /** * @brief ShapeGraphicsItemPropertiesWidget::apply * Apply the current change, by pushing an undo command to the * undo stack of the shape diagram. */ void ShapeGraphicsItemPropertiesWidget::apply() { if (m_live_edit) { disconnect(m_shape, &QGraphicsObject::scaleChanged, this, &ShapeGraphicsItemPropertiesWidget::updateUi); disconnect(m_shape, &QetShapeItem::styleChanged, this, &ShapeGraphicsItemPropertiesWidget::updateUi); } if (m_shape->diagram()) if (QUndoCommand *undo = associatedUndo()) m_shape->diagram()->undoStack().push(undo); m_old_pen_style = m_shape->penStyle(); m_old_scale = m_shape->scale(); if (m_live_edit) { connect(m_shape, &QGraphicsObject::scaleChanged, this, &ShapeGraphicsItemPropertiesWidget::updateUi); connect(m_shape, &QetShapeItem::styleChanged, this, &ShapeGraphicsItemPropertiesWidget::updateUi); } } /** * @brief ShapeGraphicsItemPropertiesWidget::reset * Reset the change */ void ShapeGraphicsItemPropertiesWidget::reset() { m_shape->setStyle(m_old_pen_style); m_shape->setScale(m_old_scale); updateUi(); } /** * @brief ShapeGraphicsItemPropertiesWidget::associatedUndo * @return an undo command that represent the change edited by this widget. * The returned undo command can be a ChangeShapeStyleCommand, ItemResizerCommand or * a ChangeShapeStyleCommand with a ItemResizerCommand as child. * If there isn't change, return nullptr */ QUndoCommand* ShapeGraphicsItemPropertiesWidget::associatedUndo() const { QUndoCommand *undo = nullptr; Qt::PenStyle new_style = Qt::PenStyle(ui->m_style_cb->currentIndex() + 1); if (new_style != m_old_pen_style) undo = new ChangeShapeStyleCommand(m_shape, m_old_pen_style, new_style); qreal value = ui->m_scale_slider->value(); value /= 100; if (value != m_old_scale) { if (undo) new ItemResizerCommand(m_shape, m_old_scale, value, tr("une shape"), undo); else undo = new ItemResizerCommand(m_shape, m_old_scale, value, tr("une shape")); } return undo; } /** * @brief ShapeGraphicsItemPropertiesWidget::updateUi */ void ShapeGraphicsItemPropertiesWidget::updateUi() { ui->m_style_cb->setCurrentIndex(static_cast(m_shape->penStyle()) - 1); ui->m_lock_pos_cb->setChecked(!m_shape->isMovable()); ui->m_scale_slider->setValue(m_shape->scale() * 100); } /** * @brief ShapeGraphicsItemPropertiesWidget::setLiveEdit * @param live_edit * @return always true */ bool ShapeGraphicsItemPropertiesWidget::setLiveEdit(bool live_edit) { if (live_edit == m_live_edit) return true; m_live_edit = live_edit; if (m_live_edit) { connect (ui->m_scale_slider, &QSlider::sliderReleased, this, &ShapeGraphicsItemPropertiesWidget::apply); connect (ui->m_scale_sb, &QSpinBox::editingFinished, this, &ShapeGraphicsItemPropertiesWidget::apply); connect (ui->m_style_cb, SIGNAL(activated(int)), this, SLOT(apply())); } else { disconnect (ui->m_scale_slider, &QSlider::sliderReleased, this, &ShapeGraphicsItemPropertiesWidget::apply); disconnect (ui->m_scale_sb, &QSpinBox::editingFinished, this, &ShapeGraphicsItemPropertiesWidget::apply); disconnect (ui->m_style_cb, SIGNAL(activated(int)), this, SLOT(apply())); } return true; } void ShapeGraphicsItemPropertiesWidget::on_m_scale_slider_valueChanged(int value) { qreal scale = value; m_shape->setScale(scale / 100); } void ShapeGraphicsItemPropertiesWidget::on_m_lock_pos_cb_clicked() { m_shape->setMovable(!ui->m_lock_pos_cb->isChecked()); }