mirror of https://github.com/buggins/dlangui.git
column resize support - fix #306
This commit is contained in:
parent
738d70584e
commit
da1aa0606a
|
|
@ -349,9 +349,16 @@ class GridWidgetBase : ScrollWidgetBase, GridModelAdapter, MenuItemActionHandler
|
||||||
/// set row count
|
/// set row count
|
||||||
@property GridWidgetBase rows(int r) { resize(cols, r); return this; }
|
@property GridWidgetBase rows(int r) { resize(cols, r); return this; }
|
||||||
|
|
||||||
|
protected bool _allowColResizing = true;
|
||||||
|
/// get col resizing flag; when true, allow resizing of column with mouse
|
||||||
|
@property bool allowColResizing() { return _allowColResizing; }
|
||||||
|
/// set col resizing flag; when true, allow resizing of column with mouse
|
||||||
|
@property GridWidgetBase allowColResizing(bool flgAllowColResizing) { _allowColResizing = flgAllowColResizing; return this; }
|
||||||
|
|
||||||
protected uint _selectionColor = 0x804040FF;
|
protected uint _selectionColor = 0x804040FF;
|
||||||
protected uint _selectionColorRowSelect = 0xC0A0B0FF;
|
protected uint _selectionColorRowSelect = 0xC0A0B0FF;
|
||||||
protected uint _fixedCellBackgroundColor = 0xC0E0E0E0;
|
protected uint _fixedCellBackgroundColor = 0xC0E0E0E0;
|
||||||
|
protected uint _fixedCellBorderColor = 0xC0C0C0C0;
|
||||||
protected uint _cellBorderColor = 0xC0C0C0C0;
|
protected uint _cellBorderColor = 0xC0C0C0C0;
|
||||||
protected uint _cellHeaderBorderColor = 0xC0202020;
|
protected uint _cellHeaderBorderColor = 0xC0202020;
|
||||||
protected uint _cellHeaderBackgroundColor = 0xC0909090;
|
protected uint _cellHeaderBackgroundColor = 0xC0909090;
|
||||||
|
|
@ -420,7 +427,7 @@ class GridWidgetBase : ScrollWidgetBase, GridModelAdapter, MenuItemActionHandler
|
||||||
|
|
||||||
/// set bool property value, for ML loaders
|
/// set bool property value, for ML loaders
|
||||||
mixin(generatePropertySettersMethodOverride("setBoolProperty", "bool",
|
mixin(generatePropertySettersMethodOverride("setBoolProperty", "bool",
|
||||||
"showColHeaders", "showColHeaders", "rowSelect", "smoothHScroll", "smoothVScroll"));
|
"showColHeaders", "showColHeaders", "rowSelect", "smoothHScroll", "smoothVScroll", "allowColResizing"));
|
||||||
|
|
||||||
/// set int property value, for ML loaders
|
/// set int property value, for ML loaders
|
||||||
mixin(generatePropertySettersMethodOverride("setIntProperty", "int",
|
mixin(generatePropertySettersMethodOverride("setIntProperty", "int",
|
||||||
|
|
@ -912,6 +919,64 @@ class GridWidgetBase : ScrollWidgetBase, GridModelAdapter, MenuItemActionHandler
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// returns mouse cursor type for widget
|
||||||
|
override uint getCursorType(int x, int y) {
|
||||||
|
if (_allowColResizing) {
|
||||||
|
if (_colResizingIndex >= 0) // resizing in progress
|
||||||
|
return CursorType.SizeWE;
|
||||||
|
int col = isColumnResizingPoint(x, y);
|
||||||
|
if (col >= 0)
|
||||||
|
return CursorType.SizeWE;
|
||||||
|
}
|
||||||
|
return CursorType.Arrow;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected int _colResizingIndex = -1;
|
||||||
|
protected int _colResizingStartX = -1;
|
||||||
|
protected int _colResizingStartWidth = -1;
|
||||||
|
|
||||||
|
protected void startColResize(int col, int x) {
|
||||||
|
_colResizingIndex = col;
|
||||||
|
_colResizingStartX = x;
|
||||||
|
_colResizingStartWidth = _colWidths[col];
|
||||||
|
}
|
||||||
|
protected void processColResize(int x) {
|
||||||
|
if (_colResizingIndex < 0 || _colResizingIndex >= _cols)
|
||||||
|
return;
|
||||||
|
int newWidth = _colResizingStartWidth + x - _colResizingStartX;
|
||||||
|
if (newWidth < 0)
|
||||||
|
newWidth = 0;
|
||||||
|
_colWidths[_colResizingIndex] = newWidth;
|
||||||
|
updateCumulativeSizes();
|
||||||
|
updateScrollBars();
|
||||||
|
invalidate();
|
||||||
|
}
|
||||||
|
protected void endColResize() {
|
||||||
|
_colResizingIndex = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// return column index to resize if point is in column resize area in header row, -1 if outside resize area
|
||||||
|
int isColumnResizingPoint(int x, int y) {
|
||||||
|
x -= _clientRect.left;
|
||||||
|
y -= _clientRect.top;
|
||||||
|
if (!_headerRows)
|
||||||
|
return -1; // no header rows
|
||||||
|
if (y >= _rowCumulativeHeights[_headerRows - 1])
|
||||||
|
return -1; // not in header row
|
||||||
|
// point is somewhere in header row
|
||||||
|
int resizeRange = BACKEND_GUI ? 4.pointsToPixels : 1;
|
||||||
|
if (x >= nonScrollAreaPixels.x)
|
||||||
|
x += _scrollX;
|
||||||
|
int col = colByAbsoluteX(x);
|
||||||
|
int start = col > 0 ? _colCumulativeWidths[col - 1] : 0;
|
||||||
|
int end = col < _cols ? _colCumulativeWidths[col] : _colCumulativeWidths[$ - 1];
|
||||||
|
if (x >= end - resizeRange / 2)
|
||||||
|
return col; // resize this column
|
||||||
|
if (x <= start + resizeRange / 2)
|
||||||
|
return col - 1; // resize previous column
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/// handle mouse wheel events
|
/// handle mouse wheel events
|
||||||
override bool onMouseEvent(MouseEvent event) {
|
override bool onMouseEvent(MouseEvent event) {
|
||||||
if (visibility != Visibility.Visible)
|
if (visibility != Visibility.Visible)
|
||||||
|
|
@ -920,18 +985,45 @@ class GridWidgetBase : ScrollWidgetBase, GridModelAdapter, MenuItemActionHandler
|
||||||
Rect rc;
|
Rect rc;
|
||||||
bool cellFound = false;
|
bool cellFound = false;
|
||||||
bool normalCell = false;
|
bool normalCell = false;
|
||||||
|
bool insideHeaderRow = false;
|
||||||
|
bool insideHeaderCol = false;
|
||||||
|
if (_colResizingIndex >= 0) {
|
||||||
|
if (event.action == MouseAction.Move) {
|
||||||
|
// column resize is active
|
||||||
|
processColResize(event.x);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (event.action == MouseAction.ButtonUp || event.action == MouseAction.Cancel) {
|
||||||
|
// stop column resizing
|
||||||
|
if (event.action == MouseAction.ButtonUp)
|
||||||
|
processColResize(event.x);
|
||||||
|
endColResize();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
// convert coordinates
|
// convert coordinates
|
||||||
if (event.action == MouseAction.ButtonUp || event.action == MouseAction.ButtonDown || event.action == MouseAction.Move) {
|
if (event.action == MouseAction.ButtonUp || event.action == MouseAction.ButtonDown || event.action == MouseAction.Move) {
|
||||||
int x = event.x;
|
int x = event.x;
|
||||||
int y = event.y;
|
int y = event.y;
|
||||||
x -= _clientRect.left;
|
x -= _clientRect.left;
|
||||||
y -= _clientRect.top;
|
y -= _clientRect.top;
|
||||||
|
if (_headerRows)
|
||||||
|
insideHeaderRow = y < _rowCumulativeHeights[_headerRows - 1];
|
||||||
|
if (_headerCols)
|
||||||
|
insideHeaderCol = y < _colCumulativeWidths[_headerCols - 1];
|
||||||
cellFound = pointToCell(x, y, c, r, rc);
|
cellFound = pointToCell(x, y, c, r, rc);
|
||||||
normalCell = c >= _headerCols && r >= _headerRows;
|
normalCell = c >= _headerCols && r >= _headerRows;
|
||||||
}
|
}
|
||||||
if (event.action == MouseAction.ButtonDown && event.button == MouseButton.Left) {
|
if (event.action == MouseAction.ButtonDown && event.button == MouseButton.Left) {
|
||||||
if (canFocus && !focused)
|
if (canFocus && !focused)
|
||||||
setFocus();
|
setFocus();
|
||||||
|
int resizeCol = isColumnResizingPoint(event.x, event.y);
|
||||||
|
if (resizeCol >= 0) {
|
||||||
|
// start column resizing
|
||||||
|
startColResize(resizeCol, event.x);
|
||||||
|
event.track(this);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (cellFound && normalCell) {
|
if (cellFound && normalCell) {
|
||||||
if (c == _col && r == _row && event.doubleClick) {
|
if (c == _col && r == _row && event.doubleClick) {
|
||||||
activateCell(c, r);
|
activateCell(c, r);
|
||||||
|
|
@ -1541,8 +1633,9 @@ class StringGridWidget : StringGridWidgetBase {
|
||||||
}
|
}
|
||||||
buf.fillRect(rc, cl);
|
buf.fillRect(rc, cl);
|
||||||
static if (BACKEND_GUI) {
|
static if (BACKEND_GUI) {
|
||||||
buf.drawLine(Point(rc.right, rc.bottom), Point(rc.right, rc.top), _cellHeaderBorderColor); // vertical
|
uint borderColor = _cellHeaderBorderColor;
|
||||||
buf.drawLine(Point(rc.left, rc.bottom), Point(rc.right - 1, rc.bottom), _cellHeaderBorderColor); // horizontal
|
buf.drawLine(Point(rc.right - 1, rc.bottom), Point(rc.right - 1, rc.top), _cellHeaderBorderColor); // vertical
|
||||||
|
buf.drawLine(Point(rc.left, rc.bottom - 1), Point(rc.right - 1, rc.bottom - 1), _cellHeaderBorderColor); // horizontal
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1553,14 +1646,15 @@ class StringGridWidget : StringGridWidgetBase {
|
||||||
bool selectedCell = selectedCol && selectedRow;
|
bool selectedCell = selectedCol && selectedRow;
|
||||||
if (_rowSelect && selectedRow)
|
if (_rowSelect && selectedRow)
|
||||||
selectedCell = true;
|
selectedCell = true;
|
||||||
// normal cell background
|
uint borderColor = _cellBorderColor;
|
||||||
if (c < fixedCols || r < fixedRows) {
|
if (c < fixedCols || r < fixedRows) {
|
||||||
// fixed cell background
|
// fixed cell background
|
||||||
buf.fillRect(rc, _fixedCellBackgroundColor);
|
buf.fillRect(rc, _fixedCellBackgroundColor);
|
||||||
|
borderColor = _fixedCellBorderColor;
|
||||||
}
|
}
|
||||||
static if (BACKEND_GUI) {
|
static if (BACKEND_GUI) {
|
||||||
buf.drawLine(Point(rc.left, rc.bottom + 1), Point(rc.left, rc.top), _cellBorderColor); // vertical
|
buf.drawLine(Point(rc.left, rc.bottom + 1), Point(rc.left, rc.top), borderColor); // vertical
|
||||||
buf.drawLine(Point(rc.left, rc.bottom), Point(rc.right - 1, rc.bottom), _cellBorderColor); // horizontal
|
buf.drawLine(Point(rc.left, rc.bottom - 1), Point(rc.right - 1, rc.bottom - 1), borderColor); // horizontal
|
||||||
}
|
}
|
||||||
if (selectedCell) {
|
if (selectedCell) {
|
||||||
static if (BACKEND_GUI) {
|
static if (BACKEND_GUI) {
|
||||||
|
|
@ -1585,6 +1679,7 @@ class StringGridWidget : StringGridWidgetBase {
|
||||||
_selectionColorRowSelect = style.customColor("grid_selection_color_row", 0xC0A0B0FF);
|
_selectionColorRowSelect = style.customColor("grid_selection_color_row", 0xC0A0B0FF);
|
||||||
_fixedCellBackgroundColor = style.customColor("grid_cell_background_fixed", 0xC0E0E0E0);
|
_fixedCellBackgroundColor = style.customColor("grid_cell_background_fixed", 0xC0E0E0E0);
|
||||||
_cellBorderColor = style.customColor("grid_cell_border_color", 0xC0C0C0C0);
|
_cellBorderColor = style.customColor("grid_cell_border_color", 0xC0C0C0C0);
|
||||||
|
_fixedCellBorderColor = style.customColor("grid_cell_border_color_fixed", _cellBorderColor);
|
||||||
_cellHeaderBorderColor = style.customColor("grid_cell_border_color_header", 0xC0202020);
|
_cellHeaderBorderColor = style.customColor("grid_cell_border_color_header", 0xC0202020);
|
||||||
_cellHeaderBackgroundColor = style.customColor("grid_cell_background_header", 0xC0909090);
|
_cellHeaderBackgroundColor = style.customColor("grid_cell_background_header", 0xC0909090);
|
||||||
_cellHeaderSelectedBackgroundColor = style.customColor("grid_cell_background_header_selected", 0x80FFC040);
|
_cellHeaderSelectedBackgroundColor = style.customColor("grid_cell_background_header_selected", 0x80FFC040);
|
||||||
|
|
|
||||||
|
|
@ -319,11 +319,11 @@ class ScrollBar : AbstractSlider, OnClickHandler {
|
||||||
/// sets scrollbar orientation
|
/// sets scrollbar orientation
|
||||||
override @property AbstractSlider orientation(Orientation value) {
|
override @property AbstractSlider orientation(Orientation value) {
|
||||||
if (_orientation != value) {
|
if (_orientation != value) {
|
||||||
_orientation = value;
|
_orientation = value;
|
||||||
_btnBack.drawableId = style.customDrawableId(_orientation == Orientation.Vertical ? ATTR_SCROLLBAR_BUTTON_UP : ATTR_SCROLLBAR_BUTTON_LEFT);
|
_btnBack.drawableId = style.customDrawableId(_orientation == Orientation.Vertical ? ATTR_SCROLLBAR_BUTTON_UP : ATTR_SCROLLBAR_BUTTON_LEFT);
|
||||||
_btnForward.drawableId = style.customDrawableId(_orientation == Orientation.Vertical ? ATTR_SCROLLBAR_BUTTON_DOWN : ATTR_SCROLLBAR_BUTTON_RIGHT);
|
_btnForward.drawableId = style.customDrawableId(_orientation == Orientation.Vertical ? ATTR_SCROLLBAR_BUTTON_DOWN : ATTR_SCROLLBAR_BUTTON_RIGHT);
|
||||||
_indicator.drawableId = style.customDrawableId(_orientation == Orientation.Vertical ? ATTR_SCROLLBAR_INDICATOR_VERTICAL : ATTR_SCROLLBAR_INDICATOR_HORIZONTAL);
|
_indicator.drawableId = style.customDrawableId(_orientation == Orientation.Vertical ? ATTR_SCROLLBAR_INDICATOR_VERTICAL : ATTR_SCROLLBAR_INDICATOR_HORIZONTAL);
|
||||||
requestLayout();
|
requestLayout();
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue