/******************************************************************************* * retroshare-gui/src/gui/PhotoShare/PhotoDialog.cpp * * * * Copyright (C) 2018 by Retroshare Team * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Affero General Public License as * * published by the Free Software Foundation, either version 3 of the * * License, or (at your option) any later version. * * * * 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 Affero General Public License for more details. * * * * You should have received a copy of the GNU Affero General Public License * * along with this program. If not, see . * * * *******************************************************************************/ #include #include #include "PhotoDialog.h" #include "ui_PhotoDialog.h" #include "retroshare/rsidentity.h" #include "gui/gxs/GxsCommentDialog.h" PhotoDialog::PhotoDialog(RsPhoto *rs_photo, const RsPhotoPhoto &photo, QWidget *parent) : QDialog(parent, Qt::WindowSystemMenuHint | Qt::WindowTitleHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint), ui(new Ui::PhotoDialog), mRsPhoto(rs_photo), mPhotoQueue(new TokenQueue(mRsPhoto->getTokenService(), this)), mPhotoDetails(photo), mCommentsCreated(false) { ui->setupUi(this); setAttribute ( Qt::WA_DeleteOnClose, true ); connect(ui->fullscreenButton, SIGNAL(clicked()),this, SLOT(setFullScreen())); connect(ui->commentsButton, SIGNAL(clicked()),this, SLOT(toggleComments())); connect(ui->detailsButton, SIGNAL(clicked()),this, SLOT(toggleDetails())); setUp(); } PhotoDialog::~PhotoDialog() { delete ui; delete mPhotoQueue; } void PhotoDialog::setUp() { QPixmap qtn; qtn.loadFromData(mPhotoDetails.mThumbnail.mData, mPhotoDetails.mThumbnail.mSize, "PNG"); ui->label_Photo->setPixmap(qtn); ui->label_Photo->setVisible(true); // set size of label to match image. ui->label_Photo->setMinimumSize(ui->label_Photo->sizeHint()); // alternative is to scale contents. // ui->label_Photo->setScaledContents(true); // Neither are ideal. sizeHint is potentially too large. // scaled contents - doesn't respect Aspect Ratio... // // Ideal soln: // Allow both, depending on Zoom Factor. // Auto: use Scale, with correct aspect ratio. // answer here: https://stackoverflow.com/questions/8211982/qt-resizing-a-qlabel-containing-a-qpixmap-while-keeping-its-aspect-ratio // Fixed %, then manually scale to that, with scroll area. ui->lineEdit_Title->setText(QString::fromStdString(mPhotoDetails.mMeta.mMsgName)); ui->frame_comments->setVisible(false); ui->frame_details->setVisible(false); } void PhotoDialog::toggleDetails() { if (ui->frame_details->isVisible()) { ui->frame_details->setVisible(false); } else { ui->frame_details->setVisible(true); } } void PhotoDialog::toggleComments() { if (ui->frame_comments->isVisible()) { ui->frame_comments->setVisible(false); } else { if (mCommentsCreated) { ui->frame_comments->setVisible(true); } else { // create CommentDialog. RsGxsCommentService *commentService = dynamic_cast(mRsPhoto); GxsCommentDialog *commentDialog = new GxsCommentDialog(this, mRsPhoto->getTokenService(), commentService); // TODO: Need to fetch all msg versions, otherwise - won't get all the comments. // For the moment - use current msgid. // Needs to be passed to PhotoDialog, or fetched here. RsGxsGroupId grpId = mPhotoDetails.mMeta.mGroupId; RsGxsMessageId msgId = mPhotoDetails.mMeta.mMsgId; std::set msgv; msgv.insert(msgId); msgv.insert(mPhotoDetails.mMeta.mOrigMsgId); // if duplicate will be ignored. commentDialog->commentLoad(grpId, msgv,msgId); // insert into frame. QVBoxLayout *vbox = new QVBoxLayout(); vbox->addWidget(commentDialog); ui->frame_comments->setLayout(vbox); ui->frame_comments->setVisible(true); mCommentsCreated = true; } } } /*************** message loading **********************/ void PhotoDialog::loadRequest(const TokenQueue *queue, const TokenRequest &req) { std::cerr << "PhotoShare::loadRequest()"; std::cerr << std::endl; if (queue == mPhotoQueue) { /* now switch on req */ switch(req.mType) { case TOKENREQ_MSGINFO: { switch(req.mAnsType) { case RS_TOKREQ_ANSTYPE_LIST: loadList(req.mToken); break; default: std::cerr << "PhotoShare::loadRequest() ERROR: MSG INVALID TYPE"; std::cerr << std::endl; break; } break; } default: { std::cerr << "PhotoShare::loadRequest() ERROR: INVALID TYPE"; std::cerr << std::endl; break; } } } } void PhotoDialog::loadList(uint32_t token) { GxsMsgReq msgIds; mRsPhoto->getMsgList(token, msgIds); RsTokReqOptions opts; // just use data as no need to worry about getting comments opts.mReqType = GXS_REQUEST_TYPE_MSG_DATA; uint32_t reqToken; mPhotoQueue->requestMsgInfo(reqToken, RS_TOKREQ_ANSTYPE_DATA, opts, msgIds, 0); } void PhotoDialog::setFullScreen() { if (!isFullScreen()) { // hide menu & toolbars #ifdef Q_OS_LINUX show(); raise(); setWindowState( windowState() | Qt::WindowFullScreen ); #else setWindowState( windowState() | Qt::WindowFullScreen ); show(); raise(); #endif } else { setWindowState( windowState() ^ Qt::WindowFullScreen ); show(); } }