mirror of
https://github.com/gnustep/libs-gui.git
synced 2025-04-25 14:00:54 +00:00
Preliminary implementation of NSCollectionView.
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/branches/gnustep_testplant_branch@36183 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
b40571e9c5
commit
c9f3f71f41
7 changed files with 839 additions and 1 deletions
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
|||
2013-02-21 Frank Le Grand <frank.legrand@testplant.com>
|
||||
Prelimirary/basic implementation of NSCollectionView and NSCollectionViewItem.
|
||||
This is a work in progress.
|
||||
* Source\NSCollectionView.m
|
||||
* Source\NSCollectionViewItem.m
|
||||
* Headers\NSCollectionView.h
|
||||
* Headers\NSCollectionViewItem.h: Added files to project
|
||||
* Source\NSViewController.m: Added a retain on view in SetView:
|
||||
* Source\GNUmakefile: Added NSCollectionView and NSCollectionViewItem
|
||||
to AppKit.
|
||||
|
||||
2013-02-13 Jonathan Gillaspie <jonathan.gillaspie@testplant.com>
|
||||
|
||||
* Source\GSXibLoader.m: Fix a problem where owner, firstResponder and application
|
||||
|
|
122
Headers/AppKit/NSCollectionView.h
Normal file
122
Headers/AppKit/NSCollectionView.h
Normal file
|
@ -0,0 +1,122 @@
|
|||
/* -*-objc-*-
|
||||
NSCollectionView.h
|
||||
|
||||
Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
|
||||
Author: Doug Simons (doug.simons@testplant.com)
|
||||
Frank LeGrand (frank.legrand@testplant.com)
|
||||
Date: February 2013
|
||||
|
||||
This file is part of the GNUstep GUI Library.
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; see the file COPYING.LIB.
|
||||
If not, see <http://www.gnu.org/licenses/> or write to the
|
||||
Free Software Foundation, 51 Franklin Street, Fifth Floor,
|
||||
Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#ifndef _GNUstep_H_NSCollectionView
|
||||
#define _GNUstep_H_NSCollectionView
|
||||
|
||||
#import <AppKit/NSNibDeclarations.h>
|
||||
#import <GNUstepBase/GSVersionMacros.h>
|
||||
|
||||
#import <AppKit/NSView.h>
|
||||
#import <AppKit/NSDragging.h>
|
||||
|
||||
@class NSCollectionViewItem;
|
||||
|
||||
|
||||
@protocol NSCollectionViewDelegate <NSObject>
|
||||
|
||||
// TODO
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface NSCollectionView : NSView
|
||||
{
|
||||
NSArray *_content;
|
||||
IBOutlet NSCollectionViewItem *itemPrototype;
|
||||
NSMutableArray *_items;
|
||||
|
||||
BOOL _allowsMultipleSelection;
|
||||
BOOL _isSelectable;
|
||||
NSIndexSet *_selectionIndexes;
|
||||
|
||||
NSArray *_backgroundColors;
|
||||
IBOutlet id <NSCollectionViewDelegate> delegate;
|
||||
|
||||
NSSize _itemSize;
|
||||
NSSize _maxItemSize;
|
||||
NSSize _minItemSize;
|
||||
float _tileWidth;
|
||||
float _verticalMargin;
|
||||
|
||||
NSUInteger _maxNumberOfColumns;
|
||||
NSUInteger _maxNumberOfRows;
|
||||
}
|
||||
|
||||
- (BOOL)allowsMultipleSelection;
|
||||
- (void)setAllowsMultipleSelection:(BOOL)flag;
|
||||
|
||||
- (NSArray *)backgroundColors;
|
||||
- (void)setBackgroundColors:(NSArray *)colors;
|
||||
|
||||
- (NSArray *)content;
|
||||
- (void)setContent:(NSArray *)content;
|
||||
|
||||
- (id < NSCollectionViewDelegate >)delegate;
|
||||
- (void)setDelegate:(id < NSCollectionViewDelegate >)aDelegate;
|
||||
|
||||
- (NSCollectionViewItem *)itemPrototype;
|
||||
- (void)setItemPrototype:(NSCollectionViewItem *)prototype;
|
||||
|
||||
- (BOOL)isFirstResponder;
|
||||
|
||||
- (NSSize)maxItemSize;
|
||||
- (void)setMaxItemSize:(NSSize)size;
|
||||
|
||||
- (NSUInteger)maxNumberOfColumns;
|
||||
- (void)setMaxNumberOfColumns:(NSUInteger)number;
|
||||
|
||||
- (NSUInteger)maxNumberOfRows;
|
||||
- (void)setMaxNumberOfRows:(NSUInteger)number;
|
||||
|
||||
- (NSSize)minItemSize;
|
||||
- (void)setMinItemSize:(NSSize)size;
|
||||
|
||||
- (BOOL)isSelectable;
|
||||
- (void)setSelectable:(BOOL)flag;
|
||||
|
||||
- (NSIndexSet *)selectionIndexes;
|
||||
- (void)setSelectionIndexes:(NSIndexSet *)indexes;
|
||||
|
||||
- (NSRect)frameForItemAtIndex:(NSUInteger)index;
|
||||
- (NSCollectionViewItem *)itemAtIndex:(NSUInteger)index;
|
||||
|
||||
- (NSCollectionViewItem *)newItemForRepresentedObject:(id)object;
|
||||
|
||||
- (void)reloadContent;
|
||||
- (void)tile;
|
||||
|
||||
- (void)setDraggingSourceOperationMask:(NSDragOperation)dragOperationMask forLocal:(BOOL)localDestination;
|
||||
- (NSImage *)draggingImageForItemsAtIndexes:(NSIndexSet *)indexes
|
||||
withEvent:(NSEvent *)event
|
||||
offset:(NSPointPointer)dragImageOffset;
|
||||
|
||||
|
||||
@end
|
||||
|
||||
#endif /* _GNUstep_H_NSCollectionView */
|
52
Headers/AppKit/NSCollectionViewItem.h
Normal file
52
Headers/AppKit/NSCollectionViewItem.h
Normal file
|
@ -0,0 +1,52 @@
|
|||
/* -*-objc-*-
|
||||
NSCollectionViewItem.h
|
||||
|
||||
Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
|
||||
Author: Doug Simons (doug.simons@testplant.com)
|
||||
Frank LeGrand (frank.legrand@testplant.com)
|
||||
Date: February 2013
|
||||
|
||||
This file is part of the GNUstep GUI Library.
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; see the file COPYING.LIB.
|
||||
If not, see <http://www.gnu.org/licenses/> or write to the
|
||||
Free Software Foundation, 51 Franklin Street, Fifth Floor,
|
||||
Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#ifndef _GNUstep_H_NSCollectionViewItem
|
||||
#define _GNUstep_H_NSCollectionViewItem
|
||||
|
||||
#import <AppKit/NSNibDeclarations.h>
|
||||
#import <GNUstepBase/GSVersionMacros.h>
|
||||
#import <AppKit/NSTextField.h>
|
||||
#import <AppKit/NSImageView.h>
|
||||
#import <AppKit/NSView.h>
|
||||
#import <AppKit/NSViewController.h>
|
||||
#import <AppKit/NSDragging.h>
|
||||
|
||||
@interface NSCollectionViewItem : NSViewController
|
||||
{
|
||||
IBOutlet NSTextField *textField;
|
||||
IBOutlet NSImageView *imageView;
|
||||
BOOL _isSelected;
|
||||
}
|
||||
|
||||
- (void)setSelected:(BOOL)shouldBeSelected;
|
||||
- (BOOL)isSelected;
|
||||
|
||||
@end
|
||||
|
||||
#endif /* _GNUstep_H_NSCollectionView */
|
|
@ -67,6 +67,8 @@ NSButtonCell.m \
|
|||
NSCachedImageRep.m \
|
||||
NSCell.m \
|
||||
NSClipView.m \
|
||||
NSCollectionView.m \
|
||||
NSCollectionViewItem.m \
|
||||
NSColor.m \
|
||||
NSColorList.m \
|
||||
NSColorPanel.m \
|
||||
|
@ -278,6 +280,8 @@ NSButtonCell.h \
|
|||
NSCachedImageRep.h \
|
||||
NSCell.h \
|
||||
NSClipView.h \
|
||||
NSCollectionView.h \
|
||||
NSCollectionViewItem.h \
|
||||
NSColor.h \
|
||||
NSColorList.h \
|
||||
NSColorPanel.h \
|
||||
|
|
499
Source/NSCollectionView.m
Normal file
499
Source/NSCollectionView.m
Normal file
|
@ -0,0 +1,499 @@
|
|||
/** <title>NSCollectionView</title>
|
||||
|
||||
Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
|
||||
Author: Doug Simons (doug.simons@testplant.com)
|
||||
Frank LeGrand (frank.legrand@testplant.com)
|
||||
Date: February 2013
|
||||
|
||||
This file is part of the GNUstep GUI Library.
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; see the file COPYING.LIB.
|
||||
If not, see <http://www.gnu.org/licenses/> or write to the
|
||||
Free Software Foundation, 51 Franklin Street, Fifth Floor,
|
||||
Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#import "AppKit/NSCollectionView.h"
|
||||
#import "AppKit/NSCollectionViewItem.h"
|
||||
#import "Foundation/NSKeyedArchiver.h"
|
||||
#import <Foundation/NSGeometry.h>
|
||||
|
||||
#import <Foundation/NSAutoreleasePool.h>
|
||||
#import <Foundation/NSDebug.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSEnumerator.h>
|
||||
#import <Foundation/NSException.h>
|
||||
#import <Foundation/NSFormatter.h>
|
||||
#import <Foundation/NSIndexSet.h>
|
||||
#import <Foundation/NSKeyValueCoding.h>
|
||||
#import <Foundation/NSNotification.h>
|
||||
#import <Foundation/NSSet.h>
|
||||
#import <Foundation/NSSortDescriptor.h>
|
||||
#import <Foundation/NSUserDefaults.h>
|
||||
#import <Foundation/NSValue.h>
|
||||
#import <Foundation/NSKeyedArchiver.h>
|
||||
|
||||
#import "AppKit/NSView.h"
|
||||
#import "AppKit/NSNibLoading.h"
|
||||
#import "AppKit/NSTableView.h"
|
||||
#import "AppKit/NSApplication.h"
|
||||
#import "AppKit/NSCell.h"
|
||||
#import "AppKit/NSClipView.h"
|
||||
#import "AppKit/NSColor.h"
|
||||
#import "AppKit/NSEvent.h"
|
||||
#import "AppKit/NSImage.h"
|
||||
#import "AppKit/NSGraphics.h"
|
||||
#import "AppKit/NSKeyValueBinding.h"
|
||||
#import "AppKit/NSScroller.h"
|
||||
#import "AppKit/NSScrollView.h"
|
||||
#import "AppKit/NSTableColumn.h"
|
||||
#import "AppKit/NSTableHeaderView.h"
|
||||
#import "AppKit/NSText.h"
|
||||
#import "AppKit/NSTextFieldCell.h"
|
||||
#import "AppKit/NSWindow.h"
|
||||
#import "AppKit/PSOperators.h"
|
||||
#import "AppKit/NSCachedImageRep.h"
|
||||
#import "AppKit/NSPasteboard.h"
|
||||
#import "AppKit/NSDragging.h"
|
||||
#import "AppKit/NSCustomImageRep.h"
|
||||
#import "AppKit/NSAttributedString.h"
|
||||
#import "AppKit/NSStringDrawing.h"
|
||||
#import "GNUstepGUI/GSTheme.h"
|
||||
#import "GSBindingHelpers.h"
|
||||
|
||||
#include <math.h>
|
||||
|
||||
|
||||
|
||||
|
||||
static NSString* NSCollectionViewMinItemSizeKey = @"NSCollectionViewMinItemSizeKey";
|
||||
static NSString* NSCollectionViewMaxItemSizeKey = @"NSCollectionViewMaxItemSizeKey";
|
||||
static NSString* NSCollectionViewVerticalMarginKey = @"NSCollectionViewVerticalMarginKey";
|
||||
static NSString* NSCollectionViewMaxNumberOfRowsKey = @"NSCollectionViewMaxNumberOfRowsKey";
|
||||
static NSString* NSCollectionViewMaxNumberOfColumnsKey = @"NSCollectionViewMaxNumberOfColumnsKey";
|
||||
static NSString* NSCollectionViewSelectableKey = @"NSCollectionViewSelectableKey";
|
||||
static NSString* NSCollectionViewAllowsMultipleSelectionKey = @"NSCollectionViewAllowsMultipleSelectionKey";
|
||||
static NSString* NSCollectionViewBackgroundColorsKey = @"NSCollectionViewBackgroundColorsKey";
|
||||
|
||||
|
||||
/*
|
||||
* Class variables
|
||||
*/
|
||||
static NSString *placeholderItem = nil;
|
||||
|
||||
@implementation NSCollectionView
|
||||
|
||||
//
|
||||
// Class methods
|
||||
//
|
||||
+ (void) initialize
|
||||
{
|
||||
placeholderItem = @"Placeholder";
|
||||
}
|
||||
|
||||
- (void)awakeFromNib
|
||||
{
|
||||
// FIXME: This is just preliminary stuff
|
||||
_minItemSize = NSMakeSize(120.0, 100.0);
|
||||
_maxItemSize = NSMakeSize(120.0, 100.0);
|
||||
_content = [[NSArray alloc] init];
|
||||
_items = [[NSMutableArray alloc] init];
|
||||
}
|
||||
|
||||
- (void)drawRect:(NSRect)dirtyRect
|
||||
{
|
||||
[[NSColor whiteColor] set];
|
||||
NSRectFill([self bounds]);
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[_content release];
|
||||
[itemPrototype release];
|
||||
[_backgroundColors release];
|
||||
[_selectionIndexes release];
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (BOOL)isFlipped
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (BOOL)allowsMultipleSelection
|
||||
{
|
||||
return _allowsMultipleSelection;
|
||||
}
|
||||
|
||||
- (void)setAllowsMultipleSelection:(BOOL)flag
|
||||
{
|
||||
_allowsMultipleSelection = flag;
|
||||
}
|
||||
|
||||
- (NSArray *)backgroundColors
|
||||
{
|
||||
return _backgroundColors;
|
||||
}
|
||||
|
||||
- (void)setBackgroundColors:(NSArray *)colors
|
||||
{
|
||||
_backgroundColors = [colors copy];
|
||||
}
|
||||
|
||||
- (NSArray *)content
|
||||
{
|
||||
return _content;
|
||||
}
|
||||
|
||||
- (void)setContent:(NSArray *)content
|
||||
{
|
||||
[_content release];
|
||||
_content = [content retain];
|
||||
|
||||
[_items release];
|
||||
_items = [[NSMutableArray alloc] initWithCapacity:[_content count]];
|
||||
|
||||
int i;
|
||||
for (i=0; i<[_content count]; i++)
|
||||
{
|
||||
[_items addObject:placeholderItem];
|
||||
}
|
||||
[self reloadContent];
|
||||
}
|
||||
|
||||
- (id < NSCollectionViewDelegate >)delegate
|
||||
{
|
||||
return delegate;
|
||||
}
|
||||
|
||||
- (void)setDelegate:(id < NSCollectionViewDelegate >)aDelegate
|
||||
{
|
||||
delegate = aDelegate;
|
||||
}
|
||||
|
||||
- (NSCollectionViewItem *)itemPrototype
|
||||
{
|
||||
return itemPrototype;
|
||||
}
|
||||
|
||||
- (void)setItemPrototype:(NSCollectionViewItem *)prototype
|
||||
{
|
||||
[itemPrototype release];
|
||||
itemPrototype = [prototype retain];
|
||||
|
||||
//TODO: Re-enabled this
|
||||
// if (itemPrototype)
|
||||
// _itemSize = [[itemPrototype view] frame].size;
|
||||
// else
|
||||
// {
|
||||
// // TODO: Figure out what to do if prototype==nil
|
||||
// _itemSize = NSMakeSize (1,1);
|
||||
// }
|
||||
}
|
||||
|
||||
- (BOOL)isFirstResponder
|
||||
{
|
||||
// FIXME
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (float)verticalMargin
|
||||
{
|
||||
return _verticalMargin;
|
||||
}
|
||||
|
||||
- (void)setVerticalMargin:(float)margin
|
||||
{
|
||||
if (_verticalMargin == margin)
|
||||
return;
|
||||
|
||||
_verticalMargin = margin;
|
||||
[self tile];
|
||||
}
|
||||
|
||||
- (NSSize)maxItemSize
|
||||
{
|
||||
return _maxItemSize;
|
||||
}
|
||||
|
||||
- (void)setMaxItemSize:(NSSize)size
|
||||
{
|
||||
if (NSEqualSizes(_maxItemSize, size))
|
||||
return;
|
||||
|
||||
_maxItemSize = size;
|
||||
[self tile];
|
||||
}
|
||||
|
||||
- (NSUInteger)maxNumberOfColumns
|
||||
{
|
||||
return _maxNumberOfColumns;
|
||||
}
|
||||
|
||||
- (void)setMaxNumberOfColumns:(NSUInteger)number
|
||||
{
|
||||
_maxNumberOfColumns = number;
|
||||
}
|
||||
|
||||
- (NSUInteger)maxNumberOfRows
|
||||
{
|
||||
return _maxNumberOfRows;
|
||||
}
|
||||
|
||||
- (void)setMaxNumberOfRows:(NSUInteger)number
|
||||
{
|
||||
_maxNumberOfRows = number;
|
||||
}
|
||||
|
||||
- (NSSize)minItemSize
|
||||
{
|
||||
return _minItemSize;
|
||||
}
|
||||
|
||||
- (void)setMinItemSize:(NSSize)size
|
||||
{
|
||||
if (NSEqualSizes(_minItemSize, size))
|
||||
return;
|
||||
|
||||
_minItemSize = size;
|
||||
[self tile];
|
||||
}
|
||||
|
||||
- (BOOL)isSelectable
|
||||
{
|
||||
return _isSelectable;
|
||||
}
|
||||
|
||||
- (void)setSelectable:(BOOL)flag
|
||||
{
|
||||
_isSelectable = flag;
|
||||
}
|
||||
|
||||
- (NSIndexSet *)selectionIndexes
|
||||
{
|
||||
return _selectionIndexes;
|
||||
}
|
||||
|
||||
- (void)setSelectionIndexes:(NSIndexSet *)indexes
|
||||
{
|
||||
[_selectionIndexes release];
|
||||
_selectionIndexes = [indexes copy];
|
||||
}
|
||||
|
||||
- (NSRect)frameForItemAtIndex:(NSUInteger)index
|
||||
{
|
||||
return [[[self itemAtIndex:index] view] frame];
|
||||
}
|
||||
|
||||
- (NSCollectionViewItem *)itemAtIndex:(NSUInteger)index
|
||||
{
|
||||
id item = [_items objectAtIndex:index];
|
||||
if (item == placeholderItem)
|
||||
{
|
||||
item = [self newItemForRepresentedObject:[_content objectAtIndex:index]];
|
||||
[_items replaceObjectAtIndex:index withObject:item];
|
||||
}
|
||||
return item;
|
||||
}
|
||||
|
||||
- (NSCollectionViewItem *)newItemForRepresentedObject:(id)object
|
||||
{
|
||||
NSCollectionViewItem *collectionItem = nil;
|
||||
if (itemPrototype)
|
||||
{
|
||||
NSData *itemAsData = [NSKeyedArchiver archivedDataWithRootObject:itemPrototype];
|
||||
collectionItem = [NSKeyedUnarchiver unarchiveObjectWithData:itemAsData];
|
||||
[collectionItem setRepresentedObject:object];
|
||||
}
|
||||
return collectionItem;
|
||||
}
|
||||
|
||||
- (void)setDraggingSourceOperationMask:(NSDragOperation)dragOperationMask forLocal:(BOOL)localDestination
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
- (NSImage *)draggingImageForItemsAtIndexes:(NSIndexSet *)indexes
|
||||
withEvent:(NSEvent *)event
|
||||
offset:(NSPointPointer)dragImageOffset
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (void)reloadContent
|
||||
{
|
||||
// First of all clean off the current item views:
|
||||
long count = [_items count];
|
||||
|
||||
while (count--)
|
||||
{
|
||||
if (![[_items objectAtIndex:count] isKindOfClass:[NSString class]])
|
||||
{
|
||||
[[[_items objectAtIndex:count] view] removeFromSuperview];
|
||||
[[_items objectAtIndex:count] setSelected:NO];
|
||||
}
|
||||
}
|
||||
|
||||
if (!itemPrototype)
|
||||
return;
|
||||
|
||||
long index = 0;
|
||||
|
||||
count = [_content count];
|
||||
|
||||
for (; index < count; ++index)
|
||||
{
|
||||
[_items replaceObjectAtIndex:index
|
||||
withObject:[self newItemForRepresentedObject:[_content objectAtIndex:index]]];
|
||||
|
||||
[self addSubview:[[_items objectAtIndex:index] view]];
|
||||
}
|
||||
|
||||
// TODO: Restore item's selected state
|
||||
|
||||
[self tile];
|
||||
}
|
||||
|
||||
- (void)tile
|
||||
{
|
||||
if (!_items)
|
||||
return;
|
||||
|
||||
float width = [self bounds].size.width;
|
||||
|
||||
if (width == _tileWidth)
|
||||
return;
|
||||
|
||||
NSSize itemSize = NSMakeSize(_minItemSize.width, _minItemSize.height);
|
||||
|
||||
long _numberOfColumns = MAX(1.0, floor(width / itemSize.width));
|
||||
|
||||
if (_maxNumberOfColumns > 0)
|
||||
_numberOfColumns = MIN(_maxNumberOfColumns, _numberOfColumns);
|
||||
|
||||
float remaining = width - _numberOfColumns * itemSize.width;
|
||||
BOOL itemsNeedSizeUpdate = NO;
|
||||
|
||||
if (remaining > 0 && itemSize.width < _maxItemSize.width)
|
||||
itemSize.width = MIN(_maxItemSize.width, itemSize.width + floor(remaining / _numberOfColumns));
|
||||
|
||||
if (_maxNumberOfColumns == 1 && itemSize.width < _maxItemSize.width && itemSize.width < width)
|
||||
itemSize.width = MIN(_maxItemSize.width, width);
|
||||
|
||||
if (!NSEqualSizes(_itemSize, itemSize))
|
||||
{
|
||||
_itemSize = itemSize;
|
||||
itemsNeedSizeUpdate = YES;
|
||||
}
|
||||
|
||||
int index = 0;
|
||||
long count = (long)[_items count];
|
||||
|
||||
if (_maxNumberOfColumns > 0 && _maxNumberOfRows > 0)
|
||||
count = MIN(count, _maxNumberOfColumns * _maxNumberOfRows);
|
||||
|
||||
float _horizontalMargin = floor((width - _numberOfColumns * itemSize.width) / (_numberOfColumns + 1));
|
||||
|
||||
float x = _horizontalMargin;
|
||||
float y = -itemSize.height;
|
||||
|
||||
for (; index < count; ++index)
|
||||
{
|
||||
if (index % _numberOfColumns == 0)
|
||||
{
|
||||
x = _horizontalMargin;
|
||||
y += _verticalMargin + itemSize.height;
|
||||
}
|
||||
|
||||
NSView *view = [[_items objectAtIndex:index] view];
|
||||
|
||||
[view setFrameOrigin:NSMakePoint(x, y)];
|
||||
|
||||
if (itemsNeedSizeUpdate)
|
||||
[view setFrameSize:_itemSize];
|
||||
|
||||
x += itemSize.width + _horizontalMargin;
|
||||
}
|
||||
|
||||
float proposedHeight = y + itemSize.height + _verticalMargin;
|
||||
|
||||
_tileWidth = width;
|
||||
[self setFrameSize:NSMakeSize(width, proposedHeight)];
|
||||
_tileWidth = -1.0;
|
||||
|
||||
}
|
||||
|
||||
- (void)resizeSubviewsWithOldSize:(NSSize)aSize
|
||||
{
|
||||
[self tile];
|
||||
}
|
||||
|
||||
- (id)initWithCoder:(NSCoder *)aCoder
|
||||
{
|
||||
self = [super initWithCoder:aCoder];
|
||||
|
||||
if (self)
|
||||
{
|
||||
_items = [NSMutableArray array];
|
||||
_content = [NSArray array];
|
||||
|
||||
_itemSize = NSMakeSize(0, 0);
|
||||
|
||||
_minItemSize = [aCoder decodeSizeForKey:NSCollectionViewMinItemSizeKey];
|
||||
_maxItemSize = [aCoder decodeSizeForKey:NSCollectionViewMaxItemSizeKey];
|
||||
|
||||
_maxNumberOfRows = [aCoder decodeInt64ForKey:NSCollectionViewMaxNumberOfRowsKey];
|
||||
_maxNumberOfColumns = [aCoder decodeInt64ForKey:NSCollectionViewMaxNumberOfColumnsKey];
|
||||
|
||||
_verticalMargin = [aCoder decodeFloatForKey:NSCollectionViewVerticalMarginKey];
|
||||
|
||||
_isSelectable = [aCoder decodeBoolForKey:NSCollectionViewSelectableKey];
|
||||
_allowsMultipleSelection = [aCoder decodeBoolForKey:NSCollectionViewAllowsMultipleSelectionKey];
|
||||
|
||||
[self setBackgroundColors:[aCoder decodeObjectForKey:NSCollectionViewBackgroundColorsKey]];
|
||||
|
||||
_tileWidth = -1.0;
|
||||
|
||||
_selectionIndexes = [NSIndexSet indexSet];
|
||||
|
||||
// FIXME
|
||||
//_allowsEmptySelection = YES;
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)encodeWithCoder:(NSCoder *)aCoder
|
||||
{
|
||||
[super encodeWithCoder:aCoder];
|
||||
|
||||
if (!NSEqualSizes(_minItemSize, NSMakeSize(0, 0)))
|
||||
[aCoder encodeSize:_minItemSize forKey:NSCollectionViewMinItemSizeKey];
|
||||
|
||||
if (!NSEqualSizes(_maxItemSize, NSMakeSize(0, 0)))
|
||||
[aCoder encodeSize:_maxItemSize forKey:NSCollectionViewMaxItemSizeKey];
|
||||
|
||||
[aCoder encodeInt64:_maxNumberOfRows forKey:NSCollectionViewMaxNumberOfRowsKey];
|
||||
[aCoder encodeInt64:_maxNumberOfColumns forKey:NSCollectionViewMaxNumberOfColumnsKey];
|
||||
|
||||
[aCoder encodeBool:_isSelectable forKey:NSCollectionViewSelectableKey];
|
||||
[aCoder encodeBool:_allowsMultipleSelection forKey:NSCollectionViewAllowsMultipleSelectionKey];
|
||||
|
||||
[aCoder encodeFloat:_verticalMargin forKey:NSCollectionViewVerticalMarginKey];
|
||||
|
||||
[aCoder encodeObject:_backgroundColors forKey:NSCollectionViewBackgroundColorsKey];
|
||||
}
|
||||
|
||||
@end
|
125
Source/NSCollectionViewItem.m
Normal file
125
Source/NSCollectionViewItem.m
Normal file
|
@ -0,0 +1,125 @@
|
|||
/** <title>NSCollectionViewItem</title>
|
||||
|
||||
Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
|
||||
Author: Doug Simons (doug.simons@testplant.com)
|
||||
Frank LeGrand (frank.legrand@testplant.com)
|
||||
Date: February 2013
|
||||
|
||||
This file is part of the GNUstep GUI Library.
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; see the file COPYING.LIB.
|
||||
If not, see <http://www.gnu.org/licenses/> or write to the
|
||||
Free Software Foundation, 51 Franklin Street, Fifth Floor,
|
||||
Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#import "AppKit/NSCollectionViewItem.h"
|
||||
|
||||
#import <Foundation/NSAutoreleasePool.h>
|
||||
#import <Foundation/NSDebug.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSEnumerator.h>
|
||||
#import <Foundation/NSException.h>
|
||||
#import <Foundation/NSFormatter.h>
|
||||
#import <Foundation/NSIndexSet.h>
|
||||
#import <Foundation/NSKeyValueCoding.h>
|
||||
#import <Foundation/NSNotification.h>
|
||||
#import <Foundation/NSSet.h>
|
||||
#import <Foundation/NSSortDescriptor.h>
|
||||
#import <Foundation/NSUserDefaults.h>
|
||||
#import <Foundation/NSValue.h>
|
||||
#import <Foundation/NSKeyedArchiver.h>
|
||||
|
||||
#import "AppKit/NSTableView.h"
|
||||
#import "AppKit/NSApplication.h"
|
||||
#import "AppKit/NSCell.h"
|
||||
#import "AppKit/NSClipView.h"
|
||||
#import "AppKit/NSColor.h"
|
||||
#import "AppKit/NSEvent.h"
|
||||
#import "AppKit/NSImage.h"
|
||||
#import "AppKit/NSGraphics.h"
|
||||
#import "AppKit/NSKeyValueBinding.h"
|
||||
#import "AppKit/NSScroller.h"
|
||||
#import "AppKit/NSScrollView.h"
|
||||
#import "AppKit/NSTableColumn.h"
|
||||
#import "AppKit/NSTableHeaderView.h"
|
||||
#import "AppKit/NSText.h"
|
||||
#import "AppKit/NSTextFieldCell.h"
|
||||
#import "AppKit/NSWindow.h"
|
||||
#import "AppKit/PSOperators.h"
|
||||
#import "AppKit/NSCachedImageRep.h"
|
||||
#import "AppKit/NSPasteboard.h"
|
||||
#import "AppKit/NSDragging.h"
|
||||
#import "AppKit/NSCustomImageRep.h"
|
||||
#import "AppKit/NSAttributedString.h"
|
||||
#import "AppKit/NSStringDrawing.h"
|
||||
#import "GNUstepGUI/GSTheme.h"
|
||||
#import "GSBindingHelpers.h"
|
||||
|
||||
#include <math.h>
|
||||
|
||||
@implementation NSCollectionViewItem
|
||||
|
||||
- (void)awakeFromNib
|
||||
{
|
||||
}
|
||||
|
||||
- (BOOL)isSelected
|
||||
{
|
||||
return _isSelected;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (void)setSelected:(BOOL)shouldBeSelected
|
||||
{
|
||||
_isSelected = shouldBeSelected;
|
||||
}
|
||||
|
||||
- (id)representedObject
|
||||
{
|
||||
return [super representedObject];
|
||||
}
|
||||
|
||||
- (void)setRepresentedObject:(id)anObject
|
||||
{
|
||||
[super setRepresentedObject:anObject];
|
||||
[textField setStringValue:[self representedObject]];
|
||||
}
|
||||
|
||||
- (id)initWithCoder:(NSCoder *)aCoder
|
||||
{
|
||||
self = [super initWithCoder:aCoder];
|
||||
|
||||
if (self)
|
||||
{
|
||||
textField = [aCoder decodeObjectForKey:@"textField"];
|
||||
imageView = [aCoder decodeObjectForKey:@"imageView"];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)encodeWithCoder:(NSCoder *)aCoder
|
||||
{
|
||||
[super encodeWithCoder:aCoder];
|
||||
[aCoder encodeObject:textField forKey:@"textField"];
|
||||
[aCoder encodeObject:imageView forKey:@"imageView"];
|
||||
}
|
||||
|
||||
@end
|
|
@ -28,6 +28,7 @@
|
|||
#import <Foundation/NSBundle.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSKeyedArchiver.h>
|
||||
#import "AppKit/NSKeyValueBinding.h"
|
||||
#import "AppKit/NSNib.h"
|
||||
#import "AppKit/NSViewController.h"
|
||||
|
@ -62,6 +63,7 @@
|
|||
DESTROY(_editors);
|
||||
DESTROY(_autounbinder);
|
||||
DESTROY(_designNibBundleIdentifier);
|
||||
DESTROY(view);
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
@ -97,7 +99,11 @@
|
|||
|
||||
- (void)setView:(NSView *)aView
|
||||
{
|
||||
view = aView;
|
||||
if (aView != view)
|
||||
{
|
||||
[view release];
|
||||
view = [aView retain];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)loadView
|
||||
|
@ -188,4 +194,23 @@
|
|||
[self notImplemented: _cmd];
|
||||
}
|
||||
|
||||
- (id)initWithCoder:(NSCoder *)aCoder
|
||||
{
|
||||
self = [super initWithCoder:aCoder];
|
||||
|
||||
if (self)
|
||||
{
|
||||
NSView *aView = [aCoder decodeObjectForKey:@"NSView"];
|
||||
[self setView:aView];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)encodeWithCoder:(NSCoder *)aCoder
|
||||
{
|
||||
[super encodeWithCoder:aCoder];
|
||||
[aCoder encodeObject:[self view] forKey:@"NSView"];
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
Loading…
Reference in a new issue