From 8c2246bdc88d1729b006bf66ed03995347f75475 Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Mon, 20 Jun 2011 19:25:21 +0000 Subject: [PATCH] fixed slider rendering in highgui windows on MacOSX (ticket #608; thanks to tingfan for the patch) --- modules/highgui/src/cap_qtkit.mm | 4 +++ modules/highgui/src/window_cocoa.mm | 45 ++++++++++++++++++++--------- 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/modules/highgui/src/cap_qtkit.mm b/modules/highgui/src/cap_qtkit.mm index c999ce7668..17737c0364 100644 --- a/modules/highgui/src/cap_qtkit.mm +++ b/modules/highgui/src/cap_qtkit.mm @@ -795,6 +795,7 @@ double CvCaptureFile::getProperty(int property_id){ double retval; QTTime t; + //cerr << "get_prop"<([[[window contentView] image] size].width, MIN_SLIDER_WIDTH); + [[window contentView] setFrameSize:vrectNew.size]; //adjust sliders to fit new window size + rect.size.width += vrectNew.size.width - vrectOld.size.width; rect.size.height += vrectNew.size.height - vrectOld.size.height; rect.origin.y -= vrectNew.size.height - vrectOld.size.height; @@ -645,17 +654,26 @@ CV_IMPL int cvWaitKey (int maxWait) // Save slider [sliders setValue:slider forKey:cvname]; [[self contentView] addSubview:slider]; + + //update contentView size to contain sliders + NSSize viewSize=[[self contentView] frame].size, + sliderSize=[slider frame].size; + viewSize.height += sliderSize.height; + viewSize.width = std::max(viewSize.width, MIN_SLIDER_WIDTH); + // Update slider sizes - [[self contentView] setFrameSize:[[self contentView] frame].size]; + [[self contentView] setFrameSize:viewSize]; [[self contentView] setNeedsDisplay:YES]; + + //update window size to contain sliders + NSRect rect = [self frame]; + rect.size.height += [slider frame].size.height; + rect.size.width = std::max(rect.size.width, MIN_SLIDER_WIDTH); + [self setFrame:rect display:YES]; + - - int height = 0; - for(NSString *key in sliders) { - height += [[sliders valueForKey:key] frame].size.height; - } - [self setContentMinSize:NSMakeSize(0, height)]; + } - (CVView *)contentView { @@ -755,6 +773,7 @@ CV_IMPL int cvWaitKey (int maxWait) NSSlider *slider = [[cvwindow sliders] valueForKey:key]; NSRect r = [slider frame]; r.origin.y = height - r.size.height; + r.size.width = [[cvwindow contentView] frame].size.width; [slider setFrame:r]; height -= r.size.height; } @@ -773,7 +792,7 @@ CV_IMPL int cvWaitKey (int maxWait) } - NSRect imageRect = {{0,0}, {self.frame.size.width, self.frame.size.height-height-6}}; + NSRect imageRect = {{0,0}, {[image size].width, [image size].height}}; if(image != nil) { [image drawInRect: imageRect @@ -803,9 +822,9 @@ CV_IMPL int cvWaitKey (int maxWait) value = NULL; userData = NULL; - [self setFrame:NSMakeRect(0,0,200,25)]; + [self setFrame:NSMakeRect(0,0,200,30)]; - name = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0,120, 20)]; + name = [[NSTextField alloc] initWithFrame:NSMakeRect(10, 0,110, 25)]; [name setEditable:NO]; [name setSelectable:NO]; [name setBezeled:NO]; @@ -814,7 +833,7 @@ CV_IMPL int cvWaitKey (int maxWait) [[name cell] setLineBreakMode:NSLineBreakByTruncatingTail]; [self addSubview:name]; - slider = [[NSSlider alloc] initWithFrame:NSMakeRect(120, 0, 76, 20)]; + slider = [[NSSlider alloc] initWithFrame:NSMakeRect(120, 0, 70, 25)]; [slider setAutoresizingMask:NSViewWidthSizable]; [slider setMinValue:0]; [slider setMaxValue:100]; @@ -825,7 +844,7 @@ CV_IMPL int cvWaitKey (int maxWait) [self setAutoresizingMask:NSViewWidthSizable]; - [self setFrame:NSMakeRect(12, 0, 182, 30)]; + //[self setFrame:NSMakeRect(12, 0, 100, 30)]; return self; }