Merge pull request #65 from RetroShare/master

update to master
This commit is contained in:
defnax 2020-02-15 15:04:29 +01:00 committed by GitHub
commit 6231beb9e4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
72 changed files with 950 additions and 615 deletions

View File

@ -5,51 +5,51 @@
RetroShare is a decentralized, private, secure, cross-platform, communication
toolkit.
RetroShare provides filesharing, chat, messages, forums, channels and more.
RetroShare provides file sharing, chat, messages, forums, channels and more.
.Build Status
|===============================================================================
|GNU/Linux, MacOS, (via travis-ci) | image:https://travis-ci.org/RetroShare/RetroShare.svg?branch=master[link="https://travis-ci.org/RetroShare/RetroShare"]
|Windows (via appveyor) | image:https://ci.appveyor.com/api/projects/status/github/RetroShare/RetroShare?svg=true[link="https://ci.appveyor.com/project/RetroShare58622/retroshare"]
|GNU/Linux, macOS, (via Travis CI) | image:https://travis-ci.org/RetroShare/RetroShare.svg?branch=master[link="https://travis-ci.org/RetroShare/RetroShare"]
|Windows (via AppVeyor) | image:https://ci.appveyor.com/api/projects/status/github/RetroShare/RetroShare?svg=true[link="https://ci.appveyor.com/project/RetroShare58622/retroshare"]
|===============================================================================
== Compilation
It is very difficult to keep a comprehensive (we support many platforms) and
updated documentation on how to build RetroShare, instead we provide scripts and
recipes that are used to create the packages for the supported platforms and
more in the `build_scripts` directory of this repository.
Short of comprehensive and updated documentation on how to build RetroShare
(for the many supported platforms it runs on), scripts and recipes are provided
in the aim of creating packages for the supported platforms (and more)
in the `build_scripts` directory of this repository.
Those packaging receipts together with the continuous integration files
`.travis.yml` and `appveyor.yml` are a good source of knowledge on how to
compile RetroShare on different platforms.
== Using RetroShare on a headless computer with WebUI
== Using RetroShare on a headless computer with web UI
WARNING: This section is outdated need to be adapted to new WebUI
WARNING: This section is outdated need to be adapted to the new web UI
The webUI needs to be enabled as a parameter option in retroshare-service:
The web UI needs to be enabled as a parameter option to the retroshare-service:
[source,bash]
--------
./retroshare-nogui --webinterface 9090 --docroot /usr/share/retroshare/webui/
--------
The webUI is only accessible on localhost:9090. It is advised to keep it that way so that your RS
The web UI is only accessible on localhost:9090. It is advised to keep it that way so that your RS
cannot be controlled using an untrusted connection.
To access your web UI from a distance, just open a SSH tunnel on it:
To access your web UI from a distance, just open a SSH tunnel to it:
[source,bash]
--------
distant_machine:~/ > ssh rs_host -L 9090:localhost:9090 -N
--------
"rs_host" is the machine running retroshare-nogui. Then on the distant machine, access your webUI on
"rs_host" is the machine running `retroshare-nogui`. Then on the distant machine, access your web UI on
http://localhost:9090
That also works with a retroshare GUI of course.
(This can also be done from the RetroShare GUI.)

View File

@ -512,10 +512,10 @@ public:
RS_DEPRECATED_FOR(getChannelsInfo)
virtual bool getGroupData(const uint32_t &token, std::vector<RsGxsChannelGroup> &groups) = 0;
RS_DEPRECATED_FOR(getChannelsContent)
RS_DEPRECATED_FOR(getChannelContent)
virtual bool getPostData(const uint32_t &token, std::vector<RsGxsChannelPost> &posts, std::vector<RsGxsComment> &cmts) = 0;
RS_DEPRECATED_FOR(getChannelsContent)
RS_DEPRECATED_FOR(getChannelContent)
virtual bool getPostData(const uint32_t &token, std::vector<RsGxsChannelPost> &posts) = 0;
/**

View File

@ -3,7 +3,7 @@
* *
* 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 *
* it under the terms of the GNU Lesser General Public License as *
@ -26,6 +26,7 @@
#include <string>
#include <list>
#include "rsgxsservice.h"
#include "rsgxscommon.h"
/* The Main Interface Class - for information about your Peers */
class RsPhoto;
@ -37,21 +38,6 @@ extern RsPhoto *rsPhoto;
#define RSPHOTO_MODE_OWN 2
#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
*/
@ -96,7 +82,7 @@ class RsPhotoPhoto
int mOrder;
RsPhotoThumbnail mThumbnail;
RsGxsImage mThumbnail;
int mMode;
@ -137,7 +123,7 @@ class RsPhotoAlbum
std::string mHashTags;
RsPhotoThumbnail mThumbnail;
RsGxsImage mThumbnail;
int mMode;

View File

@ -26,39 +26,34 @@
#include "serialiser/rstlvbinary.h"
#include "serialiser/rstypeserializer.h"
#define GXS_PHOTO_SERIAL_DEBUG
RsItem *RsGxsPhotoSerialiser::create_item(uint16_t service, uint8_t item_sub_id) const
{
if(service != RS_SERVICE_GXS_TYPE_PHOTO)
return NULL ;
if(service != RS_SERVICE_GXS_TYPE_PHOTO)
return NULL ;
switch(item_sub_id)
{
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_ITEM: return new RsGxsPhotoPhotoItem() ;
default:
return NULL ;
}
switch(item_sub_id)
{
case RS_PKT_SUBTYPE_PHOTO_COMMENT_ITEM: return new RsGxsPhotoCommentItem() ;
case RS_PKT_SUBTYPE_PHOTO_SHOW_ITEM: return new RsGxsPhotoPhotoItem() ;
case RS_PKT_SUBTYPE_PHOTO_ITEM: return new RsGxsPhotoAlbumItem() ;
default:
return NULL ;
}
}
void RsGxsPhotoAlbumItem::serial_process(RsGenericSerializer::SerializeJob j,RsGenericSerializer::SerializeContext& ctx)
{
RsTypeSerializer::serial_process(j,ctx,TLV_TYPE_STR_CAPTION, album.mCaption, "mCaption");
RsTypeSerializer::serial_process(j,ctx,TLV_TYPE_STR_CATEGORY, album.mCategory, "mCategory");
RsTypeSerializer::serial_process(j,ctx,TLV_TYPE_STR_DESCR, album.mDescription, "mDescription");
RsTypeSerializer::serial_process(j,ctx,TLV_TYPE_STR_HASH_TAG, album.mHashTags, "mHashTags");
RsTypeSerializer::serial_process(j,ctx,TLV_TYPE_STR_MSG, album.mOther, "mOther");
RsTypeSerializer::serial_process(j,ctx,TLV_TYPE_STR_PATH, album.mPhotoPath, "mPhotoPath");
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_LOCATION, album.mWhere, "mWhere");
RsTypeSerializer::serial_process(j,ctx,TLV_TYPE_STR_PIC_TYPE, album.mThumbnail.type,"mThumbnail.type");
RsTypeSerializer::serial_process(j,ctx,TLV_TYPE_STR_CAPTION, album.mCaption, "mCaption");
RsTypeSerializer::serial_process(j,ctx,TLV_TYPE_STR_CATEGORY, album.mCategory, "mCategory");
RsTypeSerializer::serial_process(j,ctx,TLV_TYPE_STR_DESCR, album.mDescription, "mDescription");
RsTypeSerializer::serial_process(j,ctx,TLV_TYPE_STR_HASH_TAG, album.mHashTags, "mHashTags");
RsTypeSerializer::serial_process(j,ctx,TLV_TYPE_STR_MSG, album.mOther, "mOther");
RsTypeSerializer::serial_process(j,ctx,TLV_TYPE_STR_PATH, album.mPhotoPath, "mPhotoPath");
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_LOCATION, album.mWhere, "mWhere");
RsTlvBinaryDataRef b(RS_SERVICE_GXS_TYPE_PHOTO, album.mThumbnail.data, album.mThumbnail.size);
RsTypeSerializer::serial_process<RsTlvItem>(j, ctx, b, "thumbnail binary data") ;
album.mThumbnail.serial_process(j, ctx);
}
void RsGxsPhotoPhotoItem::serial_process(RsGenericSerializer::SerializeJob j,RsGenericSerializer::SerializeContext& ctx)
{
@ -70,15 +65,13 @@ 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_DATE, photo.mWhen, "mWhen");
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);
RsTypeSerializer::serial_process<RsTlvItem>(j, ctx, b, "mThumbnail") ;
photo.mThumbnail.serial_process(j, ctx);
}
void RsGxsPhotoCommentItem::serial_process(RsGenericSerializer::SerializeJob j,RsGenericSerializer::SerializeContext& ctx)
{
RsTypeSerializer::serial_process (j,ctx,TLV_TYPE_STR_COMMENT,comment.mComment,"mComment");
RsTypeSerializer::serial_process<uint32_t>(j,ctx,comment.mCommentFlag,"mCommentFlag");
RsTypeSerializer::serial_process (j,ctx,TLV_TYPE_STR_COMMENT,comment.mComment,"mComment");
RsTypeSerializer::serial_process<uint32_t>(j,ctx,comment.mCommentFlag,"mCommentFlag");
}
void RsGxsPhotoAlbumItem::clear()
@ -92,13 +85,13 @@ void RsGxsPhotoAlbumItem::clear()
album.mPhotographer.clear();
album.mWhen.clear();
album.mWhere.clear();
album.mThumbnail.deleteImage();
album.mThumbnail.clear();
}
void RsGxsPhotoCommentItem::clear()
{
comment.mComment.clear();
comment.mCommentFlag = 0;
comment.mComment.clear();
comment.mCommentFlag = 0;
}
void RsGxsPhotoPhotoItem::clear()
@ -111,5 +104,5 @@ void RsGxsPhotoPhotoItem::clear()
photo.mPhotographer.clear();
photo.mWhen.clear();
photo.mWhere.clear();
photo.mThumbnail.deleteImage();
photo.mThumbnail.clear();
}

View File

@ -26,140 +26,100 @@
RsPhoto *rsPhoto = NULL;
const uint32_t RsPhoto::FLAG_MSG_TYPE_MASK = 0x000f;
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_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()
:mSetFlags(0), mOrder(0), mMode(0), mModFlags(0)
:mSetFlags(0), mOrder(0), mMode(0), mModFlags(0)
{
return;
return;
}
RsPhotoAlbum::RsPhotoAlbum()
:mMode(0), mSetFlags(0), mModFlags(0)
:mMode(0), mSetFlags(0), mModFlags(0)
{
return;
return;
}
RsPhotoComment::RsPhotoComment()
: mComment(""), mCommentFlag(0) {
: mComment(""), mCommentFlag(0) {
}
RsPhotoComment::RsPhotoComment(const RsGxsPhotoCommentItem &comment)
: mComment(""), mCommentFlag(0) {
: mComment(""), mCommentFlag(0) {
*this = comment.comment;
(*this).mMeta = comment.meta;
*this = comment.comment;
(*this).mMeta = comment.meta;
}
std::ostream &operator<<(std::ostream &out, const RsPhotoPhoto &photo)
{
out << "RsPhotoPhoto [ ";
out << "Title: " << photo.mMeta.mMsgName;
out << "]";
return out;
out << "RsPhotoPhoto [ ";
out << "Title: " << photo.mMeta.mMsgName;
out << "]";
return out;
}
std::ostream &operator<<(std::ostream &out, const RsPhotoAlbum &album)
{
out << "RsPhotoAlbum [ ";
out << "Title: " << album.mMeta.mGroupName;
out << "]";
return out;
out << "RsPhotoAlbum [ ";
out << "Title: " << album.mMeta.mGroupName;
out << "]";
return out;
}
p3PhotoService::p3PhotoService(RsGeneralDataService* gds, RsNetworkExchangeService* nes, RsGixs* gixs)
: RsGenExchange(gds, nes, new RsGxsPhotoSerialiser(), RS_SERVICE_GXS_TYPE_PHOTO, gixs, photoAuthenPolicy()),
mPhotoMutex(std::string("Photo Mutex"))
: RsGenExchange(gds, nes, new RsGxsPhotoSerialiser(), RS_SERVICE_GXS_TYPE_PHOTO, gixs, photoAuthenPolicy()),
mPhotoMutex(std::string("Photo Mutex"))
{
}
const std::string GXS_PHOTO_APP_NAME = "gxsphoto";
const uint16_t GXS_PHOTO_APP_MAJOR_VERSION = 1;
const uint16_t GXS_PHOTO_APP_MINOR_VERSION = 0;
const uint16_t GXS_PHOTO_MIN_MAJOR_VERSION = 1;
const uint16_t GXS_PHOTO_MIN_MINOR_VERSION = 0;
const uint16_t GXS_PHOTO_APP_MAJOR_VERSION = 1;
const uint16_t GXS_PHOTO_APP_MINOR_VERSION = 0;
const uint16_t GXS_PHOTO_MIN_MAJOR_VERSION = 1;
const uint16_t GXS_PHOTO_MIN_MINOR_VERSION = 0;
RsServiceInfo p3PhotoService::getServiceInfo()
{
return RsServiceInfo(RS_SERVICE_GXS_TYPE_PHOTO,
GXS_PHOTO_APP_NAME,
GXS_PHOTO_APP_MAJOR_VERSION,
GXS_PHOTO_APP_MINOR_VERSION,
GXS_PHOTO_MIN_MAJOR_VERSION,
GXS_PHOTO_MIN_MINOR_VERSION);
return RsServiceInfo(RS_SERVICE_GXS_TYPE_PHOTO,
GXS_PHOTO_APP_NAME,
GXS_PHOTO_APP_MAJOR_VERSION,
GXS_PHOTO_APP_MINOR_VERSION,
GXS_PHOTO_MIN_MAJOR_VERSION,
GXS_PHOTO_MIN_MINOR_VERSION);
}
uint32_t p3PhotoService::photoAuthenPolicy()
{
uint32_t policy = 0;
uint8_t flag = 0;
uint32_t policy = 0;
uint8_t flag = 0;
flag = GXS_SERV::MSG_AUTHEN_ROOT_PUBLISH_SIGN | GXS_SERV::MSG_AUTHEN_CHILD_AUTHOR_SIGN;
RsGenExchange::setAuthenPolicyFlag(flag, policy, RsGenExchange::PUBLIC_GRP_BITS);
flag = GXS_SERV::MSG_AUTHEN_ROOT_PUBLISH_SIGN | GXS_SERV::MSG_AUTHEN_CHILD_AUTHOR_SIGN;
RsGenExchange::setAuthenPolicyFlag(flag, policy, RsGenExchange::PUBLIC_GRP_BITS);
flag |= GXS_SERV::MSG_AUTHEN_CHILD_PUBLISH_SIGN;
RsGenExchange::setAuthenPolicyFlag(flag, policy, RsGenExchange::RESTRICTED_GRP_BITS);
RsGenExchange::setAuthenPolicyFlag(flag, policy, RsGenExchange::PRIVATE_GRP_BITS);
flag |= GXS_SERV::MSG_AUTHEN_CHILD_PUBLISH_SIGN;
RsGenExchange::setAuthenPolicyFlag(flag, policy, RsGenExchange::RESTRICTED_GRP_BITS);
RsGenExchange::setAuthenPolicyFlag(flag, policy, RsGenExchange::PRIVATE_GRP_BITS);
flag = GXS_SERV::GRP_OPTION_AUTHEN_AUTHOR_SIGN;
RsGenExchange::setAuthenPolicyFlag(flag, policy, RsGenExchange::GRP_OPTION_BITS);
flag = GXS_SERV::GRP_OPTION_AUTHEN_AUTHOR_SIGN;
RsGenExchange::setAuthenPolicyFlag(flag, policy, RsGenExchange::GRP_OPTION_BITS);
return policy;
return policy;
}
bool p3PhotoService::updated()
{
RsStackMutex stack(mPhotoMutex);
RsStackMutex stack(mPhotoMutex);
bool changed = (!mGroupChange.empty() || !mMsgChange.empty());
bool changed = (!mGroupChange.empty() || !mMsgChange.empty());
return changed;
return changed;
}
void p3PhotoService::service_tick()
@ -171,33 +131,34 @@ void p3PhotoService::service_tick()
void p3PhotoService::groupsChanged(std::list<RsGxsGroupId>& grpIds)
{
RsStackMutex stack(mPhotoMutex);
RsStackMutex stack(mPhotoMutex);
while(!mGroupChange.empty())
{
RsGxsGroupChange* gc = mGroupChange.back();
std::list<RsGxsGroupId>& gList = gc->mGrpIdList;
std::list<RsGxsGroupId>::iterator lit = gList.begin();
for(; lit != gList.end(); ++lit)
grpIds.push_back(*lit);
while(!mGroupChange.empty())
{
RsGxsGroupChange* gc = mGroupChange.back();
std::list<RsGxsGroupId>& gList = gc->mGrpIdList;
std::list<RsGxsGroupId>::iterator lit = gList.begin();
for(; lit != gList.end(); ++lit) {
grpIds.push_back(*lit);
}
mGroupChange.pop_back();
delete gc;
}
mGroupChange.pop_back();
delete gc;
}
}
void p3PhotoService::msgsChanged(GxsMsgIdResult& msgs)
{
RsStackMutex stack(mPhotoMutex);
RsStackMutex stack(mPhotoMutex);
while(!mMsgChange.empty())
{
RsGxsMsgChange* mc = mMsgChange.back();
msgs = mc->msgChangeMap;
mMsgChange.pop_back();
delete mc;
}
while(!mMsgChange.empty())
{
RsGxsMsgChange* mc = mMsgChange.back();
msgs = mc->msgChangeMap;
mMsgChange.pop_back();
delete mc;
}
}
@ -210,7 +171,8 @@ RsTokenService* p3PhotoService::getTokenService() {
bool p3PhotoService::getGroupList(const uint32_t& token,
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,
std::list<RsGroupMetaData>& groupInfo)
{
return RsGenExchange::getGroupMeta(token, groupInfo);
bool okay = RsGenExchange::getGroupMeta(token, groupInfo);
return okay;
}
@ -306,61 +269,59 @@ bool p3PhotoService::getPhoto(const uint32_t& token, PhotoResult& photos)
bool p3PhotoService::getPhotoComment(const uint32_t &token, PhotoCommentResult &comments)
{
GxsMsgDataMap msgData;
bool ok = RsGenExchange::getMsgData(token, msgData);
GxsMsgDataMap msgData;
bool ok = RsGenExchange::getMsgData(token, msgData);
if(ok)
{
GxsMsgDataMap::iterator mit = msgData.begin();
if(ok)
{
GxsMsgDataMap::iterator mit = msgData.begin();
for(; mit != msgData.end(); ++mit)
{
RsGxsGroupId grpId = mit->first;
std::vector<RsGxsMsgItem*>& msgItems = mit->second;
std::vector<RsGxsMsgItem*>::iterator vit = msgItems.begin();
for(; mit != msgData.end(); ++mit)
{
RsGxsGroupId grpId = mit->first;
std::vector<RsGxsMsgItem*>& msgItems = mit->second;
std::vector<RsGxsMsgItem*>::iterator vit = msgItems.begin();
for(; vit != msgItems.end(); ++vit)
{
RsGxsPhotoCommentItem* item = dynamic_cast<RsGxsPhotoCommentItem*>(*vit);
for(; vit != msgItems.end(); ++vit)
{
RsGxsPhotoCommentItem* item = dynamic_cast<RsGxsPhotoCommentItem*>(*vit);
if(item)
{
RsPhotoComment comment = item->comment;
comment.mMeta = item->meta;
comments[grpId].push_back(comment);
delete item;
}else
{
std::cerr << "Not a comment Item, deleting!" << std::endl;
delete *vit;
}
}
}
}
if(item)
{
RsPhotoComment comment = item->comment;
comment.mMeta = item->meta;
comments[grpId].push_back(comment);
delete item;
}else
{
std::cerr << "Not a comment Item, deleting!" << std::endl;
delete *vit;
}
}
}
}
return ok;
return ok;
}
RsPhotoComment& RsPhotoComment::operator=(const RsGxsPhotoCommentItem& comment)
{
*this = comment.comment;
return *this;
*this = comment.comment;
return *this;
}
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)
{
RsGxsPhotoAlbumItem* albumItem = new RsGxsPhotoAlbumItem();
albumItem->album = album;
albumItem->meta = album.mMeta;
RsGenExchange::publishGroup(token, albumItem);
return true;
RsGxsPhotoAlbumItem* albumItem = new RsGxsPhotoAlbumItem();
albumItem->album = album;
albumItem->meta = album.mMeta;
RsGenExchange::publishGroup(token, albumItem);
return true;
}
@ -368,28 +329,28 @@ bool p3PhotoService::submitAlbumDetails(uint32_t& token, RsPhotoAlbum& album)
void p3PhotoService::notifyChanges(std::vector<RsGxsNotify*>& changes)
{
RsStackMutex stack(mPhotoMutex);
RsStackMutex stack(mPhotoMutex);
std::vector<RsGxsNotify*>::iterator vit = changes.begin();
std::vector<RsGxsNotify*>::iterator vit = changes.begin();
for(; vit != changes.end(); ++vit)
{
RsGxsNotify* n = *vit;
RsGxsGroupChange* gc;
RsGxsMsgChange* mc;
if((mc = dynamic_cast<RsGxsMsgChange*>(n)) != NULL)
{
mMsgChange.push_back(mc);
}
else if((gc = dynamic_cast<RsGxsGroupChange*>(n)) != NULL)
{
mGroupChange.push_back(gc);
}
else
{
delete n;
}
}
for(; vit != changes.end(); ++vit)
{
RsGxsNotify* n = *vit;
RsGxsGroupChange* gc;
RsGxsMsgChange* mc;
if((mc = dynamic_cast<RsGxsMsgChange*>(n)) != NULL)
{
mMsgChange.push_back(mc);
}
else if((gc = dynamic_cast<RsGxsGroupChange*>(n)) != NULL)
{
mGroupChange.push_back(gc);
}
else
{
delete n;
}
}
}
bool p3PhotoService::submitPhoto(uint32_t& token, RsPhotoPhoto& photo)
@ -397,21 +358,20 @@ bool p3PhotoService::submitPhoto(uint32_t& token, RsPhotoPhoto& photo)
RsGxsPhotoPhotoItem* photoItem = new RsGxsPhotoPhotoItem();
photoItem->photo = photo;
photoItem->meta = photo.mMeta;
photoItem->meta.mMsgFlags = FLAG_MSG_TYPE_PHOTO_POST;
RsGenExchange::publishMsg(token, photoItem);
return true;
RsGenExchange::publishMsg(token, photoItem);
return true;
}
bool p3PhotoService::submitComment(uint32_t &token, RsPhotoComment &comment)
{
RsGxsPhotoCommentItem* commentItem = new RsGxsPhotoCommentItem();
commentItem->comment = comment;
commentItem->meta = comment.mMeta;
commentItem->meta.mMsgFlags = FLAG_MSG_TYPE_PHOTO_COMMENT;
RsGxsPhotoCommentItem* commentItem = new RsGxsPhotoCommentItem();
commentItem->comment = comment;
commentItem->meta = comment.mMeta;
commentItem->meta.mMsgFlags = FLAG_MSG_TYPE_PHOTO_COMMENT;
RsGenExchange::publishMsg(token, commentItem);
return true;
RsGenExchange::publishMsg(token, commentItem);
return true;
}
bool p3PhotoService::acknowledgeMsg(const uint32_t& token,
@ -429,12 +389,12 @@ bool p3PhotoService::acknowledgeGrp(const uint32_t& token,
bool p3PhotoService::subscribeToAlbum(uint32_t &token, const RsGxsGroupId &grpId, bool subscribe)
{
if(subscribe)
RsGenExchange::setGroupSubscribeFlags(token, grpId, GXS_SERV::GROUP_SUBSCRIBE_SUBSCRIBED, GXS_SERV::GROUP_SUBSCRIBE_MASK);
else
RsGenExchange::setGroupSubscribeFlags(token, grpId, 0, GXS_SERV::GROUP_SUBSCRIBE_MASK);
if(subscribe)
RsGenExchange::setGroupSubscribeFlags(token, grpId, GXS_SERV::GROUP_SUBSCRIBE_SUBSCRIBED, GXS_SERV::GROUP_SUBSCRIBE_MASK);
else
RsGenExchange::setGroupSubscribeFlags(token, grpId, 0, GXS_SERV::GROUP_SUBSCRIBE_MASK);
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;
@ -142,17 +142,11 @@ bool AlbumCreateDialog::getAlbumThumbnail(RsPhotoThumbnail &nail)
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);
image.copy((uint8_t *) ba.data(), ba.size());
return true;
}
nail.data = NULL;
nail.size = 0;
image.clear();
return false;
}

View File

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

View File

@ -60,17 +60,17 @@ void AlbumDialog::setUp()
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)
{
ui->label_thumbNail->setPixmap(qtn);
QPixmap qtn;
GxsIdDetails::loadPixmapFromData(mAlbum.mThumbnail.mData, mAlbum.mThumbnail.mSize,qtn, GxsIdDetails::ORIGINAL);
ui->label_thumbNail->setPixmap(qtn);
}
else
{
// display a default Album icon when album has no Thumbnail
ui->label_thumbNail->setPixmap(QPixmap(":/images/album_default_128.png"));
// display a default Album icon when album has no Thumbnail
ui->label_thumbNail->setPixmap(QPixmap(":/images/album_default_128.png"));
}
}

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,17 +41,17 @@ void AlbumItem::setUp()
{
ui->label_AlbumTitle->setText(QString::fromStdString(mAlbum.mMeta.mGroupName));
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)
{
ui->label_Thumbnail->setPixmap(qtn);
QPixmap qtn;
qtn.loadFromData(mAlbum.mThumbnail.mData, mAlbum.mThumbnail.mSize, "PNG");
ui->label_Thumbnail->setPixmap(qtn);
}
else
{
// display a default Album icon when album has no Thumbnail
ui->label_Thumbnail->setPixmap(QPixmap(":/images/album_default_128.png"));
// display a default Album icon when album has no Thumbnail
ui->label_Thumbnail->setPixmap(QPixmap(":/images/album_default_128.png"));
}
}

View File

@ -53,7 +53,7 @@ PhotoDialog::~PhotoDialog()
void PhotoDialog::setUp()
{
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->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));
setSelected(false);
getPhotoThumbnail(mPhotoDetails.mThumbnail);
getThumbnail(mPhotoDetails.mThumbnail);
connect(ui->lineEdit_Title, SIGNAL(editingFinished()), this, SLOT(setTitle()));
connect(ui->lineEdit_PhotoGrapher, SIGNAL(editingFinished()), this, SLOT(setPhotoGrapher()));
@ -83,7 +83,7 @@ void PhotoItem::setSelected(bool selected)
update();
}
bool PhotoItem::getPhotoThumbnail(RsPhotoThumbnail &nail)
bool PhotoItem::getThumbnail(RsGxsImage &image)
{
const QPixmap *tmppix = &mThumbNail;
@ -96,18 +96,11 @@ bool PhotoItem::getPhotoThumbnail(RsPhotoThumbnail &nail)
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);
image.copy((uint8_t *) ba.data(), ba.size());
return true;
}
nail.data = NULL;
nail.size = 0;
image.clear();
return false;
}
@ -166,12 +159,12 @@ void PhotoItem::setUp()
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;
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));
mThumbNail = qtn;
}

View File

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

View File

@ -31,7 +31,7 @@
#include <QTimer>
#include <QMessageBox>
#include "AlbumCreateDialog.h"
#include "AlbumGroupDialog.h"
#include "AlbumItem.h"
#include "PhotoItem.h"
@ -76,7 +76,7 @@ PhotoShare::PhotoShare(QWidget *parent)
connect( ui.toolButton_ViewAlbum, SIGNAL(clicked()), this, SLOT(OpenAlbumDialog()));
connect( ui.toolButton_SlideShow, SIGNAL(clicked()), this, SLOT(OpenSlideShow()));
connect( ui.toolButton_subscribe, SIGNAL(clicked()), this, SLOT(subscribeToAlbum()));
connect(ui.toolButton_ViewPhoto, SIGNAL(clicked()), this, SLOT(OpenPhotoDialog()));
connect( ui.toolButton_ViewPhoto, SIGNAL(clicked()), this, SLOT(OpenPhotoDialog()));
connect( ui.pushButton_YourAlbums, SIGNAL(clicked()), this, SLOT(updateAlbums()));
connect( ui.pushButton_SharedAlbums, SIGNAL(clicked()), this, SLOT(updateAlbums()));
@ -215,7 +215,7 @@ void PhotoShare::OpenSlideShow()
void PhotoShare::createAlbum()
{
AlbumCreateDialog albumCreate(mPhotoQueue, rsPhoto, this);
AlbumGroupDialog albumCreate(mPhotoQueue, this);
albumCreate.exec();
}

View File

@ -28,7 +28,6 @@
#include "retroshare/rsphoto.h"
#include "retroshare-gui/mainpage.h"
#include "AlbumCreateDialog.h"
#include "AlbumDialog.h"
#include "PhotoDialog.h"
@ -39,7 +38,7 @@
#include "util/TokenQueue.h"
#include "PhotoShareItemHolder.h"
#define IMAGE_PHOTO ":/images/lphoto.png"
#define IMAGE_PHOTO ":/icons/png/photo.png"
namespace Ui {
class PhotoShare;

View File

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

View File

@ -22,6 +22,8 @@
#include <QMessageBox>
#include <QByteArray>
#include <QStringList>
#include <QSignalMapper>
#include "PostedCreatePostDialog.h"
#include "ui_PostedCreatePostDialog.h"
@ -35,10 +37,13 @@
#include <QBuffer>
#include <iostream>
#include <gui/RetroShareLink.h>
#include <util/imageutil.h>
#include <gui/RetroShareLink.h>
/* View Page */
#define VIEW_POST 1
#define VIEW_IMAGE 2
#define VIEW_LINK 3
PostedCreatePostDialog::PostedCreatePostDialog(TokenQueue* tokenQ, RsPosted *posted, const RsGxsGroupId& grpId, QWidget *parent):
QDialog(parent, Qt::WindowSystemMenuHint | Qt::WindowTitleHint | Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint | Qt::WindowCloseButtonHint),
@ -67,6 +72,16 @@ PostedCreatePostDialog::PostedCreatePostDialog(TokenQueue* tokenQ, RsPosted *pos
/* fill in the available OwnIds for signing */
ui->idChooser->loadIds(IDCHOOSER_ID_REQUIRED, RsGxsId());
QSignalMapper *signalMapper = new QSignalMapper(this);
connect(ui->postButton, SIGNAL(clicked()), signalMapper, SLOT(map()));
connect(ui->imageButton, SIGNAL(clicked()), signalMapper, SLOT(map()));
connect(ui->linkButton, SIGNAL(clicked()), signalMapper, SLOT(map()));
signalMapper->setMapping(ui->postButton, VIEW_POST);
signalMapper->setMapping(ui->imageButton, VIEW_IMAGE);
signalMapper->setMapping(ui->linkButton, VIEW_LINK);
connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(setPage(int)));
ui->removeButton->hide();
/* load settings */
@ -93,11 +108,17 @@ void PostedCreatePostDialog::processSettings(bool load)
// state of ID Chooser combobox
int index = Settings->value("IDChooser", 0).toInt();
ui->idChooser->setCurrentIndex(index);
// load last used Stacked Page
setPage(Settings->value("viewPage", VIEW_POST).toInt());
} else {
// save settings
// state of ID Chooser combobox
Settings->setValue("IDChooser", ui->idChooser->currentIndex());
// store last used Page
Settings->setValue("viewPage", viewMode());
}
Settings->endGroup();
@ -222,19 +243,51 @@ void PostedCreatePostDialog::addPicture()
}
void PostedCreatePostDialog::on_postButton_clicked()
int PostedCreatePostDialog::viewMode()
{
ui->stackedWidget->setCurrentIndex(0);
if (ui->postButton->isChecked()) {
return VIEW_POST;
} else if (ui->imageButton->isChecked()) {
return VIEW_IMAGE;
} else if (ui->linkButton->isChecked()) {
return VIEW_LINK;
}
/* Default */
return VIEW_POST;
}
void PostedCreatePostDialog::on_imageButton_clicked()
void PostedCreatePostDialog::setPage(int viewMode)
{
ui->stackedWidget->setCurrentIndex(1);
}
switch (viewMode) {
case VIEW_POST:
ui->stackedWidget->setCurrentIndex(0);
void PostedCreatePostDialog::on_linkButton_clicked()
{
ui->stackedWidget->setCurrentIndex(2);
ui->postButton->setChecked(true);
ui->imageButton->setChecked(false);
ui->linkButton->setChecked(false);
break;
case VIEW_IMAGE:
ui->stackedWidget->setCurrentIndex(1);
ui->imageButton->setChecked(true);
ui->postButton->setChecked(false);
ui->linkButton->setChecked(false);
break;
case VIEW_LINK:
ui->stackedWidget->setCurrentIndex(2);
ui->linkButton->setChecked(true);
ui->postButton->setChecked(false);
ui->imageButton->setChecked(false);
break;
default:
setPage(VIEW_POST);
return;
}
}
void PostedCreatePostDialog::on_removeButton_clicked()

View File

@ -52,14 +52,13 @@ private:
private slots:
void createPost();
void addPicture();
void on_postButton_clicked();
void on_imageButton_clicked();
void on_linkButton_clicked();
void on_removeButton_clicked();
void fileHashingFinished(QList<HashedFile> hashedFiles);
void setPage(int viewMode);
private:
void processSettings(bool load);
int viewMode();
QString mLink;
QString mNotes;

View File

@ -246,36 +246,7 @@
<property name="verticalSpacing">
<number>2</number>
</property>
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="imageLabel">
<property name="maximumSize">
<size>
<width>800</width>
<height>200</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="scaledContents">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>188</width>
<height>17</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="1">
<item row="1" column="2">
<widget class="QToolButton" name="removeButton">
<property name="toolTip">
<string>Remove image</string>
@ -295,6 +266,42 @@
</property>
</widget>
</item>
<item row="1" column="1">
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>188</width>
<height>17</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="shareimagecheckBox">
<property name="text">
<string>Share Orginal Image</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="3">
<widget class="QLabel" name="imageLabel">
<property name="maximumSize">
<size>
<width>800</width>
<height>200</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="scaledContents">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
@ -418,6 +425,9 @@
<height>24</height>
</size>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
<item>
@ -435,6 +445,15 @@
<height>24</height>
</size>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="autoRepeat">
<bool>false</bool>
</property>
<property name="default">
<bool>false</bool>
</property>
</widget>
</item>
<item>
@ -452,6 +471,12 @@
<height>24</height>
</size>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="autoDefault">
<bool>true</bool>
</property>
</widget>
</item>
<item>

View File

@ -93,13 +93,13 @@ UserNotify *PostedDialog::createUserNotify(QObject *parent)
QString PostedDialog::getHelpString() const
{
QString hlp_str = tr("<h1><img width=\"32\" src=\":/icons/help_64.png\">&nbsp;&nbsp;Posted</h1> \
<p>The posted service allows you to share internet links, that spread among Retroshare nodes like forums and \
QString hlp_str = tr("<h1><img width=\"32\" src=\":/icons/help_64.png\">&nbsp;&nbsp;Boards</h1> \
<p>The Boards service allows you to share images, blog posts & internet links, that spread among Retroshare nodes like forums and \
channels</p> \
<p>Links can be commented by subscribed users. A promotion system also gives the opportunity to \
<p>Posts can be commented by subscribed users. A promotion system also gives the opportunity to \
enlight important links.</p> \
<p>There is no restriction on which links are shared. Be careful when clicking on them.</p>\
<p>Posted links are kept for %1 days, and sync-ed over the last %2 days, unless you change this.</p>\
<p>Boards are kept for %1 days, and sync-ed over the last %2 days, unless you change this.</p>\
").arg(QString::number(rsPosted->getDefaultStoragePeriod()/86400)).arg(QString::number(rsPosted->getDefaultSyncPeriod()/86400));
return hlp_str ;
@ -109,9 +109,9 @@ QString PostedDialog::text(TextType type)
{
switch (type) {
case TEXT_NAME:
return tr("Posted Links");
return tr("Boards");
case TEXT_NEW:
return tr("Create Topic");
return tr("Create Board");
case TEXT_TODO:
return "<b>Open points:</b><ul>"
"<li>Subreddits/tag to posts support"
@ -120,13 +120,13 @@ QString PostedDialog::text(TextType type)
"</ul>";
case TEXT_YOUR_GROUP:
return tr("My Topics");
return tr("My Boards");
case TEXT_SUBSCRIBED_GROUP:
return tr("Subscribed Topics");
return tr("Subscribed Boards");
case TEXT_POPULAR_GROUP:
return tr("Popular Topics");
return tr("Popular Boards");
case TEXT_OTHER_GROUP:
return tr("Other Topics");
return tr("Other Boards");
}
return "";

View File

@ -37,7 +37,7 @@ public:
~PostedDialog();
virtual QIcon iconPixmap() const { return QIcon(IMAGE_POSTED) ; } //MainPage
virtual QString pageName() const { return tr("Links") ; } //MainPage
virtual QString pageName() const { return tr("Boards") ; } //MainPage
virtual QString helpText() const { return ""; } //MainPage
protected:

View File

@ -71,20 +71,20 @@ void PostedGroupDialog::initUi()
switch (mode())
{
case MODE_CREATE:
setUiText(UITYPE_SERVICE_HEADER, tr("Create New Topic"));
setUiText(UITYPE_SERVICE_HEADER, tr("Create New Board"));
setUiText(UITYPE_BUTTONBOX_OK, tr("Create"));
break;
case MODE_SHOW:
setUiText(UITYPE_SERVICE_HEADER, tr("Posted Topic"));
setUiText(UITYPE_SERVICE_HEADER, tr("Board"));
break;
case MODE_EDIT:
setUiText(UITYPE_SERVICE_HEADER, tr("Edit Topic"));
setUiText(UITYPE_BUTTONBOX_OK, tr("Update Topic"));
setUiText(UITYPE_SERVICE_HEADER, tr("Edit Board"));
setUiText(UITYPE_BUTTONBOX_OK, tr("Update Board"));
break;
}
setUiText(UITYPE_ADD_ADMINS_CHECKBOX, tr("Add Topic Admins"));
setUiText(UITYPE_CONTACTS_DOCK, tr("Select Topic Admins"));
setUiText(UITYPE_ADD_ADMINS_CHECKBOX, tr("Add Board Admins"));
setUiText(UITYPE_CONTACTS_DOCK, tr("Select Board Admins"));
}
QPixmap PostedGroupDialog::serviceImage()

View File

@ -43,7 +43,7 @@
#define DEBUG_POSTED_LIST_WIDGET
#define TOPIC_DEFAULT_IMAGE ":/icons/png/posted.png"
#define BOARD_DEFAULT_IMAGE ":/icons/png/posted.png"
/* View mode */
#define VIEW_MODE_CLASSIC 1
@ -351,13 +351,13 @@ void PostedListWidget::insertPostedDetails(const RsPostedGroup &group)
ui->subscribeToolButton->setHidden(IS_GROUP_SUBSCRIBED(group.mMeta.mSubscribeFlags)) ;
/* IMAGE */
QPixmap topicImage;
QPixmap boardImage;
if (group.mGroupImage.mData != NULL) {
GxsIdDetails::loadPixmapFromData(group.mGroupImage.mData, group.mGroupImage.mSize, topicImage,GxsIdDetails::ORIGINAL);
GxsIdDetails::loadPixmapFromData(group.mGroupImage.mData, group.mGroupImage.mSize, boardImage,GxsIdDetails::ORIGINAL);
} else {
topicImage = QPixmap(TOPIC_DEFAULT_IMAGE);
boardImage = QPixmap(BOARD_DEFAULT_IMAGE);
}
ui->logoLabel->setPixmap(topicImage);
ui->logoLabel->setPixmap(boardImage);
ui->namelabel->setText(QString::fromUtf8(group.mMeta.mGroupName.c_str()));
ui->poplabel->setText(QString::number( group.mMeta.mPop));

View File

@ -89,7 +89,7 @@
</property>
<property name="icon">
<iconset resource="Posted_images.qrc">
<normaloff>:/images/posted_24.png</normaloff>:/images/posted_24.png</iconset>
<normaloff>:/images/write.png</normaloff>:/images/write.png</iconset>
</property>
<property name="iconSize">
<size>
@ -285,7 +285,7 @@
<string notr="true"/>
</property>
<property name="title">
<string>Topic Details</string>
<string>Board Details</string>
</property>
<property name="flat">
<bool>false</bool>
@ -557,7 +557,7 @@ p, li { white-space: pre-wrap; }
<rect>
<x>0</x>
<y>0</y>
<width>614</width>
<width>98</width>
<height>16</height>
</rect>
</property>

View File

@ -1,16 +1,5 @@
<RCC>
<qresource prefix="/" >
<file>images/posted_16.png</file>
<file>images/posted_24.png</file>
<file>images/posted_32.png</file>
<file>images/posted_48.png</file>
<file>images/posted_64.png</file>
<file>images/posted_add_24.png</file>
<file>images/posted_add_32.png</file>
<file>images/posted_add_64.png</file>
<file>images/hot_24.png</file>
<file>images/new_24.png</file>
<file>images/posted_32_new.png</file>
<file>images/expand.png</file>
<file>images/decrease.png</file>
<file>images/down-arrow.png</file>
@ -29,5 +18,6 @@
<file>images/down-hover.png</file>
<file>images/up-hover.png</file>
<file>images/trashcan.png</file>
<file>images/write.png</file>
</qresource>
</RCC>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 954 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -25,8 +25,6 @@
#include "PulseItem.h"
#include <retroshare/rsphoto.h>
#include <algorithm>
#include <iostream>
@ -35,217 +33,48 @@
****/
/** 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()
{
#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)
{
#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()
{
return mSelected;
return mSelected;
}
void PulseItem::mousePressEvent(QMouseEvent *event)
{
/* We can be very cunning here?
* grab out position.
* flag ourselves as selected.
* then pass the mousePressEvent up for handling by the parent
*/
/* We can be very cunning here?
* grab out position.
* flag ourselves as selected.
* then pass the mousePressEvent up for handling by the parent
*/
QPoint pos = event->pos();
QPoint pos = event->pos();
std::cerr << "PulseItem::mousePressEvent(" << pos.x() << ", " << pos.y() << ")";
std::cerr << std::endl;
std::cerr << "PulseItem::mousePressEvent(" << pos.x() << ", " << pos.y() << ")";
std::cerr << std::endl;
setSelected(true);
setSelected(true);
QWidget::mousePressEvent(event);
QWidget::mousePressEvent(event);
}
const QPixmap *PulseItem::getPixmap()
{
#if 0
return imgLabel->pixmap();
#endif
return NULL;
return NULL;
}

View File

@ -23,61 +23,37 @@
#include "ui_PulseItem.h"
#include <retroshare/rsphoto.h>
class PulseItem;
class PulseHolder
{
public:
public:
virtual void deletePulseItem(PulseItem *, uint32_t 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
{
Q_OBJECT
public:
PulseItem(PulseHolder *parent, const RsPhotoAlbum &album, const RsPhotoThumbnail &thumbnail);
PulseItem(PulseHolder *parent, const RsPhotoPhoto &photo, const RsPhotoThumbnail &thumbnail);
PulseItem(PulseHolder *parent, std::string url); // for new photos.
PulseItem(PulseHolder *parent, std::string url);
bool getPhotoThumbnail(RsPhotoThumbnail &nail);
void removeItem();
void removeItem();
void setSelected(bool on);
bool isSelected();
const QPixmap *getPixmap();
// details are public - so that can be easily edited.
RsPhotoPhoto mDetails;
//private slots:
void setSelected(bool on);
bool isSelected();
const QPixmap *getPixmap();
protected:
void mousePressEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent *event);
private:
void updateAlbumText(const RsPhotoAlbum &album);
void updatePhotoText(const RsPhotoPhoto &photo);
void updateImage(const RsPhotoThumbnail &thumbnail);
PulseHolder *mParent;
uint32_t mType;
bool mSelected;
PulseHolder *mParent;
uint32_t mType;
bool mSelected;
};
#endif

View File

@ -32,7 +32,7 @@
#include <map>
#define IMAGE_WIKI ":/images/wikibook_32.png"
#define IMAGE_WIKI ":/icons/png/wiki.png"
class WikiAddDialog;
class WikiEditDialog;

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>1433</width>
<height>541</height>
<width>922</width>
<height>187</height>
</rect>
</property>
<layout class="QGridLayout" name="gxsChannelPostItem_GLayout">
@ -127,6 +127,19 @@
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QHBoxLayout" name="subjectHLayout"/>
</item>

View File

@ -141,15 +141,15 @@ void PostedGroupItem::fill()
GxsIdDetails::loadPixmapFromData(mGroup.mGroupImage.mData, mGroup.mGroupImage.mSize, postedImage,GxsIdDetails::ORIGINAL);
ui->logoLabel->setPixmap(QPixmap(postedImage));
} else {
ui->logoLabel->setPixmap(QPixmap(":/images/posted_64.png"));
ui->logoLabel->setPixmap(QPixmap(":/icons/png/posted.png"));
}
//TODO - nice icon for subscribed group
// if (IS_GROUP_PUBLISHER(mGroup.mMeta.mSubscribeFlags)) {
// ui->logoLabel->setPixmap(QPixmap(":/images/posted_64.png"));
// ui->logoLabel->setPixmap(QPixmap(":/icons/png/posted.png"));
// } else {
// ui->logoLabel->setPixmap(QPixmap(":/images/posted_64.png"));
// ui->logoLabel->setPixmap(QPixmap(":/icons/png/posted.png"));
// }
if (IS_GROUP_SUBSCRIBED(mGroup.mMeta.mSubscribeFlags)) {
@ -160,11 +160,11 @@ void PostedGroupItem::fill()
// if (mIsNew)
// {
ui->titleLabel->setText(tr("New Posted"));
ui->titleLabel->setText(tr("New Board"));
// }
// else
// {
// ui->titleLabel->setText(tr("Updated Posted"));
// ui->titleLabel->setText(tr("Updated Board"));
// }
if (mIsHome)

View File

@ -125,7 +125,10 @@
<string/>
</property>
<property name="pixmap">
<pixmap resource="../Posted/Posted_images.qrc">:/images/posted_64.png</pixmap>
<pixmap resource="../icons.qrc">:/icons/png/posted.png</pixmap>
</property>
<property name="scaledContents">
<bool>true</bool>
</property>
</widget>
</item>
@ -147,7 +150,7 @@
</font>
</property>
<property name="text">
<string notr="true">Posted</string>
<string notr="true">Board</string>
</property>
</widget>
</item>
@ -298,7 +301,7 @@
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Posted Description</string>
<string>Board Description</string>
</property>
<layout class="QHBoxLayout">
<item>
@ -321,7 +324,7 @@
</property>
<property name="text">
<string notr="true">Description
of Posted</string>
of Board</string>
</property>
</widget>
</item>

View File

@ -160,6 +160,15 @@ void GxsGroupDialog::init()
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()
{
return qApp->windowIcon();

View File

@ -172,6 +172,13 @@ protected:
virtual QPixmap serviceImage() = 0;
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
* Sets the text and tooltip of some parts of the UI

View File

@ -93,9 +93,9 @@ void GroupShareKey::setTyp()
if (!rsPosted)
return;
ui->headerFrame->setHeaderImage(QPixmap(":/images/posted_64.png"));
ui->headerFrame->setHeaderText(tr("Share topic admin permissions"));
ui->sharekeyinfo_label->setText(tr("You can allow your friends to edit the topic. Select them in the list below. Note: it is not possible to revoke Posted admin permissions."));
ui->headerFrame->setHeaderImage(QPixmap(":/icons/png/posted.png"));
ui->headerFrame->setHeaderText(tr("Share board admin permissions"));
ui->sharekeyinfo_label->setText(tr("You can allow your friends to edit the board. Select them in the list below. Note: it is not possible to revoke Board admin permissions."));
}
else

View File

@ -287,9 +287,11 @@
<file>icons/png/newsfeed2.png</file>
<file>icons/png/postedlinks.png</file>
<file>icons/png/people2.png</file>
<file>icons/png/photo.png</file>
<file>icons/png/bandwidth.png</file>
<file>icons/png/options2.png</file>
<file>icons/png/exit2.png</file>
<file>icons/png/wiki.png</file>
<file>icons/svg/addstickers.svg</file>
<file>icons/png/addstickers.png</file>
<file>icons/textedit/bold.png</file>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -0,0 +1,10 @@
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Capa_1" x="0px" y="0px" viewBox="0 0 477.867 477.867" style="enable-background:new 0 0 477.867 477.867;" xml:space="preserve" width="512px" height="512px"><g transform="matrix(0.922745 0 0 0.922745 18.4589 18.4589)"><g>
<g>
<path d="M426.667,68.267H51.2c-28.277,0-51.2,22.923-51.2,51.2V358.4c0,28.277,22.923,51.2,51.2,51.2h375.467 c28.277,0,51.2-22.923,51.2-51.2V119.467C477.867,91.19,454.944,68.267,426.667,68.267z M443.733,266.001L336.333,158.601 c-6.664-6.663-17.468-6.663-24.132,0L170.667,300.134l-56.201-56.201c-6.664-6.663-17.468-6.663-24.132,0l-56.201,56.201V119.467 c0-9.426,7.641-17.067,17.067-17.067h375.467c9.426,0,17.067,7.641,17.067,17.067V266.001z" data-original="#000000" class="active-path" data-old_color="#000000" fill="#039BD5"/>
</g>
</g><g>
<g>
<circle cx="153.6" cy="187.733" r="51.2" data-original="#000000" class="active-path" data-old_color="#000000" fill="#039BD5"/>
</g>
</g></g> </svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -0,0 +1,14 @@
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Capa_1" x="0px" y="0px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve" width="512px" height="512px" class=""><g transform="matrix(0.895338 0 0 0.895338 26.7934 26.7934)"><g>
<g>
<path d="M467,0H361v120h151V45C512,20.186,491.814,0,467,0z" data-original="#000000" class="active-path" data-old_color="#000000" fill="#039BD5"/>
</g>
</g><g>
<g>
<path d="M45,0C20.186,0,0,20.186,0,45v75h331V0H45z M106,90H76c-8.291,0-15-6.709-15-15s6.709-15,15-15h30c8.291,0,15,6.709,15,15 S114.291,90,106,90z M196,90h-30c-8.291,0-15-6.709-15-15s6.709-15,15-15h30c8.291,0,15,6.709,15,15S204.291,90,196,90z M286,90 h-30c-8.291,0-15-6.709-15-15s6.709-15,15-15h30c8.291,0,15,6.709,15,15S294.291,90,286,90z" data-original="#000000" class="active-path" data-old_color="#000000" fill="#039BD5"/>
</g>
</g><g>
<g>
<path d="M0,150v317c0,24.814,20.186,45,45,45h422c24.814,0,45-20.186,45-45V150H0z M406,240h-19.195l-56.581,170.746 C328.188,416.869,322.46,421,316,421c-6.46,0-12.188-4.131-14.224-10.254L256,272.432l-45.776,138.314 c-4.072,12.246-24.375,12.246-28.447,0L125.195,240H106c-8.291,0-15-6.709-15-15s6.709-15,15-15h60c8.291,0,15,6.709,15,15 s-6.709,15-15,15h-9.194L196,358.568L235.194,240H226c-8.291,0-15-6.709-15-15s6.709-15,15-15h60c8.291,0,15,6.709,15,15 s-6.709,15-15,15h-9.194L316,358.568L355.194,240H346c-8.291,0-15-6.709-15-15s6.709-15,15-15h60c8.291,0,15,6.709,15,15 S414.291,240,406,240z" data-original="#000000" class="active-path" data-old_color="#000000" fill="#039BD5"/>
</g>
</g></g> </svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -30,7 +30,7 @@ PostedPage::PostedPage(QWidget * parent, Qt::WindowFlags flags)
setAttribute(Qt::WA_QuitOnClose, false);
/* Initialize GroupFrameSettingsWidget */
ui->groupFrameSettingsWidget->setOpenAllInNewTabText(tr("Open each topic in a new tab"));
ui->groupFrameSettingsWidget->setOpenAllInNewTabText(tr("Open each board in a new tab"));
ui->groupFrameSettingsWidget->setType(GroupFrameSettings::Posted);
}

View File

@ -39,7 +39,7 @@ public:
virtual void load();
virtual QPixmap iconPixmap() const { return QPixmap(":/icons/settings/posted.svg") ; }
virtual QString pageName() const { return tr("Links") ; }
virtual QString pageName() const { return tr("Boards") ; }
virtual QString helpText() const { return ""; }
private:

View File

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