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 }