File indexing completed on 2024-05-12 17:11:40

0001 #include "canvasfield.h"
0002 
0003 #include "charactersheet/controllers/fieldcontroller.h"
0004 #include <QDebug>
0005 #include <QGraphicsSceneContextMenuEvent>
0006 #include <QPainter>
0007 #include <QStyleOptionGraphicsItem>
0008 
0009 QHash<int, QString> CanvasField::m_pictureMap({{FieldController::TEXTINPUT, ":/rcstyle/Actions-edit-rename-icon.png"},
0010                                                {FieldController::TEXTAREA, ":/rcstyle/textarea.png"},
0011                                                {FieldController::TEXTFIELD, ":/rcstyle/Actions-edit-rename-icon.png"},
0012                                                {FieldController::RLABEL, ""},
0013                                                {FieldController::SELECT, ""},
0014                                                {FieldController::SLIDER, ""},
0015                                                {FieldController::CHECKBOX, ":/rcstyle/checked_checkbox.png"},
0016                                                {FieldController::IMAGE, ":/rcstyle/photo.png"},
0017                                                {FieldController::WEBPAGE, ":/rcstyle/webPage.svg"},
0018                                                {FieldController::DICEBUTTON, ":/rcstyle/symbol.svg"}});
0019 
0020 bool CanvasField::m_showImageField= true;
0021 
0022 CanvasField::CanvasField(FieldController* field) : m_ctrl(field)
0023 {
0024     setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable);
0025 
0026     connect(m_ctrl, &FieldController::readOnlyChanged, this, [this]() {
0027         setFlags(m_ctrl->isReadOnly() ?
0028                      QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable :
0029                      QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable);
0030     });
0031 
0032     connect(m_ctrl, &FieldController::xChanged, this, [this]() {
0033         setPos(m_ctrl->x(), m_ctrl->y());
0034         update();
0035     });
0036     connect(m_ctrl, &FieldController::yChanged, this, [this]() {
0037         setPos(m_ctrl->x(), m_ctrl->y());
0038         update();
0039     });
0040     connect(m_ctrl, &FieldController::widthChanged, this, [this]() { update(); });
0041     connect(m_ctrl, &FieldController::heightChanged, this, [this]() { update(); });
0042     connect(m_ctrl, &FieldController::destroyed, this, &CanvasField::deleteLater);
0043 
0044     connect(this, &CanvasField::xChanged, m_ctrl, [this]() { m_ctrl->setX(pos().x()); });
0045     connect(this, &CanvasField::yChanged, m_ctrl, [this]() { m_ctrl->setY(pos().y()); });
0046 }
0047 void CanvasField::setNewEnd(QPointF nend)
0048 {
0049     m_ctrl->setSecondPosition(nend);
0050 }
0051 FieldController* CanvasField::controller() const
0052 {
0053     return m_ctrl;
0054 }
0055 
0056 QRectF CanvasField::boundingRect() const
0057 {
0058     return QRectF{0, 0, m_ctrl->width(), m_ctrl->height()};
0059 }
0060 QPainterPath CanvasField::shape() const
0061 {
0062     QPainterPath path;
0063     path.moveTo(0, 0);
0064     path.lineTo(m_ctrl->width(), 0);
0065     path.lineTo(m_ctrl->width(), m_ctrl->height());
0066     path.lineTo(0, m_ctrl->height());
0067     path.closeSubpath();
0068     return path;
0069 }
0070 void CanvasField::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
0071 {
0072     Q_UNUSED(widget)
0073 
0074     if(nullptr == m_ctrl)
0075         return;
0076     painter->save();
0077 
0078     auto rect= boundingRect();
0079 
0080     painter->fillRect(rect, m_ctrl->bgColor());
0081 
0082     if(m_ctrl->isReadOnly())
0083         painter->setPen(Qt::gray);
0084     else
0085         painter->setPen(Qt::black);
0086 
0087     painter->drawRect(rect);
0088 
0089     if(option->state & QStyle::State_Selected)
0090     {
0091         painter->save();
0092         QPen pen= painter->pen();
0093         pen.setColor(Qt::red);
0094         pen.setWidth(5);
0095         painter->setPen(pen);
0096         painter->drawRect(rect);
0097         painter->restore();
0098     }
0099 
0100     int flags= 0;
0101     FieldController::TextAlign align= m_ctrl->textAlign();
0102     if(align < 3)
0103     {
0104         flags= Qt::AlignTop;
0105     }
0106     else if(align < 6)
0107     {
0108         flags= Qt::AlignVCenter;
0109     }
0110     else
0111     {
0112         flags= Qt::AlignBottom;
0113     }
0114 
0115     if(align % 3 == 0)
0116     {
0117         flags|= Qt::AlignRight;
0118     }
0119     else if(align % 3 == 1)
0120     {
0121         flags|= Qt::AlignHCenter;
0122     }
0123     else
0124     {
0125         flags|= Qt::AlignLeft;
0126     }
0127 
0128     if(m_pix.isNull() || m_currentType != m_ctrl->fieldType())
0129     {
0130         QPixmap map= QPixmap(m_pictureMap[m_ctrl->fieldType()]);
0131         if(!map.isNull())
0132         {
0133             m_pix= map.scaled(32, 32);
0134             m_currentType= m_ctrl->fieldType();
0135         }
0136     }
0137     if((!m_pix.isNull()) && m_showImageField)
0138     {
0139         painter->drawPixmap(rect.center() - m_pix.rect().center(), m_pix, m_pix.rect());
0140     }
0141 
0142     painter->drawText(rect, flags, m_ctrl->id());
0143     painter->restore();
0144 }
0145 
0146 bool CanvasField::getShowImageField()
0147 {
0148     return m_showImageField;
0149 }
0150 
0151 void CanvasField::setShowImageField(bool showImageField)
0152 {
0153     m_showImageField= showImageField;
0154 }
0155 
0156 void CanvasField::setMenu(QMenu& menu)
0157 {
0158     Q_UNUSED(menu)
0159 }