Make FOrders toolbar responsive without stretching filter controls.
Wrap selectors on narrow windows, cap text and combo widths on wide layouts, and move the comment button to a new row when space is tight. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
36d4374db6
commit
46564ee942
@ -86,64 +86,169 @@ namespace Электронная_Фармация.UserControls
|
|||||||
UiThemeHelper.ApplyToControlTree(_btnSendOrder);
|
UiThemeHelper.ApplyToControlTree(_btnSendOrder);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static int FitControlWidth(int preferred, int minimum, int available)
|
||||||
|
{
|
||||||
|
return Math.Max(minimum, Math.Min(preferred, available));
|
||||||
|
}
|
||||||
|
|
||||||
private void ApplyToolbarLayout()
|
private void ApplyToolbarLayout()
|
||||||
{
|
{
|
||||||
const int pad = 12;
|
const int pad = 12;
|
||||||
const int gap = 8;
|
const int gap = 8;
|
||||||
const int row1Y = 10;
|
|
||||||
const int controlHeight = 32;
|
const int controlHeight = 32;
|
||||||
const int filterHeight = 33;
|
const int filterHeight = 33;
|
||||||
const int buttonHeight = 34;
|
const int buttonHeight = 34;
|
||||||
const int rowGap = 14;
|
const int rowGap = 10;
|
||||||
const int row2Y = row1Y + buttonHeight + rowGap;
|
const int dateWidth = 112;
|
||||||
const int commentWidth = 200;
|
const int deleteWidth = 138;
|
||||||
const int filterY = row1Y + (buttonHeight - filterHeight) / 2;
|
const int sendWidth = 158;
|
||||||
|
const int clearSize = 32;
|
||||||
|
const int commentMaxWidth = 200;
|
||||||
|
const int commentMinWidth = 132;
|
||||||
|
const int textMinWidth = 108;
|
||||||
|
const int textPreferredWidth = 220;
|
||||||
|
const int statusPreferredWidth = 150;
|
||||||
|
const int supplierPreferredWidth = 170;
|
||||||
|
const int consigneePreferredWidth = 190;
|
||||||
|
|
||||||
|
var panelWidth = Math.Max(panelToolbar.ClientSize.Width, 320);
|
||||||
|
int y = 10;
|
||||||
|
|
||||||
int x = pad;
|
int x = pad;
|
||||||
|
label2.Location = new Point(x, y + 5);
|
||||||
label2.Location = new Point(x, row1Y + 5);
|
|
||||||
x = label2.Right + 6;
|
x = label2.Right + 6;
|
||||||
dtpDateFrom.SetBounds(x, row1Y, 118, controlHeight);
|
dtpDateFrom.SetBounds(x, y, dateWidth, controlHeight);
|
||||||
x = dtpDateFrom.Right + 6;
|
x = dtpDateFrom.Right + 6;
|
||||||
label1.Location = new Point(x, row1Y + 4);
|
label1.Location = new Point(x, y + 4);
|
||||||
x = label1.Right + 6;
|
x = label1.Right + 6;
|
||||||
dtpDateTo.SetBounds(x, row1Y, 118, controlHeight);
|
dtpDateTo.SetBounds(x, y, dateWidth, controlHeight);
|
||||||
|
int datesRight = dtpDateTo.Right;
|
||||||
|
|
||||||
int right = panelToolbar.ClientSize.Width - pad;
|
int deleteLeft = panelWidth - pad - deleteWidth;
|
||||||
|
btnDeleteOrder.SetBounds(deleteLeft, y, deleteWidth, buttonHeight);
|
||||||
|
int sendLeft = btnDeleteOrder.Left - gap - sendWidth;
|
||||||
|
_btnSendOrder.SetBounds(sendLeft, y, sendWidth, buttonHeight);
|
||||||
|
int actionsLeft = _btnSendOrder.Left;
|
||||||
|
|
||||||
btnDeleteOrder.SetBounds(right - 148, row1Y, 148, buttonHeight);
|
int middleAvailable = actionsLeft - datesRight - gap;
|
||||||
right = btnDeleteOrder.Left - gap;
|
int statusMin = 108;
|
||||||
|
int supplierMin = 118;
|
||||||
|
int consigneeMin = 128;
|
||||||
|
int combosMin = statusMin + supplierMin + consigneeMin + gap * 2;
|
||||||
|
int combosPreferred = statusPreferredWidth + supplierPreferredWidth + consigneePreferredWidth + gap * 2;
|
||||||
|
bool wrapCombos = middleAvailable < combosMin;
|
||||||
|
|
||||||
_btnSendOrder.SetBounds(right - 168, row1Y, 168, buttonHeight);
|
comboSuppliers.Visible = true;
|
||||||
right = _btnSendOrder.Left - gap;
|
_comboOrderStatus.Visible = true;
|
||||||
|
_comboConsignees.Visible = true;
|
||||||
|
|
||||||
_comboConsignees.SetBounds(right - 190, filterY, 190, filterHeight);
|
if (wrapCombos)
|
||||||
right = _comboConsignees.Left - gap;
|
{
|
||||||
|
y += buttonHeight + rowGap;
|
||||||
|
int filterY = y + (buttonHeight - filterHeight) / 2;
|
||||||
|
int comboRowWidth = panelWidth - pad * 2;
|
||||||
|
int statusWidth;
|
||||||
|
int supplierWidth;
|
||||||
|
int consigneeWidth;
|
||||||
|
|
||||||
comboSuppliers.SetBounds(right - 170, filterY, 170, filterHeight);
|
if (comboRowWidth >= combosPreferred)
|
||||||
right = comboSuppliers.Left - gap;
|
{
|
||||||
|
statusWidth = statusPreferredWidth;
|
||||||
_comboOrderStatus.SetBounds(right - 150, filterY, 150, filterHeight);
|
supplierWidth = supplierPreferredWidth;
|
||||||
|
consigneeWidth = consigneePreferredWidth;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
float scale = (comboRowWidth - gap * 2) / (float)(statusPreferredWidth + supplierPreferredWidth + consigneePreferredWidth);
|
||||||
|
statusWidth = Math.Max(statusMin, (int)(statusPreferredWidth * scale));
|
||||||
|
supplierWidth = Math.Max(supplierMin, (int)(supplierPreferredWidth * scale));
|
||||||
|
consigneeWidth = Math.Max(consigneeMin, comboRowWidth - statusWidth - supplierWidth - gap * 2);
|
||||||
|
}
|
||||||
|
|
||||||
x = pad;
|
x = pad;
|
||||||
txtGoodFromOrders.SetBounds(x, row2Y, 220, controlHeight);
|
_comboOrderStatus.SetBounds(x, filterY, statusWidth, filterHeight);
|
||||||
|
x = _comboOrderStatus.Right + gap;
|
||||||
|
comboSuppliers.SetBounds(x, filterY, supplierWidth, filterHeight);
|
||||||
|
x = comboSuppliers.Right + gap;
|
||||||
|
_comboConsignees.SetBounds(x, filterY, consigneeWidth, filterHeight);
|
||||||
|
|
||||||
|
y += buttonHeight + rowGap;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int filterY = y + (buttonHeight - filterHeight) / 2;
|
||||||
|
int statusWidth = statusPreferredWidth;
|
||||||
|
int supplierWidth = supplierPreferredWidth;
|
||||||
|
int consigneeWidth = consigneePreferredWidth;
|
||||||
|
|
||||||
|
if (middleAvailable < combosPreferred)
|
||||||
|
{
|
||||||
|
float scale = middleAvailable / (float)combosPreferred;
|
||||||
|
statusWidth = Math.Max(statusMin, (int)(statusPreferredWidth * scale));
|
||||||
|
supplierWidth = Math.Max(supplierMin, (int)(supplierPreferredWidth * scale));
|
||||||
|
consigneeWidth = Math.Max(consigneeMin, middleAvailable - statusWidth - supplierWidth - gap * 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
int comboRight = actionsLeft - gap;
|
||||||
|
_comboConsignees.SetBounds(comboRight - consigneeWidth, filterY, consigneeWidth, filterHeight);
|
||||||
|
comboRight = _comboConsignees.Left - gap;
|
||||||
|
comboSuppliers.SetBounds(comboRight - supplierWidth, filterY, supplierWidth, filterHeight);
|
||||||
|
comboRight = comboSuppliers.Left - gap;
|
||||||
|
_comboOrderStatus.SetBounds(comboRight - statusWidth, filterY, statusWidth, filterHeight);
|
||||||
|
|
||||||
|
y += buttonHeight + rowGap;
|
||||||
|
}
|
||||||
|
|
||||||
|
int searchY = y;
|
||||||
|
int contentWidth = panelWidth - pad * 2;
|
||||||
|
int fixedControlsWidth = clearSize * 2 + gap * 4 + commentMinWidth;
|
||||||
|
int textAreaWidth = contentWidth - fixedControlsWidth;
|
||||||
|
bool wrapComment = textAreaWidth < textMinWidth * 2;
|
||||||
|
|
||||||
|
int textWidth;
|
||||||
|
if (wrapComment)
|
||||||
|
{
|
||||||
|
int narrowTextArea = contentWidth - clearSize * 2 - gap * 2;
|
||||||
|
textWidth = FitControlWidth(textPreferredWidth, textMinWidth, narrowTextArea / 2);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
textWidth = textPreferredWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
int commentWidth = wrapComment
|
||||||
|
? Math.Min(commentMaxWidth, contentWidth)
|
||||||
|
: commentMaxWidth;
|
||||||
|
|
||||||
|
x = pad;
|
||||||
|
txtGoodFromOrders.SetBounds(x, searchY, textWidth, controlHeight);
|
||||||
x = txtGoodFromOrders.Right + gap;
|
x = txtGoodFromOrders.Right + gap;
|
||||||
btnClearGoodSearch.SetBounds(x, row2Y, 32, controlHeight);
|
btnClearGoodSearch.SetBounds(x, searchY, clearSize, controlHeight);
|
||||||
x = btnClearGoodSearch.Right + gap;
|
x = btnClearGoodSearch.Right + gap;
|
||||||
txtOrderNumberFilter.SetBounds(x, row2Y, 220, controlHeight);
|
txtOrderNumberFilter.SetBounds(x, searchY, textWidth, controlHeight);
|
||||||
x = txtOrderNumberFilter.Right + gap;
|
x = txtOrderNumberFilter.Right + gap;
|
||||||
btnClearOrderNumberFilter.SetBounds(x, row2Y, 32, controlHeight);
|
btnClearOrderNumberFilter.SetBounds(x, searchY, clearSize, controlHeight);
|
||||||
x = btnClearOrderNumberFilter.Right + gap;
|
x = btnClearOrderNumberFilter.Right + gap;
|
||||||
|
|
||||||
btnAddComment.SetBounds(x, row2Y, commentWidth, buttonHeight);
|
if (wrapComment)
|
||||||
|
{
|
||||||
|
searchY += controlHeight + rowGap;
|
||||||
|
btnAddComment.SetBounds(pad, searchY, commentWidth, buttonHeight);
|
||||||
|
y = searchY + buttonHeight;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
btnAddComment.SetBounds(x, searchY, commentWidth, buttonHeight);
|
||||||
ModernButtonStyles.FitToText(btnAddComment, buttonHeight);
|
ModernButtonStyles.FitToText(btnAddComment, buttonHeight);
|
||||||
|
y = searchY + buttonHeight;
|
||||||
|
}
|
||||||
|
|
||||||
ModernButtonStyles.ApplyClear(btnClearGoodSearch);
|
ModernButtonStyles.ApplyClear(btnClearGoodSearch);
|
||||||
ModernButtonStyles.ApplyClear(btnClearOrderNumberFilter);
|
ModernButtonStyles.ApplyClear(btnClearOrderNumberFilter);
|
||||||
|
|
||||||
btnClearSuppliers.Visible = false;
|
btnClearSuppliers.Visible = false;
|
||||||
|
|
||||||
panelToolbar.Height = row2Y + buttonHeight + pad + 8;
|
panelToolbar.Height = y + pad + 8;
|
||||||
panelToolbar.Padding = new Padding(pad, 10, pad, 14);
|
panelToolbar.Padding = new Padding(pad, 10, pad, 14);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user