From 7aa7d61984fd1cf4d6b7e7442be0468238e8c031 Mon Sep 17 00:00:00 2001 From: Klaas Pieter Annema Date: Fri, 17 Sep 2010 12:06:01 +0200 Subject: [PATCH 1/2] Implement hover states. - Set CPWindow _acceptsMouseMovedEvents default to YES - Add CPThemeStateHovered to CPTheme - Add hovered logic to CPControl is hovered --- AppKit/CPControl.j | 18 ++++++++++++++++++ AppKit/CPTheme.j | 1 + AppKit/CPWindow/CPWindow.j | 1 + 3 files changed, 20 insertions(+) diff --git a/AppKit/CPControl.j b/AppKit/CPControl.j index 1b6fd6e9f..1414ab0f2 100644 --- a/AppKit/CPControl.j +++ b/AppKit/CPControl.j @@ -288,9 +288,14 @@ var CPControlBlackColor = [CPColor blackColor]; [self stopTracking:_previousTrackingLocation at:currentLocation mouseIsUp:YES]; _trackingMouseDownFlags = 0; + + if (isWithinFrame) + [self setThemeState:CPThemeStateHovered]; } else { + [self unsetThemeState:CPThemeStateHovered]; + if (type === CPLeftMouseDown) { _trackingMouseDownFlags = [anEvent modifierFlags]; @@ -386,6 +391,19 @@ var CPControlBlackColor = [CPColor blackColor]; [self trackMouse:anEvent]; } +- (void)mouseEntered:(CPEvent)anEvent +{ + if (![self isEnabled]) + return; + + [self setThemeState:CPThemeStateHovered]; +} + +- (void)mouseExited:(CPEvent)anEvent +{ + [self unsetThemeState:CPThemeStateHovered]; +} + /*! Returns the receiver's object value */ diff --git a/AppKit/CPTheme.j b/AppKit/CPTheme.j index a375b4f62..a3436e7c6 100644 --- a/AppKit/CPTheme.j +++ b/AppKit/CPTheme.j @@ -399,6 +399,7 @@ function CPThemeStateName(aState) CPThemeStateNames[0] = "normal"; CPThemeStateNormal = CPThemeStates["normal"] = 0; CPThemeStateDisabled = CPThemeState("disabled"); +CPThemeStateHovered = CPThemeState("hovered"); CPThemeStateHighlighted = CPThemeState("highlighted"); CPThemeStateSelected = CPThemeState("selected"); CPThemeStateTableDataView = CPThemeState("tableDataView"); diff --git a/AppKit/CPWindow/CPWindow.j b/AppKit/CPWindow/CPWindow.j index a3816c870..162d0baff 100644 --- a/AppKit/CPWindow/CPWindow.j +++ b/AppKit/CPWindow/CPWindow.j @@ -393,6 +393,7 @@ CPTexturedBackgroundWindowMask _registeredDraggedTypes = [CPSet set]; _registeredDraggedTypesArray = []; _isSheet = NO; + _acceptsMouseMovedEvents = YES; // Set up our window number. _windowNumber = [CPApp._windows count]; From c481d55976b900e319fa7be74c912f11b1dc3e5c Mon Sep 17 00:00:00 2001 From: Klaas Pieter Annema Date: Fri, 17 Sep 2010 13:21:54 +0200 Subject: [PATCH 2/2] fix hovered state being removed when the mouse leaves a subview of a control --- AppKit/CPControl.j | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/AppKit/CPControl.j b/AppKit/CPControl.j index 1414ab0f2..cb52406f7 100644 --- a/AppKit/CPControl.j +++ b/AppKit/CPControl.j @@ -401,7 +401,13 @@ var CPControlBlackColor = [CPColor blackColor]; - (void)mouseExited:(CPEvent)anEvent { - [self unsetThemeState:CPThemeStateHovered]; + var currentLocation = [self convertPoint:[anEvent locationInWindow] fromView:nil], + isWithinFrame = [self tracksMouseOutsideOfFrame] || CGRectContainsPoint([self bounds], currentLocation); + + // Make sure we're not still in the frame because Cappuccino will sent mouseExited events + // for all of the (ephemeral) subviews of a view as well. + if (!isWithinFrame) + [self unsetThemeState:CPThemeStateHovered]; } /*!