Example #1
0
        private void SwapCells(ref CalendarDateCell first, ref CalendarDateCell second)
        {
            var temp = first;

            first  = second;
            second = temp;
        }
Example #2
0
        private void PositionCurrentDaySelector(CalendarDateCell targetCellField)
        {
            var pos = m_GridPositions[targetCellField];

            m_CurDaySelector.rectTransform.anchoredPosition = pos;
            m_CurDaySelector.gameObject.SetActive(IsThisMonthDisplaying());
        }
Example #3
0
 public override void OnPointerUp(PointerEventData eventData)
 {
     m_IsSelecting        = false;
     m_FirstSelectedCell  = null;
     m_LastSelectedCell   = null;
     m_StartTouchPosition = Vector2.zero;
     CancelInvoke(nameof(EnableSelection));
     base.OnPointerUp(eventData);
 }
Example #4
0
        // draws the actual selection
        private void DrawSelectionMarker(CalendarDateCell startCell, CalendarDateCell endCell)
        {
            if (startCell == null || endCell == null)
            {
                return;
            }
            ClearSelectionMarkers();

            // to enable backward selection
            if (startCell.GridRow > endCell.GridRow)
            {
                SwapCells(ref startCell, ref endCell);
            }
            else if (startCell.GridRow == endCell.GridRow)
            {
                if (startCell.GridColumn > endCell.GridColumn)
                {
                    SwapCells(ref startCell, ref endCell);
                }
            }
            m_FirstDateOfSelection = GetDateBySelectedCell(startCell);
            m_LastDateOfSelection  = GetDateBySelectedCell(endCell);

            // we're gonna need a few markers for a multiline selection
            var numRowsUsed = Mathf.Abs(startCell.GridRow - endCell.GridRow) + 1;
            var loopStart   = startCell.GridRow;
            var loopEnd     = numRowsUsed + startCell.GridRow;

            for (var row = loopStart; row < loopEnd; row++)
            {
                var startMarker = m_SelectionMarkers[row];
                startMarker.gameObject.SetActive(false);
                GetCellSpanForRow(row, out var rowStartCell, out var rowEndCell,
                                  startCell, endCell, loopStart, loopEnd - 1);
                if (rowStartCell == null || rowEndCell == null)
                {
                    continue;
                }
                var markerLength = GetMultipleSelectionMarkerLength(rowStartCell, rowEndCell);
                // there are only 6 markers one for each row
                var xOffset       = startMarker.rectTransform.rect.height / 2;
                var startPosition = m_GridPositions[rowStartCell];
                startPosition.x -= xOffset;
                startMarker.rectTransform.anchoredPosition = startPosition;
                var size = startMarker.rectTransform.sizeDelta;
                size.x = markerLength;
                startMarker.rectTransform.sizeDelta = size;
                startMarker.gameObject.SetActive(true);
                startMarker.transform.SetAsFirstSibling();
            }
        }
Example #5
0
 private void EnableSelection()
 {
     m_IsSelecting = true;
     ClearSelectionMarkers();
     if (m_StartTouchPosition != Vector2.zero)
     {
         m_FirstSelectedCell = FindCellNearestToTouchPosition(m_StartTouchPosition);
         if (m_FirstSelectedCell != null)
         {
             m_LastSelectedCell = m_FirstSelectedCell;
             DrawSelectionMarker(m_FirstSelectedCell, m_FirstSelectedCell);
         }
     }
 }
Example #6
0
        private CalendarDateCell FindCellNearestToTouchPosition(Vector2 touchPos)
        {
            var minDistance = 1000.0f;
            CalendarDateCell nearestCell = null;

            foreach (var keyValuePair in m_GridPositions)
            {
                var gridPos = keyValuePair.Value + m_ClickOffset;
                var dist    = Vector2.Distance(gridPos, touchPos);
                if (dist < minDistance)
                {
                    minDistance = dist;
                    nearestCell = keyValuePair.Key;
                }
            }
            return(nearestCell);
        }
