2021-11-15 12:39:38 +00:00
|
|
|
/* -*- 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
|
|
|
|
|
2022-06-07 23:09:52 +00:00
|
|
|
#include "mozilla/dom/RustTypes.h"
|
2021-11-15 12:39:38 +00:00
|
|
|
#include "mozilla/gfx/2D.h"
|
|
|
|
#include "nsColor.h"
|
|
|
|
#include "nsITheme.h"
|
|
|
|
#include "ThemeColors.h"
|
|
|
|
#include "ThemeDrawing.h"
|
|
|
|
#include "Units.h"
|
|
|
|
|
2024-09-17 08:08:20 +00:00
|
|
|
class nsScrollbarFrame;
|
|
|
|
|
2021-11-15 12:39:38 +00:00
|
|
|
namespace mozilla::widget {
|
|
|
|
|
|
|
|
class ScrollbarDrawing {
|
|
|
|
protected:
|
|
|
|
using DPIRatio = mozilla::CSSToLayoutDeviceScale;
|
2022-06-07 23:09:52 +00:00
|
|
|
using ElementState = dom::ElementState;
|
|
|
|
using DocumentState = dom::DocumentState;
|
2021-11-15 12:39:38 +00:00
|
|
|
using DrawTarget = mozilla::gfx::DrawTarget;
|
|
|
|
using sRGBColor = mozilla::gfx::sRGBColor;
|
|
|
|
using Colors = ThemeColors;
|
|
|
|
using Overlay = nsITheme::Overlay;
|
|
|
|
using WebRenderBackendData = mozilla::widget::WebRenderBackendData;
|
|
|
|
|
2022-03-04 13:44:51 +00:00
|
|
|
enum class Kind : uint8_t {
|
|
|
|
Android,
|
|
|
|
Cocoa,
|
|
|
|
Gtk,
|
|
|
|
Win10,
|
|
|
|
Win11,
|
|
|
|
};
|
|
|
|
|
|
|
|
explicit ScrollbarDrawing(Kind aKind) : mKind(aKind) {}
|
2022-05-09 17:09:24 +00:00
|
|
|
|
|
|
|
public:
|
2021-11-15 12:39:38 +00:00
|
|
|
virtual ~ScrollbarDrawing() = default;
|
|
|
|
|
2022-05-09 17:09:24 +00:00
|
|
|
enum class ScrollbarKind : uint8_t {
|
|
|
|
Horizontal,
|
|
|
|
VerticalLeft,
|
|
|
|
VerticalRight,
|
|
|
|
};
|
|
|
|
|
2023-01-28 21:35:51 +00:00
|
|
|
DPIRatio GetDPIRatioForScrollbarPart(const nsPresContext*);
|
2021-11-15 12:39:38 +00:00
|
|
|
|
2024-09-17 08:08:20 +00:00
|
|
|
static nsScrollbarFrame* GetParentScrollbarFrame(nsIFrame* aFrame);
|
2021-11-15 12:39:38 +00:00
|
|
|
static bool IsParentScrollbarRolledOver(nsIFrame* aFrame);
|
|
|
|
static bool IsParentScrollbarHoveredOrActive(nsIFrame* aFrame);
|
|
|
|
|
|
|
|
static bool IsScrollbarWidthThin(const ComputedStyle& aStyle);
|
|
|
|
static bool IsScrollbarWidthThin(nsIFrame* aFrame);
|
|
|
|
|
2023-01-28 21:35:51 +00:00
|
|
|
CSSIntCoord GetCSSScrollbarSize(StyleScrollbarWidth, Overlay) const;
|
|
|
|
LayoutDeviceIntCoord GetScrollbarSize(const nsPresContext*,
|
|
|
|
StyleScrollbarWidth, Overlay);
|
|
|
|
LayoutDeviceIntCoord GetScrollbarSize(const nsPresContext*, nsIFrame*);
|
|
|
|
|
2021-11-15 12:39:38 +00:00
|
|
|
virtual LayoutDeviceIntSize GetMinimumWidgetSize(nsPresContext*,
|
|
|
|
StyleAppearance aAppearance,
|
|
|
|
nsIFrame* aFrame) = 0;
|
|
|
|
virtual Maybe<nsITheme::Transparency> GetScrollbarPartTransparency(
|
|
|
|
nsIFrame* aFrame, StyleAppearance aAppearance) {
|
|
|
|
return Nothing();
|
|
|
|
}
|
|
|
|
|
2021-12-15 21:06:58 +00:00
|
|
|
bool IsScrollbarTrackOpaque(nsIFrame*);
|
2022-06-07 23:09:52 +00:00
|
|
|
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);
|
2021-12-15 21:06:58 +00:00
|
|
|
Maybe<nscolor> GetScrollbarArrowColor(nscolor aButtonColor);
|
2021-11-15 12:39:38 +00:00
|
|
|
|
|
|
|
// Returned colors are button, arrow.
|
2021-12-15 21:06:58 +00:00
|
|
|
virtual std::pair<sRGBColor, sRGBColor> ComputeScrollbarButtonColors(
|
2022-06-07 23:09:52 +00:00
|
|
|
nsIFrame*, StyleAppearance, const ComputedStyle&, const ElementState&,
|
|
|
|
const DocumentState&, const Colors&);
|
2021-11-15 12:39:38 +00:00
|
|
|
|
2021-12-15 21:06:58 +00:00
|
|
|
virtual bool PaintScrollbarButton(DrawTarget&, StyleAppearance,
|
2022-05-09 17:09:24 +00:00
|
|
|
const LayoutDeviceRect&, ScrollbarKind,
|
|
|
|
nsIFrame*, const ComputedStyle&,
|
2022-06-07 23:09:52 +00:00
|
|
|
const ElementState&, const DocumentState&,
|
2021-12-27 18:53:31 +00:00
|
|
|
const Colors&, const DPIRatio&);
|
2021-11-15 12:39:38 +00:00
|
|
|
|
|
|
|
virtual bool PaintScrollbarThumb(DrawTarget&, const LayoutDeviceRect&,
|
2022-05-09 17:09:24 +00:00
|
|
|
ScrollbarKind, nsIFrame*,
|
2022-06-07 23:09:52 +00:00
|
|
|
const ComputedStyle&, const ElementState&,
|
|
|
|
const DocumentState&, const Colors&,
|
|
|
|
const DPIRatio&) = 0;
|
2021-11-15 12:39:38 +00:00
|
|
|
virtual bool PaintScrollbarThumb(WebRenderBackendData&,
|
2022-05-09 17:09:24 +00:00
|
|
|
const LayoutDeviceRect&, ScrollbarKind,
|
2021-11-15 12:39:38 +00:00
|
|
|
nsIFrame*, const ComputedStyle&,
|
2022-06-07 23:09:52 +00:00
|
|
|
const ElementState&, const DocumentState&,
|
2021-11-15 12:39:38 +00:00
|
|
|
const Colors&, const DPIRatio&) = 0;
|
|
|
|
|
|
|
|
template <typename PaintBackendData>
|
|
|
|
bool DoPaintDefaultScrollbar(PaintBackendData&, const LayoutDeviceRect&,
|
2022-05-09 17:09:24 +00:00
|
|
|
ScrollbarKind, nsIFrame*, const ComputedStyle&,
|
2022-06-07 23:09:52 +00:00
|
|
|
const ElementState&, const DocumentState&,
|
|
|
|
const Colors&, const DPIRatio&);
|
2022-05-09 17:09:24 +00:00
|
|
|
bool PaintScrollbar(DrawTarget&, const LayoutDeviceRect&, ScrollbarKind,
|
2022-06-07 23:09:52 +00:00
|
|
|
nsIFrame*, const ComputedStyle&, const ElementState&,
|
|
|
|
const DocumentState&, const Colors&, const DPIRatio&);
|
2022-03-04 13:44:51 +00:00
|
|
|
bool PaintScrollbar(WebRenderBackendData&, const LayoutDeviceRect&,
|
2022-05-09 17:09:24 +00:00
|
|
|
ScrollbarKind, nsIFrame*, const ComputedStyle&,
|
2022-06-07 23:09:52 +00:00
|
|
|
const ElementState&, const DocumentState&, const Colors&,
|
2022-03-04 13:44:51 +00:00
|
|
|
const DPIRatio&);
|
2021-11-15 12:39:38 +00:00
|
|
|
|
|
|
|
virtual bool PaintScrollbarTrack(DrawTarget&, const LayoutDeviceRect&,
|
2022-05-09 17:09:24 +00:00
|
|
|
ScrollbarKind, nsIFrame*,
|
2022-06-07 23:09:52 +00:00
|
|
|
const ComputedStyle&, const DocumentState&,
|
2021-11-15 12:39:38 +00:00
|
|
|
const Colors&, const DPIRatio&) {
|
|
|
|
// Draw nothing by default. Subclasses can override this.
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
virtual bool PaintScrollbarTrack(WebRenderBackendData&,
|
2022-05-09 17:09:24 +00:00
|
|
|
const LayoutDeviceRect&, ScrollbarKind,
|
2021-11-15 12:39:38 +00:00
|
|
|
nsIFrame*, const ComputedStyle&,
|
2022-06-07 23:09:52 +00:00
|
|
|
const DocumentState&, const Colors&,
|
|
|
|
const DPIRatio&) {
|
2021-11-15 12:39:38 +00:00
|
|
|
// Draw nothing by default. Subclasses can override this.
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename PaintBackendData>
|
|
|
|
bool DoPaintDefaultScrollCorner(PaintBackendData&, const LayoutDeviceRect&,
|
2022-05-09 17:09:24 +00:00
|
|
|
ScrollbarKind, nsIFrame*,
|
2022-06-07 23:09:52 +00:00
|
|
|
const ComputedStyle&, const DocumentState&,
|
2021-11-15 12:39:38 +00:00
|
|
|
const Colors&, const DPIRatio&);
|
|
|
|
virtual bool PaintScrollCorner(DrawTarget&, const LayoutDeviceRect&,
|
2022-05-09 17:09:24 +00:00
|
|
|
ScrollbarKind, nsIFrame*, const ComputedStyle&,
|
2022-06-07 23:09:52 +00:00
|
|
|
const DocumentState&, const Colors&,
|
|
|
|
const DPIRatio&);
|
2021-11-15 12:39:38 +00:00
|
|
|
virtual bool PaintScrollCorner(WebRenderBackendData&, const LayoutDeviceRect&,
|
2022-05-09 17:09:24 +00:00
|
|
|
ScrollbarKind, nsIFrame*, const ComputedStyle&,
|
2022-06-07 23:09:52 +00:00
|
|
|
const DocumentState&, const Colors&,
|
|
|
|
const DPIRatio&);
|
2021-11-15 12:39:38 +00:00
|
|
|
|
2021-11-15 12:39:39 +00:00
|
|
|
virtual void RecomputeScrollbarParams() = 0;
|
2021-11-15 12:39:38 +00:00
|
|
|
|
|
|
|
virtual bool ShouldDrawScrollbarButtons() { return true; }
|
|
|
|
|
2023-01-28 21:35:51 +00:00
|
|
|
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]{};
|
2021-11-15 12:39:39 +00:00
|
|
|
|
|
|
|
protected:
|
2022-03-04 13:44:51 +00:00
|
|
|
// 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;
|
2023-01-28 21:35:51 +00:00
|
|
|
|
|
|
|
// Configures the scrollbar sizes based on a single size.
|
|
|
|
void ConfigureScrollbarSize(CSSIntCoord);
|
|
|
|
|
|
|
|
// Configures a particular scrollbar size.
|
|
|
|
void ConfigureScrollbarSize(StyleScrollbarWidth, Overlay, CSSIntCoord);
|
2021-11-15 12:39:38 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace mozilla::widget
|
|
|
|
|
|
|
|
#endif
|