RKTextMatrix RKTextMatrix::transformed (bool reverse_h, bool reverse_v, bool transpose) const { RK_TRACE (EDITOR); RKTextMatrix ret; if (isEmpty ()) return ret; // empty matrices would violate some assumptions of the following code const int maxrow = rows.size () - 1; // for easier typing const int maxcol = rows[0].size () - 1; if (transpose) ret.upsize (maxcol, maxrow); // set dimensions from the start to save a few cycles else ret.upsize (maxrow, maxcol); for (int row=0; row <= maxrow; ++row) { for (int col=0; col <= maxcol; ++col) { int dest_row = row; if (reverse_v) dest_row = maxrow - row; int dest_col = col; if (reverse_h) dest_col = maxcol - col; if (transpose) { int dummy = dest_row; dest_row = dest_col; dest_col = dummy; } ret.setText (dest_row, dest_col, rows[row][col]); } } return ret; }
RKTextMatrix RKVarEditMetaModel::getTextMatrix (const QItemSelectionRange& range) const { RK_TRACE (EDITOR); if ((!range.isValid ()) || data_model->objects.isEmpty ()) return RKTextMatrix (); // NOTE: of course, when the range is small, this is terribly inefficient. On the other hand, it doesn't really matter, then, either. QItemSelectionRange erange = range.intersected (QItemSelectionRange (index (0, 0), index (trueRows () - 1, trueCols () - 1))); int top = erange.top (); int bottom = erange.bottom (); int left = erange.left (); int right = erange.right (); RKTextMatrix ret; int tcol = 0; for (int col = left; col <= right; ++col) { int trow = 0; for (int row = top; row <= bottom; ++row) { QVariant celldata = data (index (row, col), Qt::EditRole); if (!celldata.isValid ()) { RK_ASSERT (false); break; } ret.setText (trow, tcol, celldata.toString ()); ++trow; } ++tcol; } return ret; }
void RKMatrixInput::copy () { RK_TRACE (PLUGIN); QItemSelectionRange range = display->getSelectionBoundaries (); if (!range.isValid ()) return; RKTextMatrix ret; for (int col = range.left (); col <= range.right (); ++col) { for (int row = range.top (); row <= range.bottom (); ++row) { ret.setText (row - range.top (), col - range.left (), cellValue (row, col)); } } ret.copyToClipboard (); }