/****************************************************************************** * Copyright (c) 2007-2012 Transmission authors and contributors * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #import "DragOverlayWindow.h" #import "DragOverlayView.h" #import "NSStringAdditions.h" @interface DragOverlayWindow (Private) - (void)resizeWindow; @end @implementation DragOverlayWindow - (instancetype)initWithLib:(tr_session*)lib forWindow:(NSWindow*)window { if ((self = ([super initWithContentRect:window.frame styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO]))) { fLib = lib; self.backgroundColor = [NSColor colorWithCalibratedWhite:0.0 alpha:0.5]; self.alphaValue = 0.0; self.opaque = NO; self.hasShadow = NO; DragOverlayView* view = [[DragOverlayView alloc] initWithFrame:self.frame]; self.contentView = view; self.releasedWhenClosed = NO; self.ignoresMouseEvents = YES; fFadeInAnimation = [[NSViewAnimation alloc] initWithViewAnimations:@[ @{ NSViewAnimationTargetKey : self, NSViewAnimationEffectKey : NSViewAnimationFadeInEffect } ]]; fFadeInAnimation.duration = 0.15; fFadeInAnimation.animationBlockingMode = NSAnimationNonblockingThreaded; fFadeOutAnimation = [[NSViewAnimation alloc] initWithViewAnimations:@[ @{ NSViewAnimationTargetKey : self, NSViewAnimationEffectKey : NSViewAnimationFadeOutEffect } ]]; fFadeOutAnimation.duration = 0.5; fFadeOutAnimation.animationBlockingMode = NSAnimationNonblockingThreaded; [window addChildWindow:self ordered:NSWindowAbove]; [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(resizeWindow) name:NSWindowDidResizeNotification object:window]; } return self; } - (void)dealloc { [NSNotificationCenter.defaultCenter removeObserver:self]; } - (void)setTorrents:(NSArray*)files { uint64_t size = 0; NSInteger count = 0; NSString* name; BOOL folder; NSInteger fileCount = 0; for (NSString* file in files) { if ([[NSWorkspace.sharedWorkspace typeOfFile:file error:NULL] isEqualToString:@"org.bittorrent.torrent"] || [file.pathExtension caseInsensitiveCompare:@"torrent"] == NSOrderedSame) { tr_ctor* ctor = tr_ctorNew(fLib); tr_ctorSetMetainfoFromFile(ctor, file.UTF8String); tr_info info; if (tr_torrentParse(ctor, &info) == TR_PARSE_OK) { count++; size += info.totalSize; fileCount += info.fileCount; //only useful when one torrent if (count == 1) { name = @(info.name); folder = info.isFolder; } } tr_metainfoFree(&info); tr_ctorFree(ctor); } } if (count <= 0) { return; } //set strings and icon NSString* secondString = [NSString stringForFileSize:size]; if (count > 1 || folder) { NSString* fileString; if (fileCount == 1) { fileString = NSLocalizedString(@"1 file", "Drag overlay -> torrents"); } else { fileString = [NSString stringWithFormat:NSLocalizedString(@"%@ files", "Drag overlay -> torrents"), [NSString formattedUInteger:fileCount]]; } secondString = [NSString stringWithFormat:@"%@, %@", fileString, secondString]; } NSImage* icon; if (count == 1) { icon = [NSWorkspace.sharedWorkspace iconForFileType:folder ? NSFileTypeForHFSTypeCode(kGenericFolderIcon) : name.pathExtension]; } else { name = [NSString stringWithFormat:NSLocalizedString(@"%@ Torrent Files", "Drag overlay -> torrents"), [NSString formattedUInteger:count]]; secondString = [secondString stringByAppendingString:@" total"]; icon = [NSImage imageNamed:@"TransmissionDocument.icns"]; } [self.contentView setOverlay:icon mainLine:name subLine:secondString]; [self fadeIn]; } - (void)setFile:(NSString*)file { [self.contentView setOverlay:[NSImage imageNamed:@"CreateLarge"] mainLine:NSLocalizedString(@"Create a Torrent File", "Drag overlay -> file") subLine:file]; [self fadeIn]; } - (void)setURL:(NSString*)url { [self.contentView setOverlay:[NSImage imageNamed:@"Globe"] mainLine:NSLocalizedString(@"Web Address", "Drag overlay -> url") subLine:url]; [self fadeIn]; } - (void)fadeIn { //stop other animation and set to same progress if (fFadeOutAnimation.animating) { [fFadeOutAnimation stopAnimation]; fFadeInAnimation.currentProgress = 1.0 - fFadeOutAnimation.currentProgress; } [fFadeInAnimation startAnimation]; } - (void)fadeOut { //stop other animation and set to same progress if (fFadeInAnimation.animating) { [fFadeInAnimation stopAnimation]; fFadeOutAnimation.currentProgress = 1.0 - fFadeInAnimation.currentProgress; } if (self.alphaValue > 0.0) { [fFadeOutAnimation startAnimation]; } } @end @implementation DragOverlayWindow (Private) - (void)resizeWindow { [self setFrame:self.parentWindow.frame display:NO]; } @end