netsurf/cocoa/PSMTabBarControl/PSMTabDragWindowController.m

120 lines
2.9 KiB
Mathematica
Raw Normal View History

//
// PSMTabDragWindowController.m
// PSMTabBarControl
//
// Created by Kent Sutherland on 6/18/07.
// Copyright 2007 Kent Sutherland. All rights reserved.
//
#import "PSMTabDragWindowController.h"
#import "PSMTabDragWindow.h"
#import "PSMTabDragView.h"
@implementation PSMTabDragWindowController
- (id)initWithImage:(NSImage *)image styleMask:(NSUInteger)styleMask tearOffStyle:(PSMTabBarTearOffStyle)tearOffStyle
{
PSMTabDragWindow *window = [PSMTabDragWindow dragWindowWithImage:image styleMask:styleMask];
if ( (self = [super initWithWindow:window]) ) {
_view = [[window dragView] retain];
_tearOffStyle = tearOffStyle;
if (tearOffStyle == PSMTabBarTearOffMiniwindow) {
[window setBackgroundColor:[NSColor clearColor]];
[window setHasShadow:YES];
}
[window setAlphaValue:kPSMTabDragWindowAlpha];
}
return self;
}
- (void)dealloc
{
if (_timer) {
[_timer invalidate];
}
if (_animation) {
[_animation release];
}
[_view release];
[super dealloc];
}
- (NSImage *)image
{
return [_view image];
}
- (NSImage *)alternateImage
{
return [_view alternateImage];
}
- (void)setAlternateImage:(NSImage *)image
{
[_view setAlternateImage:image];
}
- (BOOL)isAnimating
{
return _animation != nil;
}
- (void)switchImages
{
if (_tearOffStyle != PSMTabBarTearOffMiniwindow || ![_view alternateImage]) {
return;
}
CGFloat progress = 0;
_showingAlternate = !_showingAlternate;
if (_animation) {
//An animation already exists, get the current progress
progress = 1.0f - [_animation currentProgress];
[_animation stopAnimation];
[_animation release];
}
//begin animating
_animation = [[NSAnimation alloc] initWithDuration:0.25 animationCurve:NSAnimationEaseInOut];
[_animation setAnimationBlockingMode:NSAnimationNonblocking];
[_animation setCurrentProgress:progress];
[_animation startAnimation];
_originalWindowFrame = [[self window] frame];
if (_timer) {
[_timer invalidate];
}
_timer = [NSTimer scheduledTimerWithTimeInterval:1.0f / 30.0f target:self selector:@selector(animateTimer:) userInfo:nil repeats:YES];
}
- (void)animateTimer:(NSTimer *)timer
{
NSRect frame = _originalWindowFrame;
NSImage *currentImage = _showingAlternate ? [_view alternateImage] : [_view image];
NSSize size = [currentImage size];
NSPoint mousePoint = [NSEvent mouseLocation];
CGFloat animationValue = [_animation currentValue];
frame.size.width = _originalWindowFrame.size.width + (size.width - _originalWindowFrame.size.width) * animationValue;
frame.size.height = _originalWindowFrame.size.height + (size.height - _originalWindowFrame.size.height) * animationValue;
frame.origin.x = mousePoint.x - (frame.size.width / 2);
frame.origin.y = mousePoint.y - (frame.size.height / 2);
[_view setFadeValue:_showingAlternate ? 1.0f - animationValue : animationValue];
[[self window] setFrame:frame display:YES];
if (![_animation isAnimating]) {
[_animation release], _animation = nil;
[timer invalidate];
_timer = nil;
}
}
@end