mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
Highlight selected text in input fields
Fixes #9993. This does not yet allow stylesheets to set the selection colors; instead it uses a hard-coded orange background and white foreground.
This commit is contained in:
parent
f2f05869d6
commit
6171000875
17 changed files with 229 additions and 62 deletions
|
@ -104,6 +104,10 @@ impl<'a> DisplayListBuildState<'a> {
|
|||
/// The logical width of an insertion point: at the moment, a one-pixel-wide line.
|
||||
const INSERTION_POINT_LOGICAL_WIDTH: Au = Au(1 * AU_PER_PX);
|
||||
|
||||
// Colors for selected text. TODO (#8077): Use the ::selection pseudo-element to set these.
|
||||
const SELECTION_FOREGROUND_COLOR: RGBA = RGBA { red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0 };
|
||||
const SELECTION_BACKGROUND_COLOR: RGBA = RGBA { red: 1.0, green: 0.5, blue: 0.0, alpha: 1.0 };
|
||||
|
||||
// TODO(gw): The transforms spec says that perspective length must
|
||||
// be positive. However, there is some confusion between the spec
|
||||
// and browser implementations as to handling the case of 0 for the
|
||||
|
@ -922,6 +926,23 @@ impl FragmentDisplayListBuilding for Fragment {
|
|||
}
|
||||
_ => return,
|
||||
};
|
||||
|
||||
// Draw a highlighted background if the text is selected.
|
||||
//
|
||||
// TODO: Allow non-text fragments to be selected too.
|
||||
if scanned_text_fragment_info.selected {
|
||||
state.add_display_item(
|
||||
DisplayItem::SolidColorClass(box SolidColorDisplayItem {
|
||||
base: BaseDisplayItem::new(stacking_relative_border_box,
|
||||
DisplayItemMetadata::new(self.node,
|
||||
&*self.style,
|
||||
Cursor::DefaultCursor),
|
||||
&clip),
|
||||
color: SELECTION_BACKGROUND_COLOR.to_gfx_color()
|
||||
}), display_list_section);
|
||||
}
|
||||
|
||||
// Draw a caret at the insertion point.
|
||||
let insertion_point_index = match scanned_text_fragment_info.insertion_point {
|
||||
Some(insertion_point_index) => insertion_point_index,
|
||||
None => return,
|
||||
|
@ -1095,7 +1116,11 @@ impl FragmentDisplayListBuilding for Fragment {
|
|||
//
|
||||
// NB: According to CSS-BACKGROUNDS, text shadows render in *reverse* order (front
|
||||
// to back).
|
||||
let text_color = self.style().get_color().color;
|
||||
let text_color = if text_fragment.selected {
|
||||
SELECTION_FOREGROUND_COLOR
|
||||
} else {
|
||||
self.style().get_color().color
|
||||
};
|
||||
for text_shadow in self.style.get_effects().text_shadow.0.iter().rev() {
|
||||
let offset = &Point2D::new(text_shadow.offset_x, text_shadow.offset_y);
|
||||
let color = self.style().resolve_color(text_shadow.color);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue