gecko-dev/widget/ScrollbarDrawing.h
Emilio Cobos Álvarez 604d8268b2 Bug 1813046 - Simplify scrollbar sizing code. r=spohl
This removes the capability of having differently-sized vertical and
horizontal scrollbars (which is only potentially used in windows, and in
practice almost-never used). For that case, we choose the larger of
vertical/horizontal scrollbar sizes.

This is in order to be able to realistically expose the scrollbar size
to CSS, see blocked bug.

We make RecomputeScrollbarParams the central place where each scrollbar
style decides its sizes, and make GetDPIRatioForScrollbarPart handle the
cocoa special-case of scaling to 1 or 2, but nothing else.

Differential Revision: https://phabricator.services.mozilla.com/D168080
2023-01-28 21:35:51 +00:00

173 lines
7.3 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_widget_ScrollbarDrawing_h
#define mozilla_widget_ScrollbarDrawing_h
#include "mozilla/dom/RustTypes.h"
#include "mozilla/gfx/2D.h"
#include "nsColor.h"
#include "nsITheme.h"
#include "ThemeColors.h"
#include "ThemeDrawing.h"
#include "Units.h"
namespace mozilla::widget {
class ScrollbarDrawing {
protected:
using DPIRatio = mozilla::CSSToLayoutDeviceScale;
using ElementState = dom::ElementState;
using DocumentState = dom::DocumentState;
using DrawTarget = mozilla::gfx::DrawTarget;
using sRGBColor = mozilla::gfx::sRGBColor;
using Colors = ThemeColors;
using Overlay = nsITheme::Overlay;
using WebRenderBackendData = mozilla::widget::WebRenderBackendData;
enum class Kind : uint8_t {
Android,
Cocoa,
Gtk,
Win10,
Win11,
};
explicit ScrollbarDrawing(Kind aKind) : mKind(aKind) {}
public:
virtual ~ScrollbarDrawing() = default;
enum class ScrollbarKind : uint8_t {
Horizontal,
VerticalLeft,
VerticalRight,
};
DPIRatio GetDPIRatioForScrollbarPart(const nsPresContext*);
static nsIFrame* GetParentScrollbarFrame(nsIFrame* aFrame);
static bool IsParentScrollbarRolledOver(nsIFrame* aFrame);
static bool IsParentScrollbarHoveredOrActive(nsIFrame* aFrame);
static bool IsScrollbarWidthThin(const ComputedStyle& aStyle);
static bool IsScrollbarWidthThin(nsIFrame* aFrame);
CSSIntCoord GetCSSScrollbarSize(StyleScrollbarWidth, Overlay) const;
LayoutDeviceIntCoord GetScrollbarSize(const nsPresContext*,
StyleScrollbarWidth, Overlay);
LayoutDeviceIntCoord GetScrollbarSize(const nsPresContext*, nsIFrame*);
virtual LayoutDeviceIntSize GetMinimumWidgetSize(nsPresContext*,
StyleAppearance aAppearance,
nsIFrame* aFrame) = 0;
virtual Maybe<nsITheme::Transparency> GetScrollbarPartTransparency(
nsIFrame* aFrame, StyleAppearance aAppearance) {
return Nothing();
}
bool IsScrollbarTrackOpaque(nsIFrame*);
virtual sRGBColor ComputeScrollbarTrackColor(nsIFrame*, const ComputedStyle&,
const DocumentState&,
const Colors&);
virtual sRGBColor ComputeScrollbarThumbColor(nsIFrame*, const ComputedStyle&,
const ElementState&,
const DocumentState&,
const Colors&);
nscolor GetScrollbarButtonColor(nscolor aTrackColor, ElementState);
Maybe<nscolor> GetScrollbarArrowColor(nscolor aButtonColor);
// Returned colors are button, arrow.
virtual std::pair<sRGBColor, sRGBColor> ComputeScrollbarButtonColors(
nsIFrame*, StyleAppearance, const ComputedStyle&, const ElementState&,
const DocumentState&, const Colors&);
virtual bool PaintScrollbarButton(DrawTarget&, StyleAppearance,
const LayoutDeviceRect&, ScrollbarKind,
nsIFrame*, const ComputedStyle&,
const ElementState&, const DocumentState&,
const Colors&, const DPIRatio&);
virtual bool PaintScrollbarThumb(DrawTarget&, const LayoutDeviceRect&,
ScrollbarKind, nsIFrame*,
const ComputedStyle&, const ElementState&,
const DocumentState&, const Colors&,
const DPIRatio&) = 0;
virtual bool PaintScrollbarThumb(WebRenderBackendData&,
const LayoutDeviceRect&, ScrollbarKind,
nsIFrame*, const ComputedStyle&,
const ElementState&, const DocumentState&,
const Colors&, const DPIRatio&) = 0;
template <typename PaintBackendData>
bool DoPaintDefaultScrollbar(PaintBackendData&, const LayoutDeviceRect&,
ScrollbarKind, nsIFrame*, const ComputedStyle&,
const ElementState&, const DocumentState&,
const Colors&, const DPIRatio&);
bool PaintScrollbar(DrawTarget&, const LayoutDeviceRect&, ScrollbarKind,
nsIFrame*, const ComputedStyle&, const ElementState&,
const DocumentState&, const Colors&, const DPIRatio&);
bool PaintScrollbar(WebRenderBackendData&, const LayoutDeviceRect&,
ScrollbarKind, nsIFrame*, const ComputedStyle&,
const ElementState&, const DocumentState&, const Colors&,
const DPIRatio&);
virtual bool PaintScrollbarTrack(DrawTarget&, const LayoutDeviceRect&,
ScrollbarKind, nsIFrame*,
const ComputedStyle&, const DocumentState&,
const Colors&, const DPIRatio&) {
// Draw nothing by default. Subclasses can override this.
return true;
}
virtual bool PaintScrollbarTrack(WebRenderBackendData&,
const LayoutDeviceRect&, ScrollbarKind,
nsIFrame*, const ComputedStyle&,
const DocumentState&, const Colors&,
const DPIRatio&) {
// Draw nothing by default. Subclasses can override this.
return true;
}
template <typename PaintBackendData>
bool DoPaintDefaultScrollCorner(PaintBackendData&, const LayoutDeviceRect&,
ScrollbarKind, nsIFrame*,
const ComputedStyle&, const DocumentState&,
const Colors&, const DPIRatio&);
virtual bool PaintScrollCorner(DrawTarget&, const LayoutDeviceRect&,
ScrollbarKind, nsIFrame*, const ComputedStyle&,
const DocumentState&, const Colors&,
const DPIRatio&);
virtual bool PaintScrollCorner(WebRenderBackendData&, const LayoutDeviceRect&,
ScrollbarKind, nsIFrame*, const ComputedStyle&,
const DocumentState&, const Colors&,
const DPIRatio&);
virtual void RecomputeScrollbarParams() = 0;
virtual bool ShouldDrawScrollbarButtons() { return true; }
private:
// The scrollbar sizes for all our scrollbars. Indices are overlay or not,
// then thin or not. Should be configured via ConfigureScrollbarSize.
CSSIntCoord mScrollbarSize[2][2]{};
protected:
// For some kind of style differences a full virtual method is overkill, so we
// store the kind here so we can branch on it if necessary.
Kind mKind;
// Configures the scrollbar sizes based on a single size.
void ConfigureScrollbarSize(CSSIntCoord);
// Configures a particular scrollbar size.
void ConfigureScrollbarSize(StyleScrollbarWidth, Overlay, CSSIntCoord);
};
} // namespace mozilla::widget
#endif