Example #7
0
        private DateTime GetDateBySelectedCell(CalendarDateCell targetCell)
        {
            if (targetCell == null || targetCell.monthType == MonthType.None)
            {
                return(DateTime.Today);
            }
            switch (targetCell.monthType)
            {
            case MonthType.Current:
                return(new DateTime(m_Date.Year, m_Date.Month, targetCell.Day));

            case MonthType.Previous:
                return(new DateTime(m_Date.Year, m_Date.Month - 1, targetCell.Day));

            case MonthType.Next:
                return(new DateTime(m_Date.Year, m_Date.Month + 1, targetCell.Day));

            default:
                return(DateTime.Today);
            }
        }
Example #8
0
        // сюда передается номер ряда и начальная и конечная ячейка.
        // А метод проверяет сколько ячеек между ними, входят в конкретный ряд
        // и возвращаяет начальную и конечную ячейку в переделах указанного ряда
        // нужно для многострочного выделения
        // finds first and last cells that are within the specified time span and lay within the current row
        private void GetCellSpanForRow(int curRow, out CalendarDateCell rowStartCell, out CalendarDateCell rowEndCell,
                                       CalendarDateCell startCell, CalendarDateCell endCell, int rowStart, int rowEnd)
        {
            rowStartCell = null;
            rowEndCell   = null;

            var row = m_AllDaysTexts
                      .Where(c => c.GridRow == curRow)
                      .OrderBy(c => c.rectTransform.anchoredPosition.x).ToList();

            var bothInSameRow = rowStart == rowEnd;

            if (!bothInSameRow)
            {
                if (rowStart == curRow)
                {
                    // первый точно должен быть в этом ряду
                    rowStartCell = row.First(c => c.Day == startCell.Day);
                    rowEndCell   = row.Last();
                }
                else if (curRow != rowStart && curRow != rowEnd)
                {
                    // этот ряд должен быть заполнен полностью
                    rowStartCell = row.First();
                    rowEndCell   = row.Last();
                }
                else
                {
                    // в этом ряду должен быть только последний
                    rowStartCell = row.First();
                    rowEndCell   = row.First(c => c.Day == endCell.Day);
                }
            }
            else
            {
                // оба в одном ряду
                rowStartCell = row.FirstOrDefault(c => c.Day == startCell.Day);
                rowEndCell   = row.LastOrDefault(c => c.Day == endCell.Day);
            }
        }
Example #9
0
 public void OnDrag(PointerEventData eventData)
 {
     if (m_IsSelecting)
     {
         if (AllowMultipleSelection)
         {
             if (m_FirstSelectedCell == null)
             {
                 return;
             }
             // blocks drag events for parents while selecting, preventing scrolling etc.
             RectTransformUtility.ScreenPointToLocalPointInRectangle(
                 GetRectTransform(), eventData.position, eventData.enterEventCamera, out var touchPos);
             m_LastSelectedCell = FindCellNearestToTouchPosition(touchPos);
         }
         else
         {
             // select single cell
             RectTransformUtility.ScreenPointToLocalPointInRectangle(
                 GetRectTransform(), eventData.position, eventData.enterEventCamera, out var touchPos);
             m_LastSelectedCell  = FindCellNearestToTouchPosition(touchPos);
             m_FirstSelectedCell = m_LastSelectedCell;
         }
         DrawSelectionMarker(m_FirstSelectedCell,
                             m_LastSelectedCell != null ? m_LastSelectedCell : m_FirstSelectedCell);
     }
     else
     {
         if (eventData.delta.magnitude > 4.0f)
         {
             // allows not to enable selection while moving
             CancelInvoke(nameof(EnableSelection));
             Invoke(nameof(EnableSelection), m_StartSelectingAfter);
         }
         ForwardToParents <IDragHandler>(parent => parent.OnDrag(eventData));
     }
 }
Example #10
0
        // calculates distance between cells within a single row. It's used for multiple selection markers
        private float GetMultipleSelectionMarkerLength(CalendarDateCell startCell, CalendarDateCell endCell)
        {
            var offset = m_MultipleSelectorSampler.rectTransform.rect.height;

            return((m_GridPositions[endCell].x - m_GridPositions[startCell].x) + offset);
        }