void DockingConView::createItems(ControllerForm *conForm)
{
/* bezel */
- bezelItem = createBezelItem(conForm);
+ bezelItem = createBezelItem(NULL, conForm);
scene()->addItem(bezelItem);
/* HW keys */
for (int i = 0; i < keyList.count(); i++) {
hwKey = keyList.at(i);
if (hwKey != NULL) {
- new SkinKeyItem(bezelItem, hwKey,
- conForm->skinImg[LayoutForm::pressed].copy(hwKey->getRegion()),
- conForm->getHoverType());
+ createKeyItem(bezelItem, conForm, hwKey);
}
}
} else {
}
}
+/* override */
+QRegion DockingConView::getKeyWinRegion(
+ QWidget *base, QRect &keyRect, LayoutForm::SkinImgType type)
+{
+ return ((MainWindow *)parent->parentWidget())->
+ uiInfo->getConKeyRegion(base, keyRect, type);
+}
+
+/* override */
void DockingConView::resizeEvent(QResizeEvent *event)
{
/* do nothing */
SkinView::resizeEvent(event);
}
+/* override */
void DockingConView::mousePressEvent(QMouseEvent *event)
{
SkinView::mousePressEvent(event);
setConViewStatus(CONVIEW_PRESSED);
}
+/* override */
void DockingConView::mouseDoubleClickEvent(QMouseEvent *event)
{
SkinView::mouseDoubleClickEvent(event);
setConViewStatus(CONVIEW_DOUBLECLICKED);
}
+/* override */
void DockingConView::mouseReleaseEvent(QMouseEvent *event)
{
SkinView::mouseReleaseEvent(event);
setConViewStatus(CONVIEW_RELEASED);
}
+/* override */
void DockingConView::mouseMoveEvent(QMouseEvent *event)
{
SkinView::mouseMoveEvent(event);
int getConViewStatus();
protected:
+ QRegion getKeyWinRegion(
+ QWidget *base, QRect &keyRect, LayoutForm::SkinImgType type);
+
void resizeEvent(QResizeEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseDoubleClickEvent(QMouseEvent *event);
void FloatingConView::createItems(ControllerForm *conForm)
{
/* bezel */
- bezelItem = createBezelItem(conForm);
+ bezelItem = createBezelItem(NULL, conForm);
scene()->addItem(bezelItem);
/* HW keys */
for (int i = 0; i < keyList.count(); i++) {
hwKey = keyList.at(i);
if (hwKey != NULL) {
- new SkinKeyItem(bezelItem, hwKey,
- conForm->skinImg[LayoutForm::pressed].copy(hwKey->getRegion()),
- conForm->getHoverType());
+ createKeyItem(bezelItem, conForm, hwKey);
}
}
} else {
}
}
+/* override */
+QRegion FloatingConView::getKeyWinRegion(
+ QWidget *base, QRect &keyRect, LayoutForm::SkinImgType type)
+{
+ return ((MainWindow *)parent->parentWidget())->
+ uiInfo->getConKeyRegion(base, keyRect, type);
+}
+
+/* override */
void FloatingConView::resizeEvent(QResizeEvent *event)
{
/* do nothing */
return -1;
}
+/* override */
void FloatingConView::mousePressEvent(QMouseEvent *event)
{
SkinView::mousePressEvent(event);
}
}
+/* override */
void FloatingConView::mouseReleaseEvent(QMouseEvent *event)
{
SkinView::mouseReleaseEvent(event);
}
}
+/* override */
void FloatingConView::mouseMoveEvent(QMouseEvent *event)
{
SkinView::mouseMoveEvent(event);
~FloatingConView();
protected:
+ QRegion getKeyWinRegion(
+ QWidget *base, QRect &keyRect, LayoutForm::SkinImgType type);
+
void resizeEvent(QResizeEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
return (keycodeType->getLongPressKeycode() > 0);
}
-QRect HardwareKey::getRegion()
+QRect &HardwareKey::getRect()
{
return region;
}
KeycodeType *getKeycodeType();
int getKeycode();
bool hasLongPressKeycode();
- QRect getRegion();
+ QRect &getRect();
QString getTooltip();
QKeySequence getKeySequence();
SkinView(parent, scene)
{
this->win = ((MainWindow *)parent);
- this->kbdHelper = new KeyboardHelper(this);
this->grabWinPos = QPoint(-1, -1);
+ this->kbdHelper = new KeyboardHelper(this);
updateLayout();
}
void MainView::createItems(MainForm *form)
{
/* bezel */
- SkinBezelItem *bezelItem = createBezelItem(form);
+ bezelItem = createBezelItem(NULL, form);
scene()->addItem(bezelItem);
/* HW keys */
for (int i = 0; i < keyList.count(); i++) {
hwKey = keyList.at(i);
if (hwKey != NULL) {
- new SkinKeyItem(bezelItem, hwKey,
- form->skinImg[LayoutForm::pressed].copy(hwKey->getRegion()),
- form->getHoverType());
+ createKeyItem(bezelItem, form, hwKey);
}
}
}
+/* override */
+QRegion MainView::getKeyWinRegion(
+ QWidget *base, QRect &keyRect, LayoutForm::SkinImgType type)
+{
+ return win->uiInfo->getMainKeyRegion(base, keyRect, type);
+}
+
KeyboardHelper *MainView::getKbdHelper()
{
return kbdHelper;
/* override */
void MainView::mousePressEvent(QMouseEvent *event)
{
+ SkinView::mousePressEvent(event);
+
+ if (bezelItem->isHWKeyHandling() == true) {
+ /* do nothing */
+ return;
+ }
+
if (event->button() == Qt::LeftButton) {
grabWindow(event->globalPos());
}
-
- SkinView::mousePressEvent(event);
}
/* override */
void MainView::mouseReleaseEvent(QMouseEvent *event)
{
+ SkinView::mouseReleaseEvent(event);
+
+ if (bezelItem->isHWKeyHandling() == true) {
+ /* do nothing */
+ return;
+ }
+
if (event->button() == Qt::LeftButton) {
releaseWindow();
}
-
- SkinView::mouseReleaseEvent(event);
}
/* override */
void MainView::mouseMoveEvent(QMouseEvent *event)
{
+ SkinView::mouseMoveEvent(event);
+
+ if (bezelItem->isHWKeyHandling() == true) {
+ /* do nothing */
+ return;
+ }
+
if (isGrabWindow() == true) {
win->move(grabWinPos + (event->globalPos() - grabPos));
}
-
- SkinView::mouseMoveEvent(event);
}
/* override */
void updateLayout();
protected:
- void resizeEvent(QResizeEvent *event);
+ QRegion getKeyWinRegion(QWidget *base, QRect &keyRect, LayoutForm::SkinImgType type);
+ void resizeEvent(QResizeEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void focusOutEvent(QFocusEvent *event);
MainWindow *win;
+ SkinBezelItem *bezelItem;
QPoint grabWinPos;
KeyboardHelper *kbdHelper;
#include <QDebug>
#include "skinkeyitem.h"
+#include "skinview.h"
extern "C" {
#include "emul_state.h"
#include "util/ui_operations.h"
}
-SkinKeyItem::SkinKeyItem(SkinBezelItem *parent,
- HardwareKey *hwKey, QImage pressedImg, HoverType *hover) :
- QGraphicsRectItem(hwKey->getRegion(), (QGraphicsItem *)parent)
+SkinKeyItem::SkinKeyItem(QGraphicsItem *parent, HardwareKey *hwKey,
+ QImage pressedImg, bool reMasking, HoverType *hover) :
+ QGraphicsRectItem(hwKey->getRect(), parent)
{
- this->bezelParent = parent;
- this->pressedImg = pressedImg;
+ this->viewer = (SkinView *)scene()->views().at(0);
+ this->bezelParent = (SkinBezelItem *)parent;
this->hwKey = hwKey;
+ this->pressedImg = pressedImg;
+ this->reMasking = reMasking;
this->isPressed = false;
if (hover != NULL) {
{
bezelParent->setHWKeyHandling(isPressed = true);
+ hoverPen.setColor(Qt::transparent);
+ update();
+
+ if (reMasking == true && viewer != NULL) {
+ /* re-masking for HW key region */
+ qDebug() << "HW key re-masking:" << hwKey->getName();
+
+ QWidget *target = viewer->topLevelWidget();
+ target->setMask(viewer->getKeyWinRegion(
+ target, hwKey->getRect(), LayoutForm::pressed));
+ }
+
if (hwKey->hasLongPressKeycode() == true) {
/* long press checking first */
longPressTimer->start();
}
const int keycode = hwKey->getKeycode();
-
qDebug() << hwKey->getName() << "key pressed:" << keycode;
do_hw_key_event(KEY_PRESSED, keycode);
-
- hoverPen.setColor(Qt::transparent);
- update();
}
/* override */
{
bezelParent->setHWKeyHandling(isPressed = false);
+ update();
+
+ if (reMasking == true && viewer != NULL) {
+ /* reset re-masking */
+ QWidget *target = viewer->topLevelWidget();
+ target->setMask(viewer->getKeyWinRegion(
+ target, hwKey->getRect(), LayoutForm::normal));
+ }
+
int keycode = hwKey->getKeycode();
if (hwKey->hasLongPressKeycode() == true) {
qDebug() << hwKey->getName() << "key released:" << keycode;
do_hw_key_event(KEY_RELEASED, keycode);
-
- update();
}
/* override */
if (hoverPen.color() != Qt::transparent) {
painter->setPen(hoverPen);
- painter->drawRect(rect());
+ painter->drawRect(rect().x(), rect().y(),
+ rect().width() - 1, rect().height() - 1);
}
if (isPressed == true) {
#include "layout/hardwarekey.h"
#include "layout/hovertype.h"
+class SkinView;
+
class SkinKeyItem : public QObject, public QGraphicsRectItem
{
Q_OBJECT
public:
- SkinKeyItem(SkinBezelItem *parent,
- HardwareKey *hwKey, QImage pressedImg, HoverType *hover);
+ SkinKeyItem(QGraphicsItem *parent, HardwareKey *hwKey,
+ QImage pressedImg, bool reMasking, HoverType *hover);
~SkinKeyItem();
- HardwareKey *hwKey;
- QImage pressedImg;
- QTimer *longPressTimer;
-
protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event);
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
void longPressHook();
private:
+ SkinView *viewer;
SkinBezelItem *bezelParent;
+ HardwareKey *hwKey;
+
+ QImage pressedImg;
+ bool reMasking;
bool isPressed;
QColor hoverColor;
QPen hoverPen;
QBrush brush;
+ QTimer *longPressTimer;
};
#endif // SKINKEYITEM_H
*
*/
+#include <QtWidgets>
+
#include "skinview.h"
SkinView::SkinView(QWidget *parent, QGraphicsScene *scene) :
setAlignment(Qt::AlignLeft | Qt::AlignTop);
}
-SkinBezelItem *SkinView::createBezelItem(LayoutForm *form)
+SkinBezelItem *SkinView::createBezelItem(QGraphicsItem *parent, LayoutForm *form)
{
- return new SkinBezelItem(NULL,
+ return new SkinBezelItem(parent,
QPixmap::fromImage(form->skinImg[LayoutForm::normal]));
}
+SkinKeyItem *SkinView::createKeyItem(QGraphicsItem *parent,
+ LayoutForm *form, HardwareKey *hwKey)
+{
+ bool reMasking = false;
+
+ QImage normalKeyImg = form->skinImg[LayoutForm::normal].copy(hwKey->getRect());
+ QImage pressedKeyImg = form->skinImg[LayoutForm::pressed].copy(hwKey->getRect());
+ QImage normalMask = normalKeyImg.createAlphaMask();
+ QImage pressedMask = pressedKeyImg.createAlphaMask();
+ if (normalMask != pressedMask) {
+ reMasking = true;
+ }
+
+ return new SkinKeyItem(parent, hwKey,
+ pressedKeyImg, reMasking, form->getHoverType());
+}
+
SkinView::~SkinView()
{
/* do nothing */
#include <QGraphicsView>
#include "skinbezelitem.h"
+#include "skinkeyitem.h"
#include "layout/layoutform.h"
class SkinView : public QGraphicsView
SkinView(QWidget *parent, QGraphicsScene *scene);
~SkinView();
+ virtual QRegion getKeyWinRegion(
+ QWidget *base, QRect &keyRect, LayoutForm::SkinImgType type) = 0;
+
protected:
- SkinBezelItem *createBezelItem(LayoutForm *form);
+ SkinBezelItem *createBezelItem(QGraphicsItem *parent, LayoutForm *form);
+ SkinKeyItem *createKeyItem(QGraphicsItem *parent,
+ LayoutForm *form, HardwareKey *hwKey);
QPoint grabPos;
};
index = uiState.mainFormIndex = 0;
}
- return mainFormList.at(index);
+ MainForm *mainForm = mainFormList.at(index);
+ if (mainForm == NULL) {
+ qFatal(MSG_INVALID_MAIN_FORM);
+ }
+
+ return mainForm;
}
DisplayType *UIInformation::getMainFormDisplayType()
/* size */
QSize UIInformation::getMainSize()
{
- MainForm *mainForm = getMainForm();
- if (mainForm == NULL) {
- qFatal(MSG_INVALID_MAIN_FORM);
- }
-
- return mainForm->skinImg[LayoutForm::normal].size() * uiState.getScaleFactor();
+ return getMainForm()->
+ skinImg[LayoutForm::normal].size() * uiState.getScaleFactor();
}
QSize UIInformation::getConSize()
/* region */
QRegion UIInformation::getMainRegion()
{
- MainForm *mainForm = getMainForm();
- if (mainForm == NULL) {
- qWarning("main form is null");
- return QRegion(0, 0, 0, 0);
- }
-
- QImage *mainImage = &(mainForm->skinImg[LayoutForm::normal]);
+ QImage *mainImage = &(getMainForm()->skinImg[LayoutForm::normal]);
QImage regionImage = mainImage->scaled(
mainImage->width() * uiState.getScaleFactor(),
mainImage->height() * uiState.getScaleFactor()).createAlphaMask();
return uiRegion;
}
+QRegion UIInformation::getMainKeyRegion(
+ QWidget *base, QRect &keyRect, LayoutForm::SkinImgType type)
+{
+ QRegion baseRegion = base->mask().subtracted(QRect(
+ keyRect.topLeft() * uiState.getScaleFactor(),
+ keyRect.size() * uiState.getScaleFactor()));
+
+ QImage keyImage = getMainForm()->skinImg[type].copy(keyRect);
+ QImage regionImage = keyImage.scaled(
+ keyImage.width() * uiState.getScaleFactor(),
+ keyImage.height() * uiState.getScaleFactor()).createAlphaMask();
+
+ QRegion keyRegion(QBitmap::fromImage(regionImage));
+ keyRegion.translate(keyRect.topLeft() * uiState.getScaleFactor());
+
+ return baseRegion.united(keyRegion);
+}
+
+QRegion UIInformation::getConKeyRegion(
+ QWidget *base, QRect &keyRect, LayoutForm::SkinImgType type)
+{
+ if (getConForm() == NULL) {
+ qWarning("controller form is null");
+ return QRegion();
+ }
+
+ QRegion baseRegion;
+ QRegion keyRegion;
+
+ if (uiState.conState.dockingCon != NULL) {
+ /* docking controller */
+ const int shiftW = getMainSize().width();
+
+ baseRegion = getUiRegion().subtracted(QRect(
+ keyRect.x() + shiftW, keyRect.y(),
+ keyRect.width(), keyRect.height()));
+
+ QImage keyImage = getConForm()->skinImg[type].copy(keyRect);
+ keyRegion = QRegion(QBitmap::fromImage(keyImage.createAlphaMask()));
+ keyRegion.translate(keyRect.left() + shiftW, keyRect.top());
+ } else {
+ baseRegion = base->mask().subtracted(QRect(
+ keyRect.x(), keyRect.y(), keyRect.width(), keyRect.height()));
+
+ QImage keyImage = getConForm()->skinImg[type].copy(keyRect);
+ keyRegion = QRegion(QBitmap::fromImage(keyImage.createAlphaMask()));
+ keyRegion.translate(keyRect.left(), keyRect.top());
+ }
+
+ return baseRegion.united(keyRegion);
+}
+
UIInformation::~UIInformation()
{
qDebug("destroy UI info");
ControllerForm *getConForm();
QSize getMainSize();
QSize getConSize();
- QSize getUiSize(); /* size included main, docking con */
+ QSize getUiSize(); /* main + docking con */
+
QRegion getMainRegion();
QRegion getConRegion();
- QRegion getUiRegion(); /* size included main, docking con */
+ QRegion getUiRegion(); /* main + docking con */
+ QRegion getMainKeyRegion(QWidget *base, QRect &keyRect, LayoutForm::SkinImgType type);
+ QRegion getConKeyRegion(QWidget *base, QRect &keyRect, LayoutForm::SkinImgType type);
};
#endif // UIINFORMATION_H