Update RsPhotoItems and switch to GxsGroupDialog.

WIP improvements to PhotoService:
 - Switch from custom image to use RsGxsImage
 - Update classes for new Image class
 - fix serialiser for photos
 - switch group creation to use GxGroupDialog
 - tweak GxsGroupDialog to display extra Widgets
 - add AlbumExtra widget
This commit is contained in:
drbob 2020-02-15 01:01:19 +11:00
parent d88788f411
commit d04518fd55
23 changed files with 704 additions and 473 deletions

View File

@ -3,7 +3,7 @@
* * * *
* libretroshare: retroshare core library * * libretroshare: retroshare core library *
* * * *
* Copyright 2008-2012 by Robert Fernie <retroshare@lunamutt.com> * * Copyright 2008-2020 by Robert Fernie <retroshare@lunamutt.com> *
* * * *
* This program is free software: you can redistribute it and/or modify * * This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as * * it under the terms of the GNU Lesser General Public License as *
@ -26,6 +26,7 @@
#include <string> #include <string>
#include <list> #include <list>
#include "rsgxsservice.h" #include "rsgxsservice.h"
#include "rsgxscommon.h"
/* The Main Interface Class - for information about your Peers */ /* The Main Interface Class - for information about your Peers */
class RsPhoto; class RsPhoto;
@ -37,21 +38,6 @@ extern RsPhoto *rsPhoto;
#define RSPHOTO_MODE_OWN 2 #define RSPHOTO_MODE_OWN 2
#define RSPHOTO_MODE_REMOTE 3 #define RSPHOTO_MODE_REMOTE 3
class RsPhotoThumbnail
{
public:
RsPhotoThumbnail()
:data(NULL), size(0), type("N/A") { return; }
bool deleteImage();
bool copyFrom(const RsPhotoThumbnail &nail);
// Holds Thumbnail image.
uint8_t *data;
uint32_t size;
std::string type;
};
/* If these flags are no set - the Photo inherits values from the Album /* If these flags are no set - the Photo inherits values from the Album
*/ */
@ -96,7 +82,7 @@ class RsPhotoPhoto
int mOrder; int mOrder;
RsPhotoThumbnail mThumbnail; RsGxsImage mThumbnail;
int mMode; int mMode;
@ -137,7 +123,7 @@ class RsPhotoAlbum
std::string mHashTags; std::string mHashTags;
RsPhotoThumbnail mThumbnail; RsGxsImage mThumbnail;
int mMode; int mMode;

View File

@ -37,8 +37,8 @@ RsItem *RsGxsPhotoSerialiser::create_item(uint16_t service, uint8_t item_sub_id)
switch(item_sub_id) switch(item_sub_id)
{ {
case RS_PKT_SUBTYPE_PHOTO_COMMENT_ITEM: return new RsGxsPhotoCommentItem() ; case RS_PKT_SUBTYPE_PHOTO_COMMENT_ITEM: return new RsGxsPhotoCommentItem() ;
case RS_PKT_SUBTYPE_PHOTO_SHOW_ITEM: return new RsGxsPhotoAlbumItem() ; case RS_PKT_SUBTYPE_PHOTO_SHOW_ITEM: return new RsGxsPhotoPhotoItem() ;
case RS_PKT_SUBTYPE_PHOTO_ITEM: return new RsGxsPhotoPhotoItem() ; case RS_PKT_SUBTYPE_PHOTO_ITEM: return new RsGxsPhotoAlbumItem() ;
default: default:
return NULL ; return NULL ;
} }
@ -55,10 +55,9 @@ void RsGxsPhotoAlbumItem::serial_process(RsGenericSerializer::SerializeJob j,RsG
RsTypeSerializer::serial_process(j,ctx,TLV_TYPE_STR_NAME, album.mPhotographer, "mPhotographer"); RsTypeSerializer::serial_process(j,ctx,TLV_TYPE_STR_NAME, album.mPhotographer, "mPhotographer");
RsTypeSerializer::serial_process(j,ctx,TLV_TYPE_STR_DATE, album.mWhen, "mWhen"); RsTypeSerializer::serial_process(j,ctx,TLV_TYPE_STR_DATE, album.mWhen, "mWhen");
RsTypeSerializer::serial_process(j,ctx,TLV_TYPE_STR_LOCATION, album.mWhere, "mWhere"); RsTypeSerializer::serial_process(j,ctx,TLV_TYPE_STR_LOCATION, album.mWhere, "mWhere");
RsTypeSerializer::serial_process(j,ctx,TLV_TYPE_STR_PIC_TYPE, album.mThumbnail.type,"mThumbnail.type");
RsTlvBinaryDataRef b(RS_SERVICE_GXS_TYPE_PHOTO, album.mThumbnail.data, album.mThumbnail.size); RsTlvBinaryDataRef b(RS_SERVICE_GXS_TYPE_PHOTO, album.mThumbnail.mData, album.mThumbnail.mSize);
RsTypeSerializer::serial_process<RsTlvItem>(j, ctx, b, "thumbnail binary data") ; RsTypeSerializer::serial_process<RsTlvItem>(j, ctx, b, "mThumbnail") ;
} }
void RsGxsPhotoPhotoItem::serial_process(RsGenericSerializer::SerializeJob j,RsGenericSerializer::SerializeContext& ctx) void RsGxsPhotoPhotoItem::serial_process(RsGenericSerializer::SerializeJob j,RsGenericSerializer::SerializeContext& ctx)
{ {
@ -70,9 +69,8 @@ void RsGxsPhotoPhotoItem::serial_process(RsGenericSerializer::SerializeJob j,RsG
RsTypeSerializer::serial_process(j, ctx, TLV_TYPE_STR_PIC_AUTH, photo.mPhotographer, "mPhotographer"); RsTypeSerializer::serial_process(j, ctx, TLV_TYPE_STR_PIC_AUTH, photo.mPhotographer, "mPhotographer");
RsTypeSerializer::serial_process(j, ctx, TLV_TYPE_STR_DATE, photo.mWhen, "mWhen"); RsTypeSerializer::serial_process(j, ctx, TLV_TYPE_STR_DATE, photo.mWhen, "mWhen");
RsTypeSerializer::serial_process(j, ctx, TLV_TYPE_STR_LOCATION, photo.mWhere, "mWhere"); RsTypeSerializer::serial_process(j, ctx, TLV_TYPE_STR_LOCATION, photo.mWhere, "mWhere");
RsTypeSerializer::serial_process(j, ctx, TLV_TYPE_STR_PIC_TYPE, photo.mThumbnail.type, "mThumbnail.type");
RsTlvBinaryDataRef b(RS_SERVICE_GXS_TYPE_PHOTO, photo.mThumbnail.data, photo.mThumbnail.size); RsTlvBinaryDataRef b(RS_SERVICE_GXS_TYPE_PHOTO, photo.mThumbnail.mData, photo.mThumbnail.mSize);
RsTypeSerializer::serial_process<RsTlvItem>(j, ctx, b, "mThumbnail") ; RsTypeSerializer::serial_process<RsTlvItem>(j, ctx, b, "mThumbnail") ;
} }
void RsGxsPhotoCommentItem::serial_process(RsGenericSerializer::SerializeJob j,RsGenericSerializer::SerializeContext& ctx) void RsGxsPhotoCommentItem::serial_process(RsGenericSerializer::SerializeJob j,RsGenericSerializer::SerializeContext& ctx)
@ -92,7 +90,7 @@ void RsGxsPhotoAlbumItem::clear()
album.mPhotographer.clear(); album.mPhotographer.clear();
album.mWhen.clear(); album.mWhen.clear();
album.mWhere.clear(); album.mWhere.clear();
album.mThumbnail.deleteImage(); album.mThumbnail.clear();
} }
void RsGxsPhotoCommentItem::clear() void RsGxsPhotoCommentItem::clear()
@ -111,5 +109,5 @@ void RsGxsPhotoPhotoItem::clear()
photo.mPhotographer.clear(); photo.mPhotographer.clear();
photo.mWhen.clear(); photo.mWhen.clear();
photo.mWhere.clear(); photo.mWhere.clear();
photo.mThumbnail.deleteImage(); photo.mThumbnail.clear();
} }

View File

@ -30,46 +30,6 @@ const uint32_t RsPhoto::FLAG_MSG_TYPE_MASK = 0x000f;
const uint32_t RsPhoto::FLAG_MSG_TYPE_PHOTO_POST = 0x0001; const uint32_t RsPhoto::FLAG_MSG_TYPE_PHOTO_POST = 0x0001;
const uint32_t RsPhoto::FLAG_MSG_TYPE_PHOTO_COMMENT = 0x0002; const uint32_t RsPhoto::FLAG_MSG_TYPE_PHOTO_COMMENT = 0x0002;
bool RsPhotoThumbnail::copyFrom(const RsPhotoThumbnail &nail)
{
if (data)
{
deleteImage();
}
if ((!nail.data) || (nail.size == 0))
{
return false;
}
size = nail.size;
type = nail.type;
data = (uint8_t *) rs_malloc(size);
if(data == NULL)
return false ;
memcpy(data, nail.data, size);
return true;
}
bool RsPhotoThumbnail::deleteImage()
{
if (data)
{
free(data);
data = NULL;
size = 0;
type.clear();
}
return true;
}
RsPhotoPhoto::RsPhotoPhoto() RsPhotoPhoto::RsPhotoPhoto()
:mSetFlags(0), mOrder(0), mMode(0), mModFlags(0) :mSetFlags(0), mOrder(0), mMode(0), mModFlags(0)
{ {
@ -178,8 +138,9 @@ void p3PhotoService::groupsChanged(std::list<RsGxsGroupId>& grpIds)
RsGxsGroupChange* gc = mGroupChange.back(); RsGxsGroupChange* gc = mGroupChange.back();
std::list<RsGxsGroupId>& gList = gc->mGrpIdList; std::list<RsGxsGroupId>& gList = gc->mGrpIdList;
std::list<RsGxsGroupId>::iterator lit = gList.begin(); std::list<RsGxsGroupId>::iterator lit = gList.begin();
for(; lit != gList.end(); ++lit) for(; lit != gList.end(); ++lit) {
grpIds.push_back(*lit); grpIds.push_back(*lit);
}
mGroupChange.pop_back(); mGroupChange.pop_back();
delete gc; delete gc;
@ -210,7 +171,8 @@ RsTokenService* p3PhotoService::getTokenService() {
bool p3PhotoService::getGroupList(const uint32_t& token, bool p3PhotoService::getGroupList(const uint32_t& token,
std::list<RsGxsGroupId>& groupIds) std::list<RsGxsGroupId>& groupIds)
{ {
return RsGenExchange::getGroupList(token, groupIds); bool okay = RsGenExchange::getGroupList(token, groupIds);
return okay;
} }
@ -225,7 +187,8 @@ bool p3PhotoService::getMsgList(const uint32_t& token,
bool p3PhotoService::getGroupSummary(const uint32_t& token, bool p3PhotoService::getGroupSummary(const uint32_t& token,
std::list<RsGroupMetaData>& groupInfo) std::list<RsGroupMetaData>& groupInfo)
{ {
return RsGenExchange::getGroupMeta(token, groupInfo); bool okay = RsGenExchange::getGroupMeta(token, groupInfo);
return okay;
} }
@ -349,9 +312,7 @@ RsPhotoComment& RsPhotoComment::operator=(const RsGxsPhotoCommentItem& comment)
bool p3PhotoService::getPhotoRelatedComment(const uint32_t &token, PhotoRelatedCommentResult &comments) bool p3PhotoService::getPhotoRelatedComment(const uint32_t &token, PhotoRelatedCommentResult &comments)
{ {
return RsGenExchange::getMsgRelatedDataT<RsGxsPhotoCommentItem, RsPhotoComment>(token, comments); return RsGenExchange::getMsgRelatedDataT<RsGxsPhotoCommentItem, RsPhotoComment>(token, comments);
} }
bool p3PhotoService::submitAlbumDetails(uint32_t& token, RsPhotoAlbum& album) bool p3PhotoService::submitAlbumDetails(uint32_t& token, RsPhotoAlbum& album)
@ -397,7 +358,6 @@ bool p3PhotoService::submitPhoto(uint32_t& token, RsPhotoPhoto& photo)
RsGxsPhotoPhotoItem* photoItem = new RsGxsPhotoPhotoItem(); RsGxsPhotoPhotoItem* photoItem = new RsGxsPhotoPhotoItem();
photoItem->photo = photo; photoItem->photo = photo;
photoItem->meta = photo.mMeta; photoItem->meta = photo.mMeta;
photoItem->meta.mMsgFlags = FLAG_MSG_TYPE_PHOTO_POST;
RsGenExchange::publishMsg(token, photoItem); RsGenExchange::publishMsg(token, photoItem);
return true; return true;

View File

@ -128,7 +128,7 @@ void AlbumCreateDialog::publishPhotos()
} }
bool AlbumCreateDialog::getAlbumThumbnail(RsPhotoThumbnail &nail) bool AlbumCreateDialog::getAlbumThumbnail(RsGxsImage &image)
{ {
const QPixmap *tmppix = &mThumbNail; const QPixmap *tmppix = &mThumbNail;
@ -142,17 +142,11 @@ bool AlbumCreateDialog::getAlbumThumbnail(RsPhotoThumbnail &nail)
buffer.open(QIODevice::WriteOnly); buffer.open(QIODevice::WriteOnly);
tmppix->save(&buffer, "PNG"); // writes image into ba in PNG format tmppix->save(&buffer, "PNG"); // writes image into ba in PNG format
RsPhotoThumbnail tmpnail; image.copy((uint8_t *) ba.data(), ba.size());
tmpnail.data = (uint8_t *) ba.data();
tmpnail.size = ba.size();
nail.copyFrom(tmpnail);
return true; return true;
} }
nail.data = NULL; image.clear();
nail.size = 0;
return false; return false;
} }

View File

@ -55,7 +55,7 @@ private slots:
private: private:
bool getAlbumThumbnail(RsPhotoThumbnail &nail); bool getAlbumThumbnail(RsGxsImage &image);
private: private:
Ui::AlbumCreateDialog *ui; Ui::AlbumCreateDialog *ui;

View File

@ -60,11 +60,11 @@ void AlbumDialog::setUp()
ui->textEdit_description->setText(QString::fromStdString(mAlbum.mDescription)); ui->textEdit_description->setText(QString::fromStdString(mAlbum.mDescription));
QPixmap qtn;
GxsIdDetails::loadPixmapFromData(mAlbum.mThumbnail.data, mAlbum.mThumbnail.size,qtn, GxsIdDetails::ORIGINAL);
if(mAlbum.mThumbnail.size != 0) if(mAlbum.mThumbnail.mSize != 0)
{ {
QPixmap qtn;
GxsIdDetails::loadPixmapFromData(mAlbum.mThumbnail.mData, mAlbum.mThumbnail.mSize,qtn, GxsIdDetails::ORIGINAL);
ui->label_thumbNail->setPixmap(qtn); ui->label_thumbNail->setPixmap(qtn);
} }
else else

View File

@ -0,0 +1,41 @@
/*******************************************************************************
* retroshare-gui/src/gui/PhotoShare/AlbumExtra.cpp *
* *
* Copyright (C) 2018 by Robert Fernie <retroshare.project@gmail.com> *
* *
* 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 <https://www.gnu.org/licenses/>. *
* *
*******************************************************************************/
#include "AlbumExtra.h"
#include "ui_AlbumExtra.h"
AlbumExtra::AlbumExtra(QWidget *parent) :
QWidget(NULL),
ui(new Ui::AlbumExtra)
{
ui->setupUi(this);
setUp();
}
AlbumExtra::~AlbumExtra()
{
delete ui;
}
void AlbumExtra::setUp()
{
}

View File

@ -0,0 +1,44 @@
/*******************************************************************************
* retroshare-gui/src/gui/PhotoShare/AlbumExtra.h *
* *
* Copyright (C) 2020 by Robert Fernie <retroshare.project@gmail.com> *
* *
* 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 <https://www.gnu.org/licenses/>. *
* *
*******************************************************************************/
#ifndef ALBUMEXTRA_H
#define ALBUMEXTRA_H
#include <QWidget>
namespace Ui {
class AlbumExtra;
}
class AlbumExtra : public QWidget
{
Q_OBJECT
public:
explicit AlbumExtra(QWidget *parent = 0);
virtual ~AlbumExtra();
private:
void setUp();
private:
Ui::AlbumExtra *ui;
};
#endif // ALBUMEXTRA_H

View File

@ -0,0 +1,162 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>AlbumExtra</class>
<widget class="QWidget" name="AlbumExtra">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>513</width>
<height>198</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label_19">
<property name="text">
<string>Category:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="comboBox_Category_2">
<item>
<property name="text">
<string>Animals</string>
</property>
</item>
<item>
<property name="text">
<string>Family</string>
</property>
</item>
<item>
<property name="text">
<string>Friends</string>
</property>
</item>
<item>
<property name="text">
<string>Flowers</string>
</property>
</item>
<item>
<property name="text">
<string>Holiday</string>
</property>
</item>
<item>
<property name="text">
<string>Landscapes</string>
</property>
</item>
<item>
<property name="text">
<string>Pets</string>
</property>
</item>
<item>
<property name="text">
<string>Portraits</string>
</property>
</item>
<item>
<property name="text">
<string>Travel</string>
</property>
</item>
<item>
<property name="text">
<string>Work</string>
</property>
</item>
<item>
<property name="text">
<string>Random</string>
</property>
</item>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Quality:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="comboBox_5">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<item>
<property name="text">
<string>Resize Images (&lt; 1Mb)</string>
</property>
</item>
<item>
<property name="text">
<string>Resize Images (&lt; 10Mb)</string>
</property>
</item>
<item>
<property name="text">
<string>Send Original Images</string>
</property>
</item>
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="captionLabel">
<property name="text">
<string>Caption:</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="lineEdit_Caption_2"/>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_14">
<property name="text">
<string>Where:</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLineEdit" name="lineEdit_Where"/>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_12">
<property name="text">
<string>Photographer:</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLineEdit" name="lineEdit_Photographer"/>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -0,0 +1,186 @@
/*******************************************************************************
* retroshare-gui/src/gui/PhotoShare/AlbumGroupDialog.cpp *
* *
* Copyright (C) 2020 by Robert Fernie <retroshare.project@gmail.com> *
* *
* 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 <https://www.gnu.org/licenses/>. *
* *
*******************************************************************************/
#include <QBuffer>
#include "AlbumGroupDialog.h"
#include "AlbumExtra.h"
#include "gui/gxs/GxsIdDetails.h"
#include <iostream>
const uint32_t AlbumCreateEnabledFlags = (
GXS_GROUP_FLAGS_NAME |
GXS_GROUP_FLAGS_ICON |
GXS_GROUP_FLAGS_DESCRIPTION |
GXS_GROUP_FLAGS_DISTRIBUTION |
// GXS_GROUP_FLAGS_PUBLISHSIGN |
// GXS_GROUP_FLAGS_SHAREKEYS | // disabled because the UI doesn't handle it yet.
// GXS_GROUP_FLAGS_PERSONALSIGN |
// GXS_GROUP_FLAGS_COMMENTS |
GXS_GROUP_FLAGS_EXTRA |
0);
uint32_t AlbumCreateDefaultsFlags = ( GXS_GROUP_DEFAULTS_DISTRIB_PUBLIC |
//GXS_GROUP_DEFAULTS_DISTRIB_GROUP |
//GXS_GROUP_DEFAULTS_DISTRIB_LOCAL |
GXS_GROUP_DEFAULTS_PUBLISH_OPEN |
//GXS_GROUP_DEFAULTS_PUBLISH_THREADS |
//GXS_GROUP_DEFAULTS_PUBLISH_REQUIRED |
//GXS_GROUP_DEFAULTS_PUBLISH_ENCRYPTED |
//GXS_GROUP_DEFAULTS_PERSONAL_GPG |
GXS_GROUP_DEFAULTS_PERSONAL_REQUIRED |
//GXS_GROUP_DEFAULTS_PERSONAL_IFNOPUB |
//GXS_GROUP_DEFAULTS_COMMENTS_YES |
GXS_GROUP_DEFAULTS_COMMENTS_NO |
0);
uint32_t AlbumEditEnabledFlags = AlbumCreateEnabledFlags;
uint32_t AlbumEditDefaultsFlags = AlbumCreateDefaultsFlags;
AlbumGroupDialog::AlbumGroupDialog(TokenQueue *tokenQueue, QWidget *parent)
: GxsGroupDialog(tokenQueue, AlbumCreateEnabledFlags, AlbumCreateDefaultsFlags, parent)
{
}
AlbumGroupDialog::AlbumGroupDialog(TokenQueue *tokenExternalQueue, RsTokenService *tokenService, Mode mode, RsGxsGroupId groupId, QWidget *parent)
: GxsGroupDialog(tokenExternalQueue, tokenService, mode, groupId, AlbumEditEnabledFlags, AlbumEditDefaultsFlags, parent)
{
}
void AlbumGroupDialog::initUi()
{
switch (mode())
{
case MODE_CREATE:
setUiText(UITYPE_SERVICE_HEADER, tr("Create New Album"));
setUiText(UITYPE_BUTTONBOX_OK, tr("Create"));
break;
case MODE_SHOW:
setUiText(UITYPE_SERVICE_HEADER, tr("Album"));
break;
case MODE_EDIT:
setUiText(UITYPE_SERVICE_HEADER, tr("Edit ALbum"));
setUiText(UITYPE_BUTTONBOX_OK, tr("Update Album"));
break;
}
setUiText(UITYPE_ADD_ADMINS_CHECKBOX, tr("Add Album Admins"));
setUiText(UITYPE_CONTACTS_DOCK, tr("Select Album Admins"));
// Inject Extra Widgets.
injectExtraWidget(new AlbumExtra(this));
}
QPixmap AlbumGroupDialog::serviceImage()
{
return QPixmap(":/images/album_create_64.png");
}
void AlbumGroupDialog::prepareAlbumGroup(RsPhotoAlbum &group, const RsGroupMetaData &meta)
{
group.mMeta = meta;
group.mDescription = getDescription().toUtf8().constData();
QPixmap pixmap = getLogo();
if (!pixmap.isNull()) {
QByteArray ba;
QBuffer buffer(&ba);
buffer.open(QIODevice::WriteOnly);
pixmap.save(&buffer, "PNG"); // writes image into ba in PNG format
group.mThumbnail.copy((uint8_t *) ba.data(), ba.size());
} else {
group.mThumbnail.clear();
}
// Additional Fields that we need to fill in.
group.mCaption = "Caption goes here";
group.mPhotographer = "photographer";
group.mWhere = "Where?";
}
bool AlbumGroupDialog::service_CreateGroup(uint32_t &token, const RsGroupMetaData &meta)
{
// Specific Function.
RsPhotoAlbum grp;
prepareAlbumGroup(grp, meta);
rsPhoto->submitAlbumDetails(token, grp);
return true;
}
bool AlbumGroupDialog::service_EditGroup(uint32_t &token, RsGroupMetaData &editedMeta)
{
RsPhotoAlbum grp;
prepareAlbumGroup(grp, editedMeta);
std::cerr << "AlbumGroupDialog::service_EditGroup() submitting changes";
std::cerr << std::endl;
// TODO: no interface here, yet.
// rsPhoto->updateGroup(token, grp);
return true;
}
bool AlbumGroupDialog::service_loadGroup(uint32_t token, Mode /*mode*/, RsGroupMetaData& groupMetaData, QString &description)
{
std::cerr << "AlbumGroupDialog::service_loadGroup(" << token << ")";
std::cerr << std::endl;
std::vector<RsPhotoAlbum> groups;
if (!rsPhoto->getAlbum(token, groups))
{
std::cerr << "AlbumGroupDialog::service_loadGroup() Error getting GroupData";
std::cerr << std::endl;
return false;
}
if (groups.size() != 1)
{
std::cerr << "AlbumGroupDialog::service_loadGroup() Error Group.size() != 1";
std::cerr << std::endl;
return false;
}
std::cerr << "AlbumGroupDialog::service_loadGroup() Unfinished Loading";
std::cerr << std::endl;
const RsPhotoAlbum &group = groups[0];
groupMetaData = group.mMeta;
description = QString::fromUtf8(group.mDescription.c_str());
if (group.mThumbnail.mData) {
QPixmap pixmap;
if (GxsIdDetails::loadPixmapFromData(group.mThumbnail.mData, group.mThumbnail.mSize, pixmap,GxsIdDetails::ORIGINAL)) {
setLogo(pixmap);
}
} else {
setLogo(QPixmap(":/images/album_create_64.png"));
}
// NEED TO Load additional data....
return true;
}

View File

@ -0,0 +1,47 @@
/*******************************************************************************
* retroshare-gui/src/gui/Posted/PostedGroupDialog.h *
* *
* Copyright (C) 2020 by Robert Fernie <retroshare.project@gmail.com> *
* *
* 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 <https://www.gnu.org/licenses/>. *
* *
*******************************************************************************/
#ifndef _ALBUM_GROUP_DIALOG_H
#define _ALBUM_GROUP_DIALOG_H
#include "gui/gxs/GxsGroupDialog.h"
#include <retroshare/rsphoto.h>
class AlbumGroupDialog : public GxsGroupDialog
{
Q_OBJECT
public:
AlbumGroupDialog(TokenQueue *tokenQueue, QWidget *parent);
AlbumGroupDialog(TokenQueue *tokenExternalQueue, RsTokenService *tokenService, Mode mode, RsGxsGroupId groupId, QWidget *parent);
protected:
virtual void initUi();
virtual QPixmap serviceImage();
virtual bool service_CreateGroup(uint32_t &token, const RsGroupMetaData &meta);
virtual bool service_loadGroup(uint32_t token, Mode mode, RsGroupMetaData& groupMetaData, QString &description);
virtual bool service_EditGroup(uint32_t &token, RsGroupMetaData &editedMeta);
private:
void prepareAlbumGroup(RsPhotoAlbum &group, const RsGroupMetaData &meta);
};
#endif

View File

@ -41,11 +41,11 @@ void AlbumItem::setUp()
{ {
ui->label_AlbumTitle->setText(QString::fromStdString(mAlbum.mMeta.mGroupName)); ui->label_AlbumTitle->setText(QString::fromStdString(mAlbum.mMeta.mGroupName));
ui->label_Photographer->setText(QString::fromStdString(mAlbum.mPhotographer)); ui->label_Photographer->setText(QString::fromStdString(mAlbum.mPhotographer));
QPixmap qtn;
qtn.loadFromData(mAlbum.mThumbnail.data, mAlbum.mThumbnail.size, mAlbum.mThumbnail.type.c_str());
if(mAlbum.mThumbnail.size != 0) if(mAlbum.mThumbnail.mSize != 0)
{ {
QPixmap qtn;
qtn.loadFromData(mAlbum.mThumbnail.mData, mAlbum.mThumbnail.mSize, "PNG");
ui->label_Thumbnail->setPixmap(qtn); ui->label_Thumbnail->setPixmap(qtn);
} }
else else

View File

@ -53,7 +53,7 @@ PhotoDialog::~PhotoDialog()
void PhotoDialog::setUp() void PhotoDialog::setUp()
{ {
QPixmap qtn; QPixmap qtn;
qtn.loadFromData(mPhotoDetails.mThumbnail.data, mPhotoDetails.mThumbnail.size, mPhotoDetails.mThumbnail.type.c_str()); qtn.loadFromData(mPhotoDetails.mThumbnail.mData, mPhotoDetails.mThumbnail.mSize, "PNG");
ui->label_Photo->setPixmap(qtn); ui->label_Photo->setPixmap(qtn);
ui->lineEdit_Title->setText(QString::fromStdString(mPhotoDetails.mMeta.mMsgName)); ui->lineEdit_Title->setText(QString::fromStdString(mPhotoDetails.mMeta.mMsgName));

View File

@ -60,7 +60,7 @@ PhotoItem::PhotoItem(PhotoShareItemHolder *holder, const QString& path, QWidget
ui->label_Thumbnail->setPixmap(mThumbNail.scaled(120, 120, Qt::KeepAspectRatio, Qt::SmoothTransformation)); ui->label_Thumbnail->setPixmap(mThumbNail.scaled(120, 120, Qt::KeepAspectRatio, Qt::SmoothTransformation));
setSelected(false); setSelected(false);
getPhotoThumbnail(mPhotoDetails.mThumbnail); getThumbnail(mPhotoDetails.mThumbnail);
connect(ui->lineEdit_Title, SIGNAL(editingFinished()), this, SLOT(setTitle())); connect(ui->lineEdit_Title, SIGNAL(editingFinished()), this, SLOT(setTitle()));
connect(ui->lineEdit_PhotoGrapher, SIGNAL(editingFinished()), this, SLOT(setPhotoGrapher())); connect(ui->lineEdit_PhotoGrapher, SIGNAL(editingFinished()), this, SLOT(setPhotoGrapher()));
@ -83,7 +83,7 @@ void PhotoItem::setSelected(bool selected)
update(); update();
} }
bool PhotoItem::getPhotoThumbnail(RsPhotoThumbnail &nail) bool PhotoItem::getThumbnail(RsGxsImage &image)
{ {
const QPixmap *tmppix = &mThumbNail; const QPixmap *tmppix = &mThumbNail;
@ -96,18 +96,11 @@ bool PhotoItem::getPhotoThumbnail(RsPhotoThumbnail &nail)
buffer.open(QIODevice::WriteOnly); buffer.open(QIODevice::WriteOnly);
tmppix->save(&buffer, "PNG"); // writes image into ba in PNG format tmppix->save(&buffer, "PNG"); // writes image into ba in PNG format
image.copy((uint8_t *) ba.data(), ba.size());
RsPhotoThumbnail tmpnail;
tmpnail.data = (uint8_t *) ba.data();
tmpnail.size = ba.size();
nail.copyFrom(tmpnail);
return true; return true;
} }
nail.data = NULL; image.clear();
nail.size = 0;
return false; return false;
} }
@ -166,12 +159,12 @@ void PhotoItem::setUp()
updateImage(mPhotoDetails.mThumbnail); updateImage(mPhotoDetails.mThumbnail);
} }
void PhotoItem::updateImage(const RsPhotoThumbnail &thumbnail) void PhotoItem::updateImage(const RsGxsImage &image)
{ {
if (thumbnail.data != NULL) if (image.mData != NULL)
{ {
QPixmap qtn; QPixmap qtn;
qtn.loadFromData(thumbnail.data, thumbnail.size, thumbnail.type.c_str()); qtn.loadFromData(image.mData, image.mSize, "PNG");
ui->label_Thumbnail->setPixmap(qtn.scaled(120, 120, Qt::KeepAspectRatio, Qt::SmoothTransformation)); ui->label_Thumbnail->setPixmap(qtn.scaled(120, 120, Qt::KeepAspectRatio, Qt::SmoothTransformation));
mThumbNail = qtn; mThumbNail = qtn;
} }

View File

@ -42,13 +42,13 @@ public:
void setSelected(bool selected); void setSelected(bool selected);
bool isSelected(){ return mSelected; } bool isSelected(){ return mSelected; }
const RsPhotoPhoto& getPhotoDetails(); const RsPhotoPhoto& getPhotoDetails();
bool getPhotoThumbnail(RsPhotoThumbnail &nail); bool getThumbnail(RsGxsImage &image);
protected: protected:
void mousePressEvent(QMouseEvent *event); void mousePressEvent(QMouseEvent *event);
private: private:
void updateImage(const RsPhotoThumbnail &thumbnail); void updateImage(const RsGxsImage &image);
void setUp(); void setUp();
private slots: private slots:

View File

@ -31,7 +31,7 @@
#include <QTimer> #include <QTimer>
#include <QMessageBox> #include <QMessageBox>
#include "AlbumCreateDialog.h" #include "AlbumGroupDialog.h"
#include "AlbumItem.h" #include "AlbumItem.h"
#include "PhotoItem.h" #include "PhotoItem.h"
@ -215,7 +215,7 @@ void PhotoShare::OpenSlideShow()
void PhotoShare::createAlbum() void PhotoShare::createAlbum()
{ {
AlbumCreateDialog albumCreate(mPhotoQueue, rsPhoto, this); AlbumGroupDialog albumCreate(mPhotoQueue, this);
albumCreate.exec(); albumCreate.exec();
} }

View File

@ -28,7 +28,6 @@
#include "retroshare/rsphoto.h" #include "retroshare/rsphoto.h"
#include "retroshare-gui/mainpage.h" #include "retroshare-gui/mainpage.h"
#include "AlbumCreateDialog.h"
#include "AlbumDialog.h" #include "AlbumDialog.h"
#include "PhotoDialog.h" #include "PhotoDialog.h"

View File

@ -20,6 +20,7 @@
#include "gui/PhotoShare/PhotoSlideShow.h" #include "gui/PhotoShare/PhotoSlideShow.h"
#include "gui/PhotoShare/PhotoDrop.h" #include "gui/PhotoShare/PhotoDrop.h"
#include "gui/gxs/GxsIdDetails.h"
#include <iostream> #include <iostream>
@ -175,16 +176,10 @@ void PhotoSlideShow::loadImage()
if (ptr) if (ptr)
{ {
/* load into the slot */ /* load into the slot */
if (ptr->mThumbnail.data != NULL) if (ptr->mThumbnail.mData != NULL)
{ {
QPixmap qtn; QPixmap qtn;
GxsIdDetails::loadPixmapFromData(ptr->mThumbnail.mData, ptr->mThumbnail.mSize,qtn, GxsIdDetails::ORIGINAL);
// copy the data for Qpixmap to use.
RsPhotoThumbnail tn;
tn.copyFrom(ptr->mThumbnail);
qtn.loadFromData(tn.data, tn.size, tn.type.c_str());
tn.data = 0;
QPixmap sqtn = qtn.scaled(800, 600, Qt::KeepAspectRatio, Qt::SmoothTransformation); QPixmap sqtn = qtn.scaled(800, 600, Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui.imgLabel->setPixmap(sqtn); ui.imgLabel->setPixmap(sqtn);
@ -249,8 +244,8 @@ bool PhotoSlideShow::loadPhotoData(const uint32_t &token)
RsPhotoPhoto& photo = *vit; RsPhotoPhoto& photo = *vit;
RsPhotoPhoto *ptr = new RsPhotoPhoto; RsPhotoPhoto *ptr = new RsPhotoPhoto;
*ptr = photo; *ptr = photo;
ptr->mThumbnail.data = 0;
ptr->mThumbnail.copyFrom(photo.mThumbnail); ptr->mThumbnail = photo.mThumbnail; // copies data.
ptr->mOrder = i++; ptr->mOrder = i++;
mPhotos[photo.mMeta.mMsgId] = ptr; mPhotos[photo.mMeta.mMsgId] = ptr;
mPhotoOrder[ptr->mOrder] = photo.mMeta.mMsgId; mPhotoOrder[ptr->mOrder] = photo.mMeta.mMsgId;

View File

@ -25,8 +25,6 @@
#include "PulseItem.h" #include "PulseItem.h"
#include <retroshare/rsphoto.h>
#include <algorithm> #include <algorithm>
#include <iostream> #include <iostream>
@ -35,184 +33,21 @@
****/ ****/
/** Constructor */ /** Constructor */
PulseItem::PulseItem(PulseHolder *parent, const RsPhotoAlbum &album, const RsPhotoThumbnail &thumbnail)
:QWidget(NULL), mParent(parent), mType(PHOTO_ITEM_TYPE_ALBUM) PulseItem::PulseItem(PulseHolder *parent, std::string path)
:QWidget(NULL), mParent(parent), mType(0)
{ {
setupUi(this); setupUi(this);
setAttribute ( Qt::WA_DeleteOnClose, true ); setAttribute ( Qt::WA_DeleteOnClose, true );
mDetails = *( (RsPhotoPhoto *) &(album));
updateAlbumText(album);
updateImage(thumbnail);
setSelected(false);
} }
PulseItem::PulseItem(PulseHolder *parent, const RsPhotoPhoto &photo, const RsPhotoThumbnail &thumbnail)
:QWidget(NULL), mParent(parent), mType(PHOTO_ITEM_TYPE_PHOTO)
{
setupUi(this);
setAttribute ( Qt::WA_DeleteOnClose, true );
mDetails = *( (RsPhotoPhoto *) &(photo));
updatePhotoText(photo);
updateImage(thumbnail);
setSelected(false);
}
PulseItem::PulseItem(PulseHolder *parent, std::string path) // for new photos.
:QWidget(NULL), mParent(parent), mType(PHOTO_ITEM_TYPE_NEW)
{
setupUi(this);
setAttribute ( Qt::WA_DeleteOnClose, true );
#if 0
QString dummyString("dummytext");
titleLabel->setText(QString("NEW PHOTO"));
fromBoldLabel->setText(QString("From:"));
fromLabel->setText(QString("Ourselves"));
statusBoldLabel->setText(QString("Status:"));
statusLabel->setText(QString("new photo"));
dateBoldLabel->setText(QString("Date:"));
dateLabel->setText(QString("now"));
int width = 120;
int height = 120;
//QPixmap qtn = QPixmap(QString::fromStdString(path)).scaled(width, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
QPixmap qtn = QPixmap(QString::fromStdString(path)).scaled(width, height, Qt::KeepAspectRatio, Qt::SmoothTransformation);
imgLabel->setPixmap(qtn);
setSelected(false);
#endif
}
void PulseItem::updateAlbumText(const RsPhotoAlbum &album)
{
#if 0
QString dummyString("dummytext");
titleLabel->setText(QString("TITLE"));
fromBoldLabel->setText(QString("From:"));
fromLabel->setText(QString("Unknown"));
statusBoldLabel->setText(QString("Status:"));
statusLabel->setText(QString("new photo"));
dateBoldLabel->setText(QString("Date:"));
dateLabel->setText(QString("now"));
//QDateTime qtime;
//qtime.setTime_t(msg.ts);
//QString timestamp = qtime.toString("dd.MMMM yyyy hh:mm");
//timestamplabel->setText(timestamp);
dateBoldLabel->setText(dummyString);
dateLabel->setText(dummyString);
#endif
}
void PulseItem::updatePhotoText(const RsPhotoPhoto &photo)
{
#if 0
QString dummyString("dummytext");
titleLabel->setText(QString("TITLE"));
fromBoldLabel->setText(QString("From:"));
fromLabel->setText(QString("Unknown"));
statusBoldLabel->setText(QString("Status:"));
statusLabel->setText(QString("new photo"));
dateBoldLabel->setText(QString("Date:"));
dateLabel->setText(QString("now"));
#endif
}
void PulseItem::updateImage(const RsPhotoThumbnail &thumbnail)
{
#if 0
if (thumbnail.data != NULL)
{
QPixmap qtn;
qtn.loadFromData(thumbnail.data, thumbnail.size, thumbnail.type.c_str());
imgLabel->setPixmap(qtn);
}
#endif
}
bool PulseItem::getPhotoThumbnail(RsPhotoThumbnail &nail)
{
#if 0
const QPixmap *tmppix = imgLabel->pixmap();
QByteArray ba;
QBuffer buffer(&ba);
if(!tmppix->isNull())
{
// send chan image
buffer.open(QIODevice::WriteOnly);
tmppix->save(&buffer, "PNG"); // writes image into ba in PNG format
RsPhotoThumbnail tmpnail;
tmpnail.data = (uint8_t *) ba.data();
tmpnail.size = ba.size();
nail.copyFrom(tmpnail);
return true;
}
nail.data = NULL;
nail.size = 0;
#endif
return false;
}
void PulseItem::removeItem() void PulseItem::removeItem()
{ {
#if 0
#ifdef DEBUG_ITEM
std::cerr << "PulseItem::removeItem()";
std::cerr << std::endl;
#endif
hide();
if (mParent)
{
mParent->deletePulseItem(this, mType);
}
#endif
} }
void PulseItem::setSelected(bool on) void PulseItem::setSelected(bool on)
{ {
#if 0
mSelected = on;
if (mSelected)
{
mParent->notifySelection(this, mType);
frame->setStyleSheet("QFrame#frame{border: 2px solid #55CC55;\nbackground: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #55EE55, stop: 1 #CCCCCC);\nborder-radius: 10px}");
}
else
{
frame->setStyleSheet("QFrame#frame{border: 2px solid #CCCCCC;\nbackground: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #EEEEEE, stop: 1 #CCCCCC);\nborder-radius: 10px}");
}
update();
#endif
} }
bool PulseItem::isSelected() bool PulseItem::isSelected()
@ -220,7 +55,6 @@ bool PulseItem::isSelected()
return mSelected; return mSelected;
} }
void PulseItem::mousePressEvent(QMouseEvent *event) void PulseItem::mousePressEvent(QMouseEvent *event)
{ {
/* We can be very cunning here? /* We can be very cunning here?
@ -239,13 +73,8 @@ void PulseItem::mousePressEvent(QMouseEvent *event)
QWidget::mousePressEvent(event); QWidget::mousePressEvent(event);
} }
const QPixmap *PulseItem::getPixmap() const QPixmap *PulseItem::getPixmap()
{ {
#if 0
return imgLabel->pixmap();
#endif
return NULL; return NULL;
} }

View File

@ -23,8 +23,6 @@
#include "ui_PulseItem.h" #include "ui_PulseItem.h"
#include <retroshare/rsphoto.h>
class PulseItem; class PulseItem;
class PulseHolder class PulseHolder
@ -34,21 +32,12 @@ virtual void deletePulseItem(PulseItem *, uint32_t ptype) = 0;
virtual void notifySelection(PulseItem *item, int ptype) = 0; virtual void notifySelection(PulseItem *item, int ptype) = 0;
}; };
#define PHOTO_ITEM_TYPE_ALBUM 0x0001
#define PHOTO_ITEM_TYPE_PHOTO 0x0002
#define PHOTO_ITEM_TYPE_NEW 0x0003
class PulseItem : public QWidget, private Ui::PulseItem class PulseItem : public QWidget, private Ui::PulseItem
{ {
Q_OBJECT Q_OBJECT
public: public:
PulseItem(PulseHolder *parent, const RsPhotoAlbum &album, const RsPhotoThumbnail &thumbnail); PulseItem(PulseHolder *parent, std::string url);
PulseItem(PulseHolder *parent, const RsPhotoPhoto &photo, const RsPhotoThumbnail &thumbnail);
PulseItem(PulseHolder *parent, std::string url); // for new photos.
bool getPhotoThumbnail(RsPhotoThumbnail &nail);
void removeItem(); void removeItem();
@ -57,27 +46,14 @@ public:
const QPixmap *getPixmap(); const QPixmap *getPixmap();
// details are public - so that can be easily edited.
RsPhotoPhoto mDetails;
//private slots:
protected: protected:
void mousePressEvent(QMouseEvent *event); void mousePressEvent(QMouseEvent *event);
private: private:
void updateAlbumText(const RsPhotoAlbum &album);
void updatePhotoText(const RsPhotoPhoto &photo);
void updateImage(const RsPhotoThumbnail &thumbnail);
PulseHolder *mParent; PulseHolder *mParent;
uint32_t mType; uint32_t mType;
bool mSelected; bool mSelected;
}; };
#endif #endif

View File

@ -160,6 +160,15 @@ void GxsGroupDialog::init()
Settings->loadWidgetInformation(this); Settings->loadWidgetInformation(this);
} }
void GxsGroupDialog::injectExtraWidget(QWidget *widget)
{
// add extra widget into layout.
QVBoxLayout *vbox = new QVBoxLayout();
vbox->addWidget(widget);
vbox->addStretch(1);
ui.extraFrame->setLayout(vbox);
}
QIcon GxsGroupDialog::serviceWindowIcon() QIcon GxsGroupDialog::serviceWindowIcon()
{ {
return qApp->windowIcon(); return qApp->windowIcon();

View File

@ -172,6 +172,13 @@ protected:
virtual QPixmap serviceImage() = 0; virtual QPixmap serviceImage() = 0;
virtual QIcon serviceWindowIcon(); virtual QIcon serviceWindowIcon();
/*!
* Inject Extra Widget for additional Group configuration options.
* NB: These are only inserted for createMode currently.
* @param widget Addtional widget which is added to extraFrame.
*/
void injectExtraWidget(QWidget *widget);
/*! /*!
* \brief setUiToolTip/setUiText * \brief setUiToolTip/setUiText
* Sets the text and tooltip of some parts of the UI * Sets the text and tooltip of some parts of the UI

View File

@ -1154,6 +1154,8 @@ gxsphotoshare {
DEFINES += RS_USE_PHOTO # enable in MainWindow DEFINES += RS_USE_PHOTO # enable in MainWindow
HEADERS += \ HEADERS += \
gui/PhotoShare/AlbumGroupDialog.h \
gui/PhotoShare/AlbumExtra.h \
gui/PhotoShare/PhotoDrop.h \ gui/PhotoShare/PhotoDrop.h \
gui/PhotoShare/AlbumItem.h \ gui/PhotoShare/AlbumItem.h \
gui/PhotoShare/AlbumDialog.h \ gui/PhotoShare/AlbumDialog.h \
@ -1167,6 +1169,7 @@ gxsphotoshare {
gui/PhotoShare/AddCommentDialog.h gui/PhotoShare/AddCommentDialog.h
FORMS += \ FORMS += \
gui/PhotoShare/AlbumExtra.ui \
gui/PhotoShare/PhotoItem.ui \ gui/PhotoShare/PhotoItem.ui \
gui/PhotoShare/PhotoDialog.ui \ gui/PhotoShare/PhotoDialog.ui \
gui/PhotoShare/AlbumItem.ui \ gui/PhotoShare/AlbumItem.ui \
@ -1178,6 +1181,8 @@ gxsphotoshare {
gui/PhotoShare/AddCommentDialog.ui gui/PhotoShare/AddCommentDialog.ui
SOURCES += \ SOURCES += \
gui/PhotoShare/AlbumGroupDialog.cpp \
gui/PhotoShare/AlbumExtra.cpp \
gui/PhotoShare/PhotoItem.cpp \ gui/PhotoShare/PhotoItem.cpp \
gui/PhotoShare/PhotoDialog.cpp \ gui/PhotoShare/PhotoDialog.cpp \
gui/PhotoShare/PhotoDrop.cpp \ gui/PhotoShare/PhotoDrop.cpp \