mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-05-02 14:16:16 -04:00
FeedReader: Added processing of enclosure in RSS feed
This commit is contained in:
parent
f9ca6cd3e1
commit
ad9d566767
15 changed files with 406 additions and 108 deletions
|
@ -100,7 +100,7 @@ AddFeedDialog::AddFeedDialog(RsFeedReader *feedReader, FeedReaderNotify *notify,
|
|||
ui->postedOnlyImageCheckBox->setEnabled(false);
|
||||
ui->postedOnlyImageCheckBox->setChecked(false);
|
||||
ui->postedShinkImageCheckBox->setEnabled(false);
|
||||
ui->postedShinkImageCheckBox->setChecked(false);
|
||||
ui->postedShinkImageCheckBox->setChecked(true);
|
||||
ui->useAuthenticationCheckBox->setChecked(false);
|
||||
ui->useStandardStorageTimeCheckBox->setChecked(true);
|
||||
ui->useStandardUpdateInterval->setChecked(true);
|
||||
|
@ -199,11 +199,9 @@ void AddFeedDialog::postedFirstImageToggled()
|
|||
{
|
||||
bool checked = ui->postedFirstImageCheckBox->isChecked();
|
||||
ui->postedOnlyImageCheckBox->setEnabled(checked);
|
||||
ui->postedShinkImageCheckBox->setEnabled(checked);
|
||||
|
||||
if (!checked) {
|
||||
ui->postedOnlyImageCheckBox->setChecked(false);
|
||||
ui->postedShinkImageCheckBox->setChecked(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include <QInputDialog>
|
||||
#include <QPainter>
|
||||
#include <QMessageBox>
|
||||
#include <QBuffer>
|
||||
|
||||
#include "FeedReaderDialog.h"
|
||||
#include "FeedReaderMessageWidget.h"
|
||||
|
@ -36,6 +37,7 @@
|
|||
#include "gui/notifyqt.h"
|
||||
#include "FeedReaderUserNotify.h"
|
||||
#include "gui/Posted/PostedCreatePostDialog.h"
|
||||
#include "util/imageutil.h"
|
||||
|
||||
#include "interface/rsFeedReader.h"
|
||||
#include "retroshare/rsiface.h"
|
||||
|
@ -56,6 +58,8 @@
|
|||
#define ROLE_FEED_ERROR Qt::UserRole + 9
|
||||
#define ROLE_FEED_DEACTIVATED Qt::UserRole + 10
|
||||
|
||||
const int MAXMESSAGESIZE = RsSerialiser::MAX_SERIAL_SIZE - 70000;
|
||||
|
||||
FeedReaderDialog::FeedReaderDialog(RsFeedReader *feedReader, FeedReaderNotify *notify, QWidget *parent)
|
||||
: MainPage(parent), mFeedReader(feedReader), mNotify(notify), ui(new Ui::FeedReaderDialog)
|
||||
{
|
||||
|
@ -67,7 +71,7 @@ FeedReaderDialog::FeedReaderDialog(RsFeedReader *feedReader, FeedReaderNotify *n
|
|||
mMessageWidget = NULL;
|
||||
|
||||
connect(mNotify, &FeedReaderNotify::feedChanged, this, &FeedReaderDialog::feedChanged, Qt::QueuedConnection);
|
||||
connect(mNotify, &FeedReaderNotify::shrinkImage, this, &FeedReaderDialog::shrinkImage, Qt::QueuedConnection);
|
||||
connect(mNotify, &FeedReaderNotify::optimizeImage, this, &FeedReaderDialog::optimizeImage, Qt::QueuedConnection);
|
||||
|
||||
connect(NotifyQt::getInstance(), SIGNAL(settingsChanged()), this, SLOT(settingsChanged()));
|
||||
|
||||
|
@ -606,34 +610,52 @@ void FeedReaderDialog::feedChanged(uint32_t feedId, int type)
|
|||
calculateFeedItems();
|
||||
}
|
||||
|
||||
void FeedReaderDialog::shrinkImage()
|
||||
void FeedReaderDialog::optimizeImage()
|
||||
{
|
||||
while (true) {
|
||||
FeedReaderShrinkImageTask *shrinkImageTask = mFeedReader->getShrinkImageTask();
|
||||
FeedReaderOptimizeImageTask *optimizeImageTask = mFeedReader->getOptimizeImageTask();
|
||||
|
||||
if (!shrinkImageTask) {
|
||||
if (!optimizeImageTask) {
|
||||
return;
|
||||
}
|
||||
|
||||
switch (shrinkImageTask->mType) {
|
||||
case FeedReaderShrinkImageTask::POSTED:
|
||||
{
|
||||
QImage image;
|
||||
if (image.loadFromData(shrinkImageTask->mImage.data(), shrinkImageTask->mImage.size())) {
|
||||
QByteArray imageBytes;
|
||||
QImage imageOpt;
|
||||
if (PostedCreatePostDialog::optimizeImage(image, imageBytes, imageOpt)) {
|
||||
shrinkImageTask->mImageResult.assign(imageBytes.begin(), imageBytes.end());
|
||||
shrinkImageTask->mResult = true;
|
||||
optimizeImageTask->mResult = false;
|
||||
|
||||
QImage image;
|
||||
if (image.loadFromData(optimizeImageTask->mImage.data(), optimizeImageTask->mImage.size())) {
|
||||
QByteArray optimizedImageData;
|
||||
std::string optimizedImageMimeType;
|
||||
QImage imageOptDummy;
|
||||
|
||||
switch (optimizeImageTask->mType) {
|
||||
case FeedReaderOptimizeImageTask::POSTED:
|
||||
if (PostedCreatePostDialog::optimizeImage(image, optimizedImageData, imageOptDummy)) {
|
||||
optimizedImageMimeType = "image/jpeg";
|
||||
optimizeImageTask->mResult = true;
|
||||
}
|
||||
break;
|
||||
case FeedReaderOptimizeImageTask::SIZE:
|
||||
if (ImageUtil::optimizeSizeBytes(optimizedImageData, image, imageOptDummy, "JPG", 0, MAXMESSAGESIZE)) {
|
||||
optimizedImageMimeType = "image/jpg";
|
||||
optimizeImageTask->mResult = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (optimizeImageTask->mResult) {
|
||||
if (optimizedImageData.size() < (ssize_t) optimizeImageTask->mImage.size()) {
|
||||
/* use optimized image */
|
||||
optimizeImageTask->mImageResult.assign(optimizedImageData.begin(), optimizedImageData.end());
|
||||
optimizeImageTask->mMimeTypeResult = optimizedImageMimeType;
|
||||
} else {
|
||||
/* use original image */
|
||||
optimizeImageTask->mImageResult = optimizeImageTask->mImage;
|
||||
optimizeImageTask->mMimeTypeResult = optimizeImageTask->mMimeType;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
shrinkImageTask->mResult = false;
|
||||
}
|
||||
|
||||
mFeedReader->setShrinkImageTaskResult(shrinkImageTask);
|
||||
mFeedReader->setOptimizeImageTaskResult(optimizeImageTask);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -69,7 +69,7 @@ private slots:
|
|||
|
||||
/* FeedReaderNotify */
|
||||
void feedChanged(uint32_t feedId, int type);
|
||||
void shrinkImage();
|
||||
void optimizeImage();
|
||||
|
||||
private:
|
||||
uint32_t currentFeedId();
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include <QDesktopServices>
|
||||
#include <QTimer>
|
||||
#include <QPainter>
|
||||
#include <QMimeData>
|
||||
|
||||
#include "FeedReaderMessageWidget.h"
|
||||
#include "ui_FeedReaderMessageWidget.h"
|
||||
|
@ -38,6 +39,8 @@
|
|||
#include "util/QtVersion.h"
|
||||
#include "gui/Posted/PostedCreatePostDialog.h"
|
||||
#include "gui/gxsforums/CreateGxsForumMsg.h"
|
||||
#include "gui/common/FilesDefs.h"
|
||||
#include "util/imageutil.h"
|
||||
|
||||
#include "retroshare/rsiface.h"
|
||||
#include "retroshare/rsgxsforums.h"
|
||||
|
@ -87,6 +90,12 @@ FeedReaderMessageWidget::FeedReaderMessageWidget(uint32_t feedId, RsFeedReader *
|
|||
connect(ui->msgRemoveButton, SIGNAL(clicked()), this, SLOT(removeMsg()));
|
||||
connect(ui->feedProcessButton, SIGNAL(clicked()), this, SLOT(processFeed()));
|
||||
|
||||
/* Set initial size the splitter */
|
||||
QList<int> sizes;
|
||||
sizes << 250 << width(); // Qt calculates the right sizes
|
||||
ui->pictureSplitter->setSizes(sizes);
|
||||
ui->pictureSplitter->hide();
|
||||
|
||||
// create timer for navigation
|
||||
mTimer = new QTimer(this);
|
||||
mTimer->setInterval(300);
|
||||
|
@ -119,6 +128,10 @@ FeedReaderMessageWidget::FeedReaderMessageWidget(uint32_t feedId, RsFeedReader *
|
|||
ui->filterLineEdit->addFilter(QIcon(), tr("Author"), COLUMN_MSG_AUTHOR, tr("Search Author"));
|
||||
ui->filterLineEdit->setCurrentFilter(COLUMN_MSG_TITLE);
|
||||
|
||||
/* add image actions */
|
||||
ui->attachmentLabel->addContextMenuAction(ui->actionAttachmentCopyLinkLocation);
|
||||
connect(ui->actionAttachmentCopyLinkLocation, &QAction::triggered, this, &FeedReaderMessageWidget::attachmentCopyLinkLocation);
|
||||
|
||||
/* load settings */
|
||||
processSettings(true);
|
||||
|
||||
|
@ -179,6 +192,7 @@ void FeedReaderMessageWidget::processSettings(bool load)
|
|||
|
||||
// state of splitter
|
||||
ui->msgSplitter->restoreState(Settings->value("msgSplitter").toByteArray());
|
||||
ui->pictureSplitter->restoreState(Settings->value("pictureSplitter").toByteArray());
|
||||
} else {
|
||||
// save settings
|
||||
|
||||
|
@ -187,6 +201,7 @@ void FeedReaderMessageWidget::processSettings(bool load)
|
|||
|
||||
// state of splitter
|
||||
Settings->setValue("msgSplitter", ui->msgSplitter->saveState());
|
||||
Settings->setValue("pictureSplitter", ui->pictureSplitter->saveState());
|
||||
}
|
||||
|
||||
Settings->endGroup();
|
||||
|
@ -599,6 +614,21 @@ void FeedReaderMessageWidget::msgItemChanged()
|
|||
mTimer->start();
|
||||
}
|
||||
|
||||
void FeedReaderMessageWidget::clearMessage()
|
||||
{
|
||||
ui->msgTitle->clear();
|
||||
// ui->msgLink->clear();
|
||||
ui->msgText->clear();
|
||||
ui->msgTextSplitter->clear();
|
||||
ui->attachmentLabel->clear();
|
||||
ui->linkButton->setEnabled(false);
|
||||
ui->msgText->show();
|
||||
ui->pictureSplitter->hide();
|
||||
|
||||
ui->actionAttachmentCopyLinkLocation->setData(QVariant());
|
||||
ui->actionAttachmentCopyLinkLocation->setEnabled(false);
|
||||
}
|
||||
|
||||
void FeedReaderMessageWidget::updateCurrentMessage()
|
||||
{
|
||||
mTimer->stop();
|
||||
|
@ -608,10 +638,7 @@ void FeedReaderMessageWidget::updateCurrentMessage()
|
|||
std::string msgId = currentMsgId();
|
||||
|
||||
if (mFeedId == 0 || msgId.empty()) {
|
||||
ui->msgTitle->clear();
|
||||
// ui->msgLink->clear();
|
||||
ui->msgText->clear();
|
||||
ui->linkButton->setEnabled(false);
|
||||
clearMessage();
|
||||
|
||||
ui->msgReadButton->setEnabled(false);
|
||||
ui->msgUnreadButton->setEnabled(false);
|
||||
|
@ -622,10 +649,7 @@ void FeedReaderMessageWidget::updateCurrentMessage()
|
|||
QTreeWidgetItem *item = ui->msgTreeWidget->currentItem();
|
||||
if (!item) {
|
||||
/* there is something wrong */
|
||||
ui->msgTitle->clear();
|
||||
// ui->msgLink->clear();
|
||||
ui->msgText->clear();
|
||||
ui->linkButton->setEnabled(false);
|
||||
clearMessage();
|
||||
|
||||
ui->msgReadButton->setEnabled(false);
|
||||
ui->msgUnreadButton->setEnabled(false);
|
||||
|
@ -640,10 +664,7 @@ void FeedReaderMessageWidget::updateCurrentMessage()
|
|||
/* get msg */
|
||||
FeedMsgInfo msgInfo;
|
||||
if (!mFeedReader->getMsgInfo(mFeedId, msgId, msgInfo)) {
|
||||
ui->msgTitle->clear();
|
||||
// ui->msgLink->clear();
|
||||
ui->msgText->clear();
|
||||
ui->linkButton->setEnabled(false);
|
||||
clearMessage();
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -663,9 +684,41 @@ void FeedReaderMessageWidget::updateCurrentMessage()
|
|||
setMsgAsReadUnread(row, setToReadOnActive);
|
||||
}
|
||||
|
||||
ui->actionAttachmentCopyLinkLocation->setData(QVariant());
|
||||
ui->actionAttachmentCopyLinkLocation->setEnabled(false);
|
||||
|
||||
if (!msgInfo.attachment.empty()) {
|
||||
QByteArray imageData((char*) msgInfo.attachment.data(), msgInfo.attachment.size());
|
||||
QPixmap pixmap;
|
||||
if (pixmap.loadFromData(imageData)) {
|
||||
ui->attachmentLabel->setPixmap(pixmap);
|
||||
ui->pictureSplitter->show();
|
||||
ui->msgText->hide();
|
||||
} else {
|
||||
ui->pictureSplitter->hide();
|
||||
ui->msgText->show();
|
||||
}
|
||||
|
||||
if (!msgInfo.attachmentLink.empty()) {
|
||||
ui->actionAttachmentCopyLinkLocation->setData(QString::fromUtf8(msgInfo.attachmentLink.c_str()));
|
||||
ui->actionAttachmentCopyLinkLocation->setEnabled(true);
|
||||
}
|
||||
} else {
|
||||
ui->pictureSplitter->hide();
|
||||
ui->msgText->show();
|
||||
}
|
||||
|
||||
QString msgTxt = RsHtml().formatText(ui->msgText->document(), QString::fromUtf8((msgInfo.descriptionTransformed.empty() ? msgInfo.description : msgInfo.descriptionTransformed).c_str()), RSHTML_FORMATTEXT_EMBED_LINKS);
|
||||
|
||||
ui->msgText->setHtml(msgTxt);
|
||||
if (ui->pictureSplitter->isVisible()) {
|
||||
ui->msgTextSplitter->setHtml(msgTxt);
|
||||
ui->msgText->clear();
|
||||
} else {
|
||||
ui->msgText->setHtml(msgTxt);
|
||||
ui->msgTextSplitter->clear();
|
||||
ui->attachmentLabel->clear();
|
||||
}
|
||||
|
||||
ui->msgTitle->setText(QString::fromUtf8(msgInfo.title.c_str()));
|
||||
|
||||
ui->linkButton->setEnabled(!msgInfo.link.empty());
|
||||
|
@ -742,11 +795,11 @@ void FeedReaderMessageWidget::toggleMsgText()
|
|||
void FeedReaderMessageWidget::toggleMsgText_internal()
|
||||
{
|
||||
if (ui->expandButton->isChecked()) {
|
||||
ui->msgText->setVisible(true);
|
||||
ui->horizontalLayoutWidget->setVisible(true);
|
||||
ui->expandButton->setIcon(QIcon(QString(":/images/edit_remove24.png")));
|
||||
ui->expandButton->setToolTip(tr("Hide"));
|
||||
} else {
|
||||
ui->msgText->setVisible(false);
|
||||
ui->horizontalLayoutWidget->setVisible(false);
|
||||
ui->expandButton->setIcon(QIcon(QString(":/images/edit_add24.png")));
|
||||
ui->expandButton->setToolTip(tr("Expand"));
|
||||
}
|
||||
|
@ -969,3 +1022,22 @@ void FeedReaderMessageWidget::addToPosted()
|
|||
msgDialog->setLink(QString::fromUtf8(msgInfo.link.c_str()));
|
||||
msgDialog->show();
|
||||
}
|
||||
|
||||
void FeedReaderMessageWidget::attachmentCopyLinkLocation()
|
||||
{
|
||||
QAction *action = dynamic_cast<QAction*>(sender()) ;
|
||||
if (!action) {
|
||||
return;
|
||||
}
|
||||
|
||||
QVariant data = action->data();
|
||||
if (!data.isValid()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (data.type() != QVariant::String) {
|
||||
return;
|
||||
}
|
||||
|
||||
QApplication::clipboard()->setText(data.toString());
|
||||
}
|
||||
|
|
|
@ -77,6 +77,7 @@ private slots:
|
|||
void fillPostedMenu();
|
||||
void addToForum();
|
||||
void addToPosted();
|
||||
void attachmentCopyLinkLocation();
|
||||
|
||||
/* FeedReaderNotify */
|
||||
void feedChanged(uint32_t feedId, int type);
|
||||
|
@ -92,6 +93,7 @@ private:
|
|||
void filterItem(QTreeWidgetItem *item, const QString &text, int filterColumn);
|
||||
void filterItem(QTreeWidgetItem *item);
|
||||
void toggleMsgText_internal();
|
||||
void clearMessage();
|
||||
|
||||
bool mProcessSettings;
|
||||
RSTreeWidgetItemCompareRole *mMsgCompareRole;
|
||||
|
|
|
@ -182,7 +182,7 @@
|
|||
<string/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../../../retroshare-gui/src/gui/images.qrc">
|
||||
<iconset>
|
||||
<normaloff>:/images/message-state-header.png</normaloff>:/images/message-state-header.png</iconset>
|
||||
</property>
|
||||
</column>
|
||||
|
@ -245,7 +245,7 @@
|
|||
<string/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../../../retroshare-gui/src/gui/images.qrc">
|
||||
<iconset>
|
||||
<normaloff>:/images/edit_remove24.png</normaloff>:/images/edit_remove24.png</iconset>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
|
@ -260,20 +260,63 @@
|
|||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="RSTextBrowser" name="msgText">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>10</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="textInteractionFlags">
|
||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||
</property>
|
||||
<widget class="QWidget" name="horizontalLayoutWidget">
|
||||
<layout class="QHBoxLayout" name="pictureHorizontalLayout">
|
||||
<item>
|
||||
<widget class="RSTextBrowser" name="msgText">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>10</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="textInteractionFlags">
|
||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QSplitter" name="pictureSplitter">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<widget class="QWidget" name="verticalLayoutWidget">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="AspectRatioPixmapLabel" name="attachmentLabel">
|
||||
<property name="text">
|
||||
<string notr="true">pictureLabel</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="RSTextBrowser" name="msgTextSplitter">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>10</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="textInteractionFlags">
|
||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||
</property>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
<action name="actionAttachmentCopyLinkLocation">
|
||||
<property name="text">
|
||||
<string>Copy Link Location</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
|
@ -297,10 +340,14 @@
|
|||
<header location="global">gui/common/ElidedLabel.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>AspectRatioPixmapLabel</class>
|
||||
<extends>QLabel</extends>
|
||||
<header location="global">util/AspectRatioPixmapLabel.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources>
|
||||
<include location="FeedReader_images.qrc"/>
|
||||
<include location="../../../retroshare-gui/src/gui/images.qrc"/>
|
||||
</resources>
|
||||
<connections/>
|
||||
</ui>
|
||||
|
|
|
@ -34,7 +34,7 @@ void FeedReaderNotify::notifyMsgChanged(uint32_t feedId, const std::string &msgI
|
|||
emit msgChanged(feedId, QString::fromStdString(msgId), type);
|
||||
}
|
||||
|
||||
void FeedReaderNotify::notifyShrinkImage()
|
||||
void FeedReaderNotify::notifyOptimizeImage()
|
||||
{
|
||||
emit shrinkImage();
|
||||
emit optimizeImage();
|
||||
}
|
||||
|
|
|
@ -34,12 +34,12 @@ public:
|
|||
/* RsFeedReaderNotify */
|
||||
virtual void notifyFeedChanged(uint32_t feedId, int type);
|
||||
virtual void notifyMsgChanged(uint32_t feedId, const std::string &msgId, int type);
|
||||
virtual void notifyShrinkImage();
|
||||
virtual void notifyOptimizeImage();
|
||||
|
||||
signals:
|
||||
void feedChanged(uint32_t feedId, int type);
|
||||
void msgChanged(uint32_t feedId, const QString &msgId, int type);
|
||||
void shrinkImage();
|
||||
void optimizeImage();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue