Skip to content
This repository was archived by the owner on May 21, 2019. It is now read-only.

Commit cd65e12

Browse files
committed
Calculate autocompletion box position without jquery.caret.
1 parent dbb5ad9 commit cd65e12

File tree

3 files changed

+25
-16
lines changed

3 files changed

+25
-16
lines changed

src/views/4_PromptComponent.tsx

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ interface Props {
3030
interface State {
3131
highlightedSuggestionIndex?: number;
3232
latestKeyCode?: number;
33+
offsetTop?: number;
3334
suggestions?: Suggestion[];
3435
}
3536

@@ -60,7 +61,10 @@ export default class PromptComponent extends React.Component<Props, State> imple
6061

6162
keyDownSubject
6263
.filter(_.negate(withModifierKey))
63-
.forEach((event: KeyboardEvent) => this.setState({latestKeyCode: event.keyCode}));
64+
.forEach((event: KeyboardEvent) => this.setState({
65+
latestKeyCode: event.keyCode,
66+
offsetTop: (event.target as HTMLDivElement).getBoundingClientRect().top}
67+
));
6468

6569

6670
const promptKeys = keyDownSubject.filter(() => this.props.status !== e.Status.InProgress)
@@ -133,7 +137,6 @@ export default class PromptComponent extends React.Component<Props, State> imple
133137
}
134138

135139
render() {
136-
const classes = ["prompt-wrapper", this.props.status].join(" ");
137140
// FIXME: write better types.
138141
let autocomplete: any;
139142
let autocompletedPreview: any;
@@ -143,7 +146,8 @@ export default class PromptComponent extends React.Component<Props, State> imple
143146

144147
if (this.showAutocomplete()) {
145148
autocomplete = <AutocompleteComponent suggestions={this.state.suggestions}
146-
caretOffset={$(this.commandNode).caret("offset")}
149+
offsetTop={this.state.offsetTop}
150+
caretPosition={getCaretPosition(this.commandNode)}
147151
onSuggestionHover={this.highlightSuggestion.bind(this)}
148152
onSuggestionClick={this.applySuggestion.bind(this)}
149153
highlightedIndex={this.state.highlightedSuggestionIndex}
@@ -170,7 +174,7 @@ export default class PromptComponent extends React.Component<Props, State> imple
170174
}
171175

172176
return (
173-
<div className={classes} style={css.promptWrapper(this.props.status)}>
177+
<div className="prompt-wrapper" style={css.promptWrapper(this.props.status)}>
174178
<div style={css.arrow(this.props.status)}>
175179
<div style={css.arrowInner(this.props.status)}></div>
176180
</div>
@@ -179,7 +183,7 @@ export default class PromptComponent extends React.Component<Props, State> imple
179183
dangerouslySetInnerHTML={{__html: this.props.status === Status.Interrupted ? fontAwesome.close : ""}}></div>
180184
<div className="prompt"
181185
style={css.prompt}
182-
onKeyDown={this.handlers.onKeyDown.bind(this)}
186+
onKeyDown={event => this.handlers.onKeyDown(event)}
183187
onInput={this.handleInput.bind(this)}
184188
onKeyPress={this.handleKeyPress.bind(this)}
185189
type="text"

src/views/AutocompleteComponent.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ const SuggestionComponent = ({suggestion, onHover, onClick, isHighlighted}: Sugg
2121
</li>;
2222

2323
interface AutocompleteProps {
24-
caretOffset: Offset;
24+
offsetTop: number;
25+
caretPosition: number;
2526
suggestions: Suggestion[];
2627
onSuggestionHover: (index: number) => void;
2728
onSuggestionClick: () => void;
@@ -47,7 +48,7 @@ export default class AutocompleteComponent extends React.Component<AutocompleteP
4748
}
4849

4950
return (
50-
<div style={css.autocomplete.box(this.props.caretOffset, suggestionDescription.length !== 0)}>
51+
<div style={css.autocomplete.box(this.props.offsetTop, this.props.caretPosition, suggestionDescription.length !== 0)}>
5152
<ul style={css.autocomplete.suggestionsList}>{suggestionViews}</ul>
5253
{descriptionElement}
5354
</div>

src/views/css/main.ts

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,10 @@ export interface CSSObject {
5555

5656
const fontSize = 14;
5757
const outputPadding = 10;
58-
const promptPadding = 5;
59-
const promptHeight = 12 + (2 * promptPadding);
60-
const promptWrapperHeight = promptHeight + promptPadding;
58+
const promptVerticalPadding = 5;
59+
const promptHorizontalPadding = 10;
60+
const promptHeight = 12 + (2 * promptVerticalPadding);
61+
const promptWrapperHeight = promptHeight + promptVerticalPadding;
6162
const promptBackgroundColor = lighten(colors.black, 5);
6263
const suggestionSize = 2 * fontSize;
6364
const defaultShadow = "0 2px 8px 1px rgba(0, 0, 0, 0.3)";
@@ -95,7 +96,10 @@ const progressBarStripesSize = 30;
9596
const arrowColor = lighten(promptBackgroundColor, 10);
9697

9798
const promptInlineElement = {
98-
padding: "0 10px 3px 10px", // FIXME: Use grid-column-gap when it's supported.
99+
paddingTop: 0,
100+
paddingRight: promptHorizontalPadding,
101+
paddingBottom: 3,
102+
paddingLeft: promptHorizontalPadding,
99103
gridArea: "prompt",
100104
fontSize: fontSize,
101105
WebkitFontFeatureSettings: '"liga", "dlig"',
@@ -185,14 +189,14 @@ export const debugTag = {
185189
};
186190

187191
export const autocomplete = {
188-
box: (caretOffset: Offset, hasDescription: boolean) => {
189-
const shouldDisplayAbove = caretOffset.top + (suggestionsLimit * suggestionSize) > window.innerHeight;
192+
box: (offsetTop: number, caretPosition: number, hasDescription: boolean) => {
193+
const shouldDisplayAbove = offsetTop + (suggestionsLimit * suggestionSize) > window.innerHeight;
190194

191195
return {
192196
position: "absolute",
193197
top: shouldDisplayAbove ? "auto" : promptWrapperHeight,
194198
bottom: shouldDisplayAbove ? suggestionSize + (hasDescription ? suggestionSize : 0) : "auto",
195-
left: caretOffset.left,
199+
left: decorationWidth + promptHorizontalPadding + (caretPosition * letterWidth),
196200
minWidth: 300,
197201
boxShadow: defaultShadow,
198202
backgroundColor: colors.black,
@@ -501,7 +505,7 @@ export const promptInfo = (status: Status) => {
501505
export const promptWrapper = (status: Status) => {
502506
const styles: CSSObject = {
503507
top: 0,
504-
paddingTop: promptPadding,
508+
paddingTop: promptVerticalPadding,
505509
position: "relative", // To position the autocompletion box correctly.
506510
display: "grid",
507511
gridTemplateAreas: "'decoration prompt actions'",
@@ -523,7 +527,7 @@ export const arrow = (status: Status) => {
523527
gridArea: "decoration",
524528
position: "relative",
525529
width: decorationWidth,
526-
height: promptHeight - promptPadding,
530+
height: promptHeight - promptVerticalPadding,
527531
margin: "0 auto",
528532
overflow: "hidden",
529533
zIndex: arrowZIndex,

0 commit comments

Comments
 (0)