Implement draggable rectangle selection

This commit is contained in:
G.K.MacGregor
2020-10-25 11:07:04 +00:00
parent af5f0ae74c
commit 151d842bc0
4 changed files with 91 additions and 16 deletions

View File

@@ -22,6 +22,7 @@
#include <QKeyEvent>
#include <QMenu>
#include <QPainter>
#include <QPair>
#include <QUndoCommand>
#include <QWidget>
#include <vector>
@@ -42,6 +43,7 @@ TeletextWidget::TeletextWidget(QFrame *parent) : QFrame(parent)
m_levelOnePage = m_teletextDocument->currentSubPage();
m_pageRender.setTeletextPage(m_levelOnePage);
m_insertMode = false;
m_selectionInProgress = false;
m_grid = false;
setFocusPolicy(Qt::StrongFocus);
m_flashTiming = m_flashPhase = 0;
@@ -50,6 +52,7 @@ TeletextWidget::TeletextWidget(QFrame *parent) : QFrame(parent)
connect(m_teletextDocument, &TeletextDocument::subPageSelected, this, &TeletextWidget::subPageSelected);
connect(m_teletextDocument, &TeletextDocument::contentsChange, this, &TeletextWidget::refreshRow);
connect(m_teletextDocument, &TeletextDocument::refreshNeeded, this, &TeletextWidget::refreshPage);
connect(m_teletextDocument, &TeletextDocument::selectionMoved, this, QOverload<>::of(&TeletextWidget::update));
}
TeletextWidget::~TeletextWidget()
@@ -91,6 +94,11 @@ void TeletextWidget::paintEvent(QPaintEvent *event)
widgetPainter.drawPixmap(480+m_pageRender.leftSidePanelColumns()*12, 0, *m_pageRender.pagePixmap(m_flashPhase), 480, 0, m_pageRender.rightSidePanelColumns()*12, 250);
if (this->hasFocus())
widgetPainter.fillRect((m_teletextDocument->cursorColumn()+m_pageRender.leftSidePanelColumns())*12, m_teletextDocument->cursorRow()*10, 12, 10, QColor(128, 128, 128, 192));
if (m_teletextDocument->selectionActive()) {
widgetPainter.setPen(QPen(QColor(192, 192, 192, 224), 1, Qt::DashLine));
widgetPainter.setBrush(QBrush(QColor(255, 255, 255, 64)));
widgetPainter.drawRect((m_teletextDocument->selectionLeftColumn()+m_pageRender.leftSidePanelColumns())*12, m_teletextDocument->selectionTopRow()*10, m_teletextDocument->selectionWidth()*12-1, m_teletextDocument->selectionHeight()*10-1);
}
}
void TeletextWidget::updateFlashTimer(int newFlashTimer)
@@ -329,29 +337,64 @@ void TeletextWidget::backspaceEvent()
m_teletextDocument->undoStack()->push(backspaceCommand);
}
void TeletextWidget::cursorToMouse(QPoint mousePosition)
QPair<int, int> TeletextWidget::mouseToRowAndColumn(const QPoint &mousePosition)
{
int newCursorRow = mousePosition.y() / 10;
int newCursorColumn = mousePosition.x() / 12 - m_pageRender.leftSidePanelColumns();
if (newCursorRow < 1)
newCursorRow = 1;
if (newCursorRow > 24)
newCursorRow = 24;
if (newCursorColumn < 0)
newCursorColumn = 0;
if (newCursorColumn > 39)
newCursorColumn = 39;
m_teletextDocument->moveCursor(newCursorRow, newCursorColumn);
int row = mousePosition.y() / 10;
int column = mousePosition.x() / 12 - m_pageRender.leftSidePanelColumns();
if (row < 1)
row = 1;
if (row > 24)
row = 24;
if (column < 0)
column = 0;
if (column > 39)
column = 39;
return qMakePair(row, column);
}
void TeletextWidget::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
cursorToMouse(event->pos());
m_teletextDocument->cancelSelection();
QPair<int, int> position = mouseToRowAndColumn(event->pos());
m_teletextDocument->moveCursor(position.first, position.second);
update();
}
}
void TeletextWidget::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() & Qt::LeftButton) {
QPair<int, int> position = mouseToRowAndColumn(event->pos());
if (m_selectionInProgress || position.first != m_teletextDocument->cursorRow() || position.second != m_teletextDocument->cursorColumn()) {
int topRow, bottomRow, leftColumn, rightColumn;
m_selectionInProgress = true;
if (m_teletextDocument->cursorRow() < position.first) {
topRow = m_teletextDocument->cursorRow();
bottomRow = position.first;
} else {
topRow = position.first;
bottomRow = m_teletextDocument->cursorRow();
}
if (m_teletextDocument->cursorColumn() < position.second) {
leftColumn = m_teletextDocument->cursorColumn();
rightColumn = position.second;
} else {
leftColumn = position.second;
rightColumn = m_teletextDocument->cursorColumn();
}
m_teletextDocument->setSelection(topRow, leftColumn, bottomRow, rightColumn);
}
}
}
void TeletextWidget::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
m_selectionInProgress = false;
}
void TeletextWidget::focusInEvent(QFocusEvent *event)
{
QFrame::focusInEvent(event);