r22560 by jghali - #15325: columns and rows selection not working on tables
scribus-commit
scribus-commit at lists.scribus.net
Sun May 27 17:59:50 UTC 2018
Author: jghali
Date: Sun May 27 17:59:49 2018
New Revision: 22560
URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=22560
Log:
#15325: columns and rows selection not working on tables
Modified:
trunk/Scribus/scribus/canvasgesture_cellselect.cpp
trunk/Scribus/scribus/canvasgesture_cellselect.h
trunk/Scribus/scribus/canvasmode_edittable.cpp
trunk/Scribus/scribus/canvasmode_edittable.h
trunk/Scribus/scribus/pageitem_table.cpp
trunk/Scribus/scribus/pageitem_table.h
Modified: trunk/Scribus/scribus/canvasgesture_cellselect.cpp
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=22560&path=/trunk/Scribus/scribus/canvasgesture_cellselect.cpp
==============================================================================
--- trunk/Scribus/scribus/canvasgesture_cellselect.cpp (original)
+++ trunk/Scribus/scribus/canvasgesture_cellselect.cpp Sun May 27 17:59:49 2018
@@ -25,6 +25,11 @@
#include "tablecell.h"
#include "tableutils.h"
#include "ui/scmwmenumanager.h"
+
+void CellSelect::activate(bool fromGesture)
+{
+ m_view->setCursor(Qt::IBeamCursor);
+}
void CellSelect::deactivate(bool forGesture)
{
Modified: trunk/Scribus/scribus/canvasgesture_cellselect.h
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=22560&path=/trunk/Scribus/scribus/canvasgesture_cellselect.h
==============================================================================
--- trunk/Scribus/scribus/canvasgesture_cellselect.h (original)
+++ trunk/Scribus/scribus/canvasgesture_cellselect.h Sun May 27 17:59:49 2018
@@ -36,7 +36,7 @@
explicit CellSelect(CanvasMode* parent) : TableGesture(parent) {}
virtual ~CellSelect() {}
- virtual void activate(bool fromGesture) {}
+ virtual void activate(bool fromGesture);
virtual void deactivate(bool forGesture);
virtual void keyPressEvent(QKeyEvent* event);
virtual void mousePressEvent(QMouseEvent* event);
Modified: trunk/Scribus/scribus/canvasmode_edittable.cpp
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=22560&path=/trunk/Scribus/scribus/canvasmode_edittable.cpp
==============================================================================
--- trunk/Scribus/scribus/canvasmode_edittable.cpp (original)
+++ trunk/Scribus/scribus/canvasmode_edittable.cpp Sun May 27 17:59:49 2018
@@ -147,8 +147,11 @@
}
// Pass all other keys to text frame of active cell.
- bool repeat;
- m_table->activeCell().textFrame()->handleModeEditKey(event, repeat);
+ if (!m_table->hasSelection())
+ {
+ bool repeat;
+ m_table->activeCell().textFrame()->handleModeEditKey(event, repeat);
+ }
updateCanvas(true);
}
@@ -207,6 +210,7 @@
QPointF canvasPoint = m_canvas->globalToCanvas(event->globalPos()).toQPointF();
double threshold = m_doc->guidesPrefs().grabRadius / m_canvas->scale();
TableHandle handle = m_table->hitTest(canvasPoint, threshold);
+ TableCell cell;
if (event->button() == Qt::LeftButton)
{
@@ -214,6 +218,20 @@
{
case TableHandle::RowSelect:
// Not implemented.
+ m_table->clearSelection();
+ cell = m_table->cellAt(canvasPoint);
+ if (!cell.isValid())
+ break;
+ // Deselect text in active frame.
+ activeFrame = m_table->activeCell().textFrame();
+ activeFrame->itemText.deselectAll();
+ activeFrame->HasSel = false;
+ // Select row and pre-position text cursor
+ m_table->moveTo(cell);
+ m_table->selectRow(cell.row());
+ m_view->slotSetCurs(event->globalPos().x(), event->globalPos().y());
+ m_lastCursorPos = -1;
+ updateCanvas(true);
break;
case TableHandle::RowResize:
// Start row resize gesture.
@@ -222,6 +240,20 @@
break;
case TableHandle::ColumnSelect:
// Not implemented.
+ m_table->clearSelection();
+ cell = m_table->cellAt(canvasPoint);
+ if (!cell.isValid())
+ break;
+ // Deselect text in active frame.
+ activeFrame = m_table->activeCell().textFrame();
+ activeFrame->itemText.deselectAll();
+ activeFrame->HasSel = false;
+ // Select column and pre-position text cursor
+ m_table->moveTo(cell);
+ m_table->selectColumn(cell.column());
+ m_view->slotSetCurs(event->globalPos().x(), event->globalPos().y());
+ m_lastCursorPos = -1;
+ updateCanvas(true);
break;
case TableHandle::ColumnResize:
// Start column resize gesture.
@@ -235,6 +267,7 @@
break;
case TableHandle::CellSelect:
// Move to the pressed cell and position the text cursor.
+ m_table->clearSelection();
m_table->moveTo(m_table->cellAt(canvasPoint));
m_view->slotSetCurs(event->globalPos().x(), event->globalPos().y());
m_lastCursorPos = m_table->activeCell().textFrame()->itemText.cursorPosition();
@@ -320,7 +353,48 @@
{
p->save();
commonDrawControls(p, false);
- drawTextCursor(p);
+ if (!m_table->hasSelection())
+ drawTextCursor(p);
+ p->restore();
+
+ if (m_table->hasSelection())
+ paintCellSelection(p);
+}
+
+void CanvasMode_EditTable::paintCellSelection(QPainter* p)
+{
+ if (!m_table || !m_canvas || !p)
+ return;
+
+ p->save();
+ p->scale(m_canvas->scale(), m_canvas->scale());
+ p->translate(-m_doc->minCanvasCoordinate.x(), -m_doc->minCanvasCoordinate.y());
+ p->setTransform(m_table->getTransform(), true);
+ p->setRenderHint(QPainter::Antialiasing);
+ p->setPen(QPen(QColor(100, 200, 255), 3.0 / m_canvas->scale(), Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin));
+ p->setBrush(QColor(100, 200, 255, 50));
+
+ /*
+ * The code below makes selectionPath a union of the cell rectangles of the selected cells.
+ * Since the cell rectangles are adjacent, they must be expanded slightly (1.0) for the
+ * uniting to work. This may not be the fastest way to compose the path of the selection,
+ * but it makes for some very simple code. And the result looks good.
+ */
+
+ const QPointF offset = m_table->gridOffset();
+ QPainterPath selectionPath;
+
+ for (const TableCell& cell : m_table->selectedCells())
+ {
+ QRectF cellRect = cell.boundingRect();
+ cellRect.translate(offset);
+ cellRect.adjust(-1.0, -1.0, 1.0, 1.0);
+ QPainterPath cellPath;
+ cellPath.addRect(cellRect);
+ selectionPath = selectionPath.united(cellPath);
+ }
+
+ p->drawPath(selectionPath);
p->restore();
}
Modified: trunk/Scribus/scribus/canvasmode_edittable.h
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=22560&path=/trunk/Scribus/scribus/canvasmode_edittable.h
==============================================================================
--- trunk/Scribus/scribus/canvasmode_edittable.h (original)
+++ trunk/Scribus/scribus/canvasmode_edittable.h Sun May 27 17:59:49 2018
@@ -48,6 +48,12 @@
virtual void mouseReleaseEvent(QMouseEvent* event);
virtual void mouseDoubleClickEvent(QMouseEvent* event);
virtual void drawControls(QPainter* p);
+
+protected:
+ /**
+ * Paints the selection of the currently edited table.
+ */
+ void paintCellSelection(QPainter* p);
private slots:
/**
Modified: trunk/Scribus/scribus/pageitem_table.cpp
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=22560&path=/trunk/Scribus/scribus/pageitem_table.cpp
==============================================================================
--- trunk/Scribus/scribus/pageitem_table.cpp (original)
+++ trunk/Scribus/scribus/pageitem_table.cpp Sun May 27 17:59:49 2018
@@ -766,6 +766,20 @@
for (int col = leftCol; col <= rightCol; ++col)
selectCell(row, col);
emit selectionChanged();
+}
+
+void PageItem_Table::selectColumn(int column)
+{
+ if (!validCell(0, column))
+ return;
+ selectCells(0, column, rows() - 1, column);
+}
+
+void PageItem_Table::selectRow(int row)
+{
+ if (!validCell(row, 0))
+ return;
+ selectCells(row, 0, row, columns() - 1);
}
void PageItem_Table::clearSelection()
Modified: trunk/Scribus/scribus/pageitem_table.h
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=22560&path=/trunk/Scribus/scribus/pageitem_table.h
==============================================================================
--- trunk/Scribus/scribus/pageitem_table.h (original)
+++ trunk/Scribus/scribus/pageitem_table.h Sun May 27 17:59:49 2018
@@ -319,9 +319,28 @@
void selectCells(int startRow, int startColumn, int endRow, int endColumn);
/**
+ * Adds the cells in specified column to the selection.
+ *
+ * If specified column is outside the table, this function does nothing.
+ */
+ void selectColumn(int column);
+
+ /**
+ * Adds the cells in specified row to the selection.
+ *
+ * If specified row is outside the table, this function does nothing.
+ */
+ void selectRow(int row);
+
+ /**
* Clears the cell selection.
*/
void clearSelection();
+
+ /**
+ * Test if item has an active cell selection
+ */
+ bool hasSelection() const { return m_selection.count() > 0; }
/**
* Returns the cell at @a row, @a column.
More information about the scribus-commit
mailing list