2

i had displayed some images in collectionview. now i want to select the image and press space button. If i pressed Space button , the image should quicklook in a seperate window. any idea?

user23790
  • 563
  • 3
  • 21

2 Answers2

4

On your view, do this:

- (void)keyDown:(NSEvent *)event
{
  unichar firstChar = 0;
  if ([[event charactersIgnoringModifiers] length] > 0)
    firstChar = [[event charactersIgnoringModifiers] characterAtIndex:0];

  if (firstChar == ' ')
  {
    if ([QLPreviewPanel sharedPreviewPanelExists]
        && [[QLPreviewPanel sharedPreviewPanel] isVisible])
    {
      [[QLPreviewPanel sharedPreviewPanel] orderOut:nil];
    }
    else
    {
      [[QLPreviewPanel sharedPreviewPanel] makeKeyAndOrderFront:nil];
      [[NSApp mainWindow] makeKeyWindow];
    }
  }
  else if (firstChar == NSRightArrowFunctionKey)
  {
    if ([QLPreviewPanel sharedPreviewPanelExists]
        && [[QLPreviewPanel sharedPreviewPanel] isVisible])
    {
      [[QLPreviewPanel sharedPreviewPanel] selectNextItem];
      return;
    }
  }
  else if (firstChar == NSLeftArrowFunctionKey)
  {
    if ([QLPreviewPanel sharedPreviewPanelExists]
        && [[QLPreviewPanel sharedPreviewPanel] isVisible])
    {
      [[QLPreviewPanel sharedPreviewPanel] selectPreviousItem];
      return;
    }
  }
  else
    [super keyDown:event];
}

Then, I do this in my app's delegate (AppDelegate.m):

- (BOOL)acceptsPreviewPanelControl:(QLPreviewPanel *)panel
{
  //note that this methods indeed gets called because NSApp's
  //delegate is in the responder chain.
  return YES;
}

- (void)beginPreviewPanelControl:(QLPreviewPanel *)panel
{
  previewPanel = panel; //set an ivar
  [panel setDataSource:self];
}

- (void)endPreviewPanelControl:(QLPreviewPanel *)panel
{
  previewPanel = nil;
}

- (NSInteger)numberOfPreviewItemsInPreviewPanel:(QLPreviewPanel *)panel
{
  //return a number of your choice (depends on your own app)
}

- (id <QLPreviewItem>)previewPanel:(QLPreviewPanel *)panel
                previewItemAtIndex:(NSInteger)index
{
  //return an object of your choice (depends on your app)
}

- (void)handleCurrentFileItemsSelectionChange:(NSNotification *)note
{
  [previewPanel reloadData]; //referring to the ivar
}
7cows
  • 4,974
  • 6
  • 25
  • 30
  • Those delegate methods may be better implemented in a window controller or (if there is one) document class, rather than the app delegate. It wouldn't make sense for the QL panel to stay up if you open the Preferences, for example. – Peter Hosey May 25 '13 at 21:00
  • is NSCollectionView, key events supportable? – user23790 May 27 '13 at 07:04
  • @muruganandham If it doesn't already, you have to subclass it and make it such, by overriding the `acceptsFirstResonder:` and `makeFirstResponder:`, etc. methods. See here: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/EventOverview/EventArchitecture/EventArchitecture.html#//apple_ref/doc/uid/10000060i-CH3-SW2 – 7cows May 27 '13 at 09:30
1

i finally got. i just replaced imageViewes and put NSButton and setted spacebutton as keyequivalent as

- (BOOL)isOneOfMyKeyEquivs:(NSString *)keyChar
{
    if (([keyChar isEqualToString:@" "])||([keyChar isEqualToString:@"\r"])) {
        return YES;
    } else {
        return NO;
    }
}
- (BOOL)performKeyEquivalent:(NSEvent *)theEvent
{

        //NSLog(@"OK");
        NSString* keyChar = [theEvent characters];
        if ([self isOneOfMyKeyEquivs:keyChar])
        {
            [[self cell] setKeyEquivalent:keyChar];
        }
        return [super performKeyEquivalent:theEvent];


    return NO;
}

and performed button action.

user23790
  • 563
  • 3
  • 21