Merge lp:~canonical-dx-team/unity/unity.quicklist-event-handling into lp:unity

Proposed by Jay Taoko
Status: Merged
Merged at revision: 640
Proposed branch: lp:~canonical-dx-team/unity/unity.quicklist-event-handling
Merge into: lp:unity
Diff against target: 293 lines (+115/-16)
4 files modified
src/QuicklistMenuItem.cpp (+3/-3)
src/QuicklistMenuItem.h (+2/-1)
src/QuicklistView.cpp (+101/-9)
src/QuicklistView.h (+9/-3)
To merge this branch: bzr merge lp:~canonical-dx-team/unity/unity.quicklist-event-handling
Reviewer Review Type Date Requested Status
Jason Smith (community) Approve
Review via email: mp+42206@code.launchpad.net

Description of the change

Improved mouse event handling. Interpret mouse events on the quicklist and get ready to send the clicked signal.

To post a comment you must log in.
Revision history for this message
Jason Smith (jassmith) wrote :

+1

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/QuicklistMenuItem.cpp'
--- src/QuicklistMenuItem.cpp 2010-11-29 17:18:55 +0000
+++ src/QuicklistMenuItem.cpp 2010-11-30 05:21:18 +0000
@@ -301,7 +301,7 @@
301301
302void QuicklistMenuItem::RecvMouseUp (int x, int y, unsigned long button_flags, unsigned long key_flags)302void QuicklistMenuItem::RecvMouseUp (int x, int y, unsigned long button_flags, unsigned long key_flags)
303{303{
304 sigMouseReleased.emit (this);304 sigMouseReleased.emit (this, x, y);
305}305}
306306
307void QuicklistMenuItem::RecvMouseClick (int x, int y, unsigned long button_flags, unsigned long key_flags)307void QuicklistMenuItem::RecvMouseClick (int x, int y, unsigned long button_flags, unsigned long key_flags)
@@ -316,12 +316,12 @@
316316
317void QuicklistMenuItem::RecvMouseMove (int x, int y, int dx, int dy, unsigned long button_flags, unsigned long key_flags)317void QuicklistMenuItem::RecvMouseMove (int x, int y, int dx, int dy, unsigned long button_flags, unsigned long key_flags)
318{318{
319 319 //printf ("[QuicklistMenuItem::RecvMouseMove]\n");
320}320}
321321
322void QuicklistMenuItem::RecvMouseDrag (int x, int y, int dx, int dy, unsigned long button_flags, unsigned long key_flags)322void QuicklistMenuItem::RecvMouseDrag (int x, int y, int dx, int dy, unsigned long button_flags, unsigned long key_flags)
323{323{
324 324 sigMouseDrag.emit (this, x, y);
325}325}
326326
327void QuicklistMenuItem::RecvMouseEnter (int x, int y, unsigned long button_flags, unsigned long key_flags)327void QuicklistMenuItem::RecvMouseEnter (int x, int y, unsigned long button_flags, unsigned long key_flags)
328328
=== modified file 'src/QuicklistMenuItem.h'
--- src/QuicklistMenuItem.h 2010-11-25 13:01:34 +0000
+++ src/QuicklistMenuItem.h 2010-11-30 05:21:18 +0000
@@ -109,8 +109,9 @@
109 109
110 sigc::signal<void, QuicklistMenuItem*> sigMouseEnter;110 sigc::signal<void, QuicklistMenuItem*> sigMouseEnter;
111 sigc::signal<void, QuicklistMenuItem*> sigMouseLeave;111 sigc::signal<void, QuicklistMenuItem*> sigMouseLeave;
112 sigc::signal<void, QuicklistMenuItem*> sigMouseReleased;112 sigc::signal<void, QuicklistMenuItem*, int, int> sigMouseReleased;
113 sigc::signal<void, QuicklistMenuItem*> sigMouseClick;113 sigc::signal<void, QuicklistMenuItem*> sigMouseClick;
114 sigc::signal<void, QuicklistMenuItem*, int, int> sigMouseDrag;
114 115
115 DbusmenuMenuitem* _menuItem;116 DbusmenuMenuitem* _menuItem;
116 QuicklistMenuItemType _item_type;117 QuicklistMenuItemType _item_type;
117118
=== modified file 'src/QuicklistView.cpp'
--- src/QuicklistView.cpp 2010-11-24 18:25:38 +0000
+++ src/QuicklistView.cpp 2010-11-30 05:21:18 +0000
@@ -139,6 +139,7 @@
139 item->sigMouseReleased.connect (sigc::mem_fun (this, &QuicklistView::RecvItemMouseRelease));139 item->sigMouseReleased.connect (sigc::mem_fun (this, &QuicklistView::RecvItemMouseRelease));
140 item->sigMouseEnter.connect (sigc::mem_fun (this, &QuicklistView::RecvItemMouseEnter));140 item->sigMouseEnter.connect (sigc::mem_fun (this, &QuicklistView::RecvItemMouseEnter));
141 item->sigMouseLeave.connect (sigc::mem_fun (this, &QuicklistView::RecvItemMouseLeave));141 item->sigMouseLeave.connect (sigc::mem_fun (this, &QuicklistView::RecvItemMouseLeave));
142 item->sigMouseDrag.connect (sigc::mem_fun (this, &QuicklistView::RecvItemMouseDrag));
142 143
143 _default_item_layout->AddView(item, 1, nux::eCenter, nux::eFull);144 _default_item_layout->AddView(item, 1, nux::eCenter, nux::eFull);
144 _default_item_list.push_back (item);145 _default_item_list.push_back (item);
@@ -159,6 +160,7 @@
159 item->sigMouseReleased.connect (sigc::mem_fun (this, &QuicklistView::RecvItemMouseRelease));160 item->sigMouseReleased.connect (sigc::mem_fun (this, &QuicklistView::RecvItemMouseRelease));
160 item->sigMouseEnter.connect (sigc::mem_fun (this, &QuicklistView::RecvItemMouseEnter));161 item->sigMouseEnter.connect (sigc::mem_fun (this, &QuicklistView::RecvItemMouseEnter));
161 item->sigMouseLeave.connect (sigc::mem_fun (this, &QuicklistView::RecvItemMouseLeave));162 item->sigMouseLeave.connect (sigc::mem_fun (this, &QuicklistView::RecvItemMouseLeave));
163 item->sigMouseDrag.connect (sigc::mem_fun (this, &QuicklistView::RecvItemMouseDrag));
162 164
163 _default_item_layout->AddView(item, 1, nux::eCenter, nux::eFull);165 _default_item_layout->AddView(item, 1, nux::eCenter, nux::eFull);
164 _default_item_list.push_back (item);166 _default_item_list.push_back (item);
@@ -214,8 +216,12 @@
214 // We choose to test the quicklist items ourselves instead of processing them as it is usual in nux.216 // We choose to test the quicklist items ourselves instead of processing them as it is usual in nux.
215 // This is meant to be easier since the quicklist has a atypical way of working.217 // This is meant to be easier since the quicklist has a atypical way of working.
216 if (m_layout)218 if (m_layout)
219 {
217 ret = m_layout->ProcessEvent (window_event, ret, ProcEvInfo);220 ret = m_layout->ProcessEvent (window_event, ret, ProcEvInfo);
218221 }
222
223 // The quicklist itself does not process the evvent. Instead we do some analysis of the event
224 // to detect the user action and perform the correct operation.
219 if (ievent.e_event == nux::NUX_MOUSE_PRESSED)225 if (ievent.e_event == nux::NUX_MOUSE_PRESSED)
220 {226 {
221 if (GetGeometry ().IsPointInside (ievent.e_x, ievent.e_y))227 if (GetGeometry ().IsPointInside (ievent.e_x, ievent.e_y))
@@ -227,6 +233,7 @@
227 _mouse_down = false;233 _mouse_down = false;
228 if (IsVisible ())234 if (IsVisible ())
229 {235 {
236 CancelItemsPrelightStatus ();
230 CaptureMouseDownAnyWhereElse (false);237 CaptureMouseDownAnyWhereElse (false);
231 ForceStopFocus (1, 1);238 ForceStopFocus (1, 1);
232 UnGrabPointer ();239 UnGrabPointer ();
@@ -238,10 +245,10 @@
238 }245 }
239 else if ((ievent.e_event == nux::NUX_MOUSE_RELEASED) && _mouse_down)246 else if ((ievent.e_event == nux::NUX_MOUSE_RELEASED) && _mouse_down)
240 {247 {
241
242 _mouse_down = false;248 _mouse_down = false;
243 if (IsVisible ())249 if (IsVisible ())
244 {250 {
251 CancelItemsPrelightStatus ();
245 CaptureMouseDownAnyWhereElse (false);252 CaptureMouseDownAnyWhereElse (false);
246 ForceStopFocus (1, 1);253 ForceStopFocus (1, 1);
247 UnGrabPointer ();254 UnGrabPointer ();
@@ -251,11 +258,7 @@
251 return nux::eMouseEventSolved;258 return nux::eMouseEventSolved;
252 }259 }
253 260
254 // PostProcessEvent2 must always have its last parameter set to 0261
255 // because the m_BackgroundArea is the real physical limit of the window.
256 // So the previous test about IsPointInside do not prevail over m_BackgroundArea
257 // testing the event by itself.
258 //ret = PostProcessEvent2 (ievent, ret, 0);
259 return ret; 262 return ret;
260}263}
261264
@@ -440,6 +443,7 @@
440 _mouse_down = false;443 _mouse_down = false;
441 if (IsVisible ())444 if (IsVisible ())
442 {445 {
446 CancelItemsPrelightStatus ();
443 CaptureMouseDownAnyWhereElse (false);447 CaptureMouseDownAnyWhereElse (false);
444 ForceStopFocus (1, 1);448 ForceStopFocus (1, 1);
445 UnGrabPointer ();449 UnGrabPointer ();
@@ -448,11 +452,44 @@
448 }452 }
449}453}
450454
451void QuicklistView::RecvItemMouseRelease (QuicklistMenuItem* item)455void QuicklistView::CheckAndEmitItemSignal (int x, int y)
456{
457 nux::Geometry geo;
458 std::list<QuicklistMenuItem*>::iterator it;
459 for (it = _item_list.begin(); it != _item_list.end(); it++)
460 {
461 geo = (*it)->GetGeometry ();
462 geo.width = _item_layout->GetBaseWidth ();
463
464 if (geo.IsPointInside (x, y))
465 {
466 // An action is performed: send the signal back to the application
467 }
468 }
469
470 for (it = _default_item_list.begin(); it != _default_item_list.end(); it++)
471 {
472 geo = (*it)->GetGeometry ();
473 geo.width = _default_item_layout->GetBaseWidth ();
474
475 if (geo.IsPointInside (x, y))
476 {
477 // An action is performed: send the signal back to the application
478 }
479 }
480}
481
482void QuicklistView::RecvItemMouseRelease (QuicklistMenuItem* item, int x, int y)
452{483{
453 _mouse_down = false;484 _mouse_down = false;
485
486
454 if (IsVisible ())487 if (IsVisible ())
455 {488 {
489 // Check if the mouse was released over an item and emit the signal
490 CheckAndEmitItemSignal (x + item->GetBaseX (), y + item->GetBaseY ());
491
492 CancelItemsPrelightStatus ();
456 CaptureMouseDownAnyWhereElse (false);493 CaptureMouseDownAnyWhereElse (false);
457 ForceStopFocus (1, 1);494 ForceStopFocus (1, 1);
458 UnGrabPointer ();495 UnGrabPointer ();
@@ -461,6 +498,57 @@
461 } 498 }
462}499}
463500
501void QuicklistView::CancelItemsPrelightStatus ()
502{
503 std::list<QuicklistMenuItem*>::iterator it;
504 for (it = _item_list.begin(); it != _item_list.end(); it++)
505 {
506 (*it)->_prelight = false;
507 }
508
509 for (it = _default_item_list.begin(); it != _default_item_list.end(); it++)
510 {
511 (*it)->_prelight = false;
512 }
513}
514
515void QuicklistView::RecvItemMouseDrag (QuicklistMenuItem* item, int x, int y)
516{
517 nux::Geometry geo;
518 std::list<QuicklistMenuItem*>::iterator it;
519 for (it = _item_list.begin(); it != _item_list.end(); it++)
520 {
521 geo = (*it)->GetGeometry ();
522 geo.width = _item_layout->GetBaseWidth ();
523
524 if (geo.IsPointInside (x + item->GetBaseX (), y + item->GetBaseY ()))
525 {
526 (*it)->_prelight = true;
527 }
528 else
529 {
530 (*it)->_prelight = false;
531 }
532 }
533
534 for (it = _default_item_list.begin(); it != _default_item_list.end(); it++)
535 {
536 geo = (*it)->GetGeometry ();
537 geo.width = _default_item_layout->GetBaseWidth ();
538
539 if (geo.IsPointInside (x + item->GetBaseX (), y + item->GetBaseY ()))
540 {
541 (*it)->_prelight = true;
542 }
543 else
544 {
545 (*it)->_prelight = false;
546 }
547 }
548
549 NeedRedraw ();
550}
551
464void QuicklistView::RecvItemMouseEnter (QuicklistMenuItem* item)552void QuicklistView::RecvItemMouseEnter (QuicklistMenuItem* item)
465{553{
466 NeedRedraw ();554 NeedRedraw ();
@@ -485,13 +573,15 @@
485573
486void QuicklistView::RecvMouseUp (int x, int y, unsigned long button_flags, unsigned long key_flags)574void QuicklistView::RecvMouseUp (int x, int y, unsigned long button_flags, unsigned long key_flags)
487{575{
488 576 // Check if the mouse was released over an item and emit the signal
577 CheckAndEmitItemSignal (x, y);
489}578}
490579
491void QuicklistView::RecvMouseClick (int x, int y, unsigned long button_flags, unsigned long key_flags)580void QuicklistView::RecvMouseClick (int x, int y, unsigned long button_flags, unsigned long key_flags)
492{581{
493 if (IsVisible ())582 if (IsVisible ())
494 {583 {
584 CancelItemsPrelightStatus ();
495 CaptureMouseDownAnyWhereElse (false);585 CaptureMouseDownAnyWhereElse (false);
496 ForceStopFocus (1, 1);586 ForceStopFocus (1, 1);
497 UnGrabPointer ();587 UnGrabPointer ();
@@ -514,6 +604,7 @@
514{604{
515 if (IsVisible ())605 if (IsVisible ())
516 {606 {
607 CancelItemsPrelightStatus ();
517 CaptureMouseDownAnyWhereElse (false);608 CaptureMouseDownAnyWhereElse (false);
518 ForceStopFocus (1, 1);609 ForceStopFocus (1, 1);
519 UnGrabPointer ();610 UnGrabPointer ();
@@ -544,6 +635,7 @@
544 item->sigMouseReleased.connect (sigc::mem_fun (this, &QuicklistView::RecvItemMouseRelease));635 item->sigMouseReleased.connect (sigc::mem_fun (this, &QuicklistView::RecvItemMouseRelease));
545 item->sigMouseEnter.connect (sigc::mem_fun (this, &QuicklistView::RecvItemMouseEnter));636 item->sigMouseEnter.connect (sigc::mem_fun (this, &QuicklistView::RecvItemMouseEnter));
546 item->sigMouseLeave.connect (sigc::mem_fun (this, &QuicklistView::RecvItemMouseLeave));637 item->sigMouseLeave.connect (sigc::mem_fun (this, &QuicklistView::RecvItemMouseLeave));
638 item->sigMouseDrag.connect (sigc::mem_fun (this, &QuicklistView::RecvItemMouseDrag));
547 639
548 _item_layout->AddView(item, 1, nux::eCenter, nux::eFull);640 _item_layout->AddView(item, 1, nux::eCenter, nux::eFull);
549 _item_list.push_back (item);641 _item_list.push_back (item);
550642
=== modified file 'src/QuicklistView.h'
--- src/QuicklistView.h 2010-11-24 00:03:08 +0000
+++ src/QuicklistView.h 2010-11-30 05:21:18 +0000
@@ -81,7 +81,7 @@
81 81
82 int GetNumItems ();82 int GetNumItems ();
83 QuicklistMenuItem* GetNthItems (int index);83 QuicklistMenuItem* GetNthItems (int index);
84 QuicklistMenuItemType GetNthType (int index);84 QuicklistMenuItemType GetNthType (int index);
85 std::list<QuicklistMenuItem*> GetChildren ();85 std::list<QuicklistMenuItem*> GetChildren ();
86 86
87 void TestMenuItems (DbusmenuMenuitem* root);87 void TestMenuItems (DbusmenuMenuitem* root);
@@ -90,10 +90,11 @@
90 void RecvCairoTextChanged (QuicklistMenuItem* item);90 void RecvCairoTextChanged (QuicklistMenuItem* item);
91 void RecvCairoTextColorChanged (QuicklistMenuItem* item);91 void RecvCairoTextColorChanged (QuicklistMenuItem* item);
92 void RecvItemMouseClick (QuicklistMenuItem* item);92 void RecvItemMouseClick (QuicklistMenuItem* item);
93 void RecvItemMouseRelease (QuicklistMenuItem* item);93 void RecvItemMouseRelease (QuicklistMenuItem* item, int x, int y);
94 void RecvItemMouseEnter (QuicklistMenuItem* item);94 void RecvItemMouseEnter (QuicklistMenuItem* item);
95 void RecvItemMouseLeave (QuicklistMenuItem* item);95 void RecvItemMouseLeave (QuicklistMenuItem* item);
96 96 void RecvItemMouseDrag (QuicklistMenuItem* item, int x, int y);
97
97 void RecvMouseDown (int x, int y, unsigned long button_flags, unsigned long key_flags);98 void RecvMouseDown (int x, int y, unsigned long button_flags, unsigned long key_flags);
98 void RecvMouseUp (int x, int y, unsigned long button_flags, unsigned long key_flags);99 void RecvMouseUp (int x, int y, unsigned long button_flags, unsigned long key_flags);
99 void RecvMouseClick (int x, int y, unsigned long button_flags, unsigned long key_flags);100 void RecvMouseClick (int x, int y, unsigned long button_flags, unsigned long key_flags);
@@ -114,6 +115,11 @@
114 //! A convenience function to fill in the default quicklist with some random items.115 //! A convenience function to fill in the default quicklist with some random items.
115 void FillInDefaultItems ();116 void FillInDefaultItems ();
116 117
118 void CancelItemsPrelightStatus ();
119
120 //! Check the mouse up event sent by an item. Detect the item where the mous is and emit the appropriate signal.
121 void CheckAndEmitItemSignal (int x, int y);
122
117 //nux::CairoGraphics* _cairo_graphics;123 //nux::CairoGraphics* _cairo_graphics;
118 int _anchorX;124 int _anchorX;
119 int _anchorY;125 int _anchorY;