Added threaded loading of channels (GUI).

git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@5115 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
thunder2 2012-04-21 13:00:17 +00:00
parent 2793e249b3
commit 83f49ac143
7 changed files with 293 additions and 76 deletions

View File

@ -22,6 +22,7 @@
#include <QMenu>
#include <QTimer>
#include <QStandardItemModel>
#include <QMessageBox>
#include <iostream>
#include <algorithm>
@ -91,6 +92,11 @@ ChannelFeed::ChannelFeed(QWidget *parent)
channeloptsmenu->addAction(actionEnable_Auto_Download);
channeloptions_Button->setMenu(channeloptsmenu);
progressLabel->hide();
progressBar->hide();
fillThread = NULL;
//added from ahead
updateChannelList();
@ -105,6 +111,12 @@ ChannelFeed::ChannelFeed(QWidget *parent)
ChannelFeed::~ChannelFeed()
{
if (fillThread) {
fillThread->stop();
delete(fillThread);
fillThread = NULL;
}
// save settings
processSettings(false);
}
@ -188,6 +200,12 @@ void ChannelFeed::channelListCustomPopupMenu( QPoint /*point*/ )
QAction *action = contextMnu.addAction(QIcon(":/images/copyrslink.png"), tr("Copy RetroShare Link"), this, SLOT(copyChannelLink()));
action->setEnabled(!mChannelId.empty());
#ifdef CHAN_DEBUG
contextMnu.addSeparator();
action = contextMnu.addAction("Generate mass data", this, SLOT(generateMassData()));
action->setEnabled (!mChannelId.empty() && (ci.channelFlags & RS_DISTRIB_PUBLISH));
#endif
contextMnu.exec(QCursor::pos());
}
@ -424,12 +442,25 @@ static bool sortChannelMsgSummary(const ChannelMsgSummary &msg1, const ChannelMs
void ChannelFeed::updateChannelMsgs()
{
if (fillThread) {
#ifdef CHAN_DEBUG
std::cerr << "ChannelFeed::updateChannelMsgs() stop current fill thread" << std::endl;
#endif
// stop current fill thread
fillThread->stop();
delete(fillThread);
fillThread = NULL;
progressLabel->hide();
progressBar->hide();
}
if (!rsChannels) {
return;
}
/* replace all the messages with new ones */
std::list<ChanMsgItem *>::iterator mit;
QList<ChanMsgItem *>::iterator mit;
for (mit = mChanMsgItems.begin(); mit != mChanMsgItems.end(); mit++) {
delete (*mit);
}
@ -463,8 +494,7 @@ void ChannelFeed::updateChannelMsgs()
iconLabel->setEnabled(true);
/* set textcolor for Channel name */
QString channelStr("<span style=\"font-size:22pt; font-weight:500;"
"color:#4F4F4F;\">%1</span>");
QString channelStr("<span style=\"font-size:22pt; font-weight:500;color:#4F4F4F;\">%1</span>");
/* set Channel name */
QString cname = QString::fromStdWString(ci.channelName);
@ -498,17 +528,74 @@ void ChannelFeed::updateChannelMsgs()
actionEnable_Auto_Download->setEnabled(false);
}
std::list<ChannelMsgSummary> msgs;
std::list<ChannelMsgSummary>::iterator it;
rsChannels->getChannelMsgList(mChannelId, msgs);
progressLabel->show();
progressBar->reset();
progressBar->show();
msgs.sort(sortChannelMsgSummary);
// create fill thread
fillThread = new ChannelFillThread(this, mChannelId);
// connect thread
connect(fillThread, SIGNAL(finished()), this, SLOT(fillThreadFinished()), Qt::BlockingQueuedConnection);
connect(fillThread, SIGNAL(progress(int,int)), this, SLOT(fillThreadProgress(int,int)));
connect(fillThread, SIGNAL(addMsg(QString,QString)), this, SLOT(fillThreadAddMsg(QString,QString)), Qt::BlockingQueuedConnection);
for(it = msgs.begin(); it != msgs.end(); it++) {
ChanMsgItem *cmi = new ChanMsgItem(this, 0, mChannelId, it->msgId, true);
#ifdef DEBUG_FORUMS
std::cerr << "ChannelFeed::updateChannelMsgs() Start fill thread" << std::endl;
#endif
// start thread
fillThread->start();
}
void ChannelFeed::fillThreadFinished()
{
#ifdef DEBUG_FORUMS
std::cerr << "ChannelFeed::fillThreadFinished" << std::endl;
#endif
// thread has finished
ChannelFillThread *thread = dynamic_cast<ChannelFillThread*>(sender());
if (thread) {
if (thread == fillThread) {
// current thread has finished, hide progressbar and release thread
progressBar->hide();
progressLabel->hide();
fillThread = NULL;
}
if (thread->wasStopped()) {
// thread was stopped
#ifdef DEBUG_FORUMS
std::cerr << "ChannelFeed::fillThreadFinished Thread was stopped" << std::endl;
#endif
}
#ifdef DEBUG_FORUMS
std::cerr << "ChannelFeed::fillThreadFinished Delete thread" << std::endl;
#endif
thread->deleteLater();
thread = NULL;
}
#ifdef DEBUG_FORUMS
std::cerr << "ChannelFeed::fillThreadFinished done" << std::endl;
#endif
}
void ChannelFeed::fillThreadProgress(int current, int count)
{
// show fill progress
if (count) {
progressBar->setValue(current * progressBar->maximum() / count);
}
}
void ChannelFeed::fillThreadAddMsg(const QString &channelId, const QString &channelMsgId)
{
if (sender() == fillThread) {
ChanMsgItem *cmi = new ChanMsgItem(this, 0, channelId.toStdString(), channelMsgId.toStdString(), true);
mChanMsgItems.push_back(cmi);
verticalLayout_2->addWidget(cmi);
}
@ -629,7 +716,7 @@ bool ChannelFeed::navigate(const std::string& channelId, const std::string& msgI
}
/* Search exisiting item */
std::list<ChanMsgItem*>::iterator mit;
QList<ChanMsgItem*>::iterator mit;
for (mit = mChanMsgItems.begin(); mit != mChanMsgItems.end(); mit++) {
ChanMsgItem *item = *mit;
if (item->msgId() == msgId) {
@ -653,3 +740,79 @@ void ChannelFeed::setAutoDownloadButton(bool autoDl)
actionEnable_Auto_Download->setText(tr("Enable Auto-Download"));
}
}
void ChannelFeed::generateMassData()
{
#ifdef CHAN_DEBUG
if (mChannelId.empty ()) {
return;
}
if (QMessageBox::question(this, "Generate mass data", "Do you really want to generate mass data ?", QMessageBox::Yes|QMessageBox::No, QMessageBox::No) == QMessageBox::No) {
return;
}
for (int thread = 1; thread < 1000; thread++) {
ChannelMsgInfo msgInfo;
msgInfo.channelId = mChannelId;
msgInfo.subject = QString("Test %1").arg(thread, 3, 10, QChar('0')).toStdWString();
msgInfo.msg = QString("That is only a test").toStdWString();
if (rsChannels->ChannelMessageSend(msgInfo) == false) {
return;
}
}
#endif
}
// ForumsFillThread
ChannelFillThread::ChannelFillThread(ChannelFeed *parent, const std::string &channelId)
: QThread(parent)
{
stopped = false;
this->channelId = channelId;
}
ChannelFillThread::~ChannelFillThread()
{
#ifdef CHAN_DEBUG
std::cerr << "ChannelFillThread::~ChannelFillThread" << std::endl;
#endif
}
void ChannelFillThread::stop()
{
disconnect();
stopped = true;
QApplication::processEvents();
wait();
}
void ChannelFillThread::run()
{
#ifdef CHAN_DEBUG
std::cerr << "ChannelFillThread::run()" << std::endl;
#endif
std::list<ChannelMsgSummary> msgs;
std::list<ChannelMsgSummary>::iterator it;
rsChannels->getChannelMsgList(channelId, msgs);
msgs.sort(sortChannelMsgSummary);
int count = msgs.size();
int pos = 0;
for (it = msgs.begin(); it != msgs.end(); it++) {
if (stopped) {
break;
}
emit addMsg(QString::fromStdString(channelId), QString::fromStdString(it->msgId));
emit progress(++pos, count);
}
#ifdef CHAN_DEBUG
std::cerr << "ChannelFillThread::run() stopped: " << (wasStopped() ? "yes" : "no") << std::endl;
#endif
}

View File

@ -24,6 +24,7 @@
#include <retroshare/rschannels.h>
#include <QStandardItemModel>
#include <QThread>
#include <map>
#include "mainpage.h"
@ -35,6 +36,7 @@
class ChanMsgItem;
class QTreeWidgetItem;
class ChannelFillThread;
class ChannelFeed : public RsAutoUpdatePage, public FeedHolder, private Ui::ChannelFeed
{
@ -75,6 +77,12 @@ private slots:
void channelMsgReadSatusChanged(const QString& channelId, const QString& msgId, int status);
void generateMassData();
void fillThreadFinished();
void fillThreadProgress(int current, int count);
void fillThreadAddMsg(const QString &channelId, const QString &channelMsgId);
private:
void updateChannelList();
void updateChannelMsgs();
@ -89,14 +97,38 @@ private:
/* Layout Pointers */
QBoxLayout *mMsgLayout;
std::list<ChanMsgItem *> mChanMsgItems;
QList<ChanMsgItem *> mChanMsgItems;
std::map<std::string, uint32_t> mChanSearchScore; //chanId, score
QTreeWidgetItem *ownChannels;
QTreeWidgetItem *subcribedChannels;
QTreeWidgetItem *popularChannels;
QTreeWidgetItem *otherChannels;
ChannelFillThread *fillThread;
};
class ChannelFillThread : public QThread
{
Q_OBJECT
public:
ChannelFillThread(ChannelFeed *parent, const std::string &channelId);
~ChannelFillThread();
void run();
void stop();
bool wasStopped() { return stopped; }
signals:
void progress(int current, int count);
void addMsg(const QString &channelId, const QString &channelMsgId);
public:
std::string channelId;
private:
volatile bool stopped;
};
#endif

View File

@ -508,7 +508,7 @@ border-image: url(:/images/btn_26_pressed.png) 4;
</layout>
</widget>
</item>
<item row="1" column="0">
<item row="2" column="0">
<widget class="QScrollArea" name="scrollArea">
<property name="widgetResizable">
<bool>true</bool>
@ -521,8 +521,8 @@ border-image: url(:/images/btn_26_pressed.png) 4;
<rect>
<x>0</x>
<y>0</y>
<width>392</width>
<height>333</height>
<width>400</width>
<height>304</height>
</rect>
</property>
<property name="styleSheet">
@ -558,6 +558,27 @@ border-image: url(:/images/btn_26_pressed.png) 4;
</widget>
</widget>
</item>
<item row="1" column="0">
<layout class="QHBoxLayout" name="progressLayout">
<item>
<widget class="QLabel" name="progressLabel">
<property name="text">
<string>Loading</string>
</property>
</widget>
</item>
<item>
<widget class="QProgressBar" name="progressBar">
<property name="maximum">
<number>1000</number>
</property>
<property name="value">
<number>24</number>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</widget>

View File

@ -208,12 +208,10 @@ ForumsDialog::ForumsDialog(QWidget *parent)
ttheader->setResizeMode (COLUMN_THREAD_READ, QHeaderView::Fixed);
ttheader->hideSection (COLUMN_THREAD_CONTENT);
ui.progressBar->setTextVisible(true);
ui.progressBar->hide();
ui.progLayOutTxt->hide();
ui.progressBarLayOut->setEnabled(false);
fillThread = NULL;
insertThreads();
@ -495,15 +493,15 @@ void ForumsDialog::updateDisplay()
}
}
static void CleanupItems (QList<QTreeWidgetItem *> &Items)
static void CleanupItems (QList<QTreeWidgetItem *> &items)
{
QList<QTreeWidgetItem *>::iterator Item;
for (Item = Items.begin (); Item != Items.end (); Item++) {
if (*Item) {
delete (*Item);
QList<QTreeWidgetItem *>::iterator item;
for (item = items.begin (); item != items.end (); item++) {
if (*item) {
delete (*item);
}
}
Items.clear();
items.clear();
}
void ForumsDialog::forumInfoToGroupItemInfo(const ForumInfo &forumInfo, GroupItemInfo &groupItemInfo)
@ -844,7 +842,6 @@ void ForumsDialog::fillThreadProgress(int current, int count)
if (count) {
ui.progressBar->setValue(current * ui.progressBar->maximum() / count);
}
}
void ForumsDialog::insertThreads()
@ -858,15 +855,13 @@ void ForumsDialog::insertThreads()
#ifdef DEBUG_FORUMS
std::cerr << "ForumsDialog::insertThreads() stop current fill thread" << std::endl;
#endif
// stop and disconnect current fill thread
ForumsFillThread *thread = fillThread;
// stop current fill thread
fillThread->stop();
delete(fillThread);
fillThread = NULL;
// disconnect only the signal "progress", the signal "finished" is needed to delete the thread
thread->disconnect(this, SIGNAL(progress(int,int)));
thread->stop();
ui.progressBar->hide();
ui.progLayOutTxt->hide();
}
subscribeFlags = 0;
@ -905,6 +900,7 @@ void ForumsDialog::insertThreads()
ui.progressBarLayOut->setEnabled(true);
ui.progLayOutTxt->show();
ui.progressBar->reset();
ui.progressBar->show();
// create fill thread
@ -1761,7 +1757,10 @@ ForumsFillThread::~ForumsFillThread()
void ForumsFillThread::stop()
{
disconnect();
stopped = true;
QApplication::processEvents();
wait();
}
void ForumsFillThread::run()

View File

@ -1192,9 +1192,6 @@ border: 1px solid #CCCCCC;}</string>
<property name="value">
<number>0</number>
</property>
<property name="textVisible">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
@ -1230,6 +1227,12 @@ border: 1px solid #CCCCCC;}</string>
</action>
</widget>
<customwidgets>
<customwidget>
<class>GroupTreeWidget</class>
<extends>QWidget</extends>
<header>gui/common/GroupTreeWidget.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>LineEditClear</class>
<extends>QLineEdit</extends>
@ -1240,12 +1243,6 @@ border: 1px solid #CCCCCC;}</string>
<extends>QTextBrowser</extends>
<header>gui/common/LinkTextBrowser.h</header>
</customwidget>
<customwidget>
<class>GroupTreeWidget</class>
<extends>QWidget</extends>
<header>gui/common/GroupTreeWidget.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources>
<include location="images.qrc"/>

View File

@ -1006,18 +1006,23 @@ p, li { white-space: pre-wrap; }
<translation>Abonnieren</translation>
</message>
<message>
<location line="+181"/>
<location line="+179"/>
<source>Loading</source>
<translation>Lade</translation>
</message>
<message>
<location line="+23"/>
<location line="+3"/>
<source>Set all as read</source>
<translation>Alle als gelesen markieren</translation>
</message>
<message>
<location line="-255"/>
<location line="-276"/>
<source>Unsubcribe To Channel</source>
<translation>Kanal abbestellen</translation>
</message>
<message>
<location filename="../gui/ChannelFeed.cpp" line="+84"/>
<location filename="../gui/ChannelFeed.cpp" line="+86"/>
<source>Own Channels</source>
<translation>Meine Kanäle</translation>
</message>
@ -1038,7 +1043,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location filename="../gui/ChannelFeed.ui" line="+116"/>
<location filename="../gui/ChannelFeed.cpp" line="+55"/>
<location filename="../gui/ChannelFeed.cpp" line="+66"/>
<source>Post to Channel</source>
<translation>Kanalbeitrag erstellen</translation>
</message>
@ -1073,24 +1078,24 @@ p, li { white-space: pre-wrap; }
<translation>Kopiere RetroShare Link</translation>
</message>
<message>
<location line="+259"/>
<location line="+278"/>
<source>No Channel Selected</source>
<translation>Keinen Kanal gewählt</translation>
</message>
<message>
<location line="+204"/>
<location line="+260"/>
<source>Disable Auto-Download</source>
<translation>Deaktiviere Auto-Download</translation>
</message>
<message>
<location filename="../gui/ChannelFeed.ui" line="+144"/>
<location filename="../gui/ChannelFeed.ui" line="+165"/>
<location line="+3"/>
<location filename="../gui/ChannelFeed.cpp" line="+2"/>
<source>Enable Auto-Download</source>
<translation>Aktiviere Auto-Download</translation>
</message>
<message>
<location filename="../gui/ChannelFeed.cpp" line="-496"/>
<location filename="../gui/ChannelFeed.cpp" line="-571"/>
<source>Edit Channel Details</source>
<translation>Kanal-Details bearbeiten</translation>
</message>
@ -1620,17 +1625,17 @@ p, li { white-space: pre-wrap; }
<translation>Schriftart auf den Standard setzen</translation>
</message>
<message>
<location filename="../gui/chat/ChatWidget.cpp" line="+364"/>
<location filename="../gui/chat/ChatWidget.cpp" line="+367"/>
<source>Paste RetroShare Link</source>
<translation>RetroShare Link einfügen</translation>
</message>
<message>
<location line="+22"/>
<location line="+39"/>
<source>is typing...</source>
<translation>tippt...</translation>
</message>
<message>
<location line="+127"/>
<location line="+125"/>
<source>Do you really want to physically delete the history?</source>
<translation>Möchtest du wirklich den Nachrichtenverlauf physisch löschen?</translation>
</message>
@ -1911,7 +1916,7 @@ p, li { white-space: pre-wrap; }
<translation>Übernehmen und Schliessen</translation>
</message>
<message>
<location filename="../gui/connect/ConfCertDialog.cpp" line="+137"/>
<location filename="../gui/connect/ConfCertDialog.cpp" line="+132"/>
<location line="+198"/>
<location line="+28"/>
<source>RetroShare</source>
@ -4433,7 +4438,7 @@ p, li { white-space: pre-wrap; }
<context>
<name>ForumsDialog</name>
<message>
<location filename="../gui/ForumsDialog.cpp" line="+291"/>
<location filename="../gui/ForumsDialog.cpp" line="+289"/>
<source>Subscribe to Forum</source>
<translation>Forum abonnieren</translation>
</message>
@ -4519,7 +4524,7 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
<location line="+583"/>
<location line="+580"/>
<source>[ ... Missing Message ... ]</source>
<translation>[ ... Fehlende Nachricht ... ]</translation>
</message>
@ -4545,7 +4550,7 @@ p, li { white-space: pre-wrap; }
<translation>Du kannst einem anonymen Autor nicht antworten</translation>
</message>
<message>
<location line="-1357"/>
<location line="-1352"/>
<source>Your Forums</source>
<translation>Deine Foren</translation>
</message>
@ -4700,7 +4705,7 @@ p, li { white-space: pre-wrap; }
<translation>Forum erstellen</translation>
</message>
<message>
<location line="+565"/>
<location line="+562"/>
<source>Print</source>
<translation>Drucken</translation>
</message>
@ -4710,8 +4715,8 @@ p, li { white-space: pre-wrap; }
<translation>Druckvorschau</translation>
</message>
<message>
<location filename="../gui/ForumsDialog.cpp" line="+149"/>
<location line="+1129"/>
<location filename="../gui/ForumsDialog.cpp" line="+147"/>
<location line="+1126"/>
<source>Start New Thread</source>
<translation>Erstelle neues Thema</translation>
</message>
@ -4732,12 +4737,12 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">Zurücksetzen</translation>
</message>
<message>
<location filename="../gui/ForumsDialog.ui" line="-133"/>
<location filename="../gui/ForumsDialog.ui" line="-130"/>
<source>Content</source>
<translation>Inhalt</translation>
</message>
<message>
<location filename="../gui/ForumsDialog.cpp" line="-1116"/>
<location filename="../gui/ForumsDialog.cpp" line="-1113"/>
<location line="+3"/>
<source>Mark as read</source>
<translation>Als gelesen markieren</translation>
@ -5515,7 +5520,7 @@ p, li { white-space: pre-wrap; }
<translation>Löscht den gespeicherten und angezeigten Chat Verlauf</translation>
</message>
<message>
<location filename="../gui/FriendsDialog.cpp" line="+98"/>
<location filename="../gui/FriendsDialog.cpp" line="+99"/>
<source>Chat lobbies</source>
<translation>Chat Lobbies</translation>
</message>
@ -5530,7 +5535,7 @@ p, li { white-space: pre-wrap; }
<translation>Neuigkeiten</translation>
</message>
<message>
<location line="+39"/>
<location line="+41"/>
<source>Welcome to RetroShare&apos;s group chat.</source>
<translation>Willkommen bei RetroShare&apos;s Gruppenchat.</translation>
</message>
@ -5648,7 +5653,7 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">Möchtest du diesen Freund entfernen?</translation>
</message>
<message>
<location line="+42"/>
<location line="+59"/>
<source>is typing...</source>
<translation>tippt...</translation>
</message>
@ -5659,7 +5664,7 @@ p, li { white-space: pre-wrap; }
<translation>Neuer Gruppenchat</translation>
</message>
<message>
<location line="+234"/>
<location line="+232"/>
<source>Do you really want to physically delete the history?</source>
<translation>Möchtest du wirklich den Nachrichtenverlauf physisch löschen?</translation>
</message>
@ -9570,7 +9575,7 @@ p, li { white-space: pre-wrap; }
<context>
<name>NotifyQt</name>
<message>
<location filename="../gui/notifyqt.cpp" line="+129"/>
<location filename="../gui/notifyqt.cpp" line="+127"/>
<source>GPG key passphrase</source>
<translation>GPG Schlüssel Passwort</translation>
</message>
@ -10040,7 +10045,7 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">Formular</translation>
</message>
<message>
<location filename="../gui/settings/PluginItem.ui" line="+241"/>
<location filename="../gui/settings/PluginItem.ui" line="+235"/>
<source>Status: </source>
<translation>Status:</translation>
</message>
@ -10050,7 +10055,7 @@ p, li { white-space: pre-wrap; }
<translation>Datei Prüfsumme:</translation>
</message>
<message>
<location line="-84"/>
<location line="-78"/>
<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; }
@ -10063,7 +10068,7 @@ p, li { white-space: pre-wrap; }
&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;&lt;a href=&quot;more&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;mehr...&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location line="+61"/>
<location line="+55"/>
<source>File name: </source>
<translation>Dateiname:</translation>
</message>
@ -10842,7 +10847,7 @@ p, li { white-space: pre-wrap; }
<context>
<name>QObject</name>
<message>
<location filename="../main.cpp" line="+86"/>
<location filename="../main.cpp" line="+85"/>
<location line="+124"/>
<source>RetroShare</source>
<translation>RetroShare</translation>
@ -11943,7 +11948,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<location line="+274"/>
<location filename="../gui/SearchDialog.cpp" line="+278"/>
<location filename="../gui/SearchDialog.cpp" line="+279"/>
<source>Download</source>
<translation>Herunterladen</translation>
</message>
@ -11979,13 +11984,13 @@ p, li { white-space: pre-wrap; }
<translation>Alle entfernen</translation>
</message>
<message>
<location line="+390"/>
<location line="+68"/>
<location line="+375"/>
<location line="+64"/>
<source>Folder</source>
<translation>Ordner</translation>
</message>
<message>
<location line="+383"/>
<location line="+392"/>
<source>New RetroShare Link(s)</source>
<translation>Neu(e) RetroShare Link(s)</translation>
</message>
@ -12039,7 +12044,7 @@ p, li { white-space: pre-wrap; }
<translation>Such ID</translation>
</message>
<message>
<location filename="../gui/SearchDialog.cpp" line="-924"/>
<location filename="../gui/SearchDialog.cpp" line="-914"/>
<source>Download Notice</source>
<translation>Download</translation>
</message>
@ -12195,7 +12200,7 @@ p, li { white-space: pre-wrap; }
<name>SecurityItem</name>
<message>
<location filename="../gui/feeds/SecurityItem.ui" line="+317"/>
<location filename="../gui/feeds/SecurityItem.cpp" line="+296"/>
<location filename="../gui/feeds/SecurityItem.cpp" line="+295"/>
<source>Expand</source>
<translation>Erweitern</translation>
</message>
@ -12298,7 +12303,7 @@ p, li { white-space: pre-wrap; }
<translation>Nachricht schreiben</translation>
</message>
<message>
<location filename="../gui/feeds/SecurityItem.cpp" line="-176"/>
<location filename="../gui/feeds/SecurityItem.cpp" line="-175"/>
<source>Connect Attempt</source>
<translation>Verbindungsversuch</translation>
</message>
@ -12338,7 +12343,7 @@ p, li { white-space: pre-wrap; }
<translation>Unbekannter Nachbar</translation>
</message>
<message>
<location line="+94"/>
<location line="+93"/>
<source>Hide</source>
<translation>Verbergen</translation>
</message>