|
|
|
@ -21,6 +21,8 @@ |
|
|
|
|
#include <QPaintEvent> |
|
|
|
|
#include <QPainter> |
|
|
|
|
#include <QScrollBar> |
|
|
|
|
#include <QApplication> |
|
|
|
|
#include <QClipboard> |
|
|
|
|
#include <QDebug> |
|
|
|
|
|
|
|
|
|
#include "messagedelegate.h" |
|
|
|
@ -53,9 +55,10 @@ FeedView::FeedView(QWidget* parent): |
|
|
|
|
dividerMetrics(dividerFont), |
|
|
|
|
mousePressed(false), |
|
|
|
|
dragging(false), |
|
|
|
|
anchorHovered(false), |
|
|
|
|
hovered(Shared::Hover::nothing), |
|
|
|
|
dragStartPoint(), |
|
|
|
|
dragEndPoint() |
|
|
|
|
dragEndPoint(), |
|
|
|
|
selectedText() |
|
|
|
|
{ |
|
|
|
|
horizontalScrollBar()->setRange(0, 0); |
|
|
|
|
verticalScrollBar()->setSingleStep(approximateSingleMessageHeight); |
|
|
|
@ -167,7 +170,7 @@ void FeedView::dataChanged(const QModelIndex& topLeft, const QModelIndex& bottom |
|
|
|
|
|
|
|
|
|
void FeedView::updateGeometries() |
|
|
|
|
{ |
|
|
|
|
qDebug() << "updateGeometries"; |
|
|
|
|
//qDebug() << "updateGeometries";
|
|
|
|
|
QScrollBar* bar = verticalScrollBar(); |
|
|
|
|
|
|
|
|
|
const QStyle* st = style(); |
|
|
|
@ -307,7 +310,7 @@ bool FeedView::tryToCalculateGeometriesWithNoScrollbars(const QStyleOptionViewIt |
|
|
|
|
|
|
|
|
|
void FeedView::paintEvent(QPaintEvent* event) |
|
|
|
|
{ |
|
|
|
|
qDebug() << "paint" << event->rect(); |
|
|
|
|
//qDebug() << "paint" << event->rect();
|
|
|
|
|
const QAbstractItemModel* m = model(); |
|
|
|
|
QWidget* vp = viewport(); |
|
|
|
|
QRect zone = event->rect().translated(0, -vo); |
|
|
|
@ -412,14 +415,20 @@ void FeedView::verticalScrollbarValueChanged(int value) |
|
|
|
|
QAbstractItemView::verticalScrollbarValueChanged(vo); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void FeedView::setAnchorHovered(bool hovered) |
|
|
|
|
void FeedView::setAnchorHovered(Shared::Hover type) |
|
|
|
|
{ |
|
|
|
|
if (anchorHovered != hovered) { |
|
|
|
|
anchorHovered = hovered; |
|
|
|
|
if (anchorHovered) { |
|
|
|
|
setCursor(Qt::PointingHandCursor); |
|
|
|
|
} else { |
|
|
|
|
setCursor(Qt::ArrowCursor); |
|
|
|
|
if (hovered != type) { |
|
|
|
|
hovered = type; |
|
|
|
|
switch (hovered) { |
|
|
|
|
case Shared::Hover::nothing: |
|
|
|
|
setCursor(Qt::ArrowCursor); |
|
|
|
|
break; |
|
|
|
|
case Shared::Hover::text: |
|
|
|
|
setCursor(Qt::IBeamCursor); |
|
|
|
|
break; |
|
|
|
|
case Shared::Hover::anchor: |
|
|
|
|
setCursor(Qt::PointingHandCursor); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -441,25 +450,31 @@ void FeedView::mouseMoveEvent(QMouseEvent* event) |
|
|
|
|
QAbstractItemView::mouseMoveEvent(event); |
|
|
|
|
|
|
|
|
|
if (specialDelegate) { |
|
|
|
|
QModelIndex index = indexAt(dragEndPoint); |
|
|
|
|
if (index.isValid()) { |
|
|
|
|
QRect rect = visualRect(index); |
|
|
|
|
if (rect.contains(dragEndPoint)) { |
|
|
|
|
MessageDelegate* del = static_cast<MessageDelegate*>(itemDelegate()); |
|
|
|
|
if (dragging) { |
|
|
|
|
setAnchorHovered(false); |
|
|
|
|
if (del->mouseDrag(dragStartPoint, dragEndPoint, index, rect)) { |
|
|
|
|
qDebug() << "asking to repaint" << rect; |
|
|
|
|
MessageDelegate* del = static_cast<MessageDelegate*>(itemDelegate()); |
|
|
|
|
if (dragging) { |
|
|
|
|
QModelIndex index = indexAt(dragStartPoint); |
|
|
|
|
if (index.isValid()) { |
|
|
|
|
QRect rect = visualRect(index); |
|
|
|
|
if (rect.contains(dragStartPoint)) { |
|
|
|
|
QString selected = del->mouseDrag(dragStartPoint, dragEndPoint, index, rect); |
|
|
|
|
if (selectedText != selected) { |
|
|
|
|
selectedText = selected; |
|
|
|
|
setDirtyRegion(rect); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
QModelIndex index = indexAt(dragEndPoint); |
|
|
|
|
if (index.isValid()) { |
|
|
|
|
QRect rect = visualRect(index); |
|
|
|
|
if (rect.contains(dragEndPoint)) { |
|
|
|
|
setAnchorHovered(del->hoverType(dragEndPoint, index, rect)); |
|
|
|
|
} else { |
|
|
|
|
setAnchorHovered(del->isAnchorHovered(dragEndPoint, index, rect)); |
|
|
|
|
setAnchorHovered(Shared::Hover::nothing); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
setAnchorHovered(false); |
|
|
|
|
setAnchorHovered(Shared::Hover::nothing); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
setAnchorHovered(false); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -470,6 +485,17 @@ void FeedView::mousePressEvent(QMouseEvent* event) |
|
|
|
|
mousePressed = event->button() == Qt::LeftButton; |
|
|
|
|
if (mousePressed) { |
|
|
|
|
dragStartPoint = event->localPos().toPoint(); |
|
|
|
|
if (specialDelegate && specialModel) { |
|
|
|
|
MessageDelegate* del = static_cast<MessageDelegate*>(itemDelegate()); |
|
|
|
|
QString lastSelectedId = del->clearSelection(); |
|
|
|
|
if (lastSelectedId.size()) { |
|
|
|
|
Models::MessageFeed* feed = static_cast<Models::MessageFeed*>(model()); |
|
|
|
|
QModelIndex index = feed->modelIndexById(lastSelectedId); |
|
|
|
|
if (index.isValid()) { |
|
|
|
|
setDirtyRegion(visualRect(index)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -494,6 +520,17 @@ void FeedView::mouseReleaseEvent(QMouseEvent* event) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void FeedView::keyPressEvent(QKeyEvent* event) |
|
|
|
|
{ |
|
|
|
|
QKeyEvent *key_event = static_cast<QKeyEvent*>(event); |
|
|
|
|
if (key_event->matches(QKeySequence::Copy)) { |
|
|
|
|
if (selectedText.size() > 0) { |
|
|
|
|
QClipboard* cb = QApplication::clipboard(); |
|
|
|
|
cb->setText(selectedText); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void FeedView::resizeEvent(QResizeEvent* event) |
|
|
|
|
{ |
|
|
|
|
QAbstractItemView::resizeEvent(event); |
|
|
|
@ -603,3 +640,8 @@ void FeedView::onModelSyncStateChange(Models::MessageFeed::SyncState state) |
|
|
|
|
scheduleDelayedItemsLayout(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
QString FeedView::getSelectedText() const |
|
|
|
|
{ |
|
|
|
|
return selectedText; |
|
|
|
|
} |
|
|
|
|