Skip to content

Commit ee42c78

Browse files
committed
Fix workspace dark theme, theme render bug
Signed-off-by: Andrew Stein <steinlink@gmail.com>
1 parent 6a49a55 commit ee42c78

9 files changed

Lines changed: 51 additions & 42 deletions

File tree

packages/perspective-workspace/src/less/menu.less

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919
.lm-Menu {
2020
font-size: 12px;
2121
padding: 8px;
22-
background: white;
23-
color: #666;
22+
background-color: var(--plugin--background);
23+
color: var(--icon--color);
2424
border: 1px solid var(--inactive--color);
2525
border-radius: 3px;
2626
max-width: 350px;

packages/perspective-workspace/src/themes/pro-dark.less

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,6 @@ perspective-indicator[theme="Pro Dark"] {
2222
--theme-name: "Pro Dark";
2323
}
2424

25-
perspective-workspace-menu {
26-
@include perspective-viewer-pro-dark--colors;
27-
}
2825

2926
perspective-workspace perspective-viewer {
3027
--status-bar--height: 38px;

packages/perspective-workspace/src/themes/pro.less

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,6 @@ perspective-workspace {
2424
background-color: #dadada;
2525
}
2626

27-
perspective-workspace-menu {
28-
@include perspective-viewer-pro--colors;
29-
background-color: #ffffff;
30-
}
31-
3227
perspective-workspace perspective-viewer[settings] {
3328
--modal-panel--margin: -4px 0 -4px 0;
3429
--status-bar--border-radius: 6px 0 0 0;

packages/perspective-workspace/src/ts/workspace/commands.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -234,11 +234,11 @@ export const createCommands = (
234234
workspace.toggleMasterDetail(
235235
workspace.getWidgetByName(args.widget_name as string)!
236236
),
237-
isVisible: () => true,
238-
// iconClass: (args) =>
239-
// args.widget.parent === workspace.dockpanel
240-
// ? "menu-master"
241-
// : "menu-detail",
237+
isVisible: (args) => {
238+
return !!workspace.getWidgetByName(args.widget_name as string)
239+
?._is_pivoted;
240+
},
241+
242242
label: (args) => {
243243
return workspace.getWidgetByName(args.widget_name as string)!
244244
.parent === workspace.get_dock_panel()

packages/perspective-workspace/src/ts/workspace/tabbar.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,11 +129,12 @@ export class PerspectiveTabBar extends TabBar<any> {
129129
});
130130

131131
const box = (event.target as HTMLElement).getBoundingClientRect();
132-
this._menu.open(box.x, box.y + box.height);
133-
132+
const outer_box = this._workspace.element.getBoundingClientRect();
133+
this._menu.open(box.x - outer_box.x, box.y + box.height - outer_box.y);
134134
this._menu.aboutToClose.connect(() => {
135135
this._menu = undefined;
136136
});
137+
137138
event.preventDefault();
138139
event.stopPropagation();
139140
}

packages/perspective-workspace/src/ts/workspace/widget.ts

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export class PerspectiveViewerWidget extends Widget {
2525
viewer: psp_viewer.HTMLPerspectiveViewerElement;
2626
_title: string;
2727
_is_table_loaded: boolean;
28+
_is_pivoted: boolean;
2829
_restore_config?: () => Promise<void>;
2930
task?: Promise<void>;
3031

@@ -33,6 +34,7 @@ export class PerspectiveViewerWidget extends Widget {
3334
this.viewer = viewer;
3435
this._title = "";
3536
this._is_table_loaded = false;
37+
this._is_pivoted = false;
3638
}
3739

3840
get name(): string {
@@ -65,16 +67,7 @@ export class PerspectiveViewerWidget extends Widget {
6567
this.viewer.setAttribute("table", table);
6668
}
6769

68-
// if (selectable) {
69-
// this.viewer.setAttribute("selectable", selectable);
70-
// }
71-
72-
// if (editable) {
73-
// this.viewer.setAttribute("editable", editable);
74-
// }
75-
7670
const restore_config = () => this.viewer.restore({ ...viewerConfig });
77-
7871
if (this._is_table_loaded) {
7972
return restore_config();
8073
} else {

packages/perspective-workspace/src/ts/workspace/workspace.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ export class PerspectiveWorkspace extends SplitPanel {
5353
private dockpanel: PerspectiveDockPanel;
5454
private detailPanel: Panel;
5555
private masterPanel: SplitPanel;
56-
private element: HTMLElement;
56+
element: HTMLElement;
5757
menu_elem: HTMLElement;
5858
private _tables: ObservableMap<string, psp.Table | Promise<psp.Table>>;
5959
private listeners: WeakMap<PerspectiveViewerWidget, () => void>;
@@ -91,6 +91,8 @@ export class PerspectiveWorkspace extends SplitPanel {
9191
this.commands = createCommands(this, this.indicator);
9292
this.menu_elem = document.createElement("perspective-workspace-menu");
9393
this.menu_elem.attachShadow({ mode: "open" });
94+
this.menu_elem.shadowRoot!.innerHTML = `<style>${injectedStyles}</style>`;
95+
9496
this.element.shadowRoot!.insertBefore(
9597
this.menu_elem,
9698
this.element.shadowRoot!.lastElementChild!
@@ -789,16 +791,13 @@ export class PerspectiveWorkspace extends SplitPanel {
789791

790792
showContextMenu(widget: PerspectiveViewerWidget | null, event: MouseEvent) {
791793
if (!event.shiftKey) {
792-
this.menu_elem.shadowRoot!.innerHTML = `<style>${injectedStyles}</style>`;
793-
794794
const menu = this.createContextMenu(widget);
795795
menu.init_overlay?.();
796796
const rect = this.element.getBoundingClientRect();
797797
menu.open(event.clientX - rect.x, event.clientY - rect.y, {
798798
host: this.menu_elem.shadowRoot as unknown as HTMLElement,
799799
});
800800

801-
// this.menu_elem = menu_elem;
802801
event.preventDefault();
803802
event.stopPropagation();
804803
}
@@ -828,11 +827,12 @@ export class PerspectiveWorkspace extends SplitPanel {
828827
}
829828

830829
addViewer(config: ViewerConfigUpdateExt, is_global_filter?: boolean) {
831-
const widget = this._createWidgetAndNode({ config });
832830
if (this.dockpanel.mode === "single-document") {
831+
const _task = this._maximizedWidget!.viewer.toggleConfig(false);
833832
this._unmaximize();
834833
}
835834

835+
const widget = this._createWidgetAndNode({ config });
836836
if (is_global_filter) {
837837
if (!this.masterPanel.isAttached) {
838838
this.setupMasterPanel(DEFAULT_WORKSPACE_SIZE);
@@ -966,6 +966,7 @@ export class PerspectiveWorkspace extends SplitPanel {
966966
const updated = async (event: CustomEvent) => {
967967
this.workspaceUpdated();
968968
widget.title.label = event.detail.title;
969+
widget._is_pivoted = event.detail.group_by?.length > 0;
969970
};
970971

971972
widget.node.addEventListener("contextmenu", contextMenu);

rust/perspective-viewer/src/rust/custom_elements/viewer.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -664,20 +664,22 @@ impl PerspectiveViewerElement {
664664
.collect();
665665

666666
let theme_name = presentation.get_selected_theme_name().await;
667-
presentation.reset_available_themes(themes).await;
667+
let mut changed = presentation.reset_available_themes(themes).await;
668668
let reset_theme = presentation
669669
.get_available_themes()
670670
.await?
671671
.iter()
672672
.find(|y| theme_name.as_ref() == Some(y))
673673
.cloned();
674674

675-
presentation.set_theme_name(reset_theme.as_deref()).await?;
676-
if let Some(view) = session.get_view() {
677-
renderer.restyle_all(&view).await
678-
} else {
679-
Ok(JsValue::UNDEFINED)
675+
changed = presentation.set_theme_name(reset_theme.as_deref()).await? || changed;
676+
if changed {
677+
if let Some(view) = session.get_view() {
678+
return renderer.restyle_all(&view).await;
679+
}
680680
}
681+
682+
Ok(JsValue::UNDEFINED)
681683
})
682684
}
683685

rust/perspective-viewer/src/rust/presentation.rs

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
1212

1313
use std::cell::RefCell;
14-
use std::collections::HashMap;
14+
use std::collections::{HashMap, HashSet};
1515
use std::ops::Deref;
1616
use std::rc::Rc;
1717

@@ -186,9 +186,20 @@ impl Presentation {
186186

187187
/// Reset the state. `styleSheets` will be re-parsed next time
188188
/// `get_themes()` is called if the `themes` argument is `None`.
189-
pub async fn reset_available_themes(&self, themes: Option<Vec<String>>) {
189+
///
190+
/// # Returns
191+
/// A `bool` indicating whether the internal state changed.
192+
pub async fn reset_available_themes(&self, themes: Option<Vec<String>>) -> bool {
193+
fn as_set(x: &Option<Vec<String>>) -> HashSet<&'_ String> {
194+
x.as_ref()
195+
.map(|x| x.iter().collect::<HashSet<_>>())
196+
.unwrap_or_default()
197+
}
198+
190199
let mut mutex = self.0.theme_data.lock().await;
200+
let changed = as_set(&mutex.themes) != as_set(&themes);
191201
mutex.themes = themes;
202+
changed
192203
}
193204

194205
pub async fn get_selected_theme_config(&self) -> ApiResult<(Vec<String>, Option<usize>)> {
@@ -218,8 +229,17 @@ impl Presentation {
218229
}
219230

220231
/// Set the theme by name, or `None` for the default theme.
221-
pub async fn set_theme_name(&self, theme: Option<&str>) -> ApiResult<()> {
222-
let (themes, _) = self.get_selected_theme_config().await?;
232+
///
233+
/// # Returns
234+
/// A `bool` indicating whether the internal state changed.
235+
pub async fn set_theme_name(&self, theme: Option<&str>) -> ApiResult<bool> {
236+
let (themes, selected) = self.get_selected_theme_config().await?;
237+
if let Some(x) = selected {
238+
if themes.get(x).map(|x| x.as_str()) == theme {
239+
return Ok(false);
240+
}
241+
}
242+
223243
let index = if let Some(theme) = theme {
224244
self.set_theme_attribute(Some(theme))?;
225245
themes.iter().position(|x| x == theme)
@@ -232,7 +252,7 @@ impl Presentation {
232252
};
233253

234254
self.theme_config_updated.emit((themes, index));
235-
Ok(())
255+
Ok(true)
236256
}
237257

238258
/// Returns an owned copy of the curent column configuration map.

0 commit comments

Comments
 (0)