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 <QMenu>
#include <QTimer> #include <QTimer>
#include <QStandardItemModel> #include <QStandardItemModel>
#include <QMessageBox>
#include <iostream> #include <iostream>
#include <algorithm> #include <algorithm>
@ -91,6 +92,11 @@ ChannelFeed::ChannelFeed(QWidget *parent)
channeloptsmenu->addAction(actionEnable_Auto_Download); channeloptsmenu->addAction(actionEnable_Auto_Download);
channeloptions_Button->setMenu(channeloptsmenu); channeloptions_Button->setMenu(channeloptsmenu);
progressLabel->hide();
progressBar->hide();
fillThread = NULL;
//added from ahead //added from ahead
updateChannelList(); updateChannelList();
@ -105,6 +111,12 @@ ChannelFeed::ChannelFeed(QWidget *parent)
ChannelFeed::~ChannelFeed() ChannelFeed::~ChannelFeed()
{ {
if (fillThread) {
fillThread->stop();
delete(fillThread);
fillThread = NULL;
}
// save settings // save settings
processSettings(false); 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())); QAction *action = contextMnu.addAction(QIcon(":/images/copyrslink.png"), tr("Copy RetroShare Link"), this, SLOT(copyChannelLink()));
action->setEnabled(!mChannelId.empty()); 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()); contextMnu.exec(QCursor::pos());
} }
@ -424,12 +442,25 @@ static bool sortChannelMsgSummary(const ChannelMsgSummary &msg1, const ChannelMs
void ChannelFeed::updateChannelMsgs() 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) { if (!rsChannels) {
return; return;
} }
/* replace all the messages with new ones */ /* replace all the messages with new ones */
std::list<ChanMsgItem *>::iterator mit; QList<ChanMsgItem *>::iterator mit;
for (mit = mChanMsgItems.begin(); mit != mChanMsgItems.end(); mit++) { for (mit = mChanMsgItems.begin(); mit != mChanMsgItems.end(); mit++) {
delete (*mit); delete (*mit);
} }
@ -463,8 +494,7 @@ void ChannelFeed::updateChannelMsgs()
iconLabel->setEnabled(true); iconLabel->setEnabled(true);
/* set textcolor for Channel name */ /* set textcolor for Channel name */
QString channelStr("<span style=\"font-size:22pt; font-weight:500;" QString channelStr("<span style=\"font-size:22pt; font-weight:500;color:#4F4F4F;\">%1</span>");
"color:#4F4F4F;\">%1</span>");
/* set Channel name */ /* set Channel name */
QString cname = QString::fromStdWString(ci.channelName); QString cname = QString::fromStdWString(ci.channelName);
@ -498,17 +528,74 @@ void ChannelFeed::updateChannelMsgs()
actionEnable_Auto_Download->setEnabled(false); actionEnable_Auto_Download->setEnabled(false);
} }
std::list<ChannelMsgSummary> msgs; progressLabel->show();
std::list<ChannelMsgSummary>::iterator it; progressBar->reset();
rsChannels->getChannelMsgList(mChannelId, msgs); 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++) { #ifdef DEBUG_FORUMS
ChanMsgItem *cmi = new ChanMsgItem(this, 0, mChannelId, it->msgId, true); 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); mChanMsgItems.push_back(cmi);
verticalLayout_2->addWidget(cmi); verticalLayout_2->addWidget(cmi);
} }
@ -629,7 +716,7 @@ bool ChannelFeed::navigate(const std::string& channelId, const std::string& msgI
} }
/* Search exisiting item */ /* Search exisiting item */
std::list<ChanMsgItem*>::iterator mit; QList<ChanMsgItem*>::iterator mit;
for (mit = mChanMsgItems.begin(); mit != mChanMsgItems.end(); mit++) { for (mit = mChanMsgItems.begin(); mit != mChanMsgItems.end(); mit++) {
ChanMsgItem *item = *mit; ChanMsgItem *item = *mit;
if (item->msgId() == msgId) { if (item->msgId() == msgId) {
@ -653,3 +740,79 @@ void ChannelFeed::setAutoDownloadButton(bool autoDl)
actionEnable_Auto_Download->setText(tr("Enable Auto-Download")); 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 <retroshare/rschannels.h>
#include <QStandardItemModel> #include <QStandardItemModel>
#include <QThread>
#include <map> #include <map>
#include "mainpage.h" #include "mainpage.h"
@ -35,6 +36,7 @@
class ChanMsgItem; class ChanMsgItem;
class QTreeWidgetItem; class QTreeWidgetItem;
class ChannelFillThread;
class ChannelFeed : public RsAutoUpdatePage, public FeedHolder, private Ui::ChannelFeed 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 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: private:
void updateChannelList(); void updateChannelList();
void updateChannelMsgs(); void updateChannelMsgs();
@ -89,14 +97,38 @@ private:
/* Layout Pointers */ /* Layout Pointers */
QBoxLayout *mMsgLayout; QBoxLayout *mMsgLayout;
std::list<ChanMsgItem *> mChanMsgItems; QList<ChanMsgItem *> mChanMsgItems;
std::map<std::string, uint32_t> mChanSearchScore; //chanId, score std::map<std::string, uint32_t> mChanSearchScore; //chanId, score
QTreeWidgetItem *ownChannels; QTreeWidgetItem *ownChannels;
QTreeWidgetItem *subcribedChannels; QTreeWidgetItem *subcribedChannels;
QTreeWidgetItem *popularChannels; QTreeWidgetItem *popularChannels;
QTreeWidgetItem *otherChannels; 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 #endif

View File

@ -508,7 +508,7 @@ border-image: url(:/images/btn_26_pressed.png) 4;
</layout> </layout>
</widget> </widget>
</item> </item>
<item row="1" column="0"> <item row="2" column="0">
<widget class="QScrollArea" name="scrollArea"> <widget class="QScrollArea" name="scrollArea">
<property name="widgetResizable"> <property name="widgetResizable">
<bool>true</bool> <bool>true</bool>
@ -521,8 +521,8 @@ border-image: url(:/images/btn_26_pressed.png) 4;
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>392</width> <width>400</width>
<height>333</height> <height>304</height>
</rect> </rect>
</property> </property>
<property name="styleSheet"> <property name="styleSheet">
@ -558,6 +558,27 @@ border-image: url(:/images/btn_26_pressed.png) 4;
</widget> </widget>
</widget> </widget>
</item> </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> </layout>
</widget> </widget>
</widget> </widget>

View File

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

View File

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

View File

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