#include "controllerwidget.h"
#include "joystick.h"
+#include "gamepad.h"
#include "keygrabber.h"
-// These tables are used to convert Qt keycodes into human readable form. Note that
-// a lot of these are just filler.
+
+// These tables are used to convert Qt keycodes into human readable form. Note
+// that a lot of these are just filler.
char ControllerWidget::keyName1[96][16] = {
"Space",
"!", "\"", "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/",
"F14", "F15", "F16"
};
+char ControllerWidget::hatName[4][16] = { "Up", "Rt", "Dn", "Lf" };
+
+char ControllerWidget::axisName[2][8] = { "+", "-" };
+
// This is hard-coded crap. It's crap-tastic!
// These are the positions to draw the button names at, ordered by the BUTTON_* sequence
// found in joystick.h.
{ 234, 31 }, { 216, 51 }, { 199, 71 }, { 164-11, 101-30 }, { 141-11, 108+13-30 }
};
+
ControllerWidget::ControllerWidget(QWidget * parent/*= 0*/): QWidget(parent),
controllerPic(":/res/controller.png"), widgetSize(controllerPic.size()),
keyToHighlight(-1), mouseDown(false)
widgetSize += QSize(4, 4);
// We want to know when the mouse is moving over our widget...
setMouseTracking(true);
+//nope
+//setFixedSize(widgetSize);
}
+
ControllerWidget::~ControllerWidget()
{
}
+
QSize ControllerWidget::sizeHint(void) const
{
return widgetSize;
}
+
QSizePolicy ControllerWidget::sizePolicy(void) const
{
return QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
}
+
void ControllerWidget::paintEvent(QPaintEvent * /*event*/)
{
QPainter painter(this);
painter.setPen(colorPen);
painter.drawLine(line);
+//#define DEBUG_CWPAINT
+#ifdef DEBUG_CWPAINT
+printf("------------------------------\n");
+#endif
for(int i=BUTTON_FIRST; i<=BUTTON_LAST; i++)
{
if (keyToHighlight == i)
painter.setFont(font);
}
+#ifdef DEBUG_CWPAINT
+printf("key %02i: ", i);
+#endif
+
if (keys[i] < 0x80)
+#ifdef DEBUG_CWPAINT
+{
+printf("Drawing a key < 0x80 [keys[i]=%X, keyname=%s]...\n", keys[i], keyName1[keys[i] - 0x20]);
+#endif
DrawBorderedText(painter, buttonPos[i][0], buttonPos[i][1],
QString(keyName1[keys[i] - 0x20]));
+#ifdef DEBUG_CWPAINT
+}
+#endif
else if ((keys[i] & 0xFFFFFF00) == 0x01000000)
{
+#ifdef DEBUG_CWPAINT
+printf("Drawing a key with bit 48 set...\n");
+#endif
DrawBorderedText(painter, buttonPos[i][0], buttonPos[i][1],
QString(keyName2[keys[i] & 0x3F]));
}
+#if 1
+ else if (keys[i] & JOY_BUTTON)
+ {
+#ifdef DEBUG_CWPAINT
+printf("Drawing a joystick button...\n");
+#endif
+ DrawBorderedText(painter, buttonPos[i][0], buttonPos[i][1],
+ QString("JB%1").arg(keys[i] & JOY_BUTTON_MASK));
+ }
+ else if (keys[i] & JOY_HAT)
+ {
+#ifdef DEBUG_CWPAINT
+printf("Drawing a joystick hat...\n");
+#endif
+ DrawBorderedText(painter, buttonPos[i][0], buttonPos[i][1],
+ QString("j%1").arg(hatName[keys[i] & JOY_BUTTON_MASK]));
+ }
+ else if (keys[i] & JOY_AXIS)
+ {
+#ifdef DEBUG_CWPAINT
+printf("Drawing a joystick axis...\n");
+#endif
+ DrawBorderedText(painter, buttonPos[i][0], buttonPos[i][1],
+ QString("JA%1%2").arg((keys[i] & JOY_AXISNUM_MASK) >> 1).arg(axisName[keys[i] & JOY_AXISDIR_MASK]));
+ }
+#endif
else
+#ifdef DEBUG_CWPAINT
+{
+printf("Drawing ???...\n");
+#endif
DrawBorderedText(painter, buttonPos[i][0], buttonPos[i][1], QString("???"));
+#ifdef DEBUG_CWPAINT
+}
+#endif
}
}
+
void ControllerWidget::mousePressEvent(QMouseEvent * /*event*/)
{
mouseDown = true;
update();
}
+
void ControllerWidget::mouseReleaseEvent(QMouseEvent * /*event*/)
{
mouseDown = false;
- // Spawning the keygrabber causes leaveEvent() to be called, so we need to save this
+ // Spawning the keygrabber causes leaveEvent() to be called, so we need to
+ // save this
int keyToHighlightSave = keyToHighlight;
KeyGrabber keyGrab(this);
int key = keyGrab.key;
if (key != Qt::Key_Escape)
+ {
keys[keyToHighlightSave] = key;
+ emit(KeyDefined(keyToHighlightSave, key));
+ }
keyToHighlight = keyToHighlightSave;
update();
}
+
void ControllerWidget::mouseMoveEvent(QMouseEvent * event)
{
if (mouseDown)
update();
}
+
void ControllerWidget::leaveEvent(QEvent * /*event*/)
{
keyToHighlight = -1;
update();
}
+
void ControllerWidget::DrawBorderedText(QPainter & painter, int x, int y, QString text)
{
// Text is drawn centered at (x, y) as well, using a bounding rect for the purpose.
rect.moveCenter(QPoint(x, y));
painter.drawText(rect, Qt::AlignCenter, text);
}
+