#ifndef REGISTERWIDGET_H #define REGISTERWIDGET_H #include #include #include class regWidgetElement { public: regWidgetElement(const QString& value,QFont font,int xMargin,int yMargin) { p_valueStr = value; p_font = font; p_xMargins = xMargin; p_yMargins = yMargin; updateBoundingRect(); } void setValue(const QString& value) { p_valueStr = value; updateBoundingRect(); } void setFont(QFont font) { p_font = font; updateBoundingRect(); } QSize boundingRect(){return p_boundingRec;} QString value(){return p_valueStr;} const QChar at ( int position ) const{return p_valueStr.at(position);} QFont font(){return p_font;} int xMargin(){return p_xMargins;} int yMargin(){return p_yMargins;} QFontMetrics fontMetrics(){return QFontMetrics(p_font);} QPoint paint(QPainter* painter) { painter->setFont(p_font); painter->drawText(0,QFontMetrics(p_font).ascent()+p_yMargins,p_valueStr); return QPoint(p_boundingRec.width(),0); } void updateBoundingRect() { p_boundingRec.setHeight(QFontMetrics(p_font).boundingRect(p_valueStr).height()+(p_yMargins*2)); p_boundingRec.setWidth(QFontMetrics(p_font).boundingRect(p_valueStr).width()+(p_xMargins*2)); } protected: QString p_valueStr; QFont p_font; QSize p_boundingRec; int p_xMargins; int p_yMargins; }; class bitfieldsElement: public regWidgetElement { class bitFieldAttribute { public: bitFieldAttribute(bool rw,QString description) { this->rw = rw; this->description = description; } bool rw; QString description; }; public: bitfieldsElement(const QString& value,QFont font,int xMargin,int yMargin); QPoint paint(QPainter* painter); void updateBoundingRect(); void setValue(const QString& value); void blinkCursor(); void moveCursorLeft(int count); void moveCursorRight(int count); void enter(int index); void leave(); uint cursorIndex(); uint cursorIndex(int xPos); void setFont(QFont font); private: int attributesIndex[32]; uint p_cursorIndex; bool p_cursorBlinkEnable; int p_dx; QList attributesLUT; QColor p_blinkTextColor,p_blinkTextBgColor; }; class registerWidget : public QObject { Q_OBJECT public: explicit registerWidget(const QString& name,qint32 address,QObject *parent = 0); ~registerWidget(); int contains(const QPointF &point); QPoint paint(QPainter* painter,QPoint offset); QRect boundingRect(); uint cursorIndex(); uint cursorIndex(int xPos); signals: void cursorUp(int pos); void cursorDown(int pos); void valueChanged(qint32 value); void repaint(); public slots: void setValue(qint32 value); void blinkCursor(); void moveCursorLeft(int count); void moveCursorRight(int count); void enter(int index=0); void leave(); void clear(int index); void set(int index); private: void updateBoundingRect(); qint32 p_address; qint32 p_value; QRect p_boundingRect; int p_xMargins; int p_yMargins; regWidgetElement* p_addressEl,*p_nameEl; bitfieldsElement* p_fieldsEl; }; #endif // REGISTERWIDGET_H