mirror of https://github.com/buggins/dlangui.git
grid actions: scroll by one cell
This commit is contained in:
parent
0091cacd88
commit
a488efaa15
|
@ -178,6 +178,11 @@ class GridWidgetBase : WidgetGroup, OnScrollHandler {
|
||||||
protected ScrollBar _vscrollbar;
|
protected ScrollBar _vscrollbar;
|
||||||
/// horizontal scrollbar control
|
/// horizontal scrollbar control
|
||||||
protected ScrollBar _hscrollbar;
|
protected ScrollBar _hscrollbar;
|
||||||
|
/// inner area, excluding additional controls like scrollbars
|
||||||
|
protected Rect _clientRect;
|
||||||
|
|
||||||
|
|
||||||
|
// properties
|
||||||
|
|
||||||
/// selected column
|
/// selected column
|
||||||
@property int col() { return _col; }
|
@property int col() { return _col; }
|
||||||
|
@ -197,22 +202,7 @@ class GridWidgetBase : WidgetGroup, OnScrollHandler {
|
||||||
/// fixed (non-scrollable) data row count
|
/// fixed (non-scrollable) data row count
|
||||||
@property int fixedRows() { return _fixedRows; }
|
@property int fixedRows() { return _fixedRows; }
|
||||||
@property GridWidgetBase fixedRows(int r) { _fixedRows = r; invalidate(); return this; }
|
@property GridWidgetBase fixedRows(int r) { _fixedRows = r; invalidate(); return this; }
|
||||||
/// set new size
|
|
||||||
void resize(int cols, int rows) {
|
|
||||||
if (cols == _cols && rows == _rows)
|
|
||||||
return;
|
|
||||||
_colWidths.length = cols;
|
|
||||||
for (int i = _cols; i < cols; i++) {
|
|
||||||
_colWidths[i] = i == 0 ? 20 : 100;
|
|
||||||
}
|
|
||||||
_rowHeights.length = rows;
|
|
||||||
int fontHeight = font.height;
|
|
||||||
for (int i = _rows; i < rows; i++) {
|
|
||||||
_rowHeights[i] = fontHeight + 2;
|
|
||||||
}
|
|
||||||
_cols = cols;
|
|
||||||
_rows = rows;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// flag to enable column headers
|
/// flag to enable column headers
|
||||||
@property bool showColHeaders() {
|
@property bool showColHeaders() {
|
||||||
|
@ -233,6 +223,23 @@ class GridWidgetBase : WidgetGroup, OnScrollHandler {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// set new size
|
||||||
|
void resize(int cols, int rows) {
|
||||||
|
if (cols == _cols && rows == _rows)
|
||||||
|
return;
|
||||||
|
_colWidths.length = cols;
|
||||||
|
for (int i = _cols; i < cols; i++) {
|
||||||
|
_colWidths[i] = i == 0 ? 20 : 100;
|
||||||
|
}
|
||||||
|
_rowHeights.length = rows;
|
||||||
|
int fontHeight = font.height;
|
||||||
|
for (int i = _rows; i < rows; i++) {
|
||||||
|
_rowHeights[i] = fontHeight + 2;
|
||||||
|
}
|
||||||
|
_cols = cols;
|
||||||
|
_rows = rows;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// returns column width (index includes col/row headers, if any); returns 0 for columns hidden by scroll at the left
|
/// returns column width (index includes col/row headers, if any); returns 0 for columns hidden by scroll at the left
|
||||||
int colWidth(int x) {
|
int colWidth(int x) {
|
||||||
|
@ -350,6 +357,11 @@ class GridWidgetBase : WidgetGroup, OnScrollHandler {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// move scroll position horizontally by dx, and vertically by dy
|
||||||
|
void scrollBy(int dx, int dy) {
|
||||||
|
scrollTo(_headerCols + _fixedCols + _scrollCol + dx, _headerRows + _fixedRows + _scrollRow + dy);
|
||||||
|
}
|
||||||
|
|
||||||
/// set scroll position to show specified cell as top left in scrollable area
|
/// set scroll position to show specified cell as top left in scrollable area
|
||||||
void scrollTo(int col, int row) {
|
void scrollTo(int col, int row) {
|
||||||
int newScrollCol = col - _headerCols - _fixedCols;
|
int newScrollCol = col - _headerCols - _fixedCols;
|
||||||
|
@ -485,6 +497,7 @@ class GridWidgetBase : WidgetGroup, OnScrollHandler {
|
||||||
return super.onMouseEvent(event);
|
return super.onMouseEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// calculate scrollable area info
|
||||||
protected void calcScrollableAreaPos(ref Rect fullyVisibleCells, ref Rect fullyVisibleCellsRect, ref Rect fullScrollableArea, ref Rect visibleScrollableArea) {
|
protected void calcScrollableAreaPos(ref Rect fullyVisibleCells, ref Rect fullyVisibleCellsRect, ref Rect fullScrollableArea, ref Rect visibleScrollableArea) {
|
||||||
fullyVisibleCells.left = _headerCols + _fixedCols + _scrollCol;
|
fullyVisibleCells.left = _headerCols + _fixedCols + _scrollCol;
|
||||||
fullyVisibleCells.top = _headerRows + _fixedRows + _scrollRow;
|
fullyVisibleCells.top = _headerRows + _fixedRows + _scrollRow;
|
||||||
|
@ -568,18 +581,42 @@ class GridWidgetBase : WidgetGroup, OnScrollHandler {
|
||||||
override protected bool handleAction(const Action a) {
|
override protected bool handleAction(const Action a) {
|
||||||
calcScrollableAreaPos(_fullyVisibleCells, _fullyVisibleCellsRect, _fullScrollableArea, _visibleScrollableArea);
|
calcScrollableAreaPos(_fullyVisibleCells, _fullyVisibleCellsRect, _fullScrollableArea, _visibleScrollableArea);
|
||||||
switch (a.id) {
|
switch (a.id) {
|
||||||
|
case GridActions.ScrollLeft:
|
||||||
|
if (_scrollCol > 0)
|
||||||
|
scrollBy(-1, 0);
|
||||||
|
return true;
|
||||||
case GridActions.Left:
|
case GridActions.Left:
|
||||||
selectCell(_col - 1, _row);
|
selectCell(_col - 1, _row);
|
||||||
return true;
|
return true;
|
||||||
|
case GridActions.ScrollRight:
|
||||||
|
if (_fullyVisibleCells.right < _cols - 1)
|
||||||
|
scrollBy(1, 0);
|
||||||
|
return true;
|
||||||
case GridActions.Right:
|
case GridActions.Right:
|
||||||
selectCell(_col + 1, _row);
|
selectCell(_col + 1, _row);
|
||||||
return true;
|
return true;
|
||||||
|
case GridActions.ScrollUp:
|
||||||
|
if (_scrollRow > 0)
|
||||||
|
scrollBy(0, -1);
|
||||||
|
return true;
|
||||||
case GridActions.Up:
|
case GridActions.Up:
|
||||||
selectCell(_col, _row - 1);
|
selectCell(_col, _row - 1);
|
||||||
return true;
|
return true;
|
||||||
|
case GridActions.ScrollDown:
|
||||||
|
if (_fullyVisibleCells.bottom < _rows - 1)
|
||||||
|
scrollBy(0, 1);
|
||||||
|
return true;
|
||||||
case GridActions.Down:
|
case GridActions.Down:
|
||||||
selectCell(_col, _row + 1);
|
selectCell(_col, _row + 1);
|
||||||
return true;
|
return true;
|
||||||
|
case GridActions.ScrollPageLeft:
|
||||||
|
return true;
|
||||||
|
case GridActions.ScrollPageRight:
|
||||||
|
return true;
|
||||||
|
case GridActions.ScrollPageUp:
|
||||||
|
return true;
|
||||||
|
case GridActions.ScrollPageDown:
|
||||||
|
return true;
|
||||||
case GridActions.LineBegin:
|
case GridActions.LineBegin:
|
||||||
if (_scrollCol > 0 && _col > _headerCols + _fixedCols + _scrollCol)
|
if (_scrollCol > 0 && _col > _headerCols + _fixedCols + _scrollCol)
|
||||||
selectCell(_headerCols + _fixedCols + _scrollCol, _row);
|
selectCell(_headerCols + _fixedCols + _scrollCol, _row);
|
||||||
|
@ -692,7 +729,6 @@ class GridWidgetBase : WidgetGroup, OnScrollHandler {
|
||||||
measuredContent(parentWidth, parentHeight, sz.x, sz.y);
|
measuredContent(parentWidth, parentHeight, sz.x, sz.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Rect _clientRect;
|
|
||||||
|
|
||||||
/// Set widget rectangle to specified value and layout widget contents. (Step 2 of two phase layout).
|
/// Set widget rectangle to specified value and layout widget contents. (Step 2 of two phase layout).
|
||||||
override void layout(Rect rc) {
|
override void layout(Rect rc) {
|
||||||
|
|
Loading…
Reference in New Issue