mirror of https://github.com/adamdruppe/arsd.git
add width percent
This commit is contained in:
parent
8c43fa1196
commit
b2aae8b83c
86
minigui.d
86
minigui.d
|
@ -7521,10 +7521,11 @@ class TableView : Widget {
|
||||||
// FIXME: auto-size columns on double click of header thing like in Windows
|
// FIXME: auto-size columns on double click of header thing like in Windows
|
||||||
// it need only make the currently displayed things fit well.
|
// it need only make the currently displayed things fit well.
|
||||||
|
|
||||||
version(custom_widgets) private {
|
|
||||||
ColumnInfo[] columns;
|
|
||||||
int itemCount;
|
|
||||||
|
|
||||||
|
private ColumnInfo[] columns;
|
||||||
|
private int itemCount;
|
||||||
|
|
||||||
|
version(custom_widgets) private {
|
||||||
TableViewWidgetInner tvwi;
|
TableViewWidgetInner tvwi;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7533,6 +7534,32 @@ class TableView : Widget {
|
||||||
const(char)[] name; /// the name displayed in the header
|
const(char)[] name; /// the name displayed in the header
|
||||||
int width; /// the default width, in pixels
|
int width; /// the default width, in pixels
|
||||||
TextAlignment alignment; /// alignment of the text in the cell
|
TextAlignment alignment; /// alignment of the text in the cell
|
||||||
|
|
||||||
|
/++
|
||||||
|
After all the pixel widths have been assigned, any left over
|
||||||
|
space is divided up among all columns and distributed to according
|
||||||
|
to the widthPercent field.
|
||||||
|
|
||||||
|
For example, if you have two fields, both with width 50 and one with
|
||||||
|
widthPercent of 25 and the other with widthPercent of 75, and the
|
||||||
|
container is 200 pixels wide, first both get their width of 50.
|
||||||
|
then the 100 remaining pixels are split up, so the one gets a total
|
||||||
|
of 75 pixels and the other gets a total of 125.
|
||||||
|
|
||||||
|
This is automatically applied as the window is resized.
|
||||||
|
|
||||||
|
If there is not enough space - that is, when a horizontal scrollbar
|
||||||
|
needs to appear - there are 0 pixels divided up, and thus everyone
|
||||||
|
gets 0. This can cause a column to shrink out of proportion when
|
||||||
|
passing the scroll threshold.
|
||||||
|
|
||||||
|
History:
|
||||||
|
Added November 10, 2021 (dub v10.4)
|
||||||
|
+/
|
||||||
|
int widthPercent;
|
||||||
|
|
||||||
|
|
||||||
|
private int calculatedWidth;
|
||||||
}
|
}
|
||||||
/++
|
/++
|
||||||
Sets the number of columns along with information about the headers.
|
Sets the number of columns along with information about the headers.
|
||||||
|
@ -7541,18 +7568,21 @@ class TableView : Widget {
|
||||||
and is always left aligned.
|
and is always left aligned.
|
||||||
+/
|
+/
|
||||||
void setColumnInfo(ColumnInfo[] columns...) {
|
void setColumnInfo(ColumnInfo[] columns...) {
|
||||||
version(custom_widgets) {
|
|
||||||
this.columns = columns.dup;
|
|
||||||
foreach(ref c; this.columns)
|
|
||||||
c.name = c.name.idup;
|
|
||||||
|
|
||||||
|
foreach(ref c; this.columns)
|
||||||
|
c.name = c.name.idup;
|
||||||
|
this.columns = columns.dup;
|
||||||
|
|
||||||
|
updateCalculatedWidth(false);
|
||||||
|
|
||||||
|
version(custom_widgets) {
|
||||||
tvwi.header.updateHeaders();
|
tvwi.header.updateHeaders();
|
||||||
tvwi.updateScrolls();
|
tvwi.updateScrolls();
|
||||||
} else version(win32_widgets)
|
} else version(win32_widgets)
|
||||||
foreach(i, column; columns) {
|
foreach(i, ref column; columns) {
|
||||||
LVCOLUMN lvColumn;
|
LVCOLUMN lvColumn;
|
||||||
lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
|
lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
|
||||||
lvColumn.cx = column.width;
|
lvColumn.cx = column.calculatedWidth;
|
||||||
|
|
||||||
auto bfr = WCharzBuffer(column.name);
|
auto bfr = WCharzBuffer(column.name);
|
||||||
lvColumn.pszText = bfr.ptr;
|
lvColumn.pszText = bfr.ptr;
|
||||||
|
@ -7569,12 +7599,36 @@ class TableView : Widget {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updateCalculatedWidth(bool informWindows) {
|
||||||
|
|
||||||
|
int remaining = this.width;
|
||||||
|
foreach(column; columns)
|
||||||
|
remaining -= column.width;
|
||||||
|
if(remaining < 0)
|
||||||
|
remaining = 0;
|
||||||
|
|
||||||
|
foreach(i, ref column; columns) {
|
||||||
|
auto c = column.width + (remaining * column.widthPercent) / 100;
|
||||||
|
column.calculatedWidth = c;
|
||||||
|
version(win32_widgets)
|
||||||
|
if(informWindows)
|
||||||
|
SendMessage(hwnd, LVM_SETCOLUMNWIDTH, i, c); // LVSCW_AUTOSIZE or LVSCW_AUTOSIZE_USEHEADER are amazing omg
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
override void registerMovement() {
|
||||||
|
super.registerMovement();
|
||||||
|
|
||||||
|
updateCalculatedWidth(true);
|
||||||
|
}
|
||||||
|
|
||||||
/++
|
/++
|
||||||
Tells the view how many items are in it. It uses this to set the scroll bar, but the items are not added per se; it calls [getData] as-needed.
|
Tells the view how many items are in it. It uses this to set the scroll bar, but the items are not added per se; it calls [getData] as-needed.
|
||||||
+/
|
+/
|
||||||
void setItemCount(int count) {
|
void setItemCount(int count) {
|
||||||
|
this.itemCount = count;
|
||||||
version(custom_widgets) {
|
version(custom_widgets) {
|
||||||
this.itemCount = count;
|
|
||||||
tvwi.updateScrolls();
|
tvwi.updateScrolls();
|
||||||
redraw();
|
redraw();
|
||||||
} else version(win32_widgets) {
|
} else version(win32_widgets) {
|
||||||
|
@ -7586,9 +7640,9 @@ class TableView : Widget {
|
||||||
Clears all items;
|
Clears all items;
|
||||||
+/
|
+/
|
||||||
void clear() {
|
void clear() {
|
||||||
|
this.itemCount = 0;
|
||||||
|
this.columns = null;
|
||||||
version(custom_widgets) {
|
version(custom_widgets) {
|
||||||
this.itemCount = 0;
|
|
||||||
this.columns = null;
|
|
||||||
tvwi.header.updateHeaders();
|
tvwi.header.updateHeaders();
|
||||||
tvwi.updateScrolls();
|
tvwi.updateScrolls();
|
||||||
redraw();
|
redraw();
|
||||||
|
@ -7711,12 +7765,12 @@ private class TableViewWidgetInner : Widget {
|
||||||
break;
|
break;
|
||||||
x = 0;
|
x = 0;
|
||||||
foreach(columnNumber, column; tvw.columns) {
|
foreach(columnNumber, column; tvw.columns) {
|
||||||
auto x2 = x + column.width;
|
auto x2 = x + column.calculatedWidth;
|
||||||
auto smwx = smw.position.x;
|
auto smwx = smw.position.x;
|
||||||
|
|
||||||
if(x2 > smwx /* if right side of it is visible at all */ || (x >= smwx && x < smwx + this.width) /* left side is visible at all*/) {
|
if(x2 > smwx /* if right side of it is visible at all */ || (x >= smwx && x < smwx + this.width) /* left side is visible at all*/) {
|
||||||
auto startX = x;
|
auto startX = x;
|
||||||
auto endX = x + column.width;
|
auto endX = x + column.calculatedWidth;
|
||||||
switch (column.alignment & (TextAlignment.Left | TextAlignment.Center | TextAlignment.Right)) {
|
switch (column.alignment & (TextAlignment.Left | TextAlignment.Center | TextAlignment.Right)) {
|
||||||
case TextAlignment.Left: startX += padding; break;
|
case TextAlignment.Left: startX += padding; break;
|
||||||
case TextAlignment.Center: startX += padding; endX -= padding; break;
|
case TextAlignment.Center: startX += padding; endX -= padding; break;
|
||||||
|
@ -7729,7 +7783,7 @@ private class TableViewWidgetInner : Widget {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
x += column.width;
|
x += column.calculatedWidth;
|
||||||
}
|
}
|
||||||
row++;
|
row++;
|
||||||
y += lh;
|
y += lh;
|
||||||
|
@ -7774,7 +7828,7 @@ private class TableViewWidgetInner : Widget {
|
||||||
continue;
|
continue;
|
||||||
child.x = pos;
|
child.x = pos;
|
||||||
child.y = 0;
|
child.y = 0;
|
||||||
child.width = tvw.tvw.columns[idx].width;
|
child.width = tvw.tvw.columns[idx].calculatedWidth;
|
||||||
child.height = 16;// this.height;
|
child.height = 16;// this.height;
|
||||||
pos += child.width;
|
pos += child.width;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue