mirror of
https://github.com/storytold/gridcraft.git
synced 2026-11-10 04:19:48 -06:00
G4: two windows on one workbook without copying it; Arrange All
- The workbook's active sheet is an atomic set in place (Workbook::active_sheet /
set_active_sheet), so a window swap or sheet switch never clones the
Arc<Workbook> or marks it dirty. Selections already live in DocState and the
window views. Save records the sheet of the most recently active window.
- A dialog taken out of its window while it runs goes back to that window when
a command run from it switched windows (dialogs::show, ui.dialog.confirm).
- view.arrangeAll {arrange?: tiled|horizontal|vertical|cascade, activeWorkbook?}
returns the visible windows, active first; the desktop moves and sizes the
native windows over the main window's monitor. New Window and Arrange All
buttons on the View ribbon; Arrange Windows dialog.
- Docs: ui-parity, hardware-parity, gaps #20, target-app-parity, ROADMAP.
This commit is contained in:
@@ -687,7 +687,7 @@ fn insert_sheet(s: &mut Session, p: &Json) -> Result<Json> {
|
||||
let before = p.get("before").and_then(Json::as_u64).map(|v| v as usize);
|
||||
let idx = edit_doc(d, |cx| {
|
||||
// Excel inserts before the active sheet; the "+" button appends after it.
|
||||
let at = before.unwrap_or(cx.wb.active_sheet + 1).min(cx.wb.sheets.len());
|
||||
let at = before.unwrap_or(cx.wb.active_sheet() + 1).min(cx.wb.sheets.len());
|
||||
cx.wb.sheets.insert(at, Arc::new(Sheet::new(name.clone())));
|
||||
// Names scoped to later sheets shift.
|
||||
for n in cx.wb.names.iter_mut() {
|
||||
@@ -697,7 +697,7 @@ fn insert_sheet(s: &mut Session, p: &Json) -> Result<Json> {
|
||||
*sc += 1;
|
||||
}
|
||||
}
|
||||
cx.wb.active_sheet = at;
|
||||
cx.wb.set_active_sheet(at);
|
||||
*cx.sel = crate::Selection::default();
|
||||
cx.structural = true;
|
||||
Ok(at)
|
||||
@@ -785,8 +785,8 @@ fn delete_sheet(s: &mut Session, p: &Json) -> Result<Json> {
|
||||
}
|
||||
}
|
||||
}
|
||||
if cx.wb.active_sheet >= cx.wb.sheets.len() || cx.wb.active_sheet > i {
|
||||
cx.wb.active_sheet = cx.wb.active_sheet.saturating_sub(1).min(cx.wb.sheets.len().saturating_sub(1));
|
||||
if cx.wb.active_sheet() >= cx.wb.sheets.len() || cx.wb.active_sheet() > i {
|
||||
cx.wb.set_active_sheet(cx.wb.active_sheet().saturating_sub(1).min(cx.wb.sheets.len().saturating_sub(1)));
|
||||
}
|
||||
*cx.sel = crate::Selection::default();
|
||||
cx.structural = true;
|
||||
@@ -900,12 +900,12 @@ fn move_sheet(s: &mut Session, p: &Json) -> Result<Json> {
|
||||
}
|
||||
cx.wb.names.extend(copies);
|
||||
cx.wb.sheets.insert(at, Arc::new(sh));
|
||||
cx.wb.active_sheet = at;
|
||||
cx.wb.set_active_sheet(at);
|
||||
} else {
|
||||
let sh = cx.wb.sheets.remove(i);
|
||||
let at = to.min(n - 1);
|
||||
cx.wb.sheets.insert(at, sh);
|
||||
cx.wb.active_sheet = at;
|
||||
cx.wb.set_active_sheet(at);
|
||||
// Sheet-level names follow their sheet.
|
||||
for nm in cx.wb.names.iter_mut() {
|
||||
if let Some(sc) = nm.scope.as_mut() {
|
||||
@@ -942,8 +942,8 @@ fn hide_sheet(s: &mut Session, p: &Json) -> Result<Json> {
|
||||
}
|
||||
edit(s, |cx| {
|
||||
cx.sheet_mut(i)?.visibility = Visibility::Hidden;
|
||||
if cx.wb.active_sheet == i {
|
||||
cx.wb.active_sheet = cx.wb.sheets.iter().position(|s| s.visibility == Visibility::Visible).unwrap_or(0);
|
||||
if cx.wb.active_sheet() == i {
|
||||
cx.wb.set_active_sheet(cx.wb.sheets.iter().position(|s| s.visibility == Visibility::Visible).unwrap_or(0));
|
||||
}
|
||||
Ok(Json::Null)
|
||||
})
|
||||
@@ -964,7 +964,7 @@ fn unhide_sheet(s: &mut Session, p: &Json) -> Result<Json> {
|
||||
let i = target_sheet(s, p)?;
|
||||
edit(s, |cx| {
|
||||
cx.sheet_mut(i)?.visibility = Visibility::Visible;
|
||||
cx.wb.active_sheet = i;
|
||||
cx.wb.set_active_sheet(i);
|
||||
Ok(Json::Null)
|
||||
})
|
||||
}
|
||||
@@ -978,7 +978,7 @@ fn activate(s: &mut Session, p: &Json) -> Result<Json> {
|
||||
|
||||
fn step_sheet(s: &mut Session, dir: isize) -> Result<Json> {
|
||||
let d = s.doc()?;
|
||||
let mut i = d.wb.active_sheet;
|
||||
let mut i = d.wb.active_sheet();
|
||||
while let Some(next) = i.checked_add_signed(dir) {
|
||||
let Some(sheet) = d.wb.sheet(next) else { break };
|
||||
if sheet.visibility == Visibility::Visible {
|
||||
|
||||
Reference in New Issue
Block a user