diff --git a/examples/spreadsheet/src/dlangui/widgets/spreadsheet.d b/examples/spreadsheet/src/dlangui/widgets/spreadsheet.d index d348e6c1..fa6323c6 100644 --- a/examples/spreadsheet/src/dlangui/widgets/spreadsheet.d +++ b/examples/spreadsheet/src/dlangui/widgets/spreadsheet.d @@ -60,7 +60,7 @@ class SpreadSheetView : StringGridWidget { } } -class SpreadSheetWidget : WidgetGroupDefaultDrawing, OnScrollHandler { +class SpreadSheetWidget : WidgetGroupDefaultDrawing, OnScrollHandler, CellSelectedHandler, CellActivatedHandler, ViewScrolledHandler { SheetEditControl _editControl; SheetTabs _tabs; @@ -106,10 +106,10 @@ class SpreadSheetWidget : WidgetGroupDefaultDrawing, OnScrollHandler { _viewBottomLeft = new SpreadSheetView("sheetViewBottomLeft"); _viewBottomRight = new SpreadSheetView("sheetViewBottomRight"); - _viewTopRight.headerCols = 0; - _viewBottomLeft.headerRows = 0; - _viewBottomRight.headerCols = 0; - _viewBottomRight.headerRows = 0; + _viewTopRight.setColWidth(0, 0); + _viewBottomLeft.setRowHeight(0, 0); + _viewBottomRight.setRowHeight(0, 0); + _viewBottomRight.setColWidth(0, 0); _views[0] = _viewTopLeft; _views[1] = _viewTopRight; @@ -132,6 +132,11 @@ class SpreadSheetWidget : WidgetGroupDefaultDrawing, OnScrollHandler { foreach(sb; _scrollbars) sb.onScrollEventListener = this; + foreach(view; _views) { + view.cellSelected = this; + view.cellActivated = this; + view.viewScrolled = this; + } } /// Measure widget according to desired width and height constraints. (Step 1 of two phase layout). @@ -198,4 +203,21 @@ class SpreadSheetWidget : WidgetGroupDefaultDrawing, OnScrollHandler { } return true; } + + /// Callback for handling of cell selection + void onCellSelected(GridWidgetBase source, int col, int row) { + foreach(view; _views) { + if (source != view) + view.selectCell(col + view.headerCols, row + view.headerRows, false, source, false); + } + } + + /// Callback for handling of cell double click or Enter key press + void onCellActivated(GridWidgetBase source, int col, int row) { + } + + /// Callback for handling of view scroll (top left visible cell change) + void onViewScrolled(GridWidgetBase source, int col, int row) { + } + } diff --git a/src/dlangui/widgets/grid.d b/src/dlangui/widgets/grid.d index ccf9e664..84779a55 100644 --- a/src/dlangui/widgets/grid.d +++ b/src/dlangui/widgets/grid.d @@ -225,6 +225,11 @@ interface CellActivatedHandler { void onCellActivated(GridWidgetBase source, int col, int row); } +/// Callback for handling of view scroll (top left visible cell change) +interface ViewScrolledHandler { + void onViewScrolled(GridWidgetBase source, int col, int row); +} + /// Abstract grid widget class GridWidgetBase : ScrollWidgetBase { /// Callback to handle selection change @@ -237,6 +242,9 @@ class GridWidgetBase : ScrollWidgetBase { /// cellActivated signal alias for backward compatibility; will be deprecated in future alias onCellActivated = cellActivated; + /// Callback for handling of view scroll (top left visible cell change) + Listener!ViewScrolledHandler viewScrolled; + protected CustomGridCellAdapter _customCellAdapter; /// Get adapter to override drawing of some particular cells @@ -414,6 +422,10 @@ class GridWidgetBase : ScrollWidgetBase { return _colWidths[x]; } + void setColWidth(int x, int w) { + _colWidths[x] = w; + } + /// returns row height (index includes col/row headers, if any); returns 0 for riws hidden by scroll at the top int rowHeight(int y) { if (y >= _headerRows + _fixedRows && y < _headerRows + _fixedRows + _scrollRow) @@ -421,6 +433,10 @@ class GridWidgetBase : ScrollWidgetBase { return _rowHeights[y]; } + void setRowHeight(int y, int w) { + _rowHeights[y] = w; + } + /// returns cell rectangle relative to client area; row 0 is col headers row; col 0 is row headers column Rect cellRect(int x, int y) { Rect rc; @@ -623,7 +639,9 @@ class GridWidgetBase : ScrollWidgetBase { } /// move selection to specified cell - bool selectCell(int col, int row, bool makeVisible = true) { + bool selectCell(int col, int row, bool makeVisible = true, GridWidgetBase source = null, bool needNotification = true) { + if (source is null) + source = this; if (_col == col && _row == row) return false; // same position if (col < _headerCols || row < _headerRows || col >= _cols || row >= _rows) @@ -634,8 +652,8 @@ class GridWidgetBase : ScrollWidgetBase { calcScrollableAreaPos(); if (makeVisible) makeCellVisible(_col, _row); - if (onCellSelected.assigned) - onCellSelected(this, _col - _headerCols, _row - _headerRows); + if (needNotification && onCellSelected.assigned) + onCellSelected(source, _col - _headerCols, _row - _headerRows); return true; }