Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(sheet): editor shortcuts #332

Merged
merged 42 commits into from
Oct 27, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
911ac51
refactor(sheet): sheet selection and theme
DR-Univer Oct 24, 2023
a363c61
refactor(sheet): sheet selection and theme
DR-Univer Oct 24, 2023
262061b
fix(sheet): conflict
DR-Univer Oct 24, 2023
0c3ecc3
fix(sheet): import error
DR-Univer Oct 24, 2023
5d4113a
fix(sheet): import error
DR-Univer Oct 24, 2023
2794d64
fix(sheet): test error
DR-Univer Oct 24, 2023
7748137
feat(sheet): editor shortcuts
DR-Univer Oct 26, 2023
686541a
fix(ui-sheets): fix potential null subscription handling (#333)
jikkai Oct 27, 2023
5ead17e
chore: upgrade dependencies (#327)
jikkai Oct 27, 2023
bc362ae
feat: refactor `ColorPicker` (#329)
jikkai Oct 27, 2023
53907ad
fix(sheet): render refresh
DR-Univer Oct 27, 2023
6decc81
fix(sheet): code review fix
DR-Univer Oct 27, 2023
b6bbda4
refactor(sheet): sheet selection and theme
DR-Univer Oct 24, 2023
59b0f26
fix(sheet): import error
DR-Univer Oct 24, 2023
e51200b
feat(sheet): editor shortcuts
DR-Univer Oct 26, 2023
3710e69
fix(sheet): render refresh
DR-Univer Oct 27, 2023
ce6137f
fix(sheet): code review fix
DR-Univer Oct 27, 2023
b4c4719
fix(sheet): conflict
DR-Univer Oct 27, 2023
bba7631
fix(sheet): ts check
DR-Univer Oct 27, 2023
84d11d1
fix(sheet): test fix
DR-Univer Oct 27, 2023
c1685de
fix(sheet): expand method
DR-Univer Oct 27, 2023
6d41329
fix(sheet): expand error
DR-Univer Oct 27, 2023
5189c13
feat(design): create `design` repo for developing UI components (#335)
jikkai Oct 27, 2023
bc028b7
fix(sheet): type error
DR-Univer Oct 27, 2023
99a43bb
fix(sheet): uppercase letters
DR-Univer Oct 27, 2023
9e67e0a
refactor(sheet): sheet selection and theme
DR-Univer Oct 24, 2023
4ccd9fc
fix(sheet): import error
DR-Univer Oct 24, 2023
7a057da
feat(sheet): editor shortcuts
DR-Univer Oct 26, 2023
ee3219d
fix(sheet): render refresh
DR-Univer Oct 27, 2023
bf4ea52
fix(sheet): code review fix
DR-Univer Oct 27, 2023
058b724
refactor(sheet): sheet selection and theme
DR-Univer Oct 24, 2023
9f2baaa
refactor(sheet): sheet selection and theme
DR-Univer Oct 24, 2023
bfd66e8
fix(sheet): import error
DR-Univer Oct 24, 2023
6597a50
feat(sheet): editor shortcuts
DR-Univer Oct 26, 2023
c6a2cd6
fix(sheet): render refresh
DR-Univer Oct 27, 2023
8d3c79b
fix(sheet): code review fix
DR-Univer Oct 27, 2023
c5a2240
fix(sheet): ts check
DR-Univer Oct 27, 2023
9908a07
fix(sheet): test fix
DR-Univer Oct 27, 2023
fde0338
fix(sheet): expand method
DR-Univer Oct 27, 2023
d574ebf
fix(sheet): expand error
DR-Univer Oct 27, 2023
8735506
fix(sheet): type error
DR-Univer Oct 27, 2023
3a6bb62
fix(sheet): conflict
DR-Univer Oct 27, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
feat(sheet): editor shortcuts
  • Loading branch information
DR-Univer committed Oct 27, 2023
commit 7a057da0899113527fbb2b74be016846cf62ca07
4 changes: 2 additions & 2 deletions packages/base-docs/src/Controller/doc-render.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,15 +88,15 @@ export class DocRenderController extends Disposable {

if (engineWidth > docsWidth) {
docsLeft = engineWidth / 2 - docsWidth / 2;
sceneWidth = engineWidth - 30;
sceneWidth = engineWidth - 34;
} else {
docsLeft = pageMarginLeft;
sceneWidth = docsWidth + pageMarginLeft * 2;
}

if (engineHeight > docsHeight) {
docsTop = engineHeight / 2 - docsHeight / 2;
sceneHeight = engineHeight - 30;
sceneHeight = engineHeight - 34;
} else {
docsTop = pageMarginTop;
sceneHeight = docsHeight + pageMarginTop * 2;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,6 @@ export const MoveCursorOperation: IOperation<IMoveCursorOperationParams> = {
return false;
}

// const univerInstanceService = accessor.get(IUniverInstanceService);
// const inputController = accessor.get(InputController);

// inputController.moveCursor(univerInstanceService.getCurrentUniverDocInstance(), params.direction);

return true;
},
};
2 changes: 2 additions & 0 deletions packages/base-docs/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,12 @@ export {
type IUpdateCommandParams,
UpdateCommand,
} from './commands/commands/core-editing.command';
export { BreakLineCommand, DeleteLeftCommand } from './commands/commands/core-editing.command';
export {
type IRichTextEditingMutationParams,
RichTextEditingMutation,
} from './commands/mutations/core-editing.mutation';
export { MoveCursorOperation } from './commands/operations/cursor.operation';
export * from './DocPlugin';
export * from './Locale';
export { DocSkeletonManagerService } from './services/doc-skeleton-manager.service';
Expand Down
79 changes: 57 additions & 22 deletions packages/base-sheets/src/Basics/selection.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,17 @@
import { TinyColor } from '@ctrl/tinycolor';
import { ISelection, ISelectionWithCoord, Nullable, ThemeService } from '@univerjs/core';
import { getCellInfoInMergeData } from '@univerjs/base-render';
import {
IRange,
ISelection,
ISelectionWithCoord,
makeCellRangeToRangeData,
Nullable,
ThemeService,
} from '@univerjs/core';

export const SELECTION_CONTROL_BORDER_BUFFER_WIDTH = 4; // The draggable range of the selection is too thin, making it easy for users to miss. Therefore, a buffer gap is provided to make it easier for users to select.

export const SELECTION_CONTROL_BORDER_BUFFER_COLOR = 'rgba(255,255,255, 0.01)';

/**
* Whether to display the controller that modifies the selection, distributed in 8 locations
Expand All @@ -23,26 +35,31 @@ export interface ISelectionWidgetConfig {
br?: boolean;
}

/**
* https://support.microsoft.com/en-us/office/select-cell-contents-in-excel-23f64223-2b6b-453a-8688-248355f10fa9
*/
export interface ISelectionStyle {
strokeWidth: number;
stroke: string;
fill: string;
widgets: ISelectionWidgetConfig;
widgetSize?: number;
widgetStrokeWidth?: number;
widgetStroke?: string;

hasAutoFill: boolean;
AutofillSize?: number;
AutofillStrokeWidth?: number;
AutofillStroke?: string;

hasRowHeader?: boolean;
rowHeaderFill?: string;
rowHeaderStroke?: string;
rowHeaderStrokeWidth?: number;

hasColumnHeader?: boolean;
strokeWidth: number; // The volume of the selection border determines the thickness of the selection border
DR-Univer marked this conversation as resolved.
Show resolved Hide resolved
stroke: string; // The color of the selection border.
strokeDash?: number; // The dashed line of the selection border. Here, the dashed line is a numerical value, different from the canvas dashed line setting. It is implemented internally as [0, strokeDash]. Setting it to 8 will look more aesthetically pleasing.
fill: string; // The fill color inside the selection. It needs to have a level of transparency, otherwise content in the covered area of the selection will be obscured.
widgets: ISelectionWidgetConfig; // The eight touch points of the selection. You can refer to Excel's formula and chart selections, which allow you to manually adjust the size of the selection. Univer has four more touch points (up, down, left, and right) than Excel. https://support.microsoft.com/en-us/office/select-data-for-a-chart-5fca57b7-8c52-4e09-979a-631085113862
widgetSize?: number; // The volume of the touch points.
widgetStrokeWidth?: number; // The thickness of the border of the touch points
widgetStroke?: string; // The color of the touch points.

// https://support.microsoft.com/en-us/office/copy-a-formula-by-dragging-the-fill-handle-in-excel-for-mac-dd928259-622b-473f-9a33-83aa1a63e218
hasAutoFill: boolean; // Whether to show the drop-down fill button at the bottom right corner of the selection.
AutofillSize?: number; // The size of the fill button.
AutofillStrokeWidth?: number; // The border size of the fill button.
AutofillStroke?: string; // The color of the fill button.

hasRowHeader?: boolean; // Whether to synchronize the display of row title highlights, the highlighting range is consistent with the horizontal range of the selection.
rowHeaderFill?: string; // The color of the row title highlight. A level of transparency should be set to avoid covering the row title content.
rowHeaderStroke?: string; // The color of the bottom border of the row title.
rowHeaderStrokeWidth?: number; // The color of the bottom border of the row title.

hasColumnHeader?: boolean; // The setting of column title highlight is similar to that of row title.
columnHeaderFill?: string;
columnHeaderStroke?: string;
columnHeaderStrokeWidth?: number;
Expand All @@ -56,12 +73,14 @@ export interface ISelectionWithStyle extends ISelection {
style: Nullable<ISelectionStyle>;
}

// The default configuration of the selection.
export function getNormalSelectionStyle(themeService: ThemeService): ISelectionStyle {
const style = themeService.getCurrentTheme();
const fill = new TinyColor(style.colorBlack).setAlpha(0.1).toString();
return {
strokeWidth: 2,
stroke: style.primaryColor,
// strokeDash: 8,
fill,
// widgets: { tl: true, tc: true, tr: true, ml: true, mr: true, bl: true, bc: true, br: true },
widgets: {},
Expand Down Expand Up @@ -118,6 +137,22 @@ export function convertSelectionDataToRange(
return result;
}

export const SELECTION_CONTROL_BORDER_BUFFER_WIDTH = 4;
export function transformCellDataToSelectionData(
row: number,
column: number,
mergeData: IRange[]
): Nullable<ISelectionWithStyle> {
const newCellRange = getCellInfoInMergeData(row, column, mergeData);

export const SELECTION_CONTROL_BORDER_BUFFER_COLOR = 'rgba(255,255,255, 0.01)';
const newSelectionData = makeCellRangeToRangeData(newCellRange);

if (!newSelectionData) {
return;
}

return {
range: newSelectionData,
primary: newCellRange,
style: null,
};
}
12 changes: 9 additions & 3 deletions packages/base-sheets/src/Controller/Selection.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ export class SelectionController extends Disposable {

this._commandExecutedListener();

spreadsheetLeftTopPlaceholder?.onPointerDownObserver.add((evt: IPointerEvent | IMouseEvent) => {});
spreadsheetLeftTopPlaceholder?.onPointerDownObserver.add(() => {});

this._userActionSyncListener();

Expand Down Expand Up @@ -99,6 +99,9 @@ export class SelectionController extends Disposable {
}
this._selectionRenderService.reset();
for (const selectionWithStyle of param) {
if (selectionWithStyle == null) {
continue;
}
const selectionData = this._selectionRenderService.convertSelectionRangeToData(selectionWithStyle);
selectionData.style = getNormalSelectionStyle(this._themeService);
this._selectionRenderService.addControlToCurrentByRangeData(selectionData);
Expand All @@ -122,7 +125,7 @@ export class SelectionController extends Disposable {
}
});

spreadsheetRowHeader?.onPointerMoveObserver.add((evt: IPointerEvent | IMouseEvent, state) => {});
// spreadsheetRowHeader?.onPointerMoveObserver.add((evt: IPointerEvent | IMouseEvent, state) => {});
}

private _initialColumnHeader(sheetObject: ISheetObjectParam) {
Expand Down Expand Up @@ -150,6 +153,9 @@ export class SelectionController extends Disposable {
}

for (const selectionWithStyle of param) {
if (selectionWithStyle == null) {
continue;
}
const selectionData = this._selectionRenderService.convertSelectionRangeToData(selectionWithStyle);
this._selectionRenderService.addControlToCurrentByRangeData(selectionData);
}
Expand Down Expand Up @@ -204,7 +210,7 @@ export class SelectionController extends Disposable {
if (param == null) {
return;
}
const { unitId, sheetId, skeleton, commandId } = param;
const { unitId, sheetId, skeleton } = param;

const currentRender = this._renderManagerService.getRenderById(unitId);

Expand Down
14 changes: 7 additions & 7 deletions packages/base-sheets/src/Controller/header-menu.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,19 +96,19 @@ export class HeaderMenuController extends Disposable {
return;
}

const { spreadsheetColumnHeader, spreadsheetRowHeader, scene } = sheetObject;
const { spreadsheetColumnHeader, spreadsheetRowHeader } = sheetObject;

const eventBindingObject =
initialType === HEADER_HOVER_TYPE.ROW ? spreadsheetRowHeader : spreadsheetColumnHeader;

this._observers.push(
eventBindingObject?.onPointerEnterObserver.add((evt: IPointerEvent | IMouseEvent, state) => {
eventBindingObject?.onPointerEnterObserver.add(() => {
this._hoverRect?.show();
})
);

this._observers.push(
eventBindingObject?.onPointerMoveObserver.add((evt: IPointerEvent | IMouseEvent, state) => {
eventBindingObject?.onPointerMoveObserver.add((evt: IPointerEvent | IMouseEvent) => {
const skeleton = this._sheetSkeletonManagerService.getCurrent()?.skeleton;
if (skeleton == null) {
return;
Expand All @@ -121,7 +121,7 @@ export class HeaderMenuController extends Disposable {

const { rowHeaderWidth, columnHeaderHeight } = skeleton;

const { startX, startY, endX, endY, row, column } = getCoordByOffset(
const { startX, startY, endX, endY, column } = getCoordByOffset(
evt.offsetX,
evt.offsetY,
sheetObject.scene,
Expand Down Expand Up @@ -169,7 +169,7 @@ export class HeaderMenuController extends Disposable {
);

this._observers.push(
eventBindingObject?.onPointerLeaveObserver.add((evt: IPointerEvent | IMouseEvent, state) => {
eventBindingObject?.onPointerLeaveObserver.add(() => {
this._hoverRect?.hide();
this._hoverMenu?.hide();
})
Expand Down Expand Up @@ -217,7 +217,7 @@ export class HeaderMenuController extends Disposable {
sheetObject.scene.resetCursor();
});

this._hoverMenu.onPointerDownObserver.add((evt: IPointerEvent | IMouseEvent, state) => {
this._hoverMenu.onPointerDownObserver.add((evt: IPointerEvent | IMouseEvent) => {
const sheetObject = this._getSheetObject();
if (sheetObject == null) {
return;
Expand All @@ -228,7 +228,7 @@ export class HeaderMenuController extends Disposable {
const currentSelectionDatas = this._selectionManagerService.getSelectionRanges();

const selectedSelection = currentSelectionDatas?.find((data) => {
const { startRow, startColumn, endRow, endColumn } = data;
const { startColumn, endColumn } = data;
if (currentColumn >= startColumn && startColumn <= endColumn) {
return true;
}
Expand Down
25 changes: 7 additions & 18 deletions packages/base-sheets/src/Controller/header-move.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,7 @@ export class HeaderMoveController extends Disposable {
@IUniverInstanceService private readonly _currentUniverService: IUniverInstanceService,
@IRenderManagerService private readonly _renderManagerService: IRenderManagerService,
@ICommandService private readonly _commandService: ICommandService,
@ISelectionRenderService
private readonly _selectionRenderService: ISelectionRenderService,
@ISelectionRenderService private readonly _selectionRenderService: ISelectionRenderService,
@Inject(SelectionManagerService) private readonly _selectionManagerService: SelectionManagerService
) {
super();
Expand Down Expand Up @@ -140,18 +139,13 @@ export class HeaderMoveController extends Disposable {
initialType === HEADER_MOVE_TYPE.ROW ? spreadsheetRowHeader : spreadsheetColumnHeader;

this._rowOrColumnMoveObservers.push(
eventBindingObject?.onPointerMoveObserver.add((evt: IPointerEvent | IMouseEvent, state) => {
eventBindingObject?.onPointerMoveObserver.add((evt: IPointerEvent | IMouseEvent) => {
const skeleton = this._sheetSkeletonManagerService.getCurrent()?.skeleton;
if (skeleton == null) {
return;
}

const { startX, startY, endX, endY, row, column } = getCoordByOffset(
evt.offsetX,
evt.offsetY,
scene,
skeleton
);
const { row, column } = getCoordByOffset(evt.offsetX, evt.offsetY, scene, skeleton);

const matchSelectionData = this._checkInHeaderRange(
initialType === HEADER_MOVE_TYPE.ROW ? row : column,
Expand All @@ -171,7 +165,7 @@ export class HeaderMoveController extends Disposable {
);

this._rowOrColumnLeaveObservers.push(
eventBindingObject?.onPointerLeaveObserver.add((evt: IPointerEvent | IMouseEvent, state) => {
eventBindingObject?.onPointerLeaveObserver.add(() => {
this._moveHelperBackgroundShape?.hide();
this._moveHelperLineShape?.hide();
scene.resetCursor();
Expand All @@ -180,7 +174,7 @@ export class HeaderMoveController extends Disposable {
);

this._rowOrColumnDownObservers.push(
eventBindingObject?.onPointerDownObserver.add((evt: IPointerEvent | IMouseEvent, state) => {
eventBindingObject?.onPointerDownObserver.add((evt: IPointerEvent | IMouseEvent) => {
const skeleton = this._sheetSkeletonManagerService.getCurrent()?.skeleton;
if (skeleton == null) {
return;
Expand All @@ -196,12 +190,7 @@ export class HeaderMoveController extends Disposable {

this._startOffsetY = newEvtOffsetY;

const { startX, startY, endX, endY, row, column } = getCoordByOffset(
evt.offsetX,
evt.offsetY,
scene,
skeleton
);
const { row, column } = getCoordByOffset(evt.offsetX, evt.offsetY, scene, skeleton);

if (initialType === HEADER_MOVE_TYPE.ROW) {
this._changeFromRow = row;
Expand Down Expand Up @@ -248,7 +237,7 @@ export class HeaderMoveController extends Disposable {
});
});

this._upObserver = scene.onPointerUpObserver.add((_upEvt: IPointerEvent | IMouseEvent) => {
this._upObserver = scene.onPointerUpObserver.add(() => {
this._disposeBackgroundAndLine();
scene.resetCursor();
scene.enableEvent();
Expand Down
2 changes: 2 additions & 0 deletions packages/base-sheets/src/SheetPlugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import { ScrollManagerService } from './services/scroll-manager.service';
import { SelectionManagerService } from './services/selection/selection-manager.service';
import { ISelectionRenderService, SelectionRenderService } from './services/selection/selection-render.service';
import { SheetSkeletonManagerService } from './services/sheet-skeleton-manager.service';
import { ShortcutExperienceService } from './services/shortcut-experience.service';
import { SheetCanvasView } from './View/sheet-canvas-view';

/**
Expand Down Expand Up @@ -64,6 +65,7 @@ export class SheetPlugin extends Plugin {
],
[ScrollManagerService],
[SelectionManagerService],
[ShortcutExperienceService],

// controllers
[FormulaBarController],
Expand Down
Loading