squawk/ui/widgets/messageline/messagedelegate.h

126 lines
4.9 KiB
C
Raw Permalink Normal View History

2020-08-20 21:32:30 +00:00
/*
* Squawk messenger.
2020-08-20 21:32:30 +00:00
* Copyright (C) 2019 Yury Gubich <blue@macaw.me>
*
2020-08-20 21:32:30 +00:00
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
2020-08-20 21:32:30 +00:00
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
2020-08-20 21:32:30 +00:00
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
2020-08-20 21:32:30 +00:00
#include <map>
#include <set>
2020-08-20 21:32:30 +00:00
#include <QStyledItemDelegate>
#include <QStyleOptionButton>
2020-08-20 21:32:30 +00:00
#include <QFont>
#include <QFontMetrics>
#include <QPushButton>
#include <QProgressBar>
#include <QLabel>
#include <QTextDocument>
2023-08-15 15:28:25 +00:00
#include <QString>
#include <QPainter>
2020-08-20 21:32:30 +00:00
#include "shared/icons.h"
#include "shared/global.h"
#include "shared/utils.h"
#include "shared/pathcheck.h"
2020-08-20 21:32:30 +00:00
#include "preview.h"
namespace Models {
struct FeedItem;
};
class MessageDelegate : public QStyledItemDelegate {
2020-08-20 21:32:30 +00:00
Q_OBJECT
public:
MessageDelegate(QObject *parent = nullptr);
~MessageDelegate();
2020-08-20 21:32:30 +00:00
void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const override;
//void setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex & index) const override;
bool editorEvent(QEvent * event, QAbstractItemModel * model, const QStyleOptionViewItem & option, const QModelIndex & index) override;
void endClearWidgets();
void beginClearWidgets();
void leftClick(const QPoint& point, const QModelIndex& index, const QRect& sizeHint) const;
QString leftDoubleClick(const QPoint& point, const QModelIndex& index, const QRect& sizeHint);
Shared::Hover hoverType(const QPoint& point, const QModelIndex& index, const QRect& sizeHint) const;
QString mouseDrag(const QPoint& start, const QPoint& end, const QModelIndex& index, const QRect& sizeHint);
QString clearSelection();
2022-01-09 14:32:23 +00:00
static int avatarHeight;
static int margin;
signals:
void buttonPushed(const QString& messageId) const;
void invalidPath(const QString& messageId) const;
void openLink(const QString& href) const;
protected:
int paintButton(QPushButton* btn, QPainter* painter, bool sentByMe, QStyleOptionViewItem& option) const;
int paintBar(QProgressBar* bar, QPainter* painter, bool sentByMe, QStyleOptionViewItem& option) const;
int paintPreview(const Models::FeedItem& data, QPainter* painter, QStyleOptionViewItem& option) const;
int paintComment(const Models::FeedItem& data, QPainter* painter, QStyleOptionViewItem& option) const;
int paintBody(const Models::FeedItem& data, QPainter* painter, QStyleOptionViewItem& option) const;
void paintAvatar(const Models::FeedItem& data, const QModelIndex& index, const QStyleOptionViewItem& option, QPainter* painter) const;
2022-01-09 14:32:23 +00:00
void paintBubble(const Models::FeedItem& data, QPainter* painter, const QStyleOptionViewItem& option) const;
QPushButton* getButton(const Models::FeedItem& data) const;
QProgressBar* getBar(const Models::FeedItem& data) const;
QLabel* getStatusIcon(const Models::FeedItem& data) const;
QLabel* getPencilIcon(const Models::FeedItem& data) const;
QLabel* getEncryptionIcon(const Models::FeedItem& data) const;
void clearHelperWidget(const Models::FeedItem& data) const;
bool needToDrawAvatar(const QModelIndex& index, const Models::FeedItem& data, const QStyleOptionViewItem& option) const;
bool needToDrawSender(const QModelIndex& index, const Models::FeedItem& data) const;
QRect getHoveredMessageBodyRect(const QModelIndex& index, const Models::FeedItem& data, const QRect& sizeHint) const;
QString getAnchor(const QPoint& point, const QModelIndex& index, const QRect& sizeHint) const;
protected slots:
void onButtonPushed() const;
2020-08-20 21:32:30 +00:00
private:
class FeedButton : public QPushButton {
public:
QString messageId;
};
const QFont& bodyFont;
const QFont& nickFont;
const QFont& dateFont;
const QFontMetrics& nickMetrics;
const QFontMetrics& dateMetrics;
mutable QTextDocument bodyRenderer;
int buttonHeight;
2022-01-09 14:32:23 +00:00
int buttonWidth;
int barHeight;
mutable std::map<QString, FeedButton*> buttons;
mutable std::map<QString, QProgressBar*> bars;
mutable std::map<QString, QLabel*> statusIcons;
mutable std::map<QString, QLabel*> pencilIcons;
mutable std::map<QString, QLabel*> encryptionIcons;
mutable std::map<QString, Preview*> previews;
mutable std::set<QString> idsToKeep;
bool clearingWidgets;
QString currentId;
std::pair<int, int> selection;
2020-08-20 21:32:30 +00:00
};