peripheralwidget.cpp
241 lines
| 7.0 KiB
| text/x-c
|
CppLexer
/ src / peripheralwidget.cpp
Jeandet Alexis
|
r5 | #include "peripheralwidget.h" | ||
peripheralWidget::peripheralWidget(const QString &name, qint32 baseAddress, QWidget *parent) : | ||||
QWidget(parent) | ||||
{ | ||||
p_name = name; | ||||
p_timer = new QTimer(this); | ||||
p_timer->setInterval(500); | ||||
p_baseAddress = baseAddress; | ||||
p_header = p_name + QString(" @0x%1").arg((uint)p_baseAddress,8,16); | ||||
setAttribute(Qt::WA_AlwaysShowToolTips); | ||||
setMouseTracking(true); | ||||
setFocusPolicy(Qt::StrongFocus); | ||||
selectedReg = -1; | ||||
registersWdgts.clear(); | ||||
connect(p_timer,SIGNAL(timeout()),this,SLOT(blinkCursor())); | ||||
setFont(QFont("Utopia", 14,QFont::Bold)); | ||||
} | ||||
void peripheralWidget::blinkCursor() | ||||
{ | ||||
if(selectedReg!=-1) | ||||
registersWdgts.at(selectedReg)->blinkCursor(); | ||||
repaint(); | ||||
} | ||||
void peripheralWidget::addRegister(const QString &name, qint32 address) | ||||
{ | ||||
/*TODO Should regs by address*/ | ||||
registersWdgts.append(new registerWidget(name,address)); | ||||
connect(registersWdgts.last(),SIGNAL(repaint()),this,SLOT(repaint())); | ||||
} | ||||
Jeandet Alexis
|
r11 | void peripheralWidget::leave() | ||
{ | ||||
if(selectedReg!=-1) | ||||
{ | ||||
p_timer->stop(); | ||||
registersWdgts.at(selectedReg)->leave(); | ||||
selectedReg = -1; | ||||
repaint(); | ||||
} | ||||
} | ||||
void peripheralWidget::enter(int cursorIndex, bool fromTop) | ||||
{ | ||||
if(cursorIndex>=0 && cursorIndex<32) | ||||
{ | ||||
if(fromTop) | ||||
{ | ||||
registersWdgts.at(0)->enter(cursorIndex); | ||||
selectedReg = 0; | ||||
} | ||||
else | ||||
{ | ||||
registersWdgts.at(registersWdgts.count()-1)->enter(cursorIndex); | ||||
selectedReg = registersWdgts.count()-1; | ||||
} | ||||
p_timer->start(); | ||||
this->setFocus(); | ||||
} | ||||
} | ||||
Jeandet Alexis
|
r5 | void peripheralWidget::mousePressEvent(QMouseEvent *event) | ||
{ | ||||
p_timer->stop(); | ||||
if(selectedReg!=-1) | ||||
{ | ||||
registersWdgts.at(selectedReg)->leave(); | ||||
selectedReg = -1; | ||||
} | ||||
for(int i=0; i<registersWdgts.count();i++) | ||||
{ | ||||
if(registersWdgts.at(i)->contains(event->pos())) | ||||
{ | ||||
registersWdgts.at(i)->enter(registersWdgts.at(i)->cursorIndex(event->pos().x())); | ||||
selectedReg = i; | ||||
p_timer->start(); | ||||
Jeandet Alexis
|
r11 | emit clicked(this); | ||
Jeandet Alexis
|
r5 | } | ||
} | ||||
repaint(); | ||||
} | ||||
void peripheralWidget::mouseMoveEvent(QMouseEvent *event) | ||||
{ | ||||
Jeandet Alexis
|
r7 | bool match=false; | ||
r9 | if(event->buttons()==Qt::LeftButton) | |||
Jeandet Alexis
|
r7 | { | ||
r9 | for(int i=0; i<registersWdgts.count();i++) | |||
Jeandet Alexis
|
r7 | { | ||
r9 | if(registersWdgts.at(i)->contains(event->pos())) | |||
{ | ||||
registersWdgts.at(i)->updateSelection(registersWdgts.at(i)->cursorIndex(event->pos().x())); | ||||
} | ||||
Jeandet Alexis
|
r7 | } | ||
} | ||||
r9 | else | |||
{ | ||||
for(int i=0; i<registersWdgts.count();i++) | ||||
{ | ||||
if(registersWdgts.at(i)->contains(event->pos())) | ||||
{ | ||||
match = true; | ||||
Jeandet Alexis
|
r11 | int bitfieldIndex=registersWdgts.at(i)->cursorIndex(event->pos().x()); | ||
QString toolTipText ="<b>< font color='Black'>"+registersWdgts.at(i)->bitFieldName(bitfieldIndex) +"</b><br />"; | ||||
toolTipText+= "Hexadecimal=<b>< font color='Blue'>"+registersWdgts.at(i)->bitFieldToHex(bitfieldIndex)+"</b>"; | ||||
toolTipText+= " Decimal=<b>< font color='BlueViolet'>"+registersWdgts.at(i)->bitFieldToDec(bitfieldIndex)+"</b><br />"; | ||||
toolTipText+= registersWdgts.at(i)->bitFieldDesc(bitfieldIndex); | ||||
QToolTip::showText(event->globalPos(),toolTipText,(QWidget*)this); | ||||
r9 | } | |||
} | ||||
if(!match)QToolTip::hideText(); | ||||
} | ||||
Jeandet Alexis
|
r5 | } | ||
void peripheralWidget::mouseReleaseEvent(QMouseEvent *event) | ||||
{ | ||||
} | ||||
void peripheralWidget::keyPressEvent(QKeyEvent *event) | ||||
{ | ||||
if(this->selectedReg!=-1){ | ||||
if(event->modifiers()==Qt::ControlModifier) | ||||
{ | ||||
switch(event->key()) | ||||
{ | ||||
case Qt::Key_Up: | ||||
registersWdgts.at(selectedReg)->set(registersWdgts.at(selectedReg)->cursorIndex()); | ||||
break; | ||||
case Qt::Key_Down: | ||||
registersWdgts.at(selectedReg)->clear(registersWdgts.at(selectedReg)->cursorIndex()); | ||||
break; | ||||
case Qt::Key_W: | ||||
emit writeRegSig(registersWdgts.at(selectedReg)->address(),registersWdgts.at(selectedReg)->value()); | ||||
break; | ||||
case Qt::Key_R: | ||||
qint32 value; | ||||
value = emit readRegSig(registersWdgts.at(selectedReg)->address()); | ||||
Jeandet Alexis
|
r7 | registersWdgts.at(selectedReg)->setValue(value); | ||
Jeandet Alexis
|
r5 | break; | ||
default: | ||||
break; | ||||
} | ||||
} | ||||
else | ||||
{ | ||||
switch(event->key()) | ||||
{ | ||||
case Qt::Key_0: | ||||
registersWdgts.at(selectedReg)->clear(registersWdgts.at(selectedReg)->cursorIndex()); | ||||
registersWdgts.at(selectedReg)->moveCursorRight(1); | ||||
break; | ||||
case Qt::Key_1: | ||||
registersWdgts.at(selectedReg)->set(registersWdgts.at(selectedReg)->cursorIndex()); | ||||
registersWdgts.at(selectedReg)->moveCursorRight(1); | ||||
break; | ||||
case Qt::Key_Right: | ||||
registersWdgts.at(selectedReg)->moveCursorRight(1); | ||||
this->repaint(); | ||||
break; | ||||
case Qt::Key_Left: | ||||
registersWdgts.at(selectedReg)->moveCursorLeft(1); | ||||
this->repaint(); | ||||
break; | ||||
case Qt::Key_Up: | ||||
up(); | ||||
break; | ||||
case Qt::Key_Down: | ||||
down(); | ||||
break; | ||||
default: | ||||
break; | ||||
} | ||||
} | ||||
} | ||||
} | ||||
void peripheralWidget::paintEvent(QPaintEvent *event) | ||||
{ | ||||
Q_UNUSED(event) | ||||
QPainter painter(this); | ||||
QPoint offset=QPoint(0,0); | ||||
int nameWidth = fontMetrics().width(p_header); | ||||
if(registersWdgts.count()==0) | ||||
{ | ||||
setMinimumSize(2*nameWidth+10,fontMetrics().height()+10); | ||||
} | ||||
painter.drawText((this->minimumWidth()/2)-nameWidth,4,fontMetrics().width(p_header),fontMetrics().height()+4,Qt::AlignCenter,p_header); | ||||
offset+=QPoint(0,fontMetrics().height()+8); | ||||
for(int i=0;i<registersWdgts.count();i++) | ||||
{ | ||||
offset = registersWdgts.at(i)->paint(&painter,offset); | ||||
} | ||||
if(registersWdgts.count()>0) | ||||
{ | ||||
setMinimumSize(registersWdgts.first()->boundingRect().width(),offset.y()); | ||||
} | ||||
updateGeometry(); | ||||
} | ||||
void peripheralWidget::up() | ||||
{ | ||||
Jeandet Alexis
|
r11 | if(selectedReg!=-1) | ||
Jeandet Alexis
|
r5 | { | ||
Jeandet Alexis
|
r11 | if(selectedReg >0) | ||
{ | ||||
registersWdgts.at(selectedReg-1)->enter(registersWdgts.at(selectedReg)->cursorIndex()); | ||||
registersWdgts.at(selectedReg)->leave(); | ||||
selectedReg-=1; | ||||
repaint(); | ||||
} | ||||
else | ||||
{ | ||||
emit upSig(this,registersWdgts.at(selectedReg)->cursorIndex()); | ||||
} | ||||
Jeandet Alexis
|
r5 | } | ||
} | ||||
void peripheralWidget::down() | ||||
{ | ||||
Jeandet Alexis
|
r11 | if(selectedReg!=-1) | ||
Jeandet Alexis
|
r5 | { | ||
Jeandet Alexis
|
r11 | if(selectedReg <(registersWdgts.count()-1)) | ||
{ | ||||
registersWdgts.at(selectedReg+1)->enter(registersWdgts.at(selectedReg)->cursorIndex()); | ||||
registersWdgts.at(selectedReg)->leave(); | ||||
selectedReg+=1; | ||||
repaint(); | ||||
} | ||||
else | ||||
{ | ||||
emit downSig(this,registersWdgts.at(selectedReg)->cursorIndex()); | ||||
} | ||||
Jeandet Alexis
|
r5 | } | ||
} | ||||