mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-01-19 00:37:25 +01:00
This fixes crashes: indeed, in the way it was done before, we called scrollToSubviewOfTypeOfCellAtLocation after setting the new selected subtype and before reloading the data. However, selecting a new subtype might expand the selected cell which can temper with the cell repartition. If so, we need to reload the data to be able to call 'selectedCell' for instance.
70 lines
3.0 KiB
C++
70 lines
3.0 KiB
C++
#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);
|
|
setDecoratorType(ScrollView::Decorator::Type::None);
|
|
}
|
|
|
|
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(HistoryViewCellDataSource::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. */
|
|
unhighlightSelectedCell();
|
|
|
|
/* Main part of the scroll */
|
|
KDCoordinate contentOffsetX = contentOffset().x();
|
|
KDCoordinate contentOffsetY = dataSource()->cumulatedHeightFromIndex(j+1) - maxContentHeightDisplayableWithoutScrolling();
|
|
if (subviewType == HistoryViewCellDataSource::SubviewType::Input) {
|
|
if (j == 0) {
|
|
contentOffsetY = 0;
|
|
} else {
|
|
contentOffsetY = dataSource()->cumulatedHeightFromIndex(j);
|
|
}
|
|
}
|
|
setContentOffset(KDPoint(contentOffsetX, contentOffsetY));
|
|
/* For the same reason, we have to rehighlight the new history view cell and
|
|
* reselect the first responder. */
|
|
HistoryViewCell * cell = (HistoryViewCell *)(selectedCell());
|
|
assert(cell);
|
|
cell->setHighlighted(true);
|
|
Container::activeApp()->setFirstResponder(cell);
|
|
}
|
|
|
|
|
|
}
|