osxcontext.cpp

来自「这是VCF框架的代码」· C++ 代码 · 共 2,398 行 · 第 1/5 页

CPP
2,398
字号
	}		if ( state.isActive() && state.isEnabled() ) {		btnInfo.state |= kThemeStateActive;	}			btnInfo.adornment = kThemeAdornmentNone;		if ( state.isFocused() ) {		btnInfo.adornment |= kThemeAdornmentFocus;	}	        	ThemeButtonDrawUPP btnDrawUPP = NewThemeButtonDrawUPP(OSXContext_drawThemeButtonText);	    DrawThemeButton( r, kThemeRadioButton, &btnInfo, NULL, NULL, btnDrawUPP, (UInt32)&state );		DisposeThemeButtonDrawUPP(btnDrawUPP);}void OSXContext::drawThemeComboboxRect( Rect* rect, ButtonState& state ){	Rect tmp = *rect;	tmp.offset( origin_.x_, origin_.y_ );	OSXRect r = &tmp;	    ThemeButtonDrawInfo btnInfo;	btnInfo.state = kThemeStateInactive ;		btnInfo.value = kThemeButtonOff;		if ( state.isPressed() ) {		btnInfo.state |= kThemeStatePressed;		btnInfo.value = kThemeButtonOn;	}		if ( state.isActive() && state.isEnabled() ) {		btnInfo.state |= kThemeStateActive;	}			btnInfo.adornment = kThemeAdornmentNone;		if ( state.isFocused() ) {		btnInfo.adornment |= kThemeAdornmentFocus;	}	        	ThemeButtonDrawUPP btnDrawUPP = NewThemeButtonDrawUPP(OSXContext_drawThemeButtonText);	    DrawThemeButton( r, kThemePopupButton, &btnInfo, NULL, NULL, btnDrawUPP, (UInt32)&state );		DisposeThemeButtonDrawUPP(btnDrawUPP);}void OSXContext::drawThemeScrollButtonRect( Rect* rect, ScrollBarState& state ){	/*	OSXRect r = rect;	ThemeTrackEnableState enableState = 0;		if ( !state.isEnabled() ) {        enableState = kThemeTrackDisabled;    }    else {		if ( state.isActive() ) {			enableState = kThemeTrackActive;		}		else {			enableState = kThemeTrackInactive;		}    }		DrawThemeScrollBarArrows	*/}void OSXContext::drawThemeDisclosureButton( Rect* rect, DisclosureButtonState& state ){	Rect tmp = *rect;	tmp.offset( origin_.x_, origin_.y_ );	OSXRect r = &tmp;	    ThemeButtonDrawInfo btnInfo;	btnInfo.state = kThemeStateInactive ;		btnInfo.value = kThemeButtonOff;		if ( state.isClosed() ) {				btnInfo.value = kThemeDisclosureRight;	}	else if ( state.isOpened() ) {				btnInfo.value = kThemeDisclosureDown;	}		if ( state.isActive() && state.isEnabled() ) {		btnInfo.state |= kThemeStateActive;	}			btnInfo.adornment = kThemeAdornmentNone;		        DrawThemeButton( r, kThemeDisclosureButton, &btnInfo, NULL, NULL, NULL, 0 );	}void OSXContext::drawThemeTab( Rect* rect, TabState& state ){	Rect tmp = *rect;	tmp.offset( origin_.x_, origin_.y_ );	OSXRect r = &tmp;		TabState* ts = (TabState*)&state;		ThemeTabStyle tabStyle = kThemeTabNonFront;	if ( ts->isPressed() ) {		tabStyle |= kThemeTabFront;	}		if ( !ts->isActive() ) {				if ( ts->isPressed() ) {			tabStyle |= kThemeTabFrontInactive;		}		else {			tabStyle |= kThemeTabNonFrontInactive;		}	}		ThemeTabDirection dir = 0;		if ( ts->isTabOnTop() ) {		dir = kThemeTabNorth;	}	else if ( ts->isTabOnBottom() ) {		dir = kThemeTabSouth;	}	else if ( ts->isTabOnLeft() ) {		dir = kThemeTabWest;	}	else if ( ts->isTabOnRight() ) {		dir = kThemeTabEast;	}				DrawThemeTab( r, tabStyle, dir, NULL, 0 );}void OSXContext::drawThemeTabContent( Rect* rect, DrawUIState& state ){}void OSXContext::drawThemeTabPage( Rect* rect, DrawUIState& state ){	Rect tmp = *rect;	tmp.offset( origin_.x_, origin_.y_ );	OSXRect r = &tmp;	DrawThemeTabPane( r, state.isActive() ? kThemeStateActive : kThemeStateInactive );}void OSXContext::drawThemeTabs( Rect* rect, DrawUIState& paneState, TabState& selectedTabState, TabState& otherTabs, const std::vector<String>& tabNames, int selectedTabIndex ){		}void OSXContext::drawThemeTickMarks( Rect* rect, SliderState& state ){	Rect tmp = *rect;	tmp.offset( origin_.x_, origin_.y_ );	OSXRect r = &tmp;    ThemeTrackDrawInfo info;    info.kind = kThemeSlider;//kThemeMediumSlider;    info.bounds = r;											    info.min = (int)state.min_;    info.max = (int)state.max_;    info.value = (int)state.position_;    info.attributes = state.isVertical() ? 0 :  kThemeTrackHorizontal;    info.attributes |= kThemeTrackShowThumb;    info.trackInfo.slider.thumbDir = 0;    info.trackInfo.slider.pressState = 0;	if ( state.isFocused() ) {		info.attributes |= kThemeTrackHasFocus;	}	    if ( !state.isEnabled() ) {        info.enableState = kThemeTrackDisabled;    }    else {		if ( state.isActive() ) {			info.enableState = kThemeTrackActive;		}		else {			info.enableState = kThemeTrackInactive;		}    }		if ( state.isPressed() ) {		info.trackInfo.slider.pressState = kThemeThumbPressed;	}	bool drawBothSides = false;	info.trackInfo.slider.thumbDir = 0;	    if ( state.isTickMarkingOnBottomRight() && state.isTickMarkingOnTopLeft() ) {				drawBothSides = true;	}    else if ( state.isTickMarkingOnBottomRight() ) {		info.trackInfo.slider.thumbDir = kThemeThumbDownward;	    }    else if( state.isTickMarkingOnTopLeft() ) {		info.trackInfo.slider.thumbDir = kThemeThumbUpward;            }		//GetThemeTrackBounds( &info, r );	//info.bounds = r;	if ( drawBothSides ) {		info.trackInfo.slider.thumbDir = kThemeThumbUpward;				if ( noErr != DrawThemeTrackTickMarks( &info, (unsigned int)state.tickMarkFrequency_, NULL, 0 ) ) {			StringUtils::trace( "DrawThemeTrackTickMarks failed\n" );		}				info.trackInfo.slider.thumbDir = kThemeThumbDownward;				if ( noErr != DrawThemeTrackTickMarks( &info, (unsigned int)state.tickMarkFrequency_, NULL, 0 ) ) {			StringUtils::trace( "DrawThemeTrackTickMarks failed\n" );		}	}	else if ( info.trackInfo.slider.thumbDir != 0 ) {//if info.trackInfo.slider.thumbDir == 0 then no track marks		if ( noErr != DrawThemeTrackTickMarks( &info, (unsigned int)state.tickMarkFrequency_, NULL, 0 ) ) {			StringUtils::trace( "DrawThemeTrackTickMarks failed\n" );		}	}    		//DrawThemeTrack( &info, NULL, NULL, 0 );	}void OSXContext::drawThemeSlider( Rect* rect, SliderState& state ){	Rect tmp = *rect;	tmp.offset( origin_.x_, origin_.y_ );	OSXRect r = &tmp;    ThemeTrackDrawInfo info;    info.kind = kThemeSlider;//kThemeMediumSlider;    info.bounds = r;											    info.min = (int)state.min_;    info.max = (int)state.max_;    info.value = (int)state.position_;    info.attributes = state.isVertical() ? 0 :  kThemeTrackHorizontal;    info.attributes |= /*kThemeTrackRightToLeft |*/ kThemeTrackShowThumb;    info.trackInfo.slider.thumbDir = 0;    info.trackInfo.slider.pressState = 0;	if ( state.isFocused() ) {		info.attributes |= kThemeTrackHasFocus;	}	    if ( !state.isEnabled() ) {        info.enableState = kThemeTrackDisabled;    }    else {		if ( state.isActive() ) {			info.enableState = kThemeTrackActive;		}		else {			info.enableState = kThemeTrackInactive;		}    }		if ( state.isPressed() ) {		info.trackInfo.slider.pressState = kThemeThumbPressed;	}	if ( state.isTickMarkingOnBottomRight() && state.isTickMarkingOnTopLeft() ) {		info.trackInfo.slider.thumbDir = kThemeThumbPlain;	}    else if ( state.isTickMarkingOnBottomRight() ) {		info.trackInfo.slider.thumbDir = kThemeThumbDownward;	    }    else if( state.isTickMarkingOnTopLeft() ) {		info.trackInfo.slider.thumbDir = kThemeThumbUpward;            }		GetThemeTrackBounds( &info, r );	info.bounds = r;			DrawThemeTrack( &info, NULL, NULL, 0 );}void OSXContext::drawThemeProgress( Rect* rect, ProgressState& state ){	Rect tmp = *rect;	tmp.offset( origin_.x_, origin_.y_ );	OSXRect r = &tmp;    ThemeTrackDrawInfo info;    info.kind = kThemeProgressBar;    info.bounds = r;											    info.min = (int)state.min_;    info.max = (int)state.max_;    info.value = (int)state.position_;    info.attributes = state.isVertical() ? 0 :  kThemeTrackHorizontal;    //info.attributes |= kThemeTrackRightToLeft;    info.trackInfo.progress.phase = 0;	if ( state.isFocused() ) {		info.attributes |= kThemeTrackHasFocus;	}	    if ( !state.isEnabled() ) {        info.enableState = kThemeTrackDisabled;    }    else {		if ( state.isActive() ) {			info.enableState = kThemeTrackActive;		}		else {			info.enableState = kThemeTrackInactive;		}    }			DrawThemeTrack( &info, NULL, NULL, 0 );}void OSXContext::drawThemeImage( Rect* rect, Image* image, DrawUIState& state ){	CGContextSaveGState( contextID_ );		if ( !state.isEnabled() ) {		CGContextSetAlpha( contextID_, 0.2 );	}			if ( (rect->getWidth() > image->getWidth()) || (rect->getHeight() > image->getHeight()) ) {		throw BasicException( MAKE_ERROR_MSG("Invalid image bounds requested"), __LINE__);	}    OSXImage* osXimage = (OSXImage*)(image);    ulong32 imgBoundsWidth = (ulong32)rect->getWidth();    ulong32 imgBoundsHeight = (ulong32)rect->getHeight();    if ( (imgBoundsWidth == image->getWidth()) && (imgBoundsHeight == image->getHeight()) ) {        CGImageRef imgRef = osXimage->getCGImage();        CGRect imgBounds;        imgBounds.origin.x = rect->left_;        imgBounds.origin.y = rect->top_;        imgBounds.size.width = imgBoundsWidth;        imgBounds.size.height = imgBoundsHeight;        CGContextDrawImage( contextID_, imgBounds, imgRef );    }    else {        //create a smaller portion of the image        int componentCount = image->getType();        int bitsPerPix = image->getChannelSize() * componentCount;        int bitsPerComponent = image->getChannelSize();        int rowStride = ((imgBoundsWidth * bitsPerComponent * componentCount)  + 7)/ 8;        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();        SysPixelType* data = new SysPixelType[imgBoundsWidth*imgBoundsHeight];        ulong32 imgSize = imgBoundsWidth * imgBoundsHeight * componentCount;        CGDataProviderRef provider = CGDataProviderCreateWithData( NULL,                                                                    (char*)data,                                                                    imgSize,                                                                    NULL );        CGImageRef imgRef = CGImageCreate( imgBoundsWidth,                                   imgBoundsHeight,                                   image->getChannelSize(),                                   bitsPerPix,                                   rowStride,                                   colorSpace,                                   kCGImageAlphaNone,                                   provider,                                   NULL,                                   FALSE,                                   kCGRenderingIntentDefault );        //copy over bits        SysPixelType* imageBuf = image->getImageBits()->pixels_;        SysPixelType* tmpBmpBuf = data;        ulong32 incr = (ulong32)((rect->top_ * image->getWidth()) + rect->left_);        imageBuf += incr;        ulong32 imgWidth = image->getWidth();        int s = (int)rect->top_;        int e = (int)rect->bottom_;        for (int y1=s;y1<e;y1++) {            memcpy( tmpBmpBuf, imageBuf, imgBoundsWidth*componentCount );            tmpBmpBuf += imgBoundsWidth;            imageBuf += imgWidth;        }        CGRect imgBounds;        imgBounds.origin.x = rect->left_;        imgBounds.origin.y = rect->top_;        imgBounds.size.width = imgBoundsWidth;        imgBounds.size.height = imgBoundsHeight;        CGContextDrawImage( contextID_, imgBounds, imgRef );        CGColorSpaceRelease(colorSpace);        CGDataProviderRelease(provider);        CGImageRelease( imgRef );        delete [] data;    }		CGContextRestoreGState( contextID_ );}void OSXContext::drawThemeHeader( Rect* rect, ButtonState& state ){	Rect tmp = *rect;	tmp.offset( origin_.x_, origin_.y_ );	OSXRect r = &tmp;	    ThemeButtonDrawInfo btnInfo;	btnInfo.state = kThemeStateInactive ;		btnInfo.value = kThemeButtonOff;		if ( state.isPressed() ) {		btnInfo.state |= kThemeStatePressed;		btnInfo.value = kThemeButtonOn;	}		if ( state.isActive() && state.isEnabled() ) {		btnInfo.state |= kThemeStateActive;	}			btnInfo.adornment = kThemeAdornmentNone;		        DrawThemeButton( r, kThemeListHeaderButton, &btnInfo, NULL, NULL, NULL, 0 );}void OSXContext::drawThemeEdge( Rect* rect, DrawUIState& state, const long& edgeSides, const long& edgeStyle ){	Rect modRect = *rect;	modRect.offset( origin_.x_, origin_.y_ );			if ( GraphicsContext::etAllSides == edgeSides ) { 		OSXRect r = &modRect;        DrawThemePrimaryGroup( r, state.isActive() ? kThemeStateActive : kThemeStateInactive );    }    else {		        if ( edgeSides & GraphicsContext::etLeftSide ) {						OSXRect tmp = &modRect;			::Rect r = tmp;            r.right = r.left;            DrawThemeSeparator( &r, state.isActive() ? kThemeStateActive : kThemeStateInactive );        }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?