Blame view

build1/epsilon-master/apps/calculation/selectable_table_view.cpp 3.18 KB
6663b6c9   adorian   projet complet av...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
  #include "selectable_table_view.h"
  
  namespace Calculation {
  
  CalculationSelectableTableView::CalculationSelectableTableView(Responder * parentResponder, TableViewDataSource * dataSource,
   SelectableTableViewDataSource * selectionDataSource, SelectableTableViewDelegate * delegate) :
    ::SelectableTableView(parentResponder, dataSource, selectionDataSource, delegate)
  {
    setVerticalCellOverlap(0);
    setMargins(0);
    setShowsIndicators(false);
  }
  
  void CalculationSelectableTableView::scrollToCell(int i, int j) {
    ::SelectableTableView::scrollToCell(i, j);
    if (m_contentView.bounds().height() < bounds().height()) {
      setTopMargin(bounds().height() - m_contentView.bounds().height());
    } else {
      setTopMargin(0);
    }
    ScrollView::layoutSubviews();
    if (m_contentView.bounds().height() - contentOffset().y() < bounds().height()) {
      KDCoordinate contentOffsetX = contentOffset().x();
      KDCoordinate contentOffsetY = dataSource()->cumulatedHeightFromIndex(dataSource()->numberOfRows()) - maxContentHeightDisplayableWithoutScrolling();
      setContentOffset(KDPoint(contentOffsetX, contentOffsetY));
    }
    if (dataSource()->numberOfRows() > j && dataSource()->numberOfColumns() > i && dataSource()->rowHeight(j) > bounds().height()) {
      KDCoordinate contentOffsetX = contentOffset().x();
      KDCoordinate contentOffsetY = contentOffset().y();
      if (contentOffsetY > dataSource()->cumulatedHeightFromIndex(j) && contentOffsetY > dataSource()->cumulatedHeightFromIndex(j+1)) {
        // Let's scroll the tableView to align the top of the cell to the top
        contentOffsetY = dataSource()->cumulatedHeightFromIndex(j);
      } else {
        // Let's scroll the tableView to align the bottom of the cell to the bottom
        contentOffsetY = dataSource()->cumulatedHeightFromIndex(j+1) - maxContentHeightDisplayableWithoutScrolling();
      }
      setContentOffset(KDPoint(contentOffsetX, contentOffsetY));
    }
  }
  
  void CalculationSelectableTableView::scrollToSubviewOfTypeOfCellAtLocation(HistoryViewCell::SubviewType subviewType, int i, int j) {
    if (dataSource()->rowHeight(j) <= bounds().height()) {
      return;
    }
    /* As we scroll, the selected calculation does not use the same history view
     * cell, thus, we want to deselect the previous used history view cell. */
    if (selectedRow() >= 0) {
      HighlightCell * previousCell = selectedCell();
      previousCell->setHighlighted(false);
    }
    /* Main part of the scroll */
    KDCoordinate contentOffsetX = contentOffset().x();
    KDCoordinate contentOffsetY = dataSource()->cumulatedHeightFromIndex(j+1) - maxContentHeightDisplayableWithoutScrolling();
    if (subviewType == HistoryViewCell::SubviewType::Input) {
      if (j == 0) {
        contentOffsetY = 0;
      } else {
        contentOffsetY = dataSource()->cumulatedHeightFromIndex(j);
      }
    }
    /* For the same reason, we have to rehighlight the new history view cell and
     * inform the delegate which history view cell is highlighted even if the
     * selected calculation has not changed. */
    setContentOffset(KDPoint(contentOffsetX, contentOffsetY));
    HighlightCell * cell = cellAtLocation(i, j);
    cell->setHighlighted(true);
    if (m_delegate) {
      m_delegate->tableViewDidChangeSelection(this, selectedColumn(), selectedRow());
    }
  }
  
  
  }