forked from blue/squawk
first successfull attempt to visualize selection on message body
This commit is contained in:
parent
c3a45ec58c
commit
0340db7f2f
4 changed files with 92 additions and 42 deletions
|
@ -56,7 +56,9 @@ MessageDelegate::MessageDelegate(QObject* parent):
|
|||
pencilIcons(new std::map<QString, QLabel*>()),
|
||||
previews(new std::map<QString, Preview*>()),
|
||||
idsToKeep(new std::set<QString>()),
|
||||
clearingWidgets(false)
|
||||
clearingWidgets(false),
|
||||
currentId(""),
|
||||
selection(0, 0)
|
||||
{
|
||||
bodyRenderer->setDocumentMargin(0);
|
||||
|
||||
|
@ -438,6 +440,37 @@ bool MessageDelegate::isAnchorHovered(const QPoint& point, const QModelIndex& in
|
|||
return anchor.size() > 0;
|
||||
}
|
||||
|
||||
bool MessageDelegate::mouseDrag(const QPoint& start, const QPoint& end, const QModelIndex& index, const QRect& sizeHint)
|
||||
{
|
||||
QVariant vi = index.data(Models::MessageFeed::Bulk);
|
||||
Models::FeedItem data = qvariant_cast<Models::FeedItem>(vi);
|
||||
if (data.text.size() > 0) {
|
||||
QRect localHint = getHoveredMessageBodyRect(index, data, sizeHint);
|
||||
|
||||
if (localHint.contains(start)) {
|
||||
QPoint translated = start - localHint.topLeft();
|
||||
|
||||
bodyRenderer->setHtml(Shared::processMessageBody(data.text));
|
||||
bodyRenderer->setTextWidth(localHint.size().width());
|
||||
selection.first = bodyRenderer->documentLayout()->hitTest(translated, Qt::HitTestAccuracy::FuzzyHit);
|
||||
selection.second = bodyRenderer->documentLayout()->hitTest(end - localHint.topLeft(), Qt::HitTestAccuracy::FuzzyHit);
|
||||
|
||||
currentId = data.id;
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
QString MessageDelegate::clearSelection()
|
||||
{
|
||||
QString lastSelectedId = currentId;
|
||||
currentId = "";
|
||||
selection = std::pair(0, 0);
|
||||
return lastSelectedId;
|
||||
}
|
||||
|
||||
void MessageDelegate::initializeFonts(const QFont& font)
|
||||
{
|
||||
bodyFont = font;
|
||||
|
@ -664,32 +697,21 @@ int MessageDelegate::paintBody(const Models::FeedItem& data, QPainter* painter,
|
|||
if (data.text.size() > 0) {
|
||||
bodyRenderer->setHtml(Shared::processMessageBody(data.text));
|
||||
bodyRenderer->setTextWidth(option.rect.size().width());
|
||||
painter->setBackgroundMode(Qt::BGMode::OpaqueMode);
|
||||
painter->save();
|
||||
// QTextCursor cursor(bodyRenderer);
|
||||
// cursor.setPosition(2, QTextCursor::KeepAnchor);
|
||||
painter->translate(option.rect.topLeft());
|
||||
// QTextFrameFormat format = bodyRenderer->rootFrame()->frameFormat();
|
||||
// format.setBackground(option.palette.brush(QPalette::Active, QPalette::Highlight));
|
||||
// bodyRenderer->rootFrame()->setFrameFormat(format);
|
||||
|
||||
if (data.id == currentId) {
|
||||
QTextCursor cursor(bodyRenderer);
|
||||
cursor.setPosition(selection.first, QTextCursor::MoveAnchor);
|
||||
cursor.setPosition(selection.second, QTextCursor::KeepAnchor);
|
||||
QTextCharFormat format = cursor.charFormat();
|
||||
format.setBackground(option.palette.color(QPalette::Active, QPalette::Highlight));
|
||||
format.setForeground(option.palette.color(QPalette::Active, QPalette::HighlightedText));
|
||||
cursor.setCharFormat(format);
|
||||
}
|
||||
|
||||
bodyRenderer->drawContents(painter);
|
||||
// QColor c = option.palette.color(QPalette::Active, QPalette::Highlight);
|
||||
// QTextBlock b = bodyRenderer->begin();
|
||||
// QTextBlockFormat format = b.blockFormat();
|
||||
// format.setBackground(option.palette.brush(QPalette::Active, QPalette::Highlight));
|
||||
// format.setProperty(QTextFormat::BackgroundBrush, option.palette.brush(QPalette::Active, QPalette::Highlight));
|
||||
// QTextCursor cursor(bodyRenderer);
|
||||
// cursor.setBlockFormat(format);
|
||||
// b = bodyRenderer->begin();
|
||||
// while (b.isValid() > 0) {
|
||||
// QTextLayout* lay = b.layout();
|
||||
// QTextLayout::FormatRange range;
|
||||
// range.format = b.charFormat();
|
||||
// range.start = 0;
|
||||
// range.length = 2;
|
||||
// lay->draw(painter, option.rect.topLeft(), {range});
|
||||
// b = b.next();
|
||||
// }
|
||||
|
||||
painter->restore();
|
||||
QSize bodySize(std::ceil(bodyRenderer->idealWidth()), std::ceil(bodyRenderer->size().height()));
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue