public void ResetOrderPanelSize() { _sizeMeasure = new Size(_colWidth, double.MaxValue); _pageColsCount = Convert.ToInt32(WpfHelper.GetAppGlobalValue("OrdersColumnsCount")); _colWidth = Convert.ToDouble(WpfHelper.GetAppGlobalValue("OrdersColumnWidth")); _colMargin = Convert.ToDouble(WpfHelper.GetAppGlobalValue("OrdersColumnMargin")); _hdrTopMargin = Convert.ToDouble(WpfHelper.GetAppGlobalValue("OrderPanelTopMargin")); _colHeight = _canvas.ActualHeight; // высота столбца OrderPanel minHeaderPanel = new OrderPanel(null, 0, _colWidth, false); _canvas.Children.Add(minHeaderPanel); DishDelimeterPanel continuePanel = createContinuePanel(true); _canvas.Children.Add(continuePanel); // измерение высоты служебных панелей #if fromActualHeight _canvas.UpdateLayout(); _ordHeaderMinHeight = minHeaderPanel.ActualHeight; _continuePanelHeight = continuePanel.ActualHeight; #else _canvas.Measure(_sizeMeasure); _ordHeaderMinHeight = minHeaderPanel.DesiredSize.Height; _continuePanelHeight = continuePanel.DesiredSize.Height; #endif _canvas.Children.Clear(); minHeaderPanel = null; }
internal void DelOrder(OrderPanel panel) { if (_ordPanels.Contains(panel)) { _ordPanels.Remove(panel); base.Children.Remove(panel); } }
private void setLastPanelPosition(OrderPanel curPanel, double panelHeight = 0d) { // при смещении назад, curTopValue указывает на Bottom панели if (!_shiftForward) { curTopValue -= ((panelHeight == 0d) ? curPanel.PanelHeight : panelHeight); } setPanelLeftTop(curPanel); // при движение вперед, сместить Top на величину _hdrTopMargin if (_shiftForward) { curTopValue += ((panelHeight == 0d) ? curPanel.PanelHeight : panelHeight); curTopValue += _hdrTopMargin; if (curTopValue > _colHeight) { curColIndex++; curTopValue = 0d; // выход за последнюю колонку if (curColIndex > _pageColsCount) { curColIndex = 1; _pageBreak = true; } } } // при движение назад else { curTopValue -= _hdrTopMargin; if (curTopValue <= 0d) { curColIndex--; curTopValue = _colHeight; } // выход за первую колонку if (curColIndex <= 0) { if ((double)curPanel.GetValue(Canvas.TopProperty) != 0d) { curPanel.SetValue(Canvas.TopProperty, 0d); } // curTopValue уже равно _colHeight; curColIndex = _pageColsCount; _pageBreak = true; } } }
private void moveToNewCol(OrderPanel ordPnl) { int iPagePrev = _currentPageIndex; setNextColumn(); ordPnl.SetPosition(_curTopValue, getLeftOrdPnl()); // добавлена новая страница(канва) - перенести панель заказа из предыд.канвы в текущую if (iPagePrev != _currentPageIndex) { OrdersPage page = _pages[iPagePrev - 1]; page.DelOrder(ordPnl); ordPnl.SetPosition(_curTopValue, getLeftOrdPnl()); CurrentPage.AddOrder(ordPnl); } }
private OrderPanel createOrderPanel(OrderViewModel orderModel, int dishIdxFrom, int dishIdxTo, bool isTailSplit) { if (dishIdxFrom > dishIdxTo) { return(null); } OrderPanel ordPanel = new OrderPanel(orderModel, 0, _colWidth, (dishIdxFrom == 0 ? true: false)); // не с первого блюда - добавляем разделитель продолжения на предыд.странице if (dishIdxFrom != 0) { ordPanel.AddDelimiter(createContinuePanel(false)); } OrderDishViewModel dishModel; int curFiling = 0; for (int i = dishIdxFrom; i <= dishIdxTo; i++) { dishModel = orderModel.Dishes[i]; // разделитель подач if (curFiling != dishModel.FilingNumber) { curFiling = dishModel.FilingNumber; DishDelimeterPanel newDelimPanel = createFilingPanel(curFiling); ordPanel.AddDelimiter(newDelimPanel); } // панель блюда DishPanel dishPanel = new DishPanel(dishModel, _colWidth); ordPanel.AddDish(dishPanel); } // оторванных хвост (dishIdxTo меньше кол-ва элементов) - добавляем разделитель продолжения на след.странице if (isTailSplit) { ordPanel.AddDelimiter(createContinuePanel(true)); } return(ordPanel); }
// возвращает следующий/предыдущий блок элементов панели заказа // блок элементов - это блюдо с предварительным разделителем подач (точнее панель-разделитель, у которой свойство DontTearOffNext = true), // или блюдо с ингредиентами, // или заголовок заказа с несколькими первыми элементами (не менее 2-х) // или два ингредиента // isDetachItems == true - блоки отсоединяются от панели // forceForward - принудительный просмотр вперед, иначе направление движения зависит от _shiftForward private List <FrameworkElement> getNextItemsBlock(OrderPanel orderPanel, bool isDetachItems, bool forceForward = false) { List <FrameworkElement> retVal = new List <FrameworkElement>(); bool addToBlock, endBlock = false; int dishesCount = 0, delimCount = 0, ingrCount = 0; // счетчики элементов блока bool isForward = (forceForward) ? true : _shiftForward; int i = ((isForward) ? 0 : orderPanel.ItemsCount - 1); FrameworkElement uiElem; while ((isDetachItems) ? orderPanel.ItemsCount > 0 : i < orderPanel.DishPanels.Count) { // в режиме отсоединения элементов берем граничный элемент if (isDetachItems) { i = ((isForward) ? 0 : orderPanel.ItemsCount - 1); } uiElem = (FrameworkElement)orderPanel.DishPanels[i]; // иначе увеличиваем индекс элемента if (!isDetachItems) { ++i; } addToBlock = true; // признак включения элемента в блок // разделитель if (uiElem is DishDelimeterPanel) { if (((DishDelimeterPanel)uiElem).DontTearOffNext) // не отрывать от следующего { // считаем только неотрываемые разделители delimCount++; // при прямом проходе неотрываемый разделитель может быть только один if (isForward) { if (delimCount > 1) { addToBlock = false; endBlock = true; } // не добавлять и выйти } // при обратном проходе else { endBlock = true; // добавить и выйти } } // отрываемый разделитель, поведение, как у блюда, но без ингредиентов, поэтому он может быть только один // как в прямом, так и в обратном направлениях else { endBlock = true; } } // блюдо else if (uiElem is DishPanel) { DishPanel dsPnl = (uiElem as DishPanel); // блюдо if (dsPnl.DishView.ParentUID.IsNull()) { dishesCount++; // при прямом проходе блюдо может быть только одно if (isForward) { // уже был ингредиент или блюдо - не добавлять и выйти if ((ingrCount > 0) || (dishesCount > 1)) { addToBlock = false; endBlock = true; } } // при обратном проходе перед блюдом может быть разделитель подач else { // не добавлять и выйти if (dishesCount > 1) { addToBlock = false; endBlock = true; } } } // ингредиент, из ингредиентов делаем блоки по 2 элемента, если перед ними не было блюда else { if (isForward) { ingrCount++; // не добавлять больше 2-х ингредиентов if (ingrCount > 2) { addToBlock = false; endBlock = true; } } else { if (dishesCount == 0) { ingrCount++; // не добавлять больше 2-х ингредиентов if (ingrCount > 2) { addToBlock = false; endBlock = true; } } else // не добавлять и выйти { addToBlock = false; endBlock = true; } } } } if (addToBlock) { retVal.Add(uiElem); // и отсоединить от панели заказа if (isDetachItems) { orderPanel.DetachDish(uiElem); } } if (endBlock) { break; } } // for next if (retVal.Count == 0) { retVal = null; } return(retVal); }
// возвращает признак повторного размещения при движении назад: // много свободного места на панели временного размещения _canvas internal bool NeedRelayout() { // нет панелей - выход if (this.OrderPanels.Count == 0) { return(false); } UIElement panel1 = this.OrderPanels[0]; int panel1ColIndex = ((OrderPanel)panel1).CanvasColumnIndex; // только одна панель заказа и она в первой колонке - не переразмещаем if ((this.OrderPanels.Count == 1) && (panel1ColIndex == 1)) { if ((double)panel1.GetValue(Canvas.TopProperty) != 0d) { panel1.SetValue(Canvas.TopProperty, 0d); } return(false); } // а если первая панель не в первой колонке, то переразмещаем if (panel1ColIndex != 1) { return(true); } // перед первой панелью есть пустое место else if ((double)((OrderPanel)panel1).GetValue(Canvas.TopProperty) != 0d) { return(true); } bool retVal = false; // несколько панелей - цикл по панелям на странице // признак переразмещения: // 1. свободное место по вертикали между соседними панелями в одной колонке // больше (или в два раза меньше, 2017-12-21) _hdrTopMargin // 2. если панели одного заказа и следующая панель начинается со следующей колонки (или Top==0) и блок из следующей панели можно разместить в свободном месте в конце предыдущей колонки OrderPanel prePanel, nextPanel = (OrderPanel)_canvas.Children[0]; double prePanelTop, prePanelHeight, nextPanelTop, freeSpace, h1; for (int i = 1; i < _canvas.Children.Count; i++) { // две соседние панели prePanel = nextPanel; nextPanel = (OrderPanel)_canvas.Children[i]; prePanelTop = (double)prePanel.GetValue(Canvas.TopProperty); prePanelHeight = prePanel.PanelHeight; // в одной колонке, проверяем расстояние между панелями по вертикали if (prePanel.CanvasColumnIndex == nextPanel.CanvasColumnIndex) { nextPanelTop = (double)nextPanel.GetValue(Canvas.TopProperty); freeSpace = nextPanelTop - (prePanelTop + prePanelHeight); if (freeSpace > _hdrTopMargin) { retVal = true; break; } if (freeSpace < (_hdrTopMargin / 2.0d)) { retVal = true; break; } } // проверка на пустую колонку else if ((nextPanel.CanvasColumnIndex - prePanel.CanvasColumnIndex) > 1) { retVal = true; break; } // разные колонки else { // nextPanel - это первая панель следующей колонки, ее Top должен быть = 0 nextPanelTop = (double)nextPanel.GetValue(Canvas.TopProperty); if (nextPanelTop != 0d) { retVal = true; break; } // если панель в след.колонке - это продолжение предыд.панели, // то проверяем может ли в свободное место после предыд.панели поместиться // первый блок элементов след.панели if (nextPanel.OrderViewModel == prePanel.OrderViewModel) { freeSpace = _colHeight - (prePanelTop + prePanelHeight); // высота первого блока следующей панели List <FrameworkElement> firstBlock = getNextItemsBlock(nextPanel, false, true); h1 = getBlockHeight(firstBlock); if (h1 <= freeSpace) { retVal = true; break; } } } } return(retVal); }
} // DrawOrderPanelsOnPage // преобразование сплошной панели в коллекцию панелей по колонкам // панели записываются на канву временного размещения // входные параметры: // - OrderPanel ordPanel - сплошная панель, которую надо разбить по колонкам, эта панель уже измерена! private void splitOrderViewPanels(OrderPanel ordPanel, bool keepSplitOrderOnLastColumnByForward) { OrderPanel curPanel = null; double curPanelHeight = 0d; string orderLogInfo = string.Format("id: {0}, index: {1}, number: {2}, dishes: {3}", ordPanel.OrderViewModel.Id, ordPanel.OrderViewModel.Index, ordPanel.OrderViewModel.Number, ordPanel.OrderViewModel.Dishes.Count); // цикл по блокам заказа, смещая curDishIndex, пока curDishIndex не дойдет до граничного значения в соотв.напр-и double freeHeight = getFreeHeight(); double curBlockHeight; List <FrameworkElement> curBlock; while (true) { curBlock = getNextItemsBlock(ordPanel, true); // выбрали все блоки - установить координаты последней панели и выйти if (curBlock == null) { setLastPanelPosition(curPanel, curPanelHeight); break; // нормальный выход - выбраны все элементы панели } // создать панель без заголовка, в которую будем переносить панели блюд if (curPanel == null) { curPanel = new OrderPanel(ordPanel.OrderViewModel, 0, ordPanel.Width, false); if (_shiftForward) { _canvas.Children.Add(curPanel); } else { _canvas.Children.Insert(0, curPanel); } // измерить панель measurePanel(curPanel); curPanelHeight = curPanel.PanelHeight; } // добавить заголовок заказа в панель, если при прямом проходе блок самый первый // иначе - добавлять в панель на последнем блоке из ordPanel if (_shiftForward && (curPanel.HeaderPanel == null) && (ordPanel.HeaderPanel != null)) { OrderPanelHeader header = ordPanel.DetachHeader(); curPanel.HeaderPanel = header; curPanelHeight += header.PanelHeight; } curBlockHeight = getBlockHeight(curBlock); // при обратном проходе и отсутствии элементов в ordPanel, // к curBlockHeight прибавить высоту заголовка и шапки таблицы блюд if (!_shiftForward && ((ordPanel.ItemsCount == 0) && (curPanel.HeaderPanel == null) && (ordPanel.HeaderPanel != null)) ) { curBlockHeight += ordPanel.HeaderHeight; if (curPanel.ItemsCount == 0) { curBlockHeight += ordPanel.DishTableHeaderHeight; } } // анализ размещения блока в свободном месте if (curPanelHeight + curBlockHeight <= freeHeight) { // при прямом проходе, добавить текущий блок элементов в конец панели заказа if (_shiftForward) { curPanel.AddDishes(curBlock); curPanelHeight += curBlockHeight; } // при обратном проходе, вставить блок в начало коллекции else { curPanel.InsertDishes(0, curBlock); curPanelHeight += curBlockHeight; // и не забываем про заголовок заказа при обратном проходе if ((ordPanel.ItemsCount == 0) && (curPanel.HeaderPanel == null) && (ordPanel.HeaderPanel != null)) { OrderPanelHeader header = ordPanel.DetachHeader(); curPanel.HeaderPanel = header; // высота заголовка заказа уже есть в curBlockHeight } } } // переход в следующий/предыдущий столбец else { // движение вперед, переход в следующий столбец if (_shiftForward) { // из последнего столбца #region из последнего столбца if (curColIndex == _pageColsCount) { // если панель заказа в последней колонке является продолжением заказа, т.е. HeaderPanel==null, то обрываем заказ и добавляем разделитель продолжения if (((curPanel.HeaderPanel == null) || keepSplitOrderOnLastColumnByForward) && (curPanel.ItemsCount > 0)) { // добавляем в конце разделитель продолжения заказа DishDelimeterPanel delimPanel = createContinuePanel(true); // удалить последний блок if (curPanelHeight + _continuePanelHeight > freeHeight) { _shiftForward = false; // смещаясь назад curBlock = getNextItemsBlock(curPanel, true); // поиск блока и удаление его _shiftForward = true; // восстановить смещение // если текущая панель не пустая, то добавляем панель переноса if ((curBlock != null) && (curPanel.ItemsCount > 0)) { curPanel.AddDelimiter(delimPanel); setPanelLeftTop(curPanel); } // иначе полностью переносим панель заказа в след.страницу else { _canvas.Children.Remove(curPanel); } } else { curPanel.AddDelimiter(delimPanel); setPanelLeftTop(curPanel); } } // иначе полностью переносим панель заказа в след.страницу else { _canvas.Children.Remove(curPanel); } // перенос панели на следующую страницу _pageBreak = true; break; } // из последнего столбца #endregion // из НЕпоследнего столбца: создаем новую панель (Top=0) #region из НЕпоследнего столбца else { // в текущей панели нет элементов или только одна панель DishPanel - // переносим панель в следующую колонку //if ((curPanel.DishPanels.Count == 0) || (curPanel.DishPanelsCount() == 1)) if (curPanel.DishPanels.Count == 0) { curPanel.AddDishes(curBlock); // добавить текущий блок элементов curPanelHeight += curBlockHeight; curColIndex++; curTopValue = 0d; // следующая колонка setPanelLeftTop(curPanel); } // размещение предыдущей панели по текущим координатам и создание новой панели else { setPanelLeftTop(curPanel); // новая панель без заголовка заказа curPanel = new OrderPanel(ordPanel.OrderViewModel, 0, ordPanel.Width, false); curPanel.AddDishes(curBlock); // добавить текущий блок элементов _canvas.Children.Add(curPanel); measurePanel(curPanel); curPanelHeight = curPanel.PanelHeight; // координаты следующего столбца curColIndex++; curTopValue = 0d; } freeHeight = getFreeHeight(); } #endregion } // движение назад, переход в предыдущий столбец else { // из первого столбца #region из первого столбца if (curColIndex == 1) { // если в текущей панели еще нет строк, то переносим всю панель на предыдущий лист // удалив текущую пустую панель if (curPanel.ItemsCount == 0) { _canvas.Children.Remove(curPanel); } // если в текущей панели уже есть блюда, т.е. есть что оставлять на текущей странице, // то добавляем в начало разделитель продолжения заказа и разделитель подачи else { DishDelimeterPanel contPanel = createContinuePanel(false); double delimPanelsHeight = _continuePanelHeight; // поиск номера подачи в блоке тек.панели (та, что остается на тек.странице) DishDelimeterPanel filingPanel = null; curBlock = getNextItemsBlock(curPanel, false, true); // блок НЕ удаляем!! if (curBlock != null) { int filingNumber = getFilingNumber(curBlock); if (filingNumber != 0) { filingPanel = createFilingPanel(filingNumber); // измерить высоту панели номера подачи //measurePanel(filingPanel); //double pnlHeight = getBlockHeight(new FrameworkElement[] { filingPanel }); //delimPanelsHeight += pnlHeight; } } bool keepPanel = true; //bool keepPanel = false; //// если разделитель не помещается, то удалить следующий блок из текущей панели //if (curPanelHeight + delimPanelsHeight > freeHeight) //{ // curBlock = getNextItemsBlock(curPanel, true, true); // // после удаления первого блока из текущ.панели остались блюда - добавляем разделитель // if ((curBlock != null) && (curPanel.ItemsCount > 0)) // { // keepPanel = true; // } // // иначе удаляем весь заказ со страницы - будет отрисован на предыду.странице // else // { // _canvas.Children.Remove(curPanel); // } //} //else //{ // keepPanel = true; //} // вставить разделители if (keepPanel) { curPanel.InsertDelimiter(0, contPanel); if (filingPanel != null) { curPanel.InsertDelimiter(0, filingPanel); } curTopValue = 0d; setPanelLeftTop(curPanel); } } // перенос панели на предыдущую страницу _pageBreak = true; break; } #endregion // из НЕпервого столбца - создаем новую панель #region из НЕпервого столбца - создаем новую панель else { // в текущей панели нет элементов - возвращаем блок и переносим панель НЕ разбивая ее if (curPanel.ItemsCount == 0) { curPanel.InsertDishes(0, curBlock); curPanelHeight += curBlockHeight; } // размещение предыдущей панели по текущим координатам и создание новой панели else { curTopValue = 0d; setPanelLeftTop(curPanel); // новая панель curPanel = new OrderPanel(ordPanel.OrderViewModel, 0, ordPanel.Width, false); curPanel.InsertDishes(0, curBlock); // добавить текущий блок элементов _canvas.Children.Insert(0, curPanel); measurePanel(curPanel); curPanelHeight = curPanel.PanelHeight; } // еще раз проверить перенос заголовка панели заказа if ((ordPanel.ItemsCount == 0) && (curPanel.HeaderPanel == null) && (ordPanel.HeaderPanel != null)) { OrderPanelHeader header = ordPanel.DetachHeader(); curPanel.HeaderPanel = header; curPanelHeight += header.PanelHeight; } curColIndex--; curTopValue = _colHeight; freeHeight = getFreeHeight(); } #endregion } } } return; }
/// <summary> /// Создает и размещает на одной странице панели заказов (тип OrderPanel). /// </summary> /// <param name="orders">Список заказов (тип OrderViewModel)</param> /// <param name="orderIndex">Индекс заказа, начиная с которого будут строиться панели</param> /// <param name="dishIndex">Индекс блюда, начиная с которогу будут строиться панели</param> /// <param name="isPanelsForward">Признак того, что коллекция orders будет листаться вперед, от стартовой позиции к концу набора</param> /// <returns></returns> internal void DrawOrderPanelsOnPage(List <OrderViewModel> orders, int orderStartIndex, int dishStartIndex, bool isPanelsForward, bool keepSplitOrderOnLastColumnByForward) { _canvas.Children.Clear(); if (orders == null) { return; } if (orderStartIndex >= orders.Count) { return; } if (orders.Count == 0) { return; } OrderViewModel orderModel; _shiftForward = isPanelsForward; _pageBreak = false; int dishIdxFrom = -1, dishIdxTo = -1; bool bSplit = false; // инициализация переменных размещения if (_shiftForward) { curColIndex = 1; curTopValue = 0; } else { curColIndex = _pageColsCount; curTopValue = _colHeight; } double freeHeight = getFreeHeight(); if (orderStartIndex < 0) { orderStartIndex = 0; } // цикл по заказам for (int iOrd = orderStartIndex; ((_shiftForward) ? iOrd < orders.Count : iOrd >= 0) && (!_pageBreak); iOrd += (_shiftForward) ? 1 : -1) { // текущий заказ orderModel = orders[iOrd]; bSplit = false; // 1. создать панель заказа со всеми блюдами и разделителями подач #region текущие начальный и конечный индексы БЛЮД // для последующих заказов - все блюда if (dishStartIndex < 0) { dishIdxFrom = 0; dishIdxTo = orderModel.Dishes.Count - 1; } // для первого заказа - часть блюд else { if (_shiftForward) { dishIdxFrom = dishStartIndex; dishIdxTo = orderModel.Dishes.Count - 1; } else { dishIdxFrom = 0; dishIdxTo = dishStartIndex; // в обратном порядке с непоследнего, поэтому добавляется разделитель переноса if (dishIdxTo < (orderModel.Dishes.Count - 1)) { bSplit = true; } } } #endregion DateTime dtTmr = DateTime.Now; OrderPanel ordPanel = createOrderPanel(orderModel, dishIdxFrom, dishIdxTo, bSplit); AppLib.WriteScreenDrawDetails($" - create order panel N {orderModel.Number} - {(DateTime.Now - dtTmr).ToString()}"); dishStartIndex = -1; // для последующих заказов - все блюда if (ordPanel == null) { continue; } // получить реальные размеры панели заказа dtTmr = DateTime.Now; if (_shiftForward) { _canvas.Children.Add(ordPanel); } else { _canvas.Children.Insert(0, ordPanel); } dtTmr = DateTime.Now; #if fromActualHeight ordPanel.UpdateLayout(); // тяжелая операция AppLib.WriteLogTraceMessage(" - measure size by UpdateLayout, panel N {0} - {1}", orderModel.Number, (DateTime.Now - dtTmr).ToString()); #else // get DesiredSize ordPanel.Measure(_sizeMeasure); // немного легче, чем UpdateLayout AppLib.WriteScreenDrawDetails($" - measure size by Measure/DesiredSize, panel N {orderModel.Number} - {(DateTime.Now - dtTmr).ToString()}"); #endif // 2. Размещение панели на странице // помещается ли вся панель заказа без разрывов в свободное место if (ordPanel.PanelHeight < freeHeight) { setLastPanelPosition(ordPanel); } // надо разбивать панель else { dtTmr = DateTime.Now; _canvas.Children.Remove(ordPanel); splitOrderViewPanels(ordPanel, keepSplitOrderOnLastColumnByForward); AppLib.WriteScreenDrawDetails(" - split order to some columns - " + (DateTime.Now - dtTmr).ToString()); } freeHeight = getFreeHeight(); } } // DrawOrderPanelsOnPage
//******************************************* // РАЗМЕЩЕНИЕ ПАНЕЛЕЙ ЗАКАЗОВ //******************************************* public void AddOrderPanel(OrderViewModel orderModel) { OrderPanel ordPnl; DishPanel dshPnl; //, curDshPnl = null; // СОЗДАТЬ ПАНЕЛЬ ЗАКАЗА вместе с ЗАГОЛОВКОМ заказа и строкой заголовка таблицы блюд ordPnl = new OrderPanel(orderModel, _currentPageIndex, _colWidth, true); // поле между заказами по вертикали if (_curTopValue > 0d) { _curTopValue += _hdrTopMargin; } ordPnl.SetPosition(_curTopValue, getLeftOrdPnl()); CurrentPage.AddOrder(ordPnl); CurrentPage.UpdateLayout(); // перенос в новый столбец всего заказа if ((_curTopValue + ordPnl.PanelHeight) >= _uiPanelSize.Height) { moveToNewCol(ordPnl); CurrentPage.UpdateLayout(); } int curFiling = 0; // блюда foreach (OrderDishViewModel dishModel in orderModel.Dishes) { if (curFiling != dishModel.FilingNumber) { curFiling = dishModel.FilingNumber; Brush foreground = (curFiling == 1) ? Brushes.Red : Brushes.Blue; DishDelimeterPanel newDelimPanel = new DishDelimeterPanel(_colWidth, foreground, Brushes.AliceBlue, "Подача " + curFiling.ToString()) { DontTearOffNext = true }; ordPnl.AddDelimiter(newDelimPanel); // и добавить в стек } //if (dishModel.ParentUID.IsNull()) curDshPnl = null; // сохранить родительское блюдо dshPnl = new DishPanel(dishModel, _colWidth); // , curDshPnl //if (dishModel.ParentUID.IsNull()) curDshPnl = dshPnl; // сохранить родительское блюдо // добавить строку заказа в стек ordPnl.AddDish(dshPnl); CurrentPage.UpdateLayout(); if ((_curTopValue + Math.Ceiling(ordPnl.PanelHeight)) > _uiPanelSize.Height) // переход в новый столбец { // 1. удалить из ordPnl только что добавленное блюдо // и вернуть массив удаленных элементов, возможно с "висячим" разделителем номера подачи UIElement[] delItems = ordPnl.RemoveDish(dshPnl, _curTopValue, _uiPanelSize.Height); // разбиваем блюда заказа по колонкам на той же странице if ((ordPnl.ItemsCount > 2) && ((_curColIndex < _pageColsCount) || ((_curColIndex == _pageColsCount) && (Convert.ToDouble(ordPnl.GetValue(Canvas.TopProperty)) == 0d)))) { setNextColumn(); // 2. создать новый OrderPanel для текущего блюда с заголовком таблицы ordPnl = new OrderPanel(orderModel, _currentPageIndex, _colWidth, false); // 3. добавить только что удаленные блюда ordPnl.AddDishes(delItems); // 4. привязать к канве ordPnl.SetPosition(_curTopValue, getLeftOrdPnl()); CurrentPage.AddOrder(ordPnl); } // не разбиваем заказ, а полностью переносим в новую колонку else { // 2. изменить координаты панели заказа moveToNewCol(ordPnl); // 3. добавить только что удаленные блюда ordPnl.AddDishes(delItems); } CurrentPage.UpdateLayout(); } } // foreach dishes _curTopValue += ordPnl.PanelHeight; }
internal void AddOrder(OrderPanel panel) { _ordPanels.Add(panel); base.Children.Add(panel); }