Skip to content

Commit

Permalink
feat: get display window by px (#222)
Browse files Browse the repository at this point in the history
  • Loading branch information
ImJeremyHe authored Jan 14, 2024
1 parent 7296668 commit d1a2d3c
Show file tree
Hide file tree
Showing 10 changed files with 200 additions and 8 deletions.
4 changes: 2 additions & 2 deletions crates/buildtools/src/generate.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
fn main() {
use gents::FileGroup;
use logisheets_controller::controller::display::DisplayWindow;
use logisheets_controller::controller::display::DisplayWindowWithStartPoint;
use logisheets_controller::controller::display::{DisplayRequest, DisplayResponse};
use logisheets_controller::edit_action::AsyncFuncResult;
use logisheets_controller::edit_action::{ActionEffect, EditAction};
Expand All @@ -11,7 +11,7 @@ fn main() {
let mut file_group = FileGroup::new();
file_group.add::<DisplayRequest>();
file_group.add::<DisplayResponse>();
file_group.add::<DisplayWindow>();
file_group.add::<DisplayWindowWithStartPoint>();
file_group.add::<EditAction>();
file_group.add::<ActionEffect>();
file_group.add::<AsyncFuncResult>();
Expand Down
11 changes: 11 additions & 0 deletions crates/controller/src/controller/display.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,17 @@ pub struct DisplayWindow {
pub merge_cells: Vec<MergeCell>,
}

#[derive(Debug, Clone)]
#[cfg_attr(
feature = "gents",
gents_derives::gents_header(file_name = "display_window_with_start_point.ts")
)]
pub struct DisplayWindowWithStartPoint {
pub window: DisplayWindow,
pub start_x: f64,
pub start_y: f64,
}

#[derive(Debug, Clone)]
#[cfg_attr(
feature = "gents",
Expand Down
77 changes: 76 additions & 1 deletion crates/wasms/server/src/controller.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use logisheets_controller::controller::display::DisplayRequest;
use logisheets_controller::controller::display::{DisplayRequest, DisplayWindowWithStartPoint};
use logisheets_controller::edit_action::{
AsyncFuncResult, BlockInput, CellInput, CreateBlock, CreateSheet, DeleteCols,
DeleteColsInBlock, DeleteRows, DeleteRowsInBlock, DeleteSheet, EditAction, EditPayload,
Expand Down Expand Up @@ -305,6 +305,81 @@ pub fn get_display_window(
serde_wasm_bindgen::to_value(&window).unwrap()
}

#[wasm_bindgen]
pub fn get_display_window_with_start_point(
id: usize,
sheet_idx: usize,
start_x: f64,
start_y: f64,
end_x: f64,
end_y: f64,
) -> JsValue {
init();
let manager = MANAGER.get();
let wb = manager.get_workbook(&id).unwrap();
let ws = wb.get_sheet_by_idx(sheet_idx);
handle_result!(ws);
let mut start_row = 0;
let mut end_row = 0;
let mut start_col = 0;
let mut end_col = 0;
let mut start_point_x = 0_f64;
let mut start_point_y = 0_f64;

let mut curr_idx = 0;
let mut curr = 0_f64;
let mut last_value = 0_f64;
let mut s_flag = false;
let mut e_flag = false;
while !s_flag || !e_flag {
if !s_flag && curr >= start_y {
start_row = if curr_idx > 0 { curr_idx - 1 } else { curr_idx };
s_flag = true;
start_point_y = curr - last_value;
}

if !e_flag && curr >= end_y {
end_row = curr_idx + 1;
e_flag = true;
}
let h = ws.get_row_height(curr_idx);
handle_result!(h);
last_value = h;
curr += h;
curr_idx += 1;
}
let mut curr_idx = 0;
let mut curr = 0_f64;
let mut last_value = 0_f64;
let mut s_flag = false;
let mut e_flag = false;
while !s_flag || !e_flag {
if !s_flag && curr >= start_x {
start_col = if curr_idx > 0 { curr_idx - 1 } else { curr_idx };
s_flag = true;
start_point_x = curr - last_value;
}

if !e_flag && curr >= end_x {
end_col = curr_idx + 1;
e_flag = true;
}
let w = ws.get_col_width(curr_idx);
handle_result!(w);
last_value = w;
curr += w;
curr_idx += 1;
}
let window = ws.get_display_window(start_row, start_col, end_row, end_col);
handle_result!(window);
let result = DisplayWindowWithStartPoint {
window,
start_x: start_point_x,
start_y: start_point_y,
};
serde_wasm_bindgen::to_value(&result).unwrap()
}

#[wasm_bindgen]
pub fn set_font(
id: usize,
Expand Down
26 changes: 25 additions & 1 deletion packages/web/src/api/worksheet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,16 @@ import {
get_style,
get_value,
get_display_window,
get_display_window_with_start_point,
} from '../../wasm'
import {ColInfo, DisplayWindow, RowInfo, Style, Value} from '../bindings'
import {
ColInfo,
DisplayWindow,
DisplayWindowWithStartPoint,
RowInfo,
Style,
Value,
} from '../bindings'
import {CellInfo} from '../bindings/cell_info'
import {Result} from './utils'

Expand All @@ -35,6 +43,22 @@ export class Worksheet {
)
}

public getDisplayWindowWithStartPoint(
startX: number,
startY: number,
endX: number,
endY: number
): DisplayWindowWithStartPoint {
return get_display_window_with_start_point(
this._id,
this._sheetIdx,
startX,
startY,
endX,
endY
)
}

public getRowHeight(rowIdx: number): Result<number> {
return get_row_height(this._id, this._sheetIdx, rowIdx)
}
Expand Down
8 changes: 8 additions & 0 deletions packages/web/src/bindings/display_window_with_start_point.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// DO NOT EDIT. CODE GENERATED BY gents.
import {DisplayWindow} from './display_window'

export interface DisplayWindowWithStartPoint {
window: DisplayWindow
startX: number
startY: number
}
1 change: 1 addition & 0 deletions packages/web/src/bindings/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ export * from './display_patch'
export * from './display_request'
export * from './display_response'
export * from './display_window'
export * from './display_window_with_start_point'
export * from './edit_action'
export * from './edit_payload'
export * from './error_message'
Expand Down
1 change: 0 additions & 1 deletion src/core/data/backend.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import {Observable, ReplaySubject, Subject} from 'rxjs'
import {
ColInfo,
DisplayPatch,
SheetBlocks,
SheetColInfo,
Expand Down
1 change: 1 addition & 0 deletions src/core/data2/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './workbook'
73 changes: 73 additions & 0 deletions src/core/data2/workbook.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import {getID} from '@/core/ioc/id'
import {injectable} from 'inversify'
import {
ActionEffect,
CustomFunc,
Transaction,
Workbook,
initWasm,
} from '@logisheets_bg'
import {DisplayWindowWithStartPoint} from 'packages/web/src/bindings'

@injectable()
export class WorkbookService {
readonly id = getID()

public constructor(funcs: readonly CustomFunc[]) {
this._init(funcs)
}

public registryCustomFunc(f: CustomFunc) {
this._workbook.registryCustomFunc(f)
}

public registryRender(render: () => void) {
this._workbook.registerUpdateCallback(render)
}

public handleTransaction(
transaction: Transaction,
undoable: boolean
): ActionEffect {
return this._workbook.execTransaction(transaction, undoable)
}

public getDisplayWindow(
sheetIdx: number,
startX: number,
startY: number,
endX: number,
endY: number
): DisplayWindowWithStartPoint {
const ws = this._workbook.getWorksheet(sheetIdx)
return ws.getDisplayWindowWithStartPoint(startX, startY, endX, endY)
}

public undo() {
this._workbook.undo()
return
}

public redo() {
this._workbook.redo()
}

public loadWorkbook(content: Uint8Array, name: string) {
this._workbook.load(content, name)
}

private async _init(funcs: readonly CustomFunc[]) {
await initWasm()
this._workbookImpl = new Workbook()
funcs.forEach((f) => {
this._workbook.registryCustomFunc(f)
})
}

private get _workbook(): Workbook {
if (!this._workbookImpl) throw Error('')
return this._workbookImpl
}

private _workbookImpl: Workbook | undefined
}
6 changes: 3 additions & 3 deletions src/wasm_svc/service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@ import {

export class Service {
public constructor(funcs: readonly CustomFunc[]) {
funcs.forEach((f) => this._workbook.registryCustomFunc(f))
this._init()
this._init(funcs)
}

public input$ = new ReplaySubject<ClientRequest>(1)
public output$: Subject<ServerResponse> = new Subject()
private async _init() {
private async _init(funcs: readonly CustomFunc[]) {
await initWasm()
this._workbookImpl = new Workbook()
funcs.forEach((f) => this._workbook.registryCustomFunc(f))
this.input$.subscribe((req: ClientRequest): void => {
const response = this._execute(req)
this.output$.next(response)
Expand Down

0 comments on commit d1a2d3c

Please sign in to comment.