Skip to content

Commit

Permalink
Add text alignment to context menus
Browse files Browse the repository at this point in the history
Signed-off-by: gjmooney <[email protected]>
  • Loading branch information
gjmooney committed Mar 27, 2024
1 parent 93be7a5 commit 1db3b40
Show file tree
Hide file tree
Showing 4 changed files with 131 additions and 8 deletions.
6 changes: 2 additions & 4 deletions js/cellrenderer.ts
Original file line number Diff line number Diff line change
@@ -1,23 +1,21 @@
// Copyright (c) Bloomberg
// Distributed under the terms of the Modified BSD License.

import * as _ from 'underscore';

const d3Format: any = require('d3-format');
const d3TimeFormat: any = require('d3-time-format');

import {
CellRenderer,
TextRenderer,
HyperlinkRenderer,
ImageRenderer,
TextRenderer,
} from '@lumino/datagrid';

import {
Dict,
ISerializers,
WidgetModel,
WidgetView,
ISerializers,
resolvePromisesDict,
unpack_models,
} from '@jupyter-widgets/base';
Expand Down
18 changes: 18 additions & 0 deletions js/core/gridContextMenu.ts
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,21 @@ export class FeatherGridContextMenu extends GridContextMenu {
this._menu.addItem({
type: 'separator',
});
this._menu.addItem({
command: FeatherGridContextMenu.CommandID.AlignLeft,
args: args,
});
this._menu.addItem({
command: FeatherGridContextMenu.CommandID.AlignCenter,
args: args,
});
this._menu.addItem({
command: FeatherGridContextMenu.CommandID.AlignRight,
args: args,
});
this._menu.addItem({
type: 'separator',
});
this._menu.addItem({
command: FeatherGridContextMenu.CommandID.OpenFilterByConditionDialog,
args: args,
Expand Down Expand Up @@ -246,6 +261,9 @@ export namespace FeatherGridContextMenu {
SaveSelectionAsCsv = 'saveSelectionAsCsv',
SaveAllAsCsv = 'saveAllAsCsv',
ClearSelection = 'clearSelection',
AlignLeft = 'align:Left',
AlignCenter = 'align:Center',
AlignRight = 'align:Right',
}

/**
Expand Down
12 changes: 8 additions & 4 deletions js/datagrid.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import {
JupyterLuminoPanelWidget,
// @ts-ignore needed for ipywidgetx 7.x compatibility
JupyterPhosphorPanelWidget,
pack_models,
resolvePromisesDict,
unpack_models,
WidgetModel,
Expand Down Expand Up @@ -325,7 +326,10 @@ export class DataGridModel extends DOMWidgetModel {
static serializers: ISerializers = {
...DOMWidgetModel.serializers,
transforms: { deserialize: unpack_models as any },
renderers: { deserialize: unpack_models as any },
renderers: {
deserialize: unpack_models as any,
serialize: pack_models as any,
},
corner_renderer: { deserialize: unpack_models as any },
default_renderer: { deserialize: unpack_models as any },
header_renderer: { deserialize: unpack_models as any },
Expand Down Expand Up @@ -789,12 +793,12 @@ export class DataGridView extends DOMWidgetView {
export {
BarRendererModel,
BarRendererView,
ImageRendererModel,
ImageRendererView,
HyperlinkRendererModel,
HyperlinkRendererView,
ImageRendererModel,
ImageRendererView,
TextRendererModel,
TextRendererView,
TextRendererView
} from './cellrenderer';
export { VegaExprModel, VegaExprView } from './vegaexpr';

Expand Down
103 changes: 103 additions & 0 deletions js/feathergrid.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,16 @@ import { ViewBasedJSONModel } from './core/viewbasedjsonmodel';
import { KeyHandler } from './keyhandler';
import { MouseHandler as FeatherGridMouseHandler } from './mousehandler';
import { Theme } from './utils';
import { MODULE_NAME, MODULE_VERSION } from './version';

import { DataGridModel as BackBoneModel } from './datagrid';

import {
DOMWidgetModel,
ISerializers,
unpack_models,
} from '@jupyter-widgets/base';

import '@lumino/default-theme/style/datagrid.css';
import '../style/feathergrid.css';

Expand Down Expand Up @@ -107,6 +114,11 @@ const themeVariables: Map<string, string[]> = new Map([
]);

export class FeatherGrid extends Widget {
static serializers: ISerializers = {
...DOMWidgetModel.serializers,
renderers: { deserialize: unpack_models as any },
};

constructor(options: DataGrid.IOptions = {}) {
super();
this.addClass('ipydatagrid-widget');
Expand Down Expand Up @@ -871,6 +883,55 @@ export class FeatherGrid extends Widget {
});
}

private async _createTextRendererWidget() {
const model = await this.backboneModel.widget_manager.new_widget({
model_name: 'TextRendererModel',
model_module: MODULE_NAME,
model_module_version: MODULE_VERSION,
view_name: 'TextRendererView',
view_module: MODULE_NAME,
view_module_version: MODULE_VERSION,
});
return model;
}

private async _updateTextAlignment(
columnName: string,
alignment: 'left' | 'center' | 'right',
) {
const currentRenderers = this.backboneModel.get('renderers');
const defaultRenderer = this.backboneModel.get('default_renderer');
const currentRendererForColumn = currentRenderers[columnName];

// If there is a renderer for which we can set the alignment, set it
if (
currentRendererForColumn !== undefined &&
'horizontal_alignment' in currentRendererForColumn.attributes
) {
currentRendererForColumn.set('horizontal_alignment', alignment);
currentRendererForColumn.save_changes();
return;
}

// Assuming it's using the default renderer, we create a new renderer and copy its attributes
// TODO create a renderer of the same type as the default renderer
const model = await this._createTextRendererWidget();
for (const attr in model.attributes) {
if (attr in defaultRenderer.attributes) {
model.set(attr, defaultRenderer.get(attr));
}
}
model.set('horizontal_alignment', alignment);
model.save_changes();

const updatedRenderers = { ...currentRenderers };
updatedRenderers[columnName] = model;

// TODO Find why this is not propagated to Python correctly
this.backboneModel.set('renderers', updatedRenderers);
this.backboneModel.save_changes();
}

private _createCommandRegistry(): CommandRegistry {
const commands = new CommandRegistry();
commands.addCommand(FeatherGridContextMenu.CommandID.SortAscending, {
Expand Down Expand Up @@ -1034,6 +1095,48 @@ export class FeatherGrid extends Widget {
this.grid.selectionModel?.clear();
},
});
commands.addCommand(FeatherGridContextMenu.CommandID.AlignLeft, {
label: 'Align Left',
mnemonic: -1,
execute: async (args) => {
const commandArgs = <FeatherGridContextMenu.CommandArgs>args;
const columnName: string = this.dataModel.metadata(
commandArgs.region,
commandArgs.rowIndex,
commandArgs.columnIndex,
)['name'];

await this._updateTextAlignment(columnName, 'left');
},
});
commands.addCommand(FeatherGridContextMenu.CommandID.AlignCenter, {
label: 'Align Center',
mnemonic: -1,
execute: async (args) => {
const commandArgs = <FeatherGridContextMenu.CommandArgs>args;
const columnName: string = this.dataModel.metadata(
commandArgs.region,
commandArgs.rowIndex,
commandArgs.columnIndex,
)['name'];

await this._updateTextAlignment(columnName, 'center');
},
});
commands.addCommand(FeatherGridContextMenu.CommandID.AlignRight, {
label: 'Align Right',
mnemonic: -1,
execute: async (args) => {
const commandArgs = <FeatherGridContextMenu.CommandArgs>args;
const columnName: string = this.dataModel.metadata(
commandArgs.region,
commandArgs.rowIndex,
commandArgs.columnIndex,
)['name'];

await this._updateTextAlignment(columnName, 'right');
},
});

return commands;
}
Expand Down

0 comments on commit 1db3b40

Please sign in to comment.