<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ciarán Walsh’s Blog &#187; Cocoa</title>
	<atom:link href="http://ciaranwal.sh/category/cocoa/feed" rel="self" type="application/rss+xml" />
	<link>http://ciaranwal.sh</link>
	<description></description>
	<lastBuildDate>Thu, 02 Oct 2008 10:38:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Quick Look APIs</title>
		<link>http://ciaranwal.sh/2007/12/07/quick-look-apis</link>
		<comments>http://ciaranwal.sh/2007/12/07/quick-look-apis#comments</comments>
		<pubDate>Fri, 07 Dec 2007 22:29:26 +0000</pubDate>
		<dc:creator>Ciarán</dc:creator>
				<category><![CDATA[Cocoa]]></category>

		<guid isPermaLink="false">http://ciaranwal.sh/2007/12/07/quick-look-apis</guid>
		<description><![CDATA[I recently did some extensive reverse-engineering of Quick Look to investigate the API, mainly to track down how to get the cool zooming effect when Quick-Looking a file in Finder. It turns out it’s pretty simple to use Quick Look from your own code. First you’ll need to load the framework found at /System/Library/PrivateFrameworks/QuickLookUI.framework if([[NSBundle [...]]]></description>
			<content:encoded><![CDATA[<p>I recently did some extensive reverse-engineering of Quick Look to investigate the API, mainly to track down how to get the cool zooming effect when Quick-Looking a file in Finder. It turns out it’s pretty simple to use Quick Look from your own code.</p>

<p><span id="more-37"></span></p>

<p>First you’ll need to load the framework found at <code>/System/Library/PrivateFrameworks/QuickLookUI.framework</code></p>

<pre class="textmate-source"><span class="source source_objc"><span class="keyword keyword_control keyword_control_c">if</span>(<span class="meta meta_bracketed meta_bracketed_objc">[<span class="meta meta_bracketed meta_bracketed_objc">[<span class="support support_class support_class_cocoa">NSBundle</span> <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">bundleWithPath:</span><span class="string string_quoted string_quoted_double string_quoted_double_objc">@"/System/…/QuickLookUI.framework"</span></span>]</span> <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">load</span></span>]</span>)
   <span class="support support_function support_function_cocoa">NSLog</span>(<span class="string string_quoted string_quoted_double string_quoted_double_objc">@"Quick Look loaded!"</span>);
</span></pre>

<p>Loading the framework with NSBundle is preferable to linking directly for 2 reasons:</p>

<ul>
<li>If your app is to support Tiger then we can try to load the framework and only use Quick Look if it succeeds</li>
<li>Since the framework is in PrivateFrameworks there is the possibility that Apple may move it – e.g. if it becomes public</li>
</ul>

<p>All your interaction with the QL system will be through the QLPreviewPanel singleton class, accessed using <code>[QLPreviewPanel sharedPreviewPanel]</code> – you’ll need to include <a href="http://ciaranwal.sh/files/QuickLook.h">this header</a> so that you can use the methods without warnings. I use a define like this:</p>

<pre class="textmate-source"><span class="source source_objc++"><span class="meta meta_preprocessor meta_preprocessor_macro meta_preprocessor_macro_c">#<span class="keyword keyword_control keyword_control_import keyword_control_import_define keyword_control_import_define_c">define</span> <span class="entity entity_name entity_name_function entity_name_function_preprocessor entity_name_function_preprocessor_c">QLPreviewPanel</span><span class="meta meta_function meta_function_c"> <span class="entity entity_name entity_name_function entity_name_function_c">NSClassFromString</span>(<span class="string string_quoted string_quoted_double string_quoted_double_objc">@"QLPreviewPanel"</span>)</span></span></span></pre>

<p>To allow <code>QLPreviewPanel</code> to be used in code.</p>

<p>Quick Look works with URLs (provided as <code>NSURL</code> instances) – to tell it which items to display you pass it an <code>NSArray</code> of <code>NSURL</code>s like so:</p>

<pre class="textmate-source"><span class="source source_objc"><span class="meta meta_bracketed meta_bracketed_objc">[<span class="meta meta_bracketed meta_bracketed_objc">[QLPreviewPanel <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">sharedPreviewPanel</span></span>]</span> <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">setURLs:</span>URLs <span class="support support_function support_function_any-method support_function_any-method_name-of-parameter support_function_any-method_name-of-parameter_objc">currentIndex:</span><span class="constant constant_numeric constant_numeric_c">0</span> <span class="support support_function support_function_any-method support_function_any-method_name-of-parameter support_function_any-method_name-of-parameter_objc">preservingDisplayState:</span><span class="constant constant_language constant_language_objc">YES</span></span>]</span></span></pre>

<p>The other 2 parameters should be self explanatory.</p>

<p>Then you need to tell the Quick Look panel to display. The simplest method is to have it fade in by using</p>

<pre class="textmate-source"><span class="source source_objc"><span class="meta meta_bracketed meta_bracketed_objc">[<span class="meta meta_bracketed meta_bracketed_objc">[QLPreviewPanel <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">sharedPreviewPanel</span></span>]</span> <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">makeKeyAndOrderFrontWithEffect:</span><span class="constant constant_numeric constant_numeric_c">1</span></span>]</span></span></pre>

<p>And that’s it! To change the current set of items (e.g. when the user changes the selection) just call <code>setURLs:current:preservingDisplayState:</code> again with the new URLs. Check <code>[[QLPreviewPanel sharedPreviewPanel] isOpen]</code> to determine whether to use <code>makeKeyAndOrderFrontWithEffect:</code> or not. Call <code>closeWithEffect:</code> to close the panel.</p>

<p>To get the zoom effect we need a little more work. First we need to set up a delegate, like this:</p>

<pre class="textmate-source"><span class="source source_objc"><span class="meta meta_bracketed meta_bracketed_objc">[<span class="meta meta_bracketed meta_bracketed_objc">[<span class="meta meta_bracketed meta_bracketed_objc">[QLPreviewPanel <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">sharedPreviewPanel</span></span>]</span> <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">windowController</span></span>]</span> <span class="meta meta_function-call meta_function-call_objc"><span class="support support_function support_function_any-method support_function_any-method_objc">setDelegate:</span>theDelegate</span>]</span></span></pre>

<p>This delegate must implement <code>- (NSRect)previewPanel:(NSPanel*)panel frameForURL:(NSURL*)URL</code>, returning the rect which the item represented by <code>URL</code> originates from.<br />
With a delegate set, simply change your <code>makeKeyAndOrderFrontWithEffect:</code> call to use <code>2</code> and Quick Look will automatically request the frame when required.</p>

<p>I’ve put together a simple project which demonstrates using Quick Look, you can <a href="http://ciaranwal.sh/files/QuickLookSample.zip">download the source code here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://ciaranwal.sh/2007/12/07/quick-look-apis/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->