X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fmacosx_dialog_provider%2FdialogProvider.m;h=113f60a84528258d201e37fa3c22bf87d45fd850;hb=e8e65d95ffc3103486cffa94e0b22647fdbf6762;hp=b60dfd51ff82a5ab7cccab0770d4c49391a69822;hpb=4ad09c1bcdc5bfd3bdef1692b969d72fcec2e9ac;p=vlc diff --git a/modules/gui/macosx_dialog_provider/dialogProvider.m b/modules/gui/macosx_dialog_provider/dialogProvider.m index b60dfd51ff..113f60a845 100644 --- a/modules/gui/macosx_dialog_provider/dialogProvider.m +++ b/modules/gui/macosx_dialog_provider/dialogProvider.m @@ -38,6 +38,7 @@ #import #import "dialogProvider.h" +#import "VLCUIWidgets.h" /***************************************************************************** * Prototypes @@ -57,405 +58,6 @@ static void updateProgressPanel (void *, const char *, float); static bool checkProgressPanel (void *); static void destroyProgressPanel (void *); -@interface VLCDialogButton : NSButton -{ - extension_widget_t *widget; -} -@property (readwrite) extension_widget_t *widget; -@end - -@implementation VLCDialogButton -@synthesize widget; -@end - -@interface VLCDialogPopUpButton : NSPopUpButton -{ - extension_widget_t *widget; -} -@property (readwrite) extension_widget_t *widget; -@end - -@implementation VLCDialogPopUpButton -@synthesize widget; -@end - - -@interface VLCDialogTextField : NSTextField -{ - extension_widget_t *widget; -} -@property (readwrite) extension_widget_t *widget; -@end - -@implementation VLCDialogTextField -@synthesize widget; -@end - -@interface VLCDialogWindow : NSWindow -{ - extension_dialog_t *dialog; -} -@property (readwrite) extension_dialog_t *dialog; -@end - -@implementation VLCDialogWindow -@synthesize dialog; -@end - - -@interface VLCDialogList : NSTableView -{ - extension_widget_t *widget; - NSMutableArray *contentArray; -} -@property (readwrite) extension_widget_t *widget; -@property (readwrite, retain) NSMutableArray *contentArray; -@end - -@implementation VLCDialogList -@synthesize widget; -@synthesize contentArray; - -- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView -{ - return [contentArray count]; -} - -- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex -{ - return [[contentArray objectAtIndex:rowIndex] objectForKey:@"text"]; -} -@end - -@interface VLCDialogGridView : NSView { - NSUInteger _rowCount, _colCount; - NSMutableArray *_gridedViews; -} - -- (NSSize)flexSize:(NSSize)size; -- (void)removeSubview:(NSView *)view; -@end - - -// Move this to separate file -@implementation VLCDialogGridView - -- (void)dealloc -{ - [_gridedViews release]; - [super dealloc]; -} - -- (void)recomputeCount -{ - _colCount = 0; - _rowCount = 0; - for (NSDictionary *obj in _gridedViews) - { - NSUInteger row = [[obj objectForKey:@"row"] intValue]; - NSUInteger col = [[obj objectForKey:@"col"] intValue]; - if (col + 1 > _colCount) - _colCount = col + 1; - if (row + 1 > _rowCount) - _rowCount = row + 1; - } -} - -- (void)recomputeWindowSize -{ - [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(recomputeWindowSize) object:nil]; - - NSWindow *window = [self window]; - NSRect frame = [window frame]; - NSRect contentRect = [window contentRectForFrameRect:frame]; - contentRect.size = [self flexSize:frame.size]; - NSRect newFrame = [window frameRectForContentRect:contentRect]; - newFrame.origin.y -= newFrame.size.height - frame.size.height; - newFrame.origin.x -= (newFrame.size.width - frame.size.width) / 2; - [window setFrame:newFrame display:YES animate:YES]; -} - -- (NSSize)objectSizeToFit:(NSView *)view -{ - if ([view isKindOfClass:[NSControl class]]) { - NSControl *control = (NSControl *)view; - return [[control cell] cellSize]; - } - return [view frame].size; -} - -- (CGFloat)marginX -{ - return 16; -} -- (CGFloat)marginY -{ - return 8; -} - -- (CGFloat)constrainedHeightOfRow:(NSUInteger)targetRow -{ - CGFloat height = 0; - for(NSDictionary *obj in _gridedViews) { - NSUInteger row = [[obj objectForKey:@"row"] intValue]; - if (row != targetRow) - continue; - NSUInteger rowSpan = [[obj objectForKey:@"rowSpan"] intValue]; - if (rowSpan != 1) - continue; - NSView *view = [obj objectForKey:@"view"]; - if ([view autoresizingMask] & NSViewHeightSizable) - continue; - NSSize sizeToFit = [self objectSizeToFit:view]; - if (height < sizeToFit.height) - height = sizeToFit.height; - } - return height; -} - -- (CGFloat)remainingRowsHeight -{ - NSUInteger height = [self marginY]; - if (!_rowCount) - return 0; - NSUInteger autosizedRows = 0; - for (NSUInteger i = 0; i < _rowCount; i++) { - CGFloat constrainedHeight = [self constrainedHeightOfRow:i]; - if (!constrainedHeight) - autosizedRows++; - height += constrainedHeight + [self marginY]; - } - CGFloat remaining = 0; - if (height < self.bounds.size.height && autosizedRows) - remaining = (self.bounds.size.height - height) / autosizedRows; - if (remaining < 0) - remaining = 0; - - return remaining; -} - -- (CGFloat)heightOfRow:(NSUInteger)targetRow -{ - NSAssert(targetRow < _rowCount, @"accessing a non existing row"); - CGFloat height = [self constrainedHeightOfRow:targetRow]; - if (!height) - height = [self remainingRowsHeight]; - return height; -} - - -- (CGFloat)topOfRow:(NSUInteger)targetRow -{ - CGFloat top = [self marginY]; - for (NSUInteger i = 1; i < _rowCount - targetRow; i++) - { - top += [self heightOfRow:_rowCount - i] + [self marginY]; - } - return top; -} - -- (CGFloat)constrainedWidthOfColumn:(NSUInteger)targetColumn -{ - CGFloat width = 0; - for(NSDictionary *obj in _gridedViews) { - NSUInteger col = [[obj objectForKey:@"col"] intValue]; - if (col != targetColumn) - continue; - NSUInteger colSpan = [[obj objectForKey:@"colSpan"] intValue]; - if (colSpan != 1) - continue; - NSView *view = [obj objectForKey:@"view"]; - if ([view autoresizingMask] & NSViewWidthSizable) - return 0; - NSSize sizeToFit = [self objectSizeToFit:view]; - if (width < sizeToFit.width) - width = sizeToFit.width; - } - return width; -} - -- (CGFloat)remainingColumnWidth -{ - NSUInteger width = [self marginX]; - if (!_colCount) - return 0; - NSUInteger autosizedCol = 0; - for (NSUInteger i = 0; i < _colCount; i++) { - CGFloat constrainedWidth = [self constrainedWidthOfColumn:i]; - if (!constrainedWidth) - autosizedCol++; - width += constrainedWidth + [self marginX]; - - } - CGFloat remaining = 0; - if (width < self.bounds.size.width && autosizedCol) - remaining = (self.bounds.size.width - width) / autosizedCol; - if (remaining < 0) - remaining = 0; - return remaining; -} - -- (CGFloat)widthOfColumn:(NSUInteger)targetColumn -{ - CGFloat width = [self constrainedWidthOfColumn:targetColumn]; - if (!width) - width = [self remainingColumnWidth]; - return width; -} - - -- (CGFloat)leftOfColumn:(NSUInteger)targetColumn -{ - CGFloat left = [self marginX]; - for (NSUInteger i = 0; i < targetColumn; i++) - { - left += [self widthOfColumn:i] + [self marginX]; - - } - return left; -} - -- (void)relayout -{ - for(NSDictionary *obj in _gridedViews) { - NSUInteger row = [[obj objectForKey:@"row"] intValue]; - NSUInteger col = [[obj objectForKey:@"col"] intValue]; - NSUInteger rowSpan = [[obj objectForKey:@"rowSpan"] intValue]; - NSUInteger colSpan = [[obj objectForKey:@"colSpan"] intValue]; - NSView *view = [obj objectForKey:@"view"]; - NSRect rect; - - // Get the height - if ([view autoresizingMask] & NSViewHeightSizable || rowSpan > 1) { - CGFloat height = 0; - for (NSUInteger r = 0; r < rowSpan; r++) { - if (row + r >= _rowCount) - break; - height += [self heightOfRow:row + r] + [self marginY]; - } - rect.size.height = height - [self marginY]; - } - else - rect.size.height = [self objectSizeToFit:view].height; - - // Get the width - if ([view autoresizingMask] & NSViewWidthSizable) { - CGFloat width = 0; - for (NSUInteger c = 0; c < colSpan; c++) - width += [self widthOfColumn:col + c] + [self marginX]; - rect.size.width = width - [self marginX]; - } - else - rect.size.width = [self objectSizeToFit:view].width; - - // Top corner - rect.origin.y = [self topOfRow:row] + ([self heightOfRow:row] - rect.size.height) / 2; - rect.origin.x = [self leftOfColumn:col]; - - [view setFrame:rect]; - [view setNeedsDisplay:YES]; - } -} - -- (NSMutableDictionary *)objectForView:(NSView *)view -{ - for (NSMutableDictionary *dict in _gridedViews) - { - if ([dict objectForKey:@"view"] == view) - return dict; - } - return nil; -} - -- (void)addSubview:(NSView *)view atRow:(NSUInteger)row column:(NSUInteger)column rowSpan:(NSUInteger)rowSpan colSpan:(NSUInteger)colSpan -{ - if (row + 1 > _rowCount) - _rowCount = row + 1; - if (column + 1 > _colCount) - _colCount = column + 1; - - if (!_gridedViews) - _gridedViews = [[NSMutableArray alloc] init]; - - NSMutableDictionary *dict = [self objectForView:view]; - if (!dict) { - dict = [NSMutableDictionary dictionary]; - [dict setObject:view forKey:@"view"]; - [_gridedViews addObject:dict]; - } - [dict setObject:[NSNumber numberWithInt:rowSpan] forKey:@"rowSpan"]; - [dict setObject:[NSNumber numberWithInt:colSpan] forKey:@"colSpan"]; - [dict setObject:[NSNumber numberWithInt:row] forKey:@"row"]; - [dict setObject:[NSNumber numberWithInt:column] forKey:@"col"]; - - - [self addSubview:view]; - [self relayout]; - - // Recompute the size of the window after making sure we won't see anymore update - [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(recomputeWindowSize) object:nil]; - [self performSelector:@selector(recomputeWindowSize) withObject:nil afterDelay:0.1]; -} - -- (void)removeSubview:(NSView *)view -{ - NSDictionary *dict = [self objectForView:view]; - if (dict) - [_gridedViews removeObject:dict]; - [view removeFromSuperview]; - - [self recomputeCount]; - [self recomputeWindowSize]; - - [self relayout]; - [self setNeedsDisplay:YES]; -} - -- (void)setFrame:(NSRect)frameRect -{ - [super setFrame:frameRect]; - [self relayout]; -} - -- (NSSize)flexSize:(NSSize)size -{ - if (!_rowCount || !_colCount) - return size; - - CGFloat minHeight = [self marginY]; - BOOL canFlexHeight = NO; - for (NSUInteger i = 0; i < _rowCount; i++) { - CGFloat constrained = [self constrainedHeightOfRow:i]; - if (!constrained) { - canFlexHeight = YES; - constrained = 128; - } - minHeight += constrained + [self marginY]; - } - - CGFloat minWidth = [self marginX]; - BOOL canFlexWidth = NO; - for (NSUInteger i = 0; i < _colCount; i++) { - CGFloat constrained = [self constrainedWidthOfColumn:i]; - if (!constrained) { - canFlexWidth = YES; - constrained = 128; - } - minWidth += constrained + [self marginX]; - } - if (size.width < minWidth) - size.width = minWidth; - if (size.height < minHeight) - size.height = minHeight; - if (!canFlexHeight) - size.height = minHeight; - if (!canFlexWidth) - size.width = minWidth; - return size; -} - -@end - static inline NSDictionary *DictFromDialogFatal(dialog_fatal_t *dialog) { return [VLCDialogDisplayer dictionaryForDialog:dialog->title :dialog->message :NULL :NULL :NULL]; @@ -875,7 +477,7 @@ bool checkProgressPanel (void *priv) config_PutPsz(p_intf, "lastfm-username", [lastFMUsername UTF8String]); config_PutPsz(p_intf, "lastfm-password", [lastFMPassword UTF8String]); - config_SaveConfigFile( p_intf, "main" ); + config_SaveConfigFile(p_intf, "main"); config_SaveConfigFile(p_intf, "audioscrobbler"); } else