📄 scrollbarthememac.mm
字号:
paintRect.setWidth(cRealButtonLength[controlSize]); if (!start) paintRect.setX(buttonRect.x() - (cRealButtonLength[controlSize] - buttonRect.width())); } else { paintRect.setHeight(cRealButtonLength[controlSize]); if (!start) paintRect.setY(buttonRect.y() - (cRealButtonLength[controlSize] - buttonRect.height())); } return paintRect;}IntRect ScrollbarThemeMac::backButtonRect(Scrollbar* scrollbar, ScrollbarPart part, bool painting){ IntRect result; if (part == BackButtonStartPart && (buttonsPlacement() == ScrollbarButtonsNone || buttonsPlacement() == ScrollbarButtonsDoubleEnd)) return result; if (part == BackButtonEndPart && (buttonsPlacement() == ScrollbarButtonsNone || buttonsPlacement() == ScrollbarButtonsDoubleStart || buttonsPlacement() == ScrollbarButtonsSingle)) return result; int thickness = scrollbarThickness(scrollbar->controlSize()); bool outerButton = part == BackButtonStartPart && (buttonsPlacement() == ScrollbarButtonsDoubleStart || buttonsPlacement() == ScrollbarButtonsDoubleBoth); if (outerButton) { if (scrollbar->orientation() == HorizontalScrollbar) result = IntRect(scrollbar->x(), scrollbar->y(), cOuterButtonLength[scrollbar->controlSize()] + painting ? cOuterButtonOverlap : 0, thickness); else result = IntRect(scrollbar->x(), scrollbar->y(), thickness, cOuterButtonLength[scrollbar->controlSize()] + painting ? cOuterButtonOverlap : 0); return result; } // Our repaint rect is slightly larger, since we are a button that is adjacent to the track. if (scrollbar->orientation() == HorizontalScrollbar) { int start = part == BackButtonStartPart ? scrollbar->x() : scrollbar->x() + scrollbar->width() - cOuterButtonLength[scrollbar->controlSize()] - cButtonLength[scrollbar->controlSize()]; result = IntRect(start, scrollbar->y(), cButtonLength[scrollbar->controlSize()], thickness); } else { int start = part == BackButtonStartPart ? scrollbar->y() : scrollbar->y() + scrollbar->height() - cOuterButtonLength[scrollbar->controlSize()] - cButtonLength[scrollbar->controlSize()]; result = IntRect(scrollbar->x(), start, thickness, cButtonLength[scrollbar->controlSize()]); } if (painting) return buttonRepaintRect(result, scrollbar->orientation(), scrollbar->controlSize(), part == BackButtonStartPart); return result;}IntRect ScrollbarThemeMac::forwardButtonRect(Scrollbar* scrollbar, ScrollbarPart part, bool painting){ IntRect result; if (part == ForwardButtonEndPart && (buttonsPlacement() == ScrollbarButtonsNone || buttonsPlacement() == ScrollbarButtonsDoubleStart)) return result; if (part == ForwardButtonStartPart && (buttonsPlacement() == ScrollbarButtonsNone || buttonsPlacement() == ScrollbarButtonsDoubleEnd || buttonsPlacement() == ScrollbarButtonsSingle)) return result; int thickness = scrollbarThickness(scrollbar->controlSize()); int outerButtonLength = cOuterButtonLength[scrollbar->controlSize()]; int buttonLength = cButtonLength[scrollbar->controlSize()]; bool outerButton = part == ForwardButtonEndPart && (buttonsPlacement() == ScrollbarButtonsDoubleEnd || buttonsPlacement() == ScrollbarButtonsDoubleBoth); if (outerButton) { if (scrollbar->orientation() == HorizontalScrollbar) { result = IntRect(scrollbar->x() + scrollbar->width() - outerButtonLength, scrollbar->y(), outerButtonLength, thickness); if (painting) result.inflateX(cOuterButtonOverlap); } else { result = IntRect(scrollbar->x(), scrollbar->y() + scrollbar->height() - outerButtonLength, thickness, outerButtonLength); if (painting) result.inflateY(cOuterButtonOverlap); } return result; } if (scrollbar->orientation() == HorizontalScrollbar) { int start = part == ForwardButtonEndPart ? scrollbar->x() + scrollbar->width() - buttonLength : scrollbar->x() + outerButtonLength; result = IntRect(start, scrollbar->y(), buttonLength, thickness); } else { int start = part == ForwardButtonEndPart ? scrollbar->y() + scrollbar->height() - buttonLength : scrollbar->y() + outerButtonLength; result = IntRect(scrollbar->x(), start, thickness, buttonLength); } if (painting) return buttonRepaintRect(result, scrollbar->orientation(), scrollbar->controlSize(), part == ForwardButtonStartPart); return result;}IntRect ScrollbarThemeMac::trackRect(Scrollbar* scrollbar, bool painting){ if (painting || !hasButtons(scrollbar)) return scrollbar->frameRect(); IntRect result; int thickness = scrollbarThickness(scrollbar->controlSize()); int startWidth = 0; int endWidth = 0; int outerButtonLength = cOuterButtonLength[scrollbar->controlSize()]; int buttonLength = cButtonLength[scrollbar->controlSize()]; int doubleButtonLength = outerButtonLength + buttonLength; switch (buttonsPlacement()) { case ScrollbarButtonsSingle: startWidth = buttonLength; endWidth = buttonLength; break; case ScrollbarButtonsDoubleStart: startWidth = doubleButtonLength; break; case ScrollbarButtonsDoubleEnd: endWidth = doubleButtonLength; break; case ScrollbarButtonsDoubleBoth: startWidth = doubleButtonLength; endWidth = doubleButtonLength; break; default: break; } int totalWidth = startWidth + endWidth; if (scrollbar->orientation() == HorizontalScrollbar) return IntRect(scrollbar->x() + startWidth, scrollbar->y(), scrollbar->width() - totalWidth, thickness); return IntRect(scrollbar->x(), scrollbar->y() + startWidth, thickness, scrollbar->height() - totalWidth);}int ScrollbarThemeMac::minimumThumbLength(Scrollbar* scrollbar){ return cThumbMinLength[scrollbar->controlSize()];}bool ScrollbarThemeMac::shouldCenterOnThumb(Scrollbar*, const PlatformMouseEvent& evt){ if (evt.button() != LeftButton) return false; if (gJumpOnTrackClick) return !evt.altKey(); return evt.altKey();}static int scrollbarPartToHIPressedState(ScrollbarPart part){ switch (part) { case BackButtonStartPart: return kThemeTopOutsideArrowPressed; case BackButtonEndPart: return kThemeTopOutsideArrowPressed; // This does not make much sense. For some reason the outside constant is required. case ForwardButtonStartPart: return kThemeTopInsideArrowPressed; case ForwardButtonEndPart: return kThemeBottomOutsideArrowPressed; case ThumbPart: return kThemeThumbPressed; default: return 0; }}bool ScrollbarThemeMac::paint(Scrollbar* scrollbar, GraphicsContext* context, const IntRect& damageRect){ HIThemeTrackDrawInfo trackInfo; trackInfo.version = 0; trackInfo.kind = scrollbar->controlSize() == RegularScrollbar ? kThemeMediumScrollBar : kThemeSmallScrollBar; trackInfo.bounds = scrollbar->frameRect(); trackInfo.min = 0; trackInfo.max = scrollbar->maximum(); trackInfo.value = scrollbar->currentPos(); trackInfo.trackInfo.scrollbar.viewsize = scrollbar->pageStep(); trackInfo.attributes = 0; if (scrollbar->orientation() == HorizontalScrollbar) trackInfo.attributes |= kThemeTrackHorizontal; trackInfo.enableState = scrollbar->client()->isActive() ? kThemeTrackActive : kThemeTrackInactive; if (!scrollbar->enabled()) trackInfo.enableState = kThemeTrackDisabled; if (hasThumb(scrollbar)) trackInfo.attributes |= kThemeTrackShowThumb; else if (!hasButtons(scrollbar)) trackInfo.enableState = kThemeTrackNothingToScroll; trackInfo.trackInfo.scrollbar.pressState = scrollbarPartToHIPressedState(scrollbar->pressedPart()); CGAffineTransform currentCTM = CGContextGetCTM(context->platformContext()); // The Aqua scrollbar is buggy when rotated and scaled. We will just draw into a bitmap if we detect a scale or rotation. bool canDrawDirectly = currentCTM.a == 1.0f && currentCTM.b == 0.0f && currentCTM.c == 0.0f && (currentCTM.d == 1.0f || currentCTM.d == -1.0f); if (canDrawDirectly) HIThemeDrawTrack(&trackInfo, 0, context->platformContext(), kHIThemeOrientationNormal); else { trackInfo.bounds = IntRect(IntPoint(), scrollbar->frameRect().size()); IntRect bufferRect(scrollbar->frameRect()); bufferRect.intersect(damageRect); bufferRect.move(-scrollbar->frameRect().x(), -scrollbar->frameRect().y()); auto_ptr<ImageBuffer> imageBuffer = ImageBuffer::create(bufferRect.size(), false); if (!imageBuffer.get()) return true; HIThemeDrawTrack(&trackInfo, 0, imageBuffer->context()->platformContext(), kHIThemeOrientationNormal); context->drawImage(imageBuffer->image(), scrollbar->frameRect().location()); } return true;}}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -