skin: find event of menu button from list of context menu
[sdk/emulator/qemu.git] / tizen / src / ui / controller / floatingconview.cpp
1 /*
2  * Qt UI
3  *
4  * Copyright (C) 2014 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact:
7  * GiWoong Kim <giwoong.kim@samsung.com>
8  * Sangho Park <sangho1206.park@samsung.com>
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License
12  * as published by the Free Software Foundation; either version 2
13  * of the License, or (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
23  * MA 02110-1301, USA.
24  *
25  * Contributors:
26  * - S-Core Co., Ltd
27  *
28  */
29
30 #include "floatingconview.h"
31 #include "mainwindow.h"
32 #include "skinkeyitem.h"
33 #include "controller/generalpurposecon.h"
34 #include "resource/ui_strings.h"
35
36 #define DOCKABLE_AREA_WIDTH 30
37
38 FloatingConView::FloatingConView(QWidget *parent,
39     ControllerForm *conForm, QGraphicsScene *scene) : SkinView(parent, scene)
40 {
41     this->parent = (FloatingController *)parent;
42
43     setStyleSheet("FloatingConView { background: transparent; border-style: none; }" +
44         QString(STYLE_TOOLTIP));
45
46     conPos = SKINVIEW_NULLITY_POSITION;
47     rubberBand = new QRubberBand(QRubberBand::Rectangle, NULL);
48
49     createItems(conForm);
50 }
51
52 void FloatingConView::createItems(ControllerForm *conForm)
53 {
54     /* bezel */
55     bezelItem = createBezelItem(NULL, conForm);
56     scene()->addItem(bezelItem);
57
58     if (conForm->isGeneralPurpose() == false) {
59         /* HW keys */
60         QList<HardwareKey *> &keyList = conForm->getKeyList();
61         HardwareKey *hwKey = NULL;
62         for (int i = 0; i < keyList.count(); i++) {
63             hwKey = keyList.at(i);
64             if (hwKey != NULL) {
65                 createKeyItem(bezelItem, conForm, hwKey);
66             }
67         }
68     } else {
69         GeneralPurposeCon *generalCon = new GeneralPurposeCon(parent->getMainWindow());
70
71         generalCon->createHeaderBarAndBorder(scene(), true);
72         QList<HWKeyButton *> buttons
73                     = generalCon->createButtons(scene(), parentWidget(), conForm);
74     }
75 }
76
77 /* override */
78 void FloatingConView::grabWindow(QPoint pos)
79 {
80     SkinView::grabWindow(pos);
81
82     conPos = parent->pos();
83 }
84
85 /* override */
86 void FloatingConView::releaseWindow()
87 {
88     SkinView::releaseWindow();
89
90     conPos = SKINVIEW_NULLITY_POSITION;
91 }
92
93 /* override */
94 QRegion FloatingConView::getKeyWinRegion(
95     QWidget *base, QRect &keyRect, LayoutForm::SkinImgType type)
96 {
97     return ((MainWindow *)parent->parentWidget())->
98         getUiInfo()->getConKeyRegion(base, keyRect, type);
99 }
100
101 /* override */
102 void FloatingConView::resizeEvent(QResizeEvent *event)
103 {
104     /* do nothing */
105
106     SkinView::resizeEvent(event);
107 }
108
109 int FloatingConView::isDockable(QWidget *object, QWidget *subject)
110 {
111     const int heightOneThird = object->size().height() / 3;
112
113     /* MainWindow */
114     QRect rectDockableRC(object->pos().x() + object->size().width() - 1,
115         object->pos().y() + heightOneThird,
116         DOCKABLE_AREA_WIDTH,
117         heightOneThird);
118
119     QRect rectDockableRT(object->pos().x() + object->size().width() - 1,
120             object->pos().y(),
121             DOCKABLE_AREA_WIDTH,
122             heightOneThird);
123
124     QRect rectDockableRB(object->pos().x() + object->size().width() - 1,
125             object->pos().y() + (heightOneThird * 2),
126             DOCKABLE_AREA_WIDTH,
127             heightOneThird);
128
129     /* ControllerWidget */
130     QRect rectTarget(subject->pos().x() - 1,
131         subject->pos().y(),
132         DOCKABLE_AREA_WIDTH,
133         subject->size().height());
134
135     // TODO: define recursive function
136     QRect interRC = rectTarget.intersected(rectDockableRC);
137     QRect interRT = rectTarget.intersected(rectDockableRT);
138     QRect interRB = rectTarget.intersected(rectDockableRB);
139
140     QRect *interBiggest = NULL;
141
142     if ((interRC.width() * interRC.height()) < (interRT.width() * interRT.height())) {
143         interBiggest = &interRT;
144     } else {
145         interBiggest = &interRC;
146     }
147
148     if ((interBiggest->width() * interBiggest->height()) < (interRB.width() * interRB.height())) {
149         interBiggest = &interRB;
150     }
151
152     if (interBiggest != NULL &&
153         interBiggest->isNull() == false && interBiggest->isEmpty() == false) {
154         if (interBiggest == &interRC) {
155             return Qt::AlignRight | Qt::AlignCenter;
156         } else if (interBiggest == &interRT) {
157             return Qt::AlignRight | Qt::AlignTop;
158         } else if (interBiggest == &interRB) {
159             return Qt::AlignRight | Qt::AlignBottom;
160         }
161     }
162
163     return -1;
164 }
165
166 /* override */
167 void FloatingConView::mousePressEvent(QMouseEvent *event)
168 {
169     SkinView::mousePressEvent(event);
170
171     if (bezelItem->isHWKeyHandling() == true) {
172         /* do nothing */
173         return;
174     }
175
176     if (event->button() == Qt::LeftButton) {
177         grabWindow(event->globalPos());
178     }
179 }
180
181 /* override */
182 void FloatingConView::mouseReleaseEvent(QMouseEvent *event)
183 {
184     SkinView::mouseReleaseEvent(event);
185
186     if (bezelItem->isHWKeyHandling() == true) {
187         /* do nothing */
188         return;
189     }
190
191     if (event->button() == Qt::LeftButton) {
192         if (rubberBand != NULL) {
193             rubberBand->hide();
194         }
195     }
196
197     releaseWindow();
198
199     MainWindow *win = ((MainWindow *)parent->parentWidget());
200
201     int dockPos = isDockable((QWidget *)win, (QWidget *)parent);
202     if (dockPos != -1) {
203         /* toggle */
204         win->openController(
205             win->getUiState()->getConState()->getConFormIndex(), dockPos);
206         return;
207     }
208 }
209
210 /* override */
211 void FloatingConView::mouseMoveEvent(QMouseEvent *event)
212 {
213     SkinView::mouseMoveEvent(event);
214
215     if (bezelItem->isHWKeyHandling() == true) {
216         /* do nothing */
217         return;
218     }
219
220     if (isGrabWindow() == true) {
221         /* draw guide for dockable position */
222         const FloatingController *con = parent;
223         MainWindow *win = ((MainWindow *)con->parent());
224
225         if (rubberBand != NULL) {
226             int dockPos = isDockable((QWidget *)win, (QWidget *)con);
227             if (dockPos != -1) {
228                 int vShift = 0;
229
230                 if (win->size().height() > size().height()) {
231                     if (dockPos & Qt::AlignCenter) {
232                         vShift = (win->size().height() / 2) - (size().height() / 2);
233                     } else if (dockPos & Qt::AlignBottom) {
234                         vShift = win->size().height() - size().height();
235                     }
236                 }
237
238                 QPoint rubberPos(win->pos().x() + win->size().width(),
239                     win->pos().y() + vShift);
240                 rubberBand->setGeometry(QRect(rubberPos, size()));
241                 rubberBand->show();
242             } else {
243                 rubberBand->hide();
244             }
245         }
246
247         parent->move(conPos + (event->globalPos() - grabPos));
248     }
249 }
250
251 /* override */
252 void FloatingConView::focusInEvent(QFocusEvent *event)
253 {
254     const FloatingController *con = parent;
255     MainWindow *win = ((MainWindow *)con->parent());
256     win->activateWindow();
257 }
258
259 FloatingConView::~FloatingConView()
260 {
261     qDebug("destroy floating controller view");
262
263     if (rubberBand != NULL) {
264         rubberBand->close();
265         delete rubberBand;
266         rubberBand = NULL;
267     }
268 }