Added new RetroShare link formats:

retroshare://forum?
retroshare://channel?...
Added "Go to" from the news feed of forums and channels.
Added "Copy RetroShare Link" to the forum/channel tree and messagees.
Fixed style sheet of the auto download button in ChannelFeed.
Fixed german language.

git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@4162 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
thunder2 2011-04-19 19:42:44 +00:00
parent d058bf9511
commit e5f3518225
20 changed files with 1826 additions and 1207 deletions

View File

@ -40,10 +40,9 @@
#include "channels/EditChanDetails.h"
#include "channels/ShareKey.h"
#include "notifyqt.h"
#include "RetroShareLink.h"
#define CHAN_DEFAULT_IMAGE ":/images/channels.png"
#define ENABLE_AUTO_DL "Enable Auto-Download"
#define DISABLE_AUTO_DL "Disable Auto-Download"
#define WARNING_LIMIT 3600*24*2
@ -188,6 +187,9 @@ void ChannelFeed::channelListCustomPopupMenu( QPoint point )
contextMnu.addAction( restoreKeysAct );
}
QAction *action = contextMnu.addAction(QIcon(":/images/copyrslink.png"), tr("Copy RetroShare Link"), this, SLOT(copyChannelLink()));
action->setEnabled(!mChannelId.empty());
contextMnu.exec(QCursor::pos());
}
@ -221,6 +223,23 @@ void ChannelFeed::shareKey()
shareUi.exec();
}
void ChannelFeed::copyChannelLink()
{
if (mChannelId.empty()) {
return;
}
ChannelInfo ci;
if (rsChannels->getChannelInfo(mChannelId, ci)) {
RetroShareLink link(RetroShareLink::TYPE_CHANNEL, QString::fromStdWString(ci.channelName), QString::fromStdString(ci.channelId), "");
if (link.valid() && link.type() == RetroShareLink::TYPE_CHANNEL) {
std::vector<RetroShareLink> urls;
urls.push_back(link);
RSLinkClipboard::copyLinks(urls);
}
}
}
void ChannelFeed::createMsg()
{
if (mChannelId.empty()) {
@ -245,10 +264,7 @@ void ChannelFeed::selectChannel(const QString &id)
bool autoDl = false;
rsChannels->channelGetAutoDl(mChannelId, autoDl);
if(autoDl)
autoDownload->setText(QString(DISABLE_AUTO_DL));
else
autoDownload->setText(QString(ENABLE_AUTO_DL));
setAutoDownloadButton(autoDl);
updateChannelMsgs();
}
@ -427,6 +443,7 @@ void ChannelFeed::updateChannelMsgs()
subscribeButton->setEnabled(false);
unsubscribeButton->setEnabled(false);
setAllAsReadButton->setEnabled(false);
autoDownload->setEnabled(false);
nameLabel->setText(tr("No Channel Selected"));
iconLabel->setPixmap(QPixmap(":/images/channels.png"));
iconLabel->setEnabled(false);
@ -577,14 +594,58 @@ void ChannelFeed::toggleAutoDownload(){
// if auto dl is set true, then set false
if(autoDl){
rsChannels->channelSetAutoDl(mChannelId, false);
autoDownload->setText(QString(ENABLE_AUTO_DL));
}else{
rsChannels->channelSetAutoDl(mChannelId, true);
autoDownload->setText(QString(DISABLE_AUTO_DL));
}
setAutoDownloadButton(!autoDl);
}
else{
std::cerr << "Auto Download failed to set"
<< std::endl;
}
}
bool ChannelFeed::navigate(const std::string& channelId, const std::string& msgId)
{
if (channelId.empty()) {
return false;
}
if (treeWidget->activateId(QString::fromStdString(channelId), msgId.empty()) == NULL) {
return false;
}
/* Messages are filled in selectChannel */
if (mChannelId != channelId) {
return false;
}
if (msgId.empty()) {
return true;
}
/* Search exisiting item */
std::list<ChanMsgItem*>::iterator mit;
for (mit = mChanMsgItems.begin(); mit != mChanMsgItems.end(); mit++) {
ChanMsgItem *item = *mit;
if (item->msgId() == msgId) {
// the next two lines are necessary to calculate the layout of the widgets in the scroll area (maybe there is a better solution)
item->show();
QCoreApplication::processEvents();
scrollArea->ensureWidgetVisible(item, 0, 0);
return true;
}
}
return false;
}
void ChannelFeed::setAutoDownloadButton(bool autoDl)
{
if (autoDl) {
autoDownload->setText(tr("Disable Auto-Download"));
}else{
autoDownload->setText(tr("Enable Auto-Download"));
}
}

View File

@ -49,6 +49,8 @@ public:
virtual void deleteFeedItem(QWidget *item, uint32_t type);
virtual void openChat(std::string peerId);
bool navigate(const std::string& channelId, const std::string& msgId);
/* overloaded from RsAuthUpdatePage */
virtual void updateDisplay();
@ -69,6 +71,7 @@ private slots:
void restoreChannelKeys();
void editChannelDetail();
void shareKey();
void copyChannelLink();
void channelMsgReadSatusChanged(const QString& channelId, const QString& msgId, int status);
@ -79,6 +82,8 @@ private:
void processSettings(bool load);
void setAutoDownloadButton(bool autoDl);
std::string mChannelId; /* current Channel */
/* Layout Pointers */

View File

@ -507,7 +507,27 @@ border-image: url(:/images/btn_26_pressed.png) 4;
</widget>
</item>
<item row="0" column="5">
<widget class="QPushButton" name="autoDownload">
<widget class="QToolButton" name="autoDownload">
<property name="styleSheet">
<string notr="true">QToolButton, QPushButton, QComboBox {
border-image: url(:/images/btn_26.png) 4;
border-width: 4;
padding: 0px 6px;
font-size: 12px;
}
QToolButton:hover, QPushButton:hover, QComboBox:hover {
border-image: url(:/images/btn_26_hover.png) 4;
}
QToolButton:disabled, QPushButton:disabled, QComboBox::disabled {
color:gray;
}
QToolButton:pressed, QPushButton:pressed{
border-image: url(:/images/btn_26_pressed.png) 4;
}</string>
</property>
<property name="text">
<string>Enable Auto-download</string>
</property>

View File

@ -35,6 +35,7 @@
#include "common/Emoticons.h"
#include "common/RSItemDelegate.h"
#include "common/PopularityDefs.h"
#include "RetroShareLink.h"
#include <retroshare/rspeers.h>
#include <retroshare/rsforums.h>
@ -60,6 +61,7 @@
#define IMAGE_INFO ":/images/info16.png"
#define IMAGE_NEWFORUM ":/images/new_forum16.png"
#define IMAGE_FORUMAUTHD ":/images/konv_message2.png"
#define IMAGE_COPYLINK ":/images/copyrslink.png"
#define VIEW_LAST_POST 0
#define VIEW_THREADED 1
@ -274,8 +276,6 @@ void ForumsDialog::forumListCustomPopupMenu( QPoint point )
action = contextMnu.addAction(QIcon(IMAGE_UNSUBSCRIBE), tr("Unsubscribe to Forum"), this, SLOT(unsubscribeToForum()));
action->setEnabled (!mCurrForumId.empty() && m_bIsForumSubscribed);
contextMnu.addSeparator();
contextMnu.addAction(QIcon(IMAGE_NEWFORUM), tr("New Forum"), this, SLOT(newforum()));
@ -286,13 +286,15 @@ void ForumsDialog::forumListCustomPopupMenu( QPoint point )
action = contextMnu.addAction(QIcon(":/images/settings16.png"), tr("Edit Forum Details"), this, SLOT(editForumDetails()));
action->setEnabled (!mCurrForumId.empty () && m_bIsForumAdmin);
QAction *restoreKeysAct = new QAction(QIcon(":/images/settings16.png"), tr("Restore Publish Rights for Forum" ), &contextMnu);
connect( restoreKeysAct , SIGNAL( triggered() ), this, SLOT( restoreForumKeys() ) );
restoreKeysAct->setEnabled(!mCurrForumId.empty() && !m_bIsForumAdmin);
contextMnu.addAction( restoreKeysAct);
action = contextMnu.addAction(QIcon(IMAGE_COPYLINK), tr("Copy RetroShare Link"), this, SLOT(copyForumLink()));
action->setEnabled(!mCurrForumId.empty());
contextMnu.addSeparator();
action = contextMnu.addAction(QIcon(":/images/message-mail-read.png"), tr("Mark all as read"), this, SLOT(markMsgAsReadAll()));
@ -336,8 +338,6 @@ void ForumsDialog::threadListCustomPopupMenu( QPoint point )
QAction *markMsgAsUnreadChildren = new QAction(QIcon(":/images/message-mail.png"), tr("Mark as unread") + " (" + tr ("with children") + ")", &contextMnu);
connect(markMsgAsUnreadChildren , SIGNAL(triggered()), this, SLOT(markMsgAsUnreadChildren()));
if (m_bIsForumSubscribed) {
QList<QTreeWidgetItem*> Rows;
QList<QTreeWidgetItem*> RowsRead;
@ -385,6 +385,8 @@ void ForumsDialog::threadListCustomPopupMenu( QPoint point )
contextMnu.addAction( replyAct);
contextMnu.addAction( newthreadAct);
contextMnu.addAction( replyauthorAct);
QAction* action = contextMnu.addAction(QIcon(IMAGE_COPYLINK), tr( "Copy RetroShare Link"), this, SLOT(copyMessageLink()));
action->setEnabled(!mCurrForumId.empty() && !mCurrThreadId.empty());
contextMnu.addSeparator();
contextMnu.addAction(markMsgAsRead);
contextMnu.addAction(markMsgAsReadChildren);
@ -1395,6 +1397,40 @@ void ForumsDialog::markMsgAsUnreadAll()
markMsgAsReadUnread(false, true, true);
}
void ForumsDialog::copyForumLink()
{
if (mCurrForumId.empty()) {
return;
}
ForumInfo fi;
if (rsForums->getForumInfo(mCurrForumId, fi)) {
RetroShareLink link(RetroShareLink::TYPE_FORUM, QString::fromStdWString(fi.forumName), QString::fromStdString(fi.forumId), "");
if (link.valid() && link.type() == RetroShareLink::TYPE_FORUM) {
std::vector<RetroShareLink> urls;
urls.push_back(link);
RSLinkClipboard::copyLinks(urls);
}
}
}
void ForumsDialog::copyMessageLink()
{
if (mCurrForumId.empty() || mCurrThreadId.empty()) {
return;
}
ForumInfo fi;
if (rsForums->getForumInfo(mCurrForumId, fi)) {
RetroShareLink link(RetroShareLink::TYPE_FORUM, QString::fromStdWString(fi.forumName), QString::fromStdString(mCurrForumId), QString::fromStdString(mCurrThreadId));
if (link.valid() && link.type() == RetroShareLink::TYPE_FORUM) {
std::vector<RetroShareLink> urls;
urls.push_back(link);
RSLinkClipboard::copyLinks(urls);
}
}
}
void ForumsDialog::newforum()
{
CreateForum cf (this);
@ -1622,3 +1658,38 @@ void ForumsDialog::updateMessageSummaryList(std::string forumId)
}
}
}
bool ForumsDialog::navigate(const std::string& forumId, const std::string& msgId)
{
if (forumId.empty()) {
return false;
}
if (ui.forumTreeWidget->activateId(QString::fromStdString(forumId), msgId.empty()) == NULL) {
return false;
}
/* Threads are filled in changedForum */
if (mCurrForumId != forumId) {
return false;
}
if (msgId.empty()) {
return true;
}
/* Search exisiting item */
QTreeWidgetItemIterator itemIterator(ui.threadTreeWidget);
QTreeWidgetItem *item = NULL;
while ((item = *itemIterator) != NULL) {
itemIterator++;
if (item->data(COLUMN_THREAD_DATA, ROLE_THREAD_MSGID).toString().toStdString() == msgId) {
ui.threadTreeWidget->setCurrentItem(item);
ui.threadTreeWidget->setFocus();
return true;
}
}
return false;
}

View File

@ -36,6 +36,8 @@ public:
ForumsDialog(QWidget *parent = 0);
~ForumsDialog();
bool navigate(const std::string& forumId, const std::string& msgId);
/* overloaded from RsAuthUpdatePage */
virtual void updateDisplay();
@ -61,6 +63,8 @@ private slots:
void markMsgAsUnread();
void markMsgAsUnreadAll();
void markMsgAsUnreadChildren();
void copyForumLink();
void copyMessageLink();
/* handle splitter */
void togglethreadview();

View File

@ -29,16 +29,24 @@
#include <QObject>
#include "RetroShareLink.h"
#include "MainWindow.h"
#include "ForumsDialog.h"
#include "ChannelFeed.h"
#include "util/misc.h"
#include "common/PeerDefs.h"
#include <retroshare/rsfiles.h>
#include <retroshare/rspeers.h>
#include <retroshare/rsforums.h>
#include <retroshare/rschannels.h>
//#define DEBUG_RSLINK 1
#define HOST_FILE "file"
#define HOST_PERSON "person"
#define HOST_FORUM "forum"
#define HOST_CHANNEL "channel"
#define HOST_REGEXP "file|person|forum|channel"
#define FILE_NAME "name"
#define FILE_SIZE "size"
@ -47,6 +55,14 @@
#define PERSON_NAME "name"
#define PERSON_HASH "hash"
#define FORUM_NAME "name"
#define FORUM_ID "id"
#define FORUM_MSGID "msgid"
#define CHANNEL_NAME "name"
#define CHANNEL_ID "id"
#define CHANNEL_MSGID "msgid"
RetroShareLink::RetroShareLink(const QUrl& url)
{
fromUrl(url);
@ -150,6 +166,26 @@ void RetroShareLink::fromUrl(const QUrl& url)
return;
}
if (url.host() == HOST_FORUM) {
_type = TYPE_FORUM;
_name = url.queryItemValue(FORUM_NAME);
_hash = url.queryItemValue(FORUM_ID);
_msgId = url.queryItemValue(FORUM_MSGID);
_size = 0;
check();
return;
}
if (url.host() == HOST_CHANNEL) {
_type = TYPE_CHANNEL;
_name = url.queryItemValue(CHANNEL_NAME);
_hash = url.queryItemValue(CHANNEL_ID);
_msgId = url.queryItemValue(CHANNEL_MSGID);
_size = 0;
check();
return;
}
// bad link
#ifdef DEBUG_RSLINK
@ -158,6 +194,7 @@ void RetroShareLink::fromUrl(const QUrl& url)
clear();
}
// file
RetroShareLink::RetroShareLink(const QString & name, uint64_t size, const QString & hash)
: _name(name),_size(size),_hash(hash)
{
@ -166,6 +203,7 @@ RetroShareLink::RetroShareLink(const QString & name, uint64_t size, const QStrin
check() ;
}
// person
RetroShareLink::RetroShareLink(const QString & name, const QString & hash)
: _name(name),_size(0),_hash(hash)
{
@ -174,6 +212,28 @@ RetroShareLink::RetroShareLink(const QString & name, const QString & hash)
check() ;
}
// forum, channel
RetroShareLink::RetroShareLink(enumType type, const QString& name, const QString& id, const QString& msgId)
: _name(name),_size(0),_hash(id),_msgId(msgId)
{
_valid = false;
_type = TYPE_UNKNOWN;
switch (type) {
case TYPE_UNKNOWN:
case TYPE_FILE:
case TYPE_PERSON:
// wrong type
break;
case TYPE_FORUM:
case TYPE_CHANNEL:
_type = type;
break;
}
check() ;
}
void RetroShareLink::clear()
{
_valid = false;
@ -208,6 +268,26 @@ void RetroShareLink::check()
if(_name.isEmpty())
_valid = false;
if(_hash.isEmpty())
_valid = false;
break;
case TYPE_FORUM:
if(_size != 0)
_valid = false;
if(_name.isEmpty())
_valid = false;
if(_hash.isEmpty())
_valid = false;
break;
case TYPE_CHANNEL:
if(_size != 0)
_valid = false;
if(_name.isEmpty())
_valid = false;
if(_hash.isEmpty())
_valid = false;
break;
@ -254,6 +334,40 @@ QString RetroShareLink::toString(bool encoded /*= true*/) const
return url.toEncoded();
}
return url.toString();
}
case TYPE_FORUM:
{
QUrl url;
url.setScheme(RSLINK_SCHEME);
url.setHost(HOST_FORUM);
url.addQueryItem(FORUM_NAME, _name);
url.addQueryItem(FORUM_ID, _hash);
if (!_msgId.isEmpty()) {
url.addQueryItem(FORUM_MSGID, _msgId);
}
if (encoded) {
return url.toEncoded();
}
return url.toString();
}
case TYPE_CHANNEL:
{
QUrl url;
url.setScheme(RSLINK_SCHEME);
url.setHost(HOST_CHANNEL);
url.addQueryItem(CHANNEL_NAME, _name);
url.addQueryItem(CHANNEL_ID, _hash);
if (!_msgId.isEmpty()) {
url.addQueryItem(CHANNEL_MSGID, _msgId);
}
if (encoded) {
return url.toEncoded();
}
return url.toString();
}
}
@ -425,6 +539,80 @@ bool RetroShareLink::process(int flag)
}
return false;
}
case TYPE_FORUM:
{
#ifdef DEBUG_RSLINK
std::cerr << " RetroShareLink::process ForumRequest : name : " << name().toStdString() << ". id : " << hash().toStdString() << ". msgId : " << msgId().toStdString() << std::endl;
#endif
ForumInfo fi;
if (!rsForums->getForumInfo(id().toStdString(), fi)) {
if (flag & RSLINK_PROCESS_NOTIFY_ERROR) {
QMessageBox mb(QObject::tr("Forum Request canceled"), QObject::tr("The forum \"%1\" could not be found.").arg(name()),QMessageBox::Critical,QMessageBox::Ok,0,0);
mb.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png")));
mb.exec();
}
return false;
}
ForumMsgInfo msg;
if (!msgId().isEmpty()) {
if (!rsForums->getForumMessage(fi.forumId, msgId().toStdString(), msg)) {
if (flag & RSLINK_PROCESS_NOTIFY_ERROR) {
QMessageBox mb(QObject::tr("Forum Request canceled"), QObject::tr("The forum message in forum \"%1\" could not be found.").arg(name()),QMessageBox::Critical,QMessageBox::Ok,0,0);
mb.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png")));
mb.exec();
}
return false;
}
}
MainWindow::showWindow(MainWindow::Forums);
ForumsDialog *forumsDialog = dynamic_cast<ForumsDialog*>(MainWindow::getPage(MainWindow::Forums));
if (!forumsDialog) {
return false;
}
return forumsDialog->navigate(fi.forumId, msg.msgId);
}
case TYPE_CHANNEL:
{
#ifdef DEBUG_RSLINK
std::cerr << " RetroShareLink::process ChannelRequest : name : " << name().toStdString() << ". id : " << hash().toStdString() << ". msgId : " << msgId().toStdString() << std::endl;
#endif
ChannelInfo ci;
if (!rsChannels->getChannelInfo(id().toStdString(), ci)) {
if (flag & RSLINK_PROCESS_NOTIFY_ERROR) {
QMessageBox mb(QObject::tr("Channel Request canceled"), QObject::tr("The channel \"%1\" could not be found.").arg(name()),QMessageBox::Critical,QMessageBox::Ok,0,0);
mb.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png")));
mb.exec();
}
return false;
}
ChannelMsgInfo msg;
if (!msgId().isEmpty()) {
if (!rsChannels->getChannelMessage(ci.channelId, msgId().toStdString(), msg)) {
if (flag & RSLINK_PROCESS_NOTIFY_ERROR) {
QMessageBox mb(QObject::tr("Channel Request canceled"), QObject::tr("The channel message in channel \"%1\" could not be found.").arg(name()),QMessageBox::Critical,QMessageBox::Ok,0,0);
mb.setWindowIcon(QIcon(QString::fromUtf8(":/images/rstray3.png")));
mb.exec();
}
return false;
}
}
MainWindow::showWindow(MainWindow::Channels);
ChannelFeed *channelFeed = dynamic_cast<ChannelFeed*>(MainWindow::getPage(MainWindow::Channels));
if (!channelFeed) {
return false;
}
return channelFeed->navigate(ci.channelId, msg.msgId);
}
}
std::cerr << " RetroShareLink::process unknown type: " << type() << std::endl;
@ -460,7 +648,7 @@ void RSLinkClipboard::parseClipboard(std::vector<RetroShareLink> &links)
std::cerr << "Parsing clipboard:" << text.toStdString() << std::endl ;
QRegExp rx("retroshare://(file|person)[^\r\n]+") ;
QRegExp rx(QString("retroshare://(%1)[^\r\n]+").arg(HOST_REGEXP));
int pos = 0;

View File

@ -47,7 +47,7 @@
class RetroShareLink
{
public:
enum enumType { TYPE_UNKNOWN, TYPE_FILE, TYPE_PERSON };
enum enumType { TYPE_UNKNOWN, TYPE_FILE, TYPE_PERSON, TYPE_FORUM, TYPE_CHANNEL };
public:
RetroShareLink(const QUrl& url);
@ -56,11 +56,15 @@ class RetroShareLink
RetroShareLink(const QString& name, uint64_t size, const QString& hash);
// person
RetroShareLink(const QString& name, const QString& hash);
// forum, channel
RetroShareLink(enumType type, const QString& name, const QString& id, const QString& msgId);
enumType type() const {return _type; }
uint64_t size() const { return _size ; }
const QString& name() const { return _name ; }
const QString& hash() const { return _hash ; }
const QString& id() const { return _hash ; }
const QString& msgId() const { return _msgId ; }
// get nice name for anchor
QString niceName() const;
@ -97,7 +101,8 @@ class RetroShareLink
enumType _type;
QString _name;
uint64_t _size;
QString _hash;
QString _hash; // or id (forum, channel)
QString _msgId; // id of the message (forum, channel)
};
/// This class handles the copy/paste of links. Every member is static to ensure unicity.

View File

@ -342,6 +342,41 @@ void GroupTreeWidget::setUnreadCount(QTreeWidgetItem *item, int unreadCount)
}
QTreeWidgetItem *GroupTreeWidget::getItemFromId(const QString &id)
{
if (id.isEmpty()) {
return NULL;
}
/* Search exisiting item */
QTreeWidgetItemIterator itemIterator(ui->treeWidget);
QTreeWidgetItem *item;
while ((item = *itemIterator) != NULL) {
itemIterator++;
if (item->parent() == NULL) {
continue;
}
if (item->data(COLUMN_DATA, ROLE_ID).toString() == id) {
return item;
}
}
}
QTreeWidgetItem *GroupTreeWidget::activateId(const QString &id, bool focus)
{
QTreeWidgetItem *item = getItemFromId(id);
if (item == NULL) {
return NULL;
}
ui->treeWidget->setCurrentItem(item);
if (focus) {
ui->treeWidget->setFocus();
}
return item;
}
void GroupTreeWidget::calculateScore(QTreeWidgetItem *item)
{
if (item) {

View File

@ -76,6 +76,9 @@ public:
// Set the unread count of an item
void setUnreadCount(QTreeWidgetItem *item, int unreadCount);
QTreeWidgetItem *getItemFromId(const QString &id);
QTreeWidgetItem *activateId(const QString &id, bool focus);
signals:
void treeCustomContextMenuRequested(const QPoint &pos);
void treeCurrentItemChanged(const QString &id);

View File

@ -28,6 +28,9 @@
#include "SubFileItem.h"
#include "gui/notifyqt.h"
#include "util/misc.h"
#include "gui/MainWindow.h"
#include "gui/ChannelFeed.h"
#include "gui/RetroShareLink.h"
#include <retroshare/rschannels.h>
@ -53,11 +56,13 @@ ChanMsgItem::ChanMsgItem(FeedHolder *parent, uint32_t feedId, std::string chanId
/* general ones */
connect( expandButton, SIGNAL( clicked( void ) ), this, SLOT( toggle ( void ) ) );
connect( clearButton, SIGNAL( clicked( void ) ), this, SLOT( removeItem ( void ) ) );
connect( gotoButton, SIGNAL( clicked( void ) ), this, SLOT( gotoHome ( void ) ) );
/* specific */
connect( unsubscribeButton, SIGNAL( clicked( void ) ), this, SLOT( unsubscribeChannel ( void ) ) );
connect( downloadButton, SIGNAL( clicked( void ) ), this, SLOT( download ( void ) ) );
connect( playButton, SIGNAL( clicked( void ) ), this, SLOT( play ( void ) ) );
connect( copyLinkButton, SIGNAL( clicked( void ) ), this, SLOT( copyLink ( void ) ) );
connect( readButton, SIGNAL( toggled(bool) ), this, SLOT( readToggled(bool) ) );
connect( NotifyQt::getInstance(), SIGNAL(channelMsgReadSatusChanged(QString,QString,int)), this, SLOT(channelMsgReadSatusChanged(QString,QString,int)), Qt::QueuedConnection);
@ -76,7 +81,6 @@ ChanMsgItem::ChanMsgItem(FeedHolder *parent, uint32_t feedId, std::string chanId
updateItem();
}
void ChanMsgItem::updateItemStatic()
{
/* fill in */
@ -93,8 +97,6 @@ void ChanMsgItem::updateItemStatic()
if (!rsChannels->getChannelMessage(mChanId, mMsgId, cmi))
return;
m_inUpdateItemStatic = true;
QString title;
@ -114,8 +116,10 @@ void ChanMsgItem::updateItemStatic()
} else {
unsubscribeButton->setEnabled(false);
}
readButton->setVisible(false);
newLabel->setVisible(false);
readButton->hide();
newLabel->hide();
gotoButton->show();
copyLinkButton->hide();
}
else
{
@ -128,6 +132,8 @@ void ChanMsgItem::updateItemStatic()
unsubscribeButton->setEnabled(false);
clearButton->hide();
unsubscribeButton->hide();
gotoButton->hide();
copyLinkButton->show();
if ((ci.channelFlags & RS_DISTRIB_SUBSCRIBED) || (ci.channelFlags & RS_DISTRIB_ADMIN)) {
readButton->setVisible(true);
@ -205,7 +211,6 @@ void ChanMsgItem::updateItemStatic()
m_inUpdateItemStatic = false;
}
void ChanMsgItem::setFileCleanUpWarning(uint32_t time_left)
{
int hours = (int)time_left/3600;
@ -224,7 +229,6 @@ void ChanMsgItem::setFileCleanUpWarning(uint32_t time_left)
}
void ChanMsgItem::updateItem()
{
/* fill in */
@ -337,11 +341,16 @@ void ChanMsgItem::gotoHome()
std::cerr << "ChanMsgItem::gotoHome()";
std::cerr << std::endl;
#endif
MainWindow::showWindow(MainWindow::Channels);
ChannelFeed *channelFeed = dynamic_cast<ChannelFeed*>(MainWindow::getPage(MainWindow::Channels));
if (channelFeed) {
channelFeed->navigate(mChanId, mMsgId);
}
}
/*********** SPECIFIC FUNCTIONS ***********************/
void ChanMsgItem::unsubscribeChannel()
{
#ifdef DEBUG_ITEM
@ -403,3 +412,20 @@ void ChanMsgItem::channelMsgReadSatusChanged(const QString& channelId, const QSt
updateItemStatic();
}
}
void ChanMsgItem::copyLink()
{
if (mChanId.empty() || mMsgId.empty()) {
return;
}
ChannelInfo ci;
if (rsChannels->getChannelInfo(mChanId, ci)) {
RetroShareLink link(RetroShareLink::TYPE_CHANNEL, QString::fromStdWString(ci.channelName), QString::fromStdString(ci.channelId), QString::fromStdString(mMsgId));
if (link.valid() && link.type() == RetroShareLink::TYPE_CHANNEL) {
std::vector<RetroShareLink> urls;
urls.push_back(link);
RSLinkClipboard::copyLinks(urls);
}
}
}

View File

@ -36,12 +36,12 @@ public:
/** Default Constructor */
ChanMsgItem(FeedHolder *parent, uint32_t feedId, std::string chanId, std::string msgId, bool isHome);
/** Default Destructor */
void updateItemStatic();
void small();
void setFileCleanUpWarning(uint32_t time_left);
const std::string &msgId() { return mMsgId; }
private slots:
/* default stuff */
void gotoHome();
@ -51,6 +51,7 @@ private slots:
void unsubscribeChannel();
void download();
void play();
void copyLink();
void readToggled(bool checked);
void channelMsgReadSatusChanged(const QString& channelId, const QString& msgId, int status);

View File

@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>528</width>
<width>583</width>
<height>208</height>
</rect>
</property>
@ -152,7 +152,7 @@ p, li { white-space: pre-wrap; }
</property>
</widget>
</item>
<item row="0" column="5" rowspan="2" colspan="4">
<item row="0" column="8" rowspan="2" colspan="5">
<widget class="QLabel" name="datetimelabel">
<property name="font">
<font>
@ -170,7 +170,7 @@ p, li { white-space: pre-wrap; }
</property>
</widget>
</item>
<item row="2" column="6" colspan="3">
<item row="2" column="9" colspan="4">
<widget class="QLabel" name="filelabel">
<property name="font">
<font>
@ -185,7 +185,7 @@ p, li { white-space: pre-wrap; }
</property>
</widget>
</item>
<item row="2" column="0" colspan="6">
<item row="2" column="0" colspan="9">
<widget class="QLabel" name="subjectLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Expanding">
@ -220,11 +220,7 @@ p, li { white-space: pre-wrap; }
</size>
</property>
<property name="toolTip">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans'; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Toggle Message Read Status&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
<string>Toggle Message Read Status</string>
</property>
<property name="icon">
<iconset resource="../images.qrc">
@ -313,7 +309,24 @@ border-radius: 3px}</string>
</property>
</spacer>
</item>
<item row="4" column="5" colspan="2">
<item row="3" column="0">
<widget class="QLabel" name="warn_image_label">
<property name="text">
<string/>
</property>
<property name="pixmap">
<pixmap resource="../images.qrc">:/images/status_unknown.png</pixmap>
</property>
</widget>
</item>
<item row="3" column="1" colspan="9">
<widget class="QLabel" name="warning_label">
<property name="text">
<string notr="true">TextLabel</string>
</property>
</widget>
</item>
<item row="4" column="8" colspan="2">
<widget class="QPushButton" name="unsubscribeButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
@ -339,7 +352,7 @@ border-radius: 3px}</string>
</property>
</widget>
</item>
<item row="4" column="7">
<item row="4" column="11">
<widget class="QPushButton" name="clearButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
@ -365,7 +378,7 @@ border-radius: 3px}</string>
</property>
</widget>
</item>
<item row="4" column="8">
<item row="4" column="12">
<widget class="QPushButton" name="expandButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
@ -394,20 +407,55 @@ border-radius: 3px}</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="warn_image_label">
<item row="4" column="6">
<widget class="QPushButton" name="gotoButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>24</width>
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>Go to Channel Message</string>
</property>
<property name="text">
<string/>
</property>
<property name="pixmap">
<pixmap resource="../images.qrc">:/images/status_unknown.png</pixmap>
<property name="icon">
<iconset resource="../images.qrc">
<normaloff>:/images/find-16.png</normaloff>:/images/find-16.png</iconset>
</property>
</widget>
</item>
<item row="3" column="1" colspan="6">
<widget class="QLabel" name="warning_label">
<item row="4" column="7">
<widget class="QPushButton" name="copyLinkButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>24</width>
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>Copy RetroShare Link</string>
</property>
<property name="text">
<string notr="true">TextLabel</string>
<string/>
</property>
<property name="icon">
<iconset resource="../images.qrc">
<normaloff>:/images/copyrslink.png</normaloff>:/images/copyrslink.png</iconset>
</property>
</widget>
</item>
@ -476,23 +524,6 @@ border-radius: 10px;}</string>
</widget>
<resources>
<include location="../images.qrc"/>
<include location="../images.qrc"/>
<include location="../images.qrc"/>
<include location="../images.qrc"/>
<include location="../images.qrc"/>
<include location="../images.qrc"/>
<include location="../images.qrc"/>
<include location="../images.qrc"/>
<include location="../images.qrc"/>
<include location="../images.qrc"/>
<include location="../images.qrc"/>
<include location="../images.qrc"/>
<include location="../images.qrc"/>
<include location="../images.qrc"/>
<include location="../images.qrc"/>
<include location="../images.qrc"/>
<include location="../images.qrc"/>
<include location="../images.qrc"/>
</resources>
<connections/>
</ui>

View File

@ -21,6 +21,8 @@
#include "ChanNewItem.h"
#include "FeedHolder.h"
#include "gui/MainWindow.h"
#include "gui/ChannelFeed.h"
#include <retroshare/rschannels.h>
@ -43,7 +45,7 @@ ChanNewItem::ChanNewItem(FeedHolder *parent, uint32_t feedId, std::string chanId
/* general ones */
connect( expandButton, SIGNAL( clicked( void ) ), this, SLOT( toggle ( void ) ) );
connect( clearButton, SIGNAL( clicked( void ) ), this, SLOT( removeItem ( void ) ) );
//connect( gotoButton, SIGNAL( clicked( void ) ), this, SLOT( gotoHome ( void ) ) );
connect( gotoButton, SIGNAL( clicked( void ) ), this, SLOT( gotoHome ( void ) ) );
/* specific ones */
connect( subscribeButton, SIGNAL( clicked( void ) ), this, SLOT( subscribeChannel ( void ) ) );
@ -175,6 +177,12 @@ void ChanNewItem::gotoHome()
std::cerr << "ChanNewItem::gotoHome()";
std::cerr << std::endl;
#endif
MainWindow::showWindow(MainWindow::Channels);
ChannelFeed *channelFeed = dynamic_cast<ChannelFeed*>(MainWindow::getPage(MainWindow::Channels));
if (channelFeed) {
channelFeed->navigate(mChanId, "");
}
}
/*********** SPECIFIC FUNCTIOSN ***********************/

View File

@ -117,6 +117,26 @@ border-radius: 2px;}</string>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="gotoButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Go to Channel</string>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../images.qrc">
<normaloff>:/images/find-16.png</normaloff>:/images/find-16.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="subscribeButton">
<property name="sizePolicy">

View File

@ -24,6 +24,8 @@
#include "ForumMsgItem.h"
#include "FeedHolder.h"
#include "gui/MainWindow.h"
#include "gui/ForumsDialog.h"
#include <retroshare/rsforums.h>
#include <retroshare/rsmsgs.h>
@ -52,7 +54,7 @@ ForumMsgItem::ForumMsgItem(FeedHolder *parent, uint32_t feedId, const std::strin
/* general ones */
connect( expandButton, SIGNAL( clicked( void ) ), this, SLOT( toggle ( void ) ) );
connect( clearButton, SIGNAL( clicked( void ) ), this, SLOT( removeItem ( void ) ) );
//connect( gotoButton, SIGNAL( clicked( void ) ), this, SLOT( gotoHome ( void ) ) );
connect( gotoButton, SIGNAL( clicked( void ) ), this, SLOT( gotoHome ( void ) ) );
/* specific ones */
connect( unsubscribeButton, SIGNAL( clicked( void ) ), this, SLOT( unsubscribeForum ( void ) ) );
@ -290,6 +292,12 @@ void ForumMsgItem::gotoHome()
std::cerr << "ForumMsgItem::gotoHome()";
std::cerr << std::endl;
#endif
MainWindow::showWindow(MainWindow::Forums);
ForumsDialog *forumsDialog = dynamic_cast<ForumsDialog*>(MainWindow::getPage(MainWindow::Forums));
if (forumsDialog) {
forumsDialog->navigate(mForumId, mPostId);
}
}
/*********** SPECIFIC FUNCTIOSN ***********************/

View File

@ -245,6 +245,26 @@ border-radius: 10px}</string>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="gotoButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Go to Forum Message</string>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../images.qrc">
<normaloff>:/images/find-16.png</normaloff>:/images/find-16.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="unsubscribeButton">
<property name="sizePolicy">

View File

@ -21,6 +21,8 @@
#include "ForumNewItem.h"
#include "FeedHolder.h"
#include "gui/MainWindow.h"
#include "gui/ForumsDialog.h"
#include <retroshare/rsforums.h>
#include "gui/forums/CreateForumMsg.h"
@ -42,7 +44,7 @@ ForumNewItem::ForumNewItem(FeedHolder *parent, uint32_t feedId, std::string foru
/* general ones */
connect( expandButton, SIGNAL( clicked( void ) ), this, SLOT( toggle ( void ) ) );
connect( clearButton, SIGNAL( clicked( void ) ), this, SLOT( removeItem ( void ) ) );
//connect( gotoButton, SIGNAL( clicked( void ) ), this, SLOT( gotoHome ( void ) ) );
connect( gotoButton, SIGNAL( clicked( void ) ), this, SLOT( gotoHome ( void ) ) );
/* specific ones */
connect( subscribeButton, SIGNAL( clicked( void ) ), this, SLOT( subscribeForum ( void ) ) );
@ -166,6 +168,12 @@ void ForumNewItem::gotoHome()
std::cerr << "ForumNewItem::gotoHome()";
std::cerr << std::endl;
#endif
MainWindow::showWindow(MainWindow::Forums);
ForumsDialog *forumsDialog = dynamic_cast<ForumsDialog*>(MainWindow::getPage(MainWindow::Forums));
if (forumsDialog) {
forumsDialog->navigate(mForumId, "");
}
}
/*********** SPECIFIC FUNCTIOSN ***********************/

View File

@ -124,6 +124,26 @@ border-radius: 10px}</string>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="gotoButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Go to Forum</string>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../images.qrc">
<normaloff>:/images/find-16.png</normaloff>:/images/find-16.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="subscribeButton">
<property name="sizePolicy">

View File

@ -853,52 +853,66 @@ p, li { white-space: pre-wrap; }
<context>
<name>ChanMsgItem</name>
<message>
<location filename="../gui/feeds/ChanMsgItem.ui" line="+357"/>
<location filename="../gui/feeds/ChanMsgItem.ui" line="+370"/>
<source>Remove Item</source>
<translation>Eintrag entfernen</translation>
</message>
<message>
<location line="+26"/>
<location filename="../gui/feeds/ChanMsgItem.cpp" line="+316"/>
<location filename="../gui/feeds/ChanMsgItem.cpp" line="+320"/>
<source>Expand</source>
<translation>Erweitern</translation>
</message>
<message>
<location line="-107"/>
<location line="-124"/>
<source>Download</source>
<translation>Herunterladen</translation>
</message>
<message>
<location line="+16"/>
<location line="-49"/>
<source>Toggle Message Read Status</source>
<translation>Setze Gelesen-Status des Beitrages</translation>
</message>
<message>
<location line="+65"/>
<source>Play</source>
<translation>Abspielen</translation>
</message>
<message>
<location line="-69"/>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans&apos;; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Toggle Message Read Status&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished">Gelesen Status umschalten</translation>
<translation type="obsolete">Gelesen Status umschalten</translation>
</message>
<message>
<location line="+41"/>
<location line="-28"/>
<source>New</source>
<translation>Neu</translation>
</message>
<message>
<location line="+67"/>
<location line="+84"/>
<source>Unsubscribe From Channel</source>
<translation>Kanal abbestellen</translation>
</message>
<message>
<location filename="../gui/feeds/ChanMsgItem.cpp" line="-102"/>
<location line="+81"/>
<source>Go to Channel Message</source>
<translation>Gehe zum Kanalbeitrag</translation>
</message>
<message>
<location line="+26"/>
<source>Copy RetroShare Link</source>
<translation>Kopiere RetroShare Link</translation>
</message>
<message>
<location filename="../gui/feeds/ChanMsgItem.cpp" line="-101"/>
<source>Warning! You have less than %1 hours and %2 minute before this file is delted Consider saving it.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+96"/>
<location line="+95"/>
<source>Hide</source>
<translation>Verbergen</translation>
</message>
@ -906,7 +920,7 @@ p, li { white-space: pre-wrap; }
<context>
<name>ChanNewItem</name>
<message>
<location filename="../gui/feeds/ChanNewItem.ui" line="+169"/>
<location filename="../gui/feeds/ChanNewItem.ui" line="+189"/>
<source>Remove Item</source>
<translation>Eintrag entfernen</translation>
</message>
@ -916,7 +930,12 @@ p, li { white-space: pre-wrap; }
<translation>Kanal abonnieren</translation>
</message>
<message>
<location line="+20"/>
<location line="-20"/>
<source>Go to Channel</source>
<translation>Gehe zum Kanal</translation>
</message>
<message>
<location line="+40"/>
<source>Expand</source>
<translation>Erweitern</translation>
</message>
@ -1026,9 +1045,9 @@ p, li { white-space: pre-wrap; }
<translation>Alle als gelesen markieren</translation>
</message>
<message>
<location line="+7"/>
<location line="+27"/>
<source>Enable Auto-download</source>
<translation type="unfinished"></translation>
<translation>Aktiviere Auto-Download</translation>
</message>
<message>
<location line="+88"/>
@ -1036,7 +1055,7 @@ p, li { white-space: pre-wrap; }
<translation>Kanal erstellen</translation>
</message>
<message>
<location line="-199"/>
<location line="-219"/>
<source>Unsubscribe</source>
<translation>Abbestellen</translation>
</message>
@ -1056,7 +1075,7 @@ p, li { white-space: pre-wrap; }
<translation>Kanal abbestellen</translation>
</message>
<message>
<location filename="../gui/ChannelFeed.cpp" line="+85"/>
<location filename="../gui/ChannelFeed.cpp" line="+84"/>
<source>Own Channels</source>
<translation>Meine Kanäle</translation>
</message>
@ -1107,12 +1126,27 @@ p, li { white-space: pre-wrap; }
<translation>Verteile Kanal</translation>
</message>
<message>
<location line="+267"/>
<location line="+28"/>
<source>Copy RetroShare Link</source>
<translation>Kopiere RetroShare Link</translation>
</message>
<message>
<location line="+257"/>
<source>No Channel Selected</source>
<translation>Keinen Kanal gewählt</translation>
</message>
<message>
<location line="-270"/>
<location line="+200"/>
<source>Disable Auto-Download</source>
<translation>Deaktiviere Auto-Download</translation>
</message>
<message>
<location line="+2"/>
<source>Enable Auto-Download</source>
<translation>Aktiviere Auto-Download</translation>
</message>
<message>
<location line="-490"/>
<source>Edit Channel Details</source>
<translation>Kanal-Details bearbeiten</translation>
</message>
@ -3329,7 +3363,7 @@ p, li { white-space: pre-wrap; }
<context>
<name>FlatStyle_RDM</name>
<message>
<location filename="../gui/RemoteDirModel.cpp" line="+653"/>
<location filename="../gui/RemoteDirModel.cpp" line="+664"/>
<source>Friends Directories</source>
<translation type="unfinished">Dateien von Freunden</translation>
</message>
@ -3510,13 +3544,18 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location line="+57"/>
<location line="+176"/>
<location line="+196"/>
<location line="+161"/>
<source>Subject: </source>
<translation>Betreff:</translation>
</message>
<message>
<location line="-278"/>
<location line="-298"/>
<source>Go to Forum Message</source>
<translation>Gehe zum Forumbeitrag</translation>
</message>
<message>
<location line="+20"/>
<source>Unsubscribe To Forum</source>
<translation>Forum abbestellen</translation>
</message>
@ -3536,7 +3575,7 @@ p, li { white-space: pre-wrap; }
<translation>Unterzeichnen</translation>
</message>
<message>
<location filename="../gui/feeds/ForumMsgItem.cpp" line="+89"/>
<location filename="../gui/feeds/ForumMsgItem.cpp" line="+91"/>
<source>Forum Post</source>
<translation>Beitrag</translation>
</message>
@ -3558,7 +3597,7 @@ p, li { white-space: pre-wrap; }
<translation>Als Antwort auf</translation>
</message>
<message>
<location line="+174"/>
<location line="+180"/>
<source>Please give a Text Message</source>
<translation>Bitte Nachricht eingeben</translation>
</message>
@ -3571,7 +3610,7 @@ p, li { white-space: pre-wrap; }
<translation>Formular</translation>
</message>
<message>
<location line="+189"/>
<location line="+209"/>
<source>Remove Item</source>
<translation>Eintrag entfernen</translation>
</message>
@ -3581,7 +3620,12 @@ p, li { white-space: pre-wrap; }
<translation>Forum abonnieren</translation>
</message>
<message>
<location line="+47"/>
<location line="-20"/>
<source>Go to Forum</source>
<translation>Gehe zum Forum</translation>
</message>
<message>
<location line="+67"/>
<source>Expand</source>
<translation>Erweitern</translation>
</message>
@ -3612,7 +3656,7 @@ p, li { white-space: pre-wrap; }
<context>
<name>ForumsDialog</name>
<message>
<location filename="../gui/ForumsDialog.cpp" line="+271"/>
<location filename="../gui/ForumsDialog.cpp" line="+273"/>
<source>Subscribe to Forum</source>
<translation>Forum abonnieren</translation>
</message>
@ -3622,7 +3666,7 @@ p, li { white-space: pre-wrap; }
<translation>Forum abbestellen</translation>
</message>
<message>
<location line="+7"/>
<location line="+5"/>
<source>New Forum</source>
<translation>Neues Forum</translation>
</message>
@ -3637,12 +3681,18 @@ p, li { white-space: pre-wrap; }
<translation>Forum-Details bearbeiten</translation>
</message>
<message>
<location line="+4"/>
<location line="+3"/>
<source>Restore Publish Rights for Forum</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<location line="+6"/>
<location line="+93"/>
<source>Copy RetroShare Link</source>
<translation type="unfinished">Kopiere RetroShare Link</translation>
</message>
<message>
<location line="-88"/>
<source>Mark all as read</source>
<translation>Alle als gelesen markieren</translation>
</message>
@ -3705,7 +3755,7 @@ p, li { white-space: pre-wrap; }
<translation>keine</translation>
</message>
<message>
<location line="+508"/>
<location line="+542"/>
<location line="+81"/>
<source>RetroShare</source>
<translation></translation>
@ -3721,7 +3771,7 @@ p, li { white-space: pre-wrap; }
<translation>Du kannst einem anonymen Autor nicht antworten</translation>
</message>
<message>
<location line="-1310"/>
<location line="-1344"/>
<source>Your Forums</source>
<translation>Deine Foren</translation>
</message>
@ -3864,7 +3914,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../gui/ForumsDialog.cpp" line="+121"/>
<location line="+1110"/>
<location line="+1144"/>
<source>Start New Thread</source>
<translation>Erstelle neues Thema</translation>
</message>
@ -3892,7 +3942,7 @@ p, li { white-space: pre-wrap; }
<translation>Inhalt</translation>
</message>
<message>
<location filename="../gui/ForumsDialog.cpp" line="-1097"/>
<location filename="../gui/ForumsDialog.cpp" line="-1131"/>
<location line="+3"/>
<source>Mark as read</source>
<translation>Als gelesen markieren</translation>
@ -8833,19 +8883,19 @@ p, li { white-space: pre-wrap; }
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="+84"/>
<location line="+123"/>
<location filename="../main.cpp" line="+85"/>
<location line="+126"/>
<source>RetroShare</source>
<translation>RetroShare</translation>
</message>
<message>
<location line="-117"/>
<location line="-120"/>
<source>Inititialize failed. Wrong or missing installation of gpg.</source>
<translation>Initialisierung fehlgeschlagen. GPG fehlt oder es ist eine falsche Version installiert.</translation>
</message>
<message>
<location line="+5"/>
<location line="+112"/>
<location line="+115"/>
<source>An unexpected error occured. Please report &apos;RsInit::InitRetroShare unexpected return code %1&apos;.</source>
<translation>Ein unerwarteter Fehler ist aufgetreten. Bitte melde &apos;RsInit::InitRetroShare unexpected return code %1&apos;.</translation>
</message>
@ -8892,7 +8942,7 @@ Lockdatei:
<translation>Vielleicht ist das Passwort falsch</translation>
</message>
<message>
<location filename="../gui/RetroShareLink.cpp" line="+366"/>
<location filename="../gui/RetroShareLink.cpp" line="+480"/>
<source>File Request Confirmation</source>
<translation>Bestätigung der Dateianforderung</translation>
</message>
@ -8952,7 +9002,43 @@ Lockdatei:
<translation>Der Freund konnte nicht gefunden werden.</translation>
</message>
<message>
<location line="+16"/>
<location line="+11"/>
<source>Forum Request canceled</source>
<translation>Forumanfrage abgebrochen</translation>
</message>
<message>
<location line="-11"/>
<source>The forum &quot;%1&quot; could not be found.</source>
<translation>Das Forum &quot;%1&quot; konnte nicht gefunden werden.</translation>
</message>
<message>
<location line="+11"/>
<source>The forum message in forum &quot;%1&quot; could not be found.</source>
<translation>Der Forumbeitrag im Forum &quot;%1&quot; konnte nicht gefunden werden.</translation>
</message>
<message>
<location line="+37"/>
<source>The channel message in channel &quot;%1&quot; could not be found.</source>
<translation>Der Kanalbeitrag im Kanal &quot;%1&quot; konnte nicht gefunden werden.</translation>
</message>
<message>
<source>The forum message could not be found.</source>
<translation type="obsolete">Der Forumbeitrag &quot;%1&quot; konnte nicht gefunden werden.</translation>
</message>
<message>
<location line="-11"/>
<location line="+11"/>
<source>Channel Request canceled</source>
<translation>Kanalanfrage abgebrochen</translation>
</message>
<message>
<location line="-11"/>
<source>The channel &quot;%1&quot; could not be found.</source>
<translation>Der Kanal &quot;%1&quot; konnte nicht gefunden werden.</translation>
</message>
<message>
<location line="+32"/>
<source>File Request Error</source>
<translation>Fehler bei der Dateianforderung</translation>
</message>
@ -8977,12 +9063,11 @@ Lockdatei:
<translation>Nachbar Details</translation>
</message>
<message>
<location filename="../util/EventReceiver.cpp" line="+91"/>
<source>No running instance of RetroShare found.</source>
<translation>Kein laufendes RetroShare gefunden.</translation>
<translation type="obsolete">Kein laufendes RetroShare gefunden.</translation>
</message>
<message>
<location line="+33"/>
<location filename="../util/EventReceiver.cpp" line="+120"/>
<source>Start with a RetroShare link is only supported for Windows.</source>
<translation>Der Start mit einem RetroShare Link wird nur unter Windows unterstützt.</translation>
</message>
@ -9570,7 +9655,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location line="+319"/>
<location filename="../gui/SearchDialog.cpp" line="+280"/>
<location filename="../gui/SearchDialog.cpp" line="+281"/>
<source>Download</source>
<translation>Herunterladen</translation>
</message>
@ -9610,7 +9695,7 @@ p, li { white-space: pre-wrap; }
<translation>Alle entfernen</translation>
</message>
<message>
<location line="+342"/>
<location line="+351"/>
<location line="+68"/>
<source>Folder</source>
<translation>Ordner</translation>
@ -9671,7 +9756,7 @@ p, li { white-space: pre-wrap; }
<translation>Such ID</translation>
</message>
<message>
<location filename="../gui/SearchDialog.cpp" line="-957"/>
<location filename="../gui/SearchDialog.cpp" line="-966"/>
<source>Download Notice</source>
<translation>Download</translation>
</message>
@ -10311,7 +10396,7 @@ p, li { white-space: pre-wrap; }
<name>SharedFilesDialog</name>
<message>
<location filename="../gui/SharedFilesDialog.ui" line="+984"/>
<location filename="../gui/SharedFilesDialog.cpp" line="+365"/>
<location filename="../gui/SharedFilesDialog.cpp" line="+386"/>
<source>Download</source>
<translation>Herunterladen</translation>
</message>
@ -10394,23 +10479,23 @@ p, li { white-space: pre-wrap; }
<translation>Prüfe Dateien</translation>
</message>
<message>
<location filename="../gui/SharedFilesDialog.cpp" line="-133"/>
<location line="+549"/>
<location filename="../gui/SharedFilesDialog.cpp" line="-154"/>
<location line="+569"/>
<source>Open File</source>
<translation>Datei öffnen</translation>
</message>
<message>
<location line="-547"/>
<location line="-567"/>
<source>Open Folder</source>
<translation>Ordner öffnen</translation>
</message>
<message>
<location line="+556"/>
<location line="+576"/>
<source>Set command for opening this file</source>
<translation>Setze eine Regel zum Öffnen dieser Datei</translation>
</message>
<message>
<location line="-420"/>
<location line="-419"/>
<source>Copy retroshare Link</source>
<translation>Kopiere RetroShare Link</translation>
</message>
@ -10430,7 +10515,7 @@ p, li { white-space: pre-wrap; }
<translation>Sende RetroShare Link</translation>
</message>
<message>
<location line="-155"/>
<location line="-176"/>
<source>Copy retroshare Links to Clipboard</source>
<translation>Kopiere RetroShare Links in die Zwischenablage</translation>
</message>
@ -10460,13 +10545,13 @@ p, li { white-space: pre-wrap; }
<translation>Füge die Links zur Verknüpfungs-Wolke hinzu</translation>
</message>
<message>
<location line="+151"/>
<location line="+380"/>
<location line="+172"/>
<location line="+379"/>
<source>Recommend in a message to</source>
<translation>Empfehle in einer Nachricht an</translation>
</message>
<message>
<location line="-254"/>
<location line="-253"/>
<location line="+23"/>
<location line="+24"/>
<source>RetroShare Link</source>
@ -10481,7 +10566,7 @@ p, li { white-space: pre-wrap; }
<translation>Empfehlung(en)</translation>
</message>
<message>
<location line="+192"/>
<location line="+191"/>
<source>&lt;strong&gt;My Shared Files&lt;/strong&gt;</source>
<translation>&lt;strong&gt;Meine Dateien&lt;/strong&gt;</translation>
</message>