diff --git a/libretroshare/src/retroshare/rsmsgs.h b/libretroshare/src/retroshare/rsmsgs.h index 1e51be6c6..57843088f 100644 --- a/libretroshare/src/retroshare/rsmsgs.h +++ b/libretroshare/src/retroshare/rsmsgs.h @@ -52,6 +52,7 @@ #define RS_MSG_UNREAD_BY_USER 0x0040 /* Unread by user */ #define RS_MSG_REPLIED 0x0080 /* Message is replied */ #define RS_MSG_FORWARDED 0x0100 /* Message is forwarded */ +#define RS_MSG_STAR 0x0200 /* Message is marked with a star */ #define RS_MSGTAGTYPE_IMPORTANT 1 #define RS_MSGTAGTYPE_WORK 2 @@ -163,9 +164,10 @@ virtual bool MessageToTrash(const std::string &mid, bool bTrash) = 0; virtual bool getMsgParentId(const std::string &msgId, std::string &msgParentId) = 0; virtual bool MessageDelete(const std::string &mid) = 0; -virtual bool MessageRead(const std::string &mid, bool bUnreadByUser) = 0; +virtual bool MessageRead(const std::string &mid, bool unreadByUser) = 0; virtual bool MessageReplied(const std::string &mid, bool replied) = 0; virtual bool MessageForwarded(const std::string &mid, bool forwarded) = 0; +virtual bool MessageStar(const std::string &mid, bool mark) = 0; /* message tagging */ diff --git a/libretroshare/src/rsserver/p3msgs.cc b/libretroshare/src/rsserver/p3msgs.cc index 1566b375f..a259fd1d7 100644 --- a/libretroshare/src/rsserver/p3msgs.cc +++ b/libretroshare/src/rsserver/p3msgs.cc @@ -100,12 +100,12 @@ bool p3Msgs::MessageDelete(const std::string &mid) return mMsgSrv -> removeMsgId(mid); } -bool p3Msgs::MessageRead(const std::string &mid, bool bUnreadByUser) +bool p3Msgs::MessageRead(const std::string &mid, bool unreadByUser) { //std::cerr << "p3Msgs::MessageRead() "; //std::cerr << "mid: " << mid << std::endl; - return mMsgSrv -> markMsgIdRead(mid, bUnreadByUser); + return mMsgSrv -> markMsgIdRead(mid, unreadByUser); } bool p3Msgs::MessageReplied(const std::string &mid, bool replied) @@ -123,6 +123,12 @@ bool p3Msgs::getMessageTagTypes(MsgTagType& tags) return mMsgSrv->getMessageTagTypes(tags); } +bool p3Msgs::MessageStar(const std::string &mid, bool star) + +{ + return mMsgSrv->setMsgFlag(mid, star ? RS_MSG_FLAGS_STAR : 0, RS_MSG_FLAGS_STAR); +} + bool p3Msgs::setMessageTagType(uint32_t tagId, std::string& text, uint32_t rgb_color) { return mMsgSrv->setMessageTagType(tagId, text, rgb_color); diff --git a/libretroshare/src/rsserver/p3msgs.h b/libretroshare/src/rsserver/p3msgs.h index 419d6bede..9440de2c5 100644 --- a/libretroshare/src/rsserver/p3msgs.h +++ b/libretroshare/src/rsserver/p3msgs.h @@ -61,9 +61,10 @@ class p3Msgs: public RsMsgs virtual bool MessageToDraft(MessageInfo &info, const std::string &msgParentId); virtual bool MessageToTrash(const std::string &mid, bool bTrash); virtual bool MessageDelete(const std::string &mid); - virtual bool MessageRead(const std::string &mid, bool bUnreadByUser); + virtual bool MessageRead(const std::string &mid, bool unreadByUser); virtual bool MessageReplied(const std::string &mid, bool replied); virtual bool MessageForwarded(const std::string &mid, bool forwarded); + virtual bool MessageStar(const std::string &mid, bool star); virtual bool getMsgParentId(const std::string &msgId, std::string &msgParentId); virtual bool getMessageTagTypes(MsgTagType& tags); diff --git a/libretroshare/src/serialiser/rsmsgitems.h b/libretroshare/src/serialiser/rsmsgitems.h index 7cda3bd8b..9e8eb3455 100644 --- a/libretroshare/src/serialiser/rsmsgitems.h +++ b/libretroshare/src/serialiser/rsmsgitems.h @@ -188,6 +188,7 @@ const uint32_t RS_MSG_FLAGS_TRASH = 0x0020; const uint32_t RS_MSG_FLAGS_UNREAD_BY_USER = 0x0040; const uint32_t RS_MSG_FLAGS_REPLIED = 0x0080; const uint32_t RS_MSG_FLAGS_FORWARDED = 0x0100; +const uint32_t RS_MSG_FLAGS_STAR = 0x0200; class RsMsgItem: public RsItem { diff --git a/libretroshare/src/services/p3msgservice.cc b/libretroshare/src/services/p3msgservice.cc index 9347478ea..2b0cb109b 100644 --- a/libretroshare/src/services/p3msgservice.cc +++ b/libretroshare/src/services/p3msgservice.cc @@ -683,7 +683,7 @@ bool p3MsgService::removeMsgId(const std::string &mid) return changed; } -bool p3MsgService::markMsgIdRead(const std::string &mid, bool bUnreadByUser) +bool p3MsgService::markMsgIdRead(const std::string &mid, bool unreadByUser) { std::map::iterator mit; uint32_t msgId = atoi(mid.c_str()); @@ -703,7 +703,7 @@ bool p3MsgService::markMsgIdRead(const std::string &mid, bool bUnreadByUser) mi->msgFlags &= ~(RS_MSG_FLAGS_NEW); /* set state from user */ - if (bUnreadByUser) { + if (unreadByUser) { mi->msgFlags |= RS_MSG_FLAGS_UNREAD_BY_USER; } else { mi->msgFlags &= ~RS_MSG_FLAGS_UNREAD_BY_USER; @@ -1311,6 +1311,10 @@ void p3MsgService::initRsMI(RsMsgItem *msg, MessageInfo &mi) { mi.msgflags |= RS_MSG_FORWARDED; } + if (msg->msgFlags & RS_MSG_FLAGS_STAR) + { + mi.msgflags |= RS_MSG_STAR; + } mi.ts = msg->sendTime; mi.srcId = msg->PeerId(); @@ -1406,6 +1410,10 @@ void p3MsgService::initRsMIS(RsMsgItem *msg, MsgInfoSummary &mis) { mis.msgflags |= RS_MSG_FORWARDED; } + if (msg->msgFlags & RS_MSG_FLAGS_STAR) + { + mis.msgflags |= RS_MSG_STAR; + } mis.srcId = msg->PeerId(); { diff --git a/retroshare-gui/src/gui/MessagesDialog.cpp b/retroshare-gui/src/gui/MessagesDialog.cpp index c9724f1da..cf04edb52 100644 --- a/retroshare-gui/src/gui/MessagesDialog.cpp +++ b/retroshare-gui/src/gui/MessagesDialog.cpp @@ -53,20 +53,23 @@ /* Images for context menu icons */ #define IMAGE_MESSAGE ":/images/folder-draft.png" #define IMAGE_MESSAGEREPLY ":/images/mail_reply.png" -#define IMAGE_MESSAGEREPLYALL ":/images/mail_replyall.png" -#define IMAGE_MESSAGEFORWARD ":/images/mail_forward.png" -#define IMAGE_MESSAGEREMOVE ":/images/message-mail-imapdelete.png" -#define IMAGE_DOWNLOAD ":/images/start.png" -#define IMAGE_DOWNLOADALL ":/images/startall.png" +#define IMAGE_MESSAGEREPLYALL ":/images/mail_replyall.png" +#define IMAGE_MESSAGEFORWARD ":/images/mail_forward.png" +#define IMAGE_MESSAGEREMOVE ":/images/message-mail-imapdelete.png" +#define IMAGE_DOWNLOAD ":/images/start.png" +#define IMAGE_DOWNLOADALL ":/images/startall.png" +#define IMAGE_STAR_ON ":/images/star-on-16.png" +#define IMAGE_STAR_OFF ":/images/star-off-16.png" -#define COLUMN_COUNT 7 +#define COLUMN_COUNT 8 #define COLUMN_ATTACHEMENTS 0 #define COLUMN_SUBJECT 1 #define COLUMN_UNREAD 2 #define COLUMN_FROM 3 #define COLUMN_DATE 4 -#define COLUMN_CONTENT 5 -#define COLUMN_TAGS 6 +#define COLUMN_STAR 5 +#define COLUMN_CONTENT 6 +#define COLUMN_TAGS 7 #define COLUMN_DATA 0 // column for storing the userdata like msgid and srcid @@ -211,13 +214,15 @@ MessagesDialog::MessagesDialog(QWidget *parent) MessagesModel->setHeaderData(COLUMN_DATE, Qt::Horizontal, tr("Date")); MessagesModel->setHeaderData(COLUMN_TAGS, Qt::Horizontal, tr("Tags")); MessagesModel->setHeaderData(COLUMN_CONTENT, Qt::Horizontal, tr("Content")); - + MessagesModel->setHeaderData(COLUMN_STAR, Qt::Horizontal, QIcon(IMAGE_STAR_ON), Qt::DecorationRole); + MessagesModel->setHeaderData(COLUMN_ATTACHEMENTS, Qt::Horizontal, tr("Click to sort by attachments"), Qt::ToolTipRole); MessagesModel->setHeaderData(COLUMN_SUBJECT, Qt::Horizontal, tr("Click to sort by subject"), Qt::ToolTipRole); MessagesModel->setHeaderData(COLUMN_UNREAD, Qt::Horizontal, tr("Click to sort by read"), Qt::ToolTipRole); MessagesModel->setHeaderData(COLUMN_FROM, Qt::Horizontal, tr("Click to sort by from"), Qt::ToolTipRole); MessagesModel->setHeaderData(COLUMN_DATE, Qt::Horizontal, tr("Click to sort by date"), Qt::ToolTipRole); MessagesModel->setHeaderData(COLUMN_TAGS, Qt::Horizontal, tr("Click to sort by tags"), Qt::ToolTipRole); + MessagesModel->setHeaderData(COLUMN_STAR, Qt::Horizontal, tr("Click to sort by star"), Qt::ToolTipRole); proxyModel = new QSortFilterProxyModel(this); proxyModel->setDynamicSortFilter(true); @@ -229,6 +234,7 @@ MessagesDialog::MessagesDialog(QWidget *parent) RSItemDelegate *itemDelegate = new RSItemDelegate(this); itemDelegate->removeFocusRect(COLUMN_UNREAD); + itemDelegate->removeFocusRect(COLUMN_STAR); itemDelegate->setSpacing(QSize(0, 2)); ui.messagestreeView->setItemDelegate(itemDelegate); @@ -257,6 +263,10 @@ MessagesDialog::MessagesDialog(QWidget *parent) msgwheader->resizeSection (COLUMN_UNREAD, 16); msgwheader->resizeSection (COLUMN_FROM, 140); msgwheader->resizeSection (COLUMN_DATE, 140); + msgwheader->resizeSection (COLUMN_STAR, 16); + + msgwheader->setResizeMode (COLUMN_STAR, QHeaderView::Fixed); + msgwheader->resizeSection (COLUMN_STAR, 24); /* Set header resize modes and initial section sizes */ QHeaderView * msglheader = ui.msgList->header () ; @@ -307,6 +317,8 @@ MessagesDialog::MessagesDialog(QWidget *parent) msgwheader->setResizeMode (COLUMN_DATE, QHeaderView::Interactive); msgwheader->setResizeMode (COLUMN_UNREAD, QHeaderView::Fixed); msgwheader->resizeSection (COLUMN_UNREAD, 24); + msgwheader->resizeSection (COLUMN_STAR, 24); + msgwheader->setResizeMode (COLUMN_STAR, QHeaderView::Fixed); // fill folder list updateMessageSummaryList(); @@ -349,6 +361,8 @@ MessagesDialog::~MessagesDialog() void MessagesDialog::processSettings(bool bLoad) { + int messageTreeVersion = 1; // version number for the settings to solve problems when modifying the column count + m_bProcessSettings = true; QHeaderView *msgwheader = ui.messagestreeView->header () ; @@ -369,7 +383,9 @@ void MessagesDialog::processSettings(bool bLoad) ui.filterColumnComboBox->setCurrentIndex(nValue); // state of message tree - msgwheader->restoreState(Settings->value("MessageTree").toByteArray()); + if (Settings->value("MessageTreeVersion").toInt() == messageTreeVersion) { + msgwheader->restoreState(Settings->value("MessageTree").toByteArray()); + } // state of tag list bValue = Settings->value("tagList", true).toBool(); @@ -384,6 +400,7 @@ void MessagesDialog::processSettings(bool bLoad) // state of message tree Settings->setValue("MessageTree", msgwheader->saveState()); + Settings->setValue("MessageTreeVersion", messageTreeVersion); // state of tag list Settings->setValue("tagList", ui.Tags_Button->isChecked()); @@ -473,10 +490,11 @@ void MessagesDialog::fillTags() // MainPage::keyPressEvent(e) ; //} -int MessagesDialog::getSelectedMsgCount (QList *pRows, QList *pRowsRead, QList *pRowsUnread) +int MessagesDialog::getSelectedMsgCount (QList *pRows, QList *pRowsRead, QList *pRowsUnread, QList *pRowsStar) { if (pRowsRead) pRowsRead->clear(); if (pRowsUnread) pRowsUnread->clear(); + if (pRowsStar) pRowsStar->clear(); //To check if the selection has more than one row. QList selectedIndexList = ui.messagestreeView->selectionModel() -> selectedIndexes (); @@ -488,7 +506,7 @@ int MessagesDialog::getSelectedMsgCount (QList *pRows, QList *pRowsRea { rowList.append(row); - if (pRows || pRowsRead || pRowsUnread) { + if (pRows || pRowsRead || pRowsUnread || pRowsStar) { int mappedRow = proxyModel->mapToSource(*it).row(); if (pRows) pRows->append(mappedRow); @@ -498,6 +516,12 @@ int MessagesDialog::getSelectedMsgCount (QList *pRows, QList *pRowsRea } else { if (pRowsRead) pRowsRead->append(mappedRow); } + + if (pRowsStar) { + if (MessagesModel->item(mappedRow, COLUMN_DATA)->data(ROLE_MSGFLAGS).toInt() & RS_MSG_STAR) { + pRowsStar->append(mappedRow); + } + } } } } @@ -507,105 +531,87 @@ int MessagesDialog::getSelectedMsgCount (QList *pRows, QList *pRowsRea bool MessagesDialog::isMessageRead(int nRow) { - QStandardItem *item; - item = MessagesModel->item(nRow,COLUMN_DATA); + QStandardItem *item = MessagesModel->item(nRow,COLUMN_DATA); return !item->data(ROLE_UNREAD).toBool(); } +bool MessagesDialog::hasMessageStar(int nRow) +{ + QStandardItem *item = MessagesModel->item(nRow,COLUMN_DATA); + return item->data(ROLE_MSGFLAGS).toInt() & RS_MSG_STAR; +} + void MessagesDialog::messageslistWidgetCostumPopupMenu( QPoint point ) { QMenu contextMnu( this ); - /** Defines the actions for the context menu */ - - QAction *replytomsgAct = new QAction(QIcon(IMAGE_MESSAGEREPLY), tr( "Reply to Message" ), &contextMnu ); - connect( replytomsgAct , SIGNAL( triggered() ), this, SLOT( replytomessage() ) ); - contextMnu.addAction( replytomsgAct); - - QAction *replyallmsgAct = new QAction(QIcon(IMAGE_MESSAGEREPLYALL), tr( "Reply to All" ), &contextMnu ); - connect( replyallmsgAct , SIGNAL( triggered() ), this, SLOT( replyallmessage() ) ); - contextMnu.addAction( replyallmsgAct); - - QAction *forwardmsgAct = new QAction(QIcon(IMAGE_MESSAGEFORWARD), tr( "Forward Message" ), &contextMnu ); - connect( forwardmsgAct , SIGNAL( triggered() ), this, SLOT( forwardmessage() ) ); - contextMnu.addAction( forwardmsgAct); - QList RowsRead; QList RowsUnread; - int nCount = getSelectedMsgCount (NULL, &RowsRead, &RowsUnread); + QList RowsStar; + int nCount = getSelectedMsgCount (NULL, &RowsRead, &RowsUnread, &RowsStar); - QAction *editAct = new QAction(tr( "Edit..." ), &contextMnu ); - connect(editAct, SIGNAL(triggered()), this, SLOT(editmessage())); - contextMnu.addAction(editAct); + /** Defines the actions for the context menu */ - if (nCount == 1) { - editAct->setEnabled(true); - } else { - editAct->setDisabled(true); + QAction *action = contextMnu.addAction(QIcon(IMAGE_MESSAGEREPLY), tr("Reply to Message"), this, SLOT(replytomessage())); + if (nCount != 1) { + action->setDisabled(true); + } + action = contextMnu.addAction(QIcon(IMAGE_MESSAGEREPLYALL), tr("Reply to All"), this, SLOT(replyallmessage())); + if (nCount != 1) { + action->setDisabled(true); + } + action = contextMnu.addAction(QIcon(IMAGE_MESSAGEFORWARD), tr("Forward Message"), this, SLOT(forwardmessage())); + if (nCount != 1) { + action->setDisabled(true); + } + + action = contextMnu.addAction(tr("Edit..."), this, SLOT(editmessage())); + if (nCount != 1) { + action->setDisabled(true); } contextMnu.addSeparator(); - QAction *markAsRead = new QAction(QIcon(":/images/message-mail-read.png"), tr( "Mark as read" ), &contextMnu); - connect(markAsRead , SIGNAL(triggered()), this, SLOT(markAsRead())); - contextMnu.addAction(markAsRead); + action = contextMnu.addAction(QIcon(":/images/message-mail-read.png"), tr("Mark as read"), this, SLOT(markAsRead())); if (RowsUnread.size() == 0) { - markAsRead->setDisabled(true); + action->setDisabled(true); } - QAction *markAsUnread = new QAction(QIcon(":/images/message-mail.png"), tr( "Mark as unread" ), &contextMnu); - connect(markAsUnread , SIGNAL(triggered()), this, SLOT(markAsUnread())); - contextMnu.addAction(markAsUnread); + action = contextMnu.addAction(QIcon(":/images/message-mail.png"), tr("Mark as unread"), this, SLOT(markAsUnread())); if (RowsRead.size() == 0) { - markAsUnread->setDisabled(true); + action->setDisabled(true); } + action = contextMnu.addAction(tr("Add Star")); + action->setCheckable(true); + action->setChecked(RowsStar.size()); + connect(action, SIGNAL(triggered(bool)), this, SLOT(markWithStar(bool))); + contextMnu.addSeparator(); // add tags contextMnu.addMenu(ui.tagButton->menu()); contextMnu.addSeparator(); - QAction *removemsgAct; - if (nCount > 1) { - removemsgAct = new QAction(QIcon(IMAGE_MESSAGEREMOVE), tr( "Remove Messages" ), &contextMnu ); - } else { - removemsgAct = new QAction(QIcon(IMAGE_MESSAGEREMOVE), tr( "Remove Message" ), &contextMnu ); + action = contextMnu.addAction(QIcon(IMAGE_MESSAGEREMOVE), (nCount > 1) ? tr("Remove Messages") : tr("Remove Message"), this, SLOT(removemessage())); + if (nCount == 0) { + action->setDisabled(true); } - connect( removemsgAct , SIGNAL( triggered() ), this, SLOT( removemessage() ) ); - contextMnu.addAction( removemsgAct); - - int listrow = ui.listWidget -> currentRow(); + int listrow = ui.listWidget->currentRow(); if (listrow == ROW_TRASHBOX) { - QAction *undeleteAct = new QAction(tr( "Undelete" ), &contextMnu ); - connect(undeleteAct, SIGNAL(triggered()), this, SLOT(undeletemessage())); - contextMnu.addAction(undeleteAct); - - if (nCount) { - undeleteAct->setEnabled(true); - } else { - undeleteAct->setDisabled(true); + action = contextMnu.addAction(tr("Undelete"), this, SLOT(undeletemessage())); + if (nCount == 0) { + action->setDisabled(true); } } - contextMnu.addAction( ui.actionSave_as); - contextMnu.addAction( ui.actionPrintPreview); - contextMnu.addAction( ui.actionPrint); + contextMnu.addAction(ui.actionSave_as); + contextMnu.addAction(ui.actionPrintPreview); + contextMnu.addAction(ui.actionPrint); contextMnu.addSeparator(); - QAction *newmsgAct = new QAction(QIcon(IMAGE_MESSAGE), tr( "New Message" ), &contextMnu ); - connect( newmsgAct , SIGNAL( triggered() ), this, SLOT( newmessage() ) ); - contextMnu.addAction( newmsgAct); - - if (nCount != 1) { - replytomsgAct->setDisabled(true); - replyallmsgAct->setDisabled(true); - forwardmsgAct->setDisabled(true); - } - if (nCount == 0) { - removemsgAct->setDisabled(true); - } + contextMnu.addAction(QIcon(IMAGE_MESSAGE), tr("New Message"), this, SLOT(newmessage())); contextMnu.exec(QCursor::pos()); } @@ -892,56 +898,64 @@ void MessagesDialog::messagesTagsChanged() showTagLabels(); } -static void InitIconAndFont(QStandardItem *pItem [COLUMN_COUNT]) +static void InitIconAndFont(QStandardItem *item[COLUMN_COUNT]) { - QString sText = pItem [COLUMN_SUBJECT]->text(); - QString mid = pItem [COLUMN_DATA]->data(ROLE_MSGID).toString(); - int nFlag = pItem [COLUMN_DATA]->data(ROLE_MSGFLAGS).toInt(); + int msgFlags = item[COLUMN_DATA]->data(ROLE_MSGFLAGS).toInt(); // show the real "New" state - if (nFlag & RS_MSG_NEW) { - pItem[COLUMN_SUBJECT]->setIcon(QIcon(":/images/message-state-new.png")); + if (msgFlags & RS_MSG_NEW) { + item[COLUMN_SUBJECT]->setIcon(QIcon(":/images/message-state-new.png")); } else { - if (nFlag & RS_MSG_UNREAD_BY_USER) { - if ((nFlag & (RS_MSG_REPLIED | RS_MSG_FORWARDED)) == RS_MSG_REPLIED) { - pItem[COLUMN_SUBJECT]->setIcon(QIcon(":/images/message-mail-replied.png")); - } else if ((nFlag & (RS_MSG_REPLIED | RS_MSG_FORWARDED)) == RS_MSG_FORWARDED) { - pItem[COLUMN_SUBJECT]->setIcon(QIcon(":/images/message-mail-forwarded.png")); - } else if ((nFlag & (RS_MSG_REPLIED | RS_MSG_FORWARDED)) == (RS_MSG_REPLIED | RS_MSG_FORWARDED)) { - pItem[COLUMN_SUBJECT]->setIcon(QIcon(":/images/message-mail-replied-forw.png")); + if (msgFlags & RS_MSG_UNREAD_BY_USER) { + if ((msgFlags & (RS_MSG_REPLIED | RS_MSG_FORWARDED)) == RS_MSG_REPLIED) { + item[COLUMN_SUBJECT]->setIcon(QIcon(":/images/message-mail-replied.png")); + } else if ((msgFlags & (RS_MSG_REPLIED | RS_MSG_FORWARDED)) == RS_MSG_FORWARDED) { + item[COLUMN_SUBJECT]->setIcon(QIcon(":/images/message-mail-forwarded.png")); + } else if ((msgFlags & (RS_MSG_REPLIED | RS_MSG_FORWARDED)) == (RS_MSG_REPLIED | RS_MSG_FORWARDED)) { + item[COLUMN_SUBJECT]->setIcon(QIcon(":/images/message-mail-replied-forw.png")); } else { - pItem[COLUMN_SUBJECT]->setIcon(QIcon(":/images/message-mail.png")); + item[COLUMN_SUBJECT]->setIcon(QIcon(":/images/message-mail.png")); } } else { - if ((nFlag & (RS_MSG_REPLIED | RS_MSG_FORWARDED)) == RS_MSG_REPLIED) { - pItem[COLUMN_SUBJECT]->setIcon(QIcon(":/images/message-mail-replied-read.png")); - } else if ((nFlag & (RS_MSG_REPLIED | RS_MSG_FORWARDED)) == RS_MSG_FORWARDED) { - pItem[COLUMN_SUBJECT]->setIcon(QIcon(":/images/message-mail-forwarded-read.png")); - } else if ((nFlag & (RS_MSG_REPLIED | RS_MSG_FORWARDED)) == (RS_MSG_REPLIED | RS_MSG_FORWARDED)) { - pItem[COLUMN_SUBJECT]->setIcon(QIcon(":/images/message-mail-replied-forw-read.png")); + if ((msgFlags & (RS_MSG_REPLIED | RS_MSG_FORWARDED)) == RS_MSG_REPLIED) { + item[COLUMN_SUBJECT]->setIcon(QIcon(":/images/message-mail-replied-read.png")); + } else if ((msgFlags & (RS_MSG_REPLIED | RS_MSG_FORWARDED)) == RS_MSG_FORWARDED) { + item[COLUMN_SUBJECT]->setIcon(QIcon(":/images/message-mail-forwarded-read.png")); + } else if ((msgFlags & (RS_MSG_REPLIED | RS_MSG_FORWARDED)) == (RS_MSG_REPLIED | RS_MSG_FORWARDED)) { + item[COLUMN_SUBJECT]->setIcon(QIcon(":/images/message-mail-replied-forw-read.png")); } else { - pItem[COLUMN_SUBJECT]->setIcon(QIcon(":/images/message-mail-read.png")); + item[COLUMN_SUBJECT]->setIcon(QIcon(":/images/message-mail-read.png")); } } } - bool bNew = nFlag & (RS_MSG_NEW | RS_MSG_UNREAD_BY_USER); + if (msgFlags & RS_MSG_STAR) { + item[COLUMN_STAR]->setIcon(QIcon(IMAGE_STAR_ON)); + item[COLUMN_STAR]->setText("1"); + } else { + item[COLUMN_STAR]->setIcon(QIcon(IMAGE_STAR_OFF)); + item[COLUMN_STAR]->setText("0"); + } + + bool isNew = msgFlags & (RS_MSG_NEW | RS_MSG_UNREAD_BY_USER); // set icon - if (bNew) { - pItem[COLUMN_UNREAD]->setIcon(QIcon(":/images/message-state-unread.png")); + if (isNew) { + item[COLUMN_UNREAD]->setIcon(QIcon(":/images/message-state-unread.png")); + item[COLUMN_UNREAD]->setText("1"); } else { - pItem[COLUMN_UNREAD]->setIcon(QIcon(":/images/message-state-read.png")); + item[COLUMN_UNREAD]->setIcon(QIcon(":/images/message-state-read.png")); + item[COLUMN_UNREAD]->setText("0"); } // set font for (int i = 0; i < COLUMN_COUNT; i++) { - QFont qf = pItem[i]->font(); - qf.setBold(bNew); - pItem[i]->setFont(qf); + QFont qf = item[i]->font(); + qf.setBold(isNew); + item[i]->setFont(qf); } - pItem[COLUMN_DATA]->setData(bNew, ROLE_UNREAD); + item[COLUMN_DATA]->setData(isNew, ROLE_UNREAD); } void MessagesDialog::insertMessages() @@ -1321,15 +1335,27 @@ void MessagesDialog::clicked(const QModelIndex &index ) return; } - if (index.column() == COLUMN_UNREAD) { - int mappedRow = proxyModel->mapToSource(index).row(); + switch (index.column()) { + case COLUMN_UNREAD: + { + int mappedRow = proxyModel->mapToSource(index).row(); - QList Rows; - Rows.append(mappedRow); - setMsgAsReadUnread(Rows, !isMessageRead(mappedRow)); - insertMsgTxtAndFiles(index, false); - updateMessageSummaryList(); - return; + QList Rows; + Rows.append(mappedRow); + setMsgAsReadUnread(Rows, !isMessageRead(mappedRow)); + insertMsgTxtAndFiles(index, false); + updateMessageSummaryList(); + return; + } + case COLUMN_STAR: + { + int mappedRow = proxyModel->mapToSource(index).row(); + + QList Rows; + Rows.append(mappedRow); + setMsgStar(Rows, !hasMessageStar(mappedRow)); + return; + } } timer->stop(); @@ -1355,7 +1381,7 @@ void MessagesDialog::updateCurrentMessage() insertMsgTxtAndFiles(timerIndex); } -void MessagesDialog::setMsgAsReadUnread(const QList &Rows, bool bRead) +void MessagesDialog::setMsgAsReadUnread(const QList &Rows, bool read) { LockUpdate Lock (this, false); @@ -1368,17 +1394,17 @@ void MessagesDialog::setMsgAsReadUnread(const QList &Rows, bool bRead) std::string mid = item[COLUMN_DATA]->data(ROLE_MSGID).toString().toStdString(); - if (rsMsgs->MessageRead(mid, !bRead)) { - int nFlag = item[COLUMN_DATA]->data(ROLE_MSGFLAGS).toInt(); - nFlag &= ~RS_MSG_NEW; + if (rsMsgs->MessageRead(mid, !read)) { + int msgFlag = item[COLUMN_DATA]->data(ROLE_MSGFLAGS).toInt(); + msgFlag &= ~RS_MSG_NEW; - if (bRead) { - nFlag &= ~RS_MSG_UNREAD_BY_USER; + if (read) { + msgFlag &= ~RS_MSG_UNREAD_BY_USER; } else { - nFlag |= RS_MSG_UNREAD_BY_USER; + msgFlag |= RS_MSG_UNREAD_BY_USER; } - item[COLUMN_DATA]->setData(nFlag, ROLE_MSGFLAGS); + item[COLUMN_DATA]->setData(msgFlag, ROLE_MSGFLAGS); InitIconAndFont(item); } @@ -1390,7 +1416,7 @@ void MessagesDialog::setMsgAsReadUnread(const QList &Rows, bool bRead) void MessagesDialog::markAsRead() { QList RowsUnread; - getSelectedMsgCount (NULL, NULL, &RowsUnread); + getSelectedMsgCount (NULL, NULL, &RowsUnread, NULL); setMsgAsReadUnread (RowsUnread, true); updateMessageSummaryList(); @@ -1399,12 +1425,52 @@ void MessagesDialog::markAsRead() void MessagesDialog::markAsUnread() { QList RowsRead; - getSelectedMsgCount (NULL, &RowsRead, NULL); + getSelectedMsgCount (NULL, &RowsRead, NULL, NULL); setMsgAsReadUnread (RowsRead, false); updateMessageSummaryList(); } +void MessagesDialog::markWithStar(bool checked) +{ + QList Rows; + getSelectedMsgCount (&Rows, NULL, NULL, NULL); + + setMsgStar(Rows, checked); + } + +void MessagesDialog::setMsgStar(const QList &Rows, bool star) +{ + LockUpdate Lock (this, false); + + for (int nRow = 0; nRow < Rows.size(); nRow++) { + QStandardItem* item[COLUMN_COUNT]; + for(int nCol = 0; nCol < COLUMN_COUNT; nCol++) + { + item[nCol] = MessagesModel->item(Rows [nRow], nCol); + } + + std::string mid = item[COLUMN_DATA]->data(ROLE_MSGID).toString().toStdString(); + + if (rsMsgs->MessageStar(mid, star)) { + int msgFlag = item[COLUMN_DATA]->data(ROLE_MSGFLAGS).toInt(); + msgFlag &= ~RS_MSG_STAR; + + if (star) { + msgFlag |= RS_MSG_STAR; + } else { + msgFlag &= ~RS_MSG_STAR; + } + + item[COLUMN_DATA]->setData(msgFlag, ROLE_MSGFLAGS); + + InitIconAndFont(item); + } + } + + // LockUpdate +} + void MessagesDialog::clearTagLabels() { /* clear all tags */ @@ -1502,7 +1568,7 @@ void MessagesDialog::insertMsgTxtAndFiles(QModelIndex Index, bool bSetToRead) cid = item->data(ROLE_SRCID).toString().toStdString(); mid = item->data(ROLE_MSGID).toString().toStdString(); - int nCount = getSelectedMsgCount (NULL, NULL, NULL); + int nCount = getSelectedMsgCount (NULL, NULL, NULL, NULL); if (nCount == 1) { ui.actionSave_as->setEnabled(true); ui.actionPrintPreview->setEnabled(true); @@ -1744,7 +1810,7 @@ void MessagesDialog::undeletemessage() LockUpdate Lock (this, true); QList Rows; - getSelectedMsgCount (&Rows, NULL, NULL); + getSelectedMsgCount (&Rows, NULL, NULL, NULL); for (int nRow = 0; nRow < Rows.size(); nRow++) { QString mid = MessagesModel->item (Rows [nRow], COLUMN_DATA)->data(ROLE_MSGID).toString(); rsMsgs->MessageToTrash(mid.toStdString(), false); @@ -2079,7 +2145,7 @@ void MessagesDialog::tagAboutToShow() MsgTagInfo tagInfo; QList rows; - getSelectedMsgCount (&rows, NULL, NULL); + getSelectedMsgCount (&rows, NULL, NULL, NULL); if (rows.size()) { QStandardItem* item = MessagesModel->item(rows [0], COLUMN_DATA); @@ -2096,7 +2162,7 @@ void MessagesDialog::tagRemoveAll() LockUpdate Lock (this, false); QList rows; - getSelectedMsgCount (&rows, NULL, NULL); + getSelectedMsgCount (&rows, NULL, NULL, NULL); for (int row = 0; row < rows.size(); row++) { QStandardItem* item = MessagesModel->item(rows [row], COLUMN_DATA); std::string msgId = item->data(ROLE_MSGID).toString().toStdString(); @@ -2119,7 +2185,7 @@ void MessagesDialog::tagSet(int tagId, bool set) LockUpdate Lock (this, false); QList rows; - getSelectedMsgCount (&rows, NULL, NULL); + getSelectedMsgCount (&rows, NULL, NULL, NULL); for (int row = 0; row < rows.size(); row++) { QStandardItem* item = MessagesModel->item(rows [row], COLUMN_DATA); std::string msgId = item->data(ROLE_MSGID).toString().toStdString(); diff --git a/retroshare-gui/src/gui/MessagesDialog.h b/retroshare-gui/src/gui/MessagesDialog.h index bca95de49..2ed6476a3 100644 --- a/retroshare-gui/src/gui/MessagesDialog.h +++ b/retroshare-gui/src/gui/MessagesDialog.h @@ -78,6 +78,7 @@ private slots: void markAsRead(); void markAsUnread(); + void markWithStar(bool checked); void emptyTrash(); @@ -122,12 +123,14 @@ private: void insertMsgTxtAndFiles(QModelIndex index = QModelIndex(), bool bSetToRead = true); bool getCurrentMsg(std::string &cid, std::string &mid); - void setMsgAsReadUnread(const QList &Rows, bool bRead); + void setMsgAsReadUnread(const QList &Rows, bool read); + void setMsgStar(const QList &Rows, bool mark); void setCurrentFileName(const QString &fileName); - int getSelectedMsgCount (QList *pRows, QList *pRowsRead, QList *pRowsUnread); + int getSelectedMsgCount (QList *pRows, QList *pRowsRead, QList *pRowsUnread, QList *pRowsStar); bool isMessageRead(int nRow); + bool hasMessageStar(int nRow); /* internal handle splitter */ void togglefileview_internal(); diff --git a/retroshare-gui/src/gui/images.qrc b/retroshare-gui/src/gui/images.qrc index c9c2489f5..bfed4a542 100644 --- a/retroshare-gui/src/gui/images.qrc +++ b/retroshare-gui/src/gui/images.qrc @@ -370,6 +370,8 @@ images/show_toolbox_frame.png images/start.png images/stop.png + images/star-on-16.png + images/star-off-16.png images/StatsCumulative.png images/StatisticsDetail.png images/status_unknown.png diff --git a/retroshare-gui/src/gui/images/star-off-16.png b/retroshare-gui/src/gui/images/star-off-16.png new file mode 100644 index 000000000..4c9da18ec Binary files /dev/null and b/retroshare-gui/src/gui/images/star-off-16.png differ diff --git a/retroshare-gui/src/gui/images/star-on-16.png b/retroshare-gui/src/gui/images/star-on-16.png new file mode 100644 index 000000000..d53827817 Binary files /dev/null and b/retroshare-gui/src/gui/images/star-on-16.png differ diff --git a/retroshare-gui/src/lang/retroshare_de.qm b/retroshare-gui/src/lang/retroshare_de.qm index 0a472b90d..3bb29e5c2 100644 Binary files a/retroshare-gui/src/lang/retroshare_de.qm and b/retroshare-gui/src/lang/retroshare_de.qm differ diff --git a/retroshare-gui/src/lang/retroshare_de.ts b/retroshare-gui/src/lang/retroshare_de.ts index 0b2ba0727..25379e033 100644 --- a/retroshare-gui/src/lang/retroshare_de.ts +++ b/retroshare-gui/src/lang/retroshare_de.ts @@ -3395,7 +3395,7 @@ p, li { white-space: pre-wrap; } FlatStyle_RDM - + Friends Directories Dateien von Freunden @@ -3994,6 +3994,439 @@ p, li { white-space: pre-wrap; } mit Kindern + + FriendsDialog + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friends</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Freunde</span></p></body></html> + + + + Add + Hinzufügen + + + + Display + Anzeige + + + + Friends + Freunde + + + + Status + Status + + + + Add or Change your Avatar + Wähle oder ändere dein Avatar Bild + + + + Edit Personal message + Statusnachricht ändern + + + + Group Chat + Gruppenchat + + + + Messages entered here are sent to all collected friends + Nachrichten, die Du hier eingibst, werden an alle verbundenen Freunde versendet + + + + Bold + Fett + + + + Underline + Unterstrichen + + + + Italic + Kursiv + + + + Font + Schriftart + + + + Text Color + Textfarbe + + + + Attach File + Datei anhängen + + + + Send + Senden + + + + Clear Chat History + Nachrichtenverlauf leeren + + + + + Add Friend + Freund hinzufügen + + + + Create new Profile + Erstelle neues Profil + + + + + Create new Forum + Erstelle neues Forum + + + + F + + + + + + Create new Channel + Erstelle neuen Kanal + + + + C + + + + + Add your Avatar Picture + Wähle dein Avatar Bild + + + + A + + + + + Set your Personal Message + Statusnachricht ändern + + + + Edit your status Message + Statusnachricht ändern + + + + Browse Message History + Nachrichtenverlauf anzeigen + + + + Browse History + Nachrichtenverlauf + + + + + Save Chat History + Nachrichtenverlauf speichern + + + + Hide Offline Friends + Verstecke offline Freunde + + + + Hide Status Column + Status Spalte ausblenden + + + + + Sort by State + Sortiere nach Status + + + + Hide State + Status ausblenden + + + + + Add a new Group + Neue Gruppe hinzufügen + + + + + Sort Descending Order + Absteigend sortieren + + + + + Sort Ascending Order + Aufsteigend sortieren + + + + Delete Chat History + Nachrichtenverlauf löschen + + + + Deletes all stored and displayed chat history + Löscht den gespeicherten und angezeigten Chat Verlauf + + + + Profile + Profil + + + + News Feed + + + + + Welcome to RetroShare's group chat. + Willkommen bei RetroShare's Gruppenchat. + + + + me + ich + + + + Paste RetroShare Link + RetroShare Link einfügen + + + + Group + Gruppe + + + + Friend + Freund + + + + Location + + + + + Message Group + Gruppe anschreiben + + + + Edit Group + Gruppe ändern + + + + Remove Group + Gruppe entfernen + + + + Chat + + + + + Message Friend + Freund anschreiben + + + + Friend Details + Freund-Details + + + + Recommend this Friend to... + Freund weiterempfehlen... + + + + Connect To Friend + + + + + Copy RetroShare Link + Kopiere RetroShare Link + + + + + Paste Friend Link + RetroShare Link einfügen + + + + Deny Friend + Blockiere Freund + + + + Remove Friend Location + Freund entfernen + + + + Add to group + Hinzufügen zur Gruppe + + + + Move to group + Verschiebe in Gruppe + + + + Groups + Gruppen + + + + Remove from group + Aus Gruppe entfernen + + + + Remove from all groups + Aus allen Gruppen entfernen + + + + Expand all + Alle erweitern + + + + Collapse all + Alle reduzieren + + + + location + Standort + + + + + Available + Verfügbar + + + + Save Certificate + Zertifikat speichern + + + + Certificates (*.pqi) + Zertifikate (*.pqi) + + + + Do you want to remove this Friend? + Willst du diesen Freund entfernen? + + + + is typing... + tippt... + + + + + New group chat + Neuer Gruppenchat + + + + Do you really want to physically delete the history? + Willst Du wirklich den Nachrichtenverlauf physisch löschen? + + + + Load File + Lade Datei + + + + Pictures (*.png *.xpm *.jpg *.tiff *.gif) + Bilder (*.png *.xpm *.jpg *.tiff *.gif) + + + + Add Extra File + + + + + + Drop file error. + Dateifehler bei Drag'n'Drop. + + + + Directory can't be dropped, only files are accepted. + Ordner können nicht für Drag'n'Drop genutzt werden. Nur Dateien werden akzeptiert. + + + + File not found or file name not accepted. + Datei nicht gefunden oder Dateiname nicht akzeptiert. + + + + Save as... + Speichern unter... + + + + Text File (*.txt );;All Files (*) + Text Datei (*.txt );;Alle Dateien (*) + + GamesDialog @@ -6243,30 +6676,30 @@ Willst Du die Nachricht speichern ? MessagesDialog - + New Message Neue Nachricht - + Reply to Message Antworten nur an Absender - + Remove Message Nachricht entfernen - + Date Datum - + From Von @@ -6351,15 +6784,15 @@ p, li { white-space: pre-wrap; } - + Inbox Posteingang - - + + Outbox Postausgang @@ -6371,7 +6804,7 @@ p, li { white-space: pre-wrap; } - + Sent Gesendet @@ -6438,13 +6871,13 @@ p, li { white-space: pre-wrap; } Speichern unter... - + Print Document Dokument drucken - + Subject Betreff @@ -6479,53 +6912,57 @@ p, li { white-space: pre-wrap; } Drucken - + Forward selected Message Gewählte Nachricht weiterleiten - + Remove Messages - Löschen + Nachrichten entfernen - + Forward Message Weiterleiten - + Click to sort by attachments - Klicken, um nach Anhang zu sortieren + Klicken, um nach Anhang zu sortieren Click to sort by subject - Klicken, um nach Betreff zu sortieren + Klicken, um nach Betreff zu sortieren Click to sort by read - Klicken, um nach Gelesen / Ungelesen zu sortieren + Klicken, um nach Gelesen / Ungelesen zu sortieren - + Click to sort by from - Klicken, um nach Von zu sortieren + Klicken, um nach Von zu sortieren - + Click to sort by date - Klicken, um nach Datum zu sortieren + Klicken, um nach Datum zu sortieren Click to sort by tags - Klicken, um nach Schlagwörter zu sortieren + Klicken, um nach Schlagwörter zu sortieren - + Click to sort by mark + Klicken, um nach Kennzeichnung zu sortieren + + + Download Herunterladen @@ -6540,12 +6977,12 @@ p, li { white-space: pre-wrap; } Empfohlene Dateien einblenden - + Click to sort by to - Klicken, um nach Empfänger zu sortieren + Klicken, um nach Empfänger zu sortieren - + File Datei @@ -6565,8 +7002,8 @@ p, li { white-space: pre-wrap; } HTML-Dateien (*.htm *.html);;Alle Dateien (*) - - + + Reply to All Allen antworten @@ -6584,7 +7021,7 @@ p, li { white-space: pre-wrap; } - + Content Inhalt @@ -6592,7 +7029,7 @@ p, li { white-space: pre-wrap; } - + Tags Schlagwörter @@ -6604,7 +7041,7 @@ p, li { white-space: pre-wrap; } - + Trash Papierkorb @@ -6628,44 +7065,54 @@ p, li { white-space: pre-wrap; } Neues Schlagwort... - + Mark as read Als gelesen markieren - + Mark as unread Als ungelesen markieren - + + Add Star + Kennzeichnung + + + Undelete Wiederherstellen - + Empty trash Papierkorb leeren - - + + Drafts Entwürfe - + To An - + Edit... Editieren... - + + Click to sort by star + Klicken, um nach Kennzeichnung zu sortieren + + + @@ -7594,434 +8041,328 @@ p, li { white-space: pre-wrap; } PeersDialog - Chat - Chat + Chat - Save Certificate - Zertifikat speichern + Zertifikat speichern - Certificates (*.pqi) - Zertifikate (*.pqi) + Zertifikate (*.pqi) - Status - Status + Status - Connect To Friend - Verbinde zum Freund + Verbinde zum Freund - Profile - Profil + Profil - Welcome to RetroShare's group chat. - Willkommen bei RetroShare's Gruppenchat. + Willkommen bei RetroShare's Gruppenchat. - me - ich + ich - Group - Gruppe + Gruppe - Friend - Freund + Freund - Location - Standort + Standort - Friend Details - Freund-Details + Freund-Details - Expand all - Alle erweitern + Alle erweitern - Collapse all - Alle reduzieren + Alle reduzieren - Message Friend - Freund anschreiben + Freund anschreiben - News Feed - Neuigkeiten + Neuigkeiten - Paste RetroShare Link - RetroShare Link einfügen + RetroShare Link einfügen - Recommend this Friend to... - Freund weiterempfehlen... + Freund weiterempfehlen... - Copy RetroShare Link - Kopiere RetroShare Link + Kopiere RetroShare Link - Deny Friend - Blockiere Freund + Blockiere Freund - Remove Friend Location - Freund entfernen + Freund entfernen - Add to group - Hinzufügen zur Gruppe + Hinzufügen zur Gruppe - Move to group - Verschiebe in Gruppe + Verschiebe in Gruppe - Groups - Gruppen + Gruppen - Remove from group - Aus Gruppe entfernen + Aus Gruppe entfernen - Remove from all groups - Aus allen Gruppen entfernen + Aus allen Gruppen entfernen - - Available - Verfügbar + Verfügbar - - New group chat - Neuer Gruppenchat + Neuer Gruppenchat - Do you really want to physically delete the history? - Willst Du wirklich den Nachrichtenverlauf physisch löschen? + Willst Du wirklich den Nachrichtenverlauf physisch löschen? - Load File - Lade Datei + Lade Datei - Pictures (*.png *.xpm *.jpg *.tiff *.gif) - Bilder (*.png *.xpm *.jpg *.tiff *.gif) + Bilder (*.png *.xpm *.jpg *.tiff *.gif) - Add Extra File - Zusätzliche Datei hinzufügen + Zusätzliche Datei hinzufügen - - Drop file error. - Dateifehler bei Drag'n'Drop. + Dateifehler bei Drag'n'Drop. - File not found or file name not accepted. - Datei nicht gefunden oder Dateiname nicht akzeptiert. + Datei nicht gefunden oder Dateiname nicht akzeptiert. - Directory can't be dropped, only files are accepted. - Ordner können nicht für Drag'n'Drop genutzt werden. Nur Dateien werden akzeptiert. + Ordner können nicht für Drag'n'Drop genutzt werden. Nur Dateien werden akzeptiert. - Italic - Kursiv + Kursiv - Underline - Unterstrichen + Unterstrichen - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Friends</span></p></body></html> - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Arial'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Freunde</span></p></body></html> - Add - Hinzufügen + Hinzufügen - Display - Anzeige + Anzeige - Add or Change your Avatar - Wähle oder ändere dein Avatar Bild + Wähle oder ändere dein Avatar Bild - Edit Personal message - Statusnachricht ändern + Statusnachricht ändern - Messages entered here are sent to all collected friends - Nachrichten, die Du hier eingibst, werden an alle verbundenen Freunde versendet + Nachrichten, die Du hier eingibst, werden an alle verbundenen Freunde versendet - Bold - Fett + Fett - Text Color - Textfarbe + Textfarbe - - Create new Forum - Erstelle neues Forum + Erstelle neues Forum - - F - - - - - Create new Channel - Erstelle neuen Kanal + Erstelle neuen Kanal - - C - - - - Add your Avatar Picture - Wähle dein Avatar Bild + Wähle dein Avatar Bild - - A - - - - Set your Personal Message - Statusnachricht ändern + Statusnachricht ändern - Edit your status Message - Statusnachricht ändern + Statusnachricht ändern - - Sort by State - Sortiere nach Status + Sortiere nach Status - Hide State - Status ausblenden + Status ausblenden - - Add a new Group - Neue Gruppe hinzufügen + Neue Gruppe hinzufügen - - Sort Descending Order - Absteigend sortieren + Absteigend sortieren - - Sort Ascending Order - Aufsteigend sortieren + Aufsteigend sortieren - Delete Chat History - Nachrichtenverlauf löschen + Nachrichtenverlauf löschen - Deletes all stored and displayed chat history - Löscht den gespeicherten und angezeigten Chat Verlauf + Löscht den gespeicherten und angezeigten Chat Verlauf - - Add Friend - Freund hinzufügen + Freund hinzufügen - Create new Profile - Erstelle neues Profil + Erstelle neues Profil - Font - Schriftart + Schriftart - Group Chat - Gruppenchat + Gruppenchat - Attach File - Datei anhängen + Datei anhängen - Send - Senden + Senden - Clear Chat History - Nachrichtenverlauf leeren + Nachrichtenverlauf leeren - - Save Chat History - Nachrichtenverlauf speichern + Nachrichtenverlauf speichern - Message Group - Gruppe anschreiben + Gruppe anschreiben - Edit Group - Gruppe ändern + Gruppe ändern - Remove Group - Gruppe entfernen + Gruppe entfernen - Do you want to remove this Friend? - Willst du diesen Freund entfernen? + Willst du diesen Freund entfernen? - Save as... - Speichern unter... + Speichern unter... - Text File (*.txt );;All Files (*) - Text Datei (*.txt );;Alle Dateien (*) + Text Datei (*.txt );;Alle Dateien (*) - Hide Offline Friends - Verstecke offline Freunde + Verstecke offline Freunde - Hide Status Column - Status Spalte ausblenden + Status Spalte ausblenden - is typing... - tippt... + tippt... - Browse Message History - Nachrichtenverlauf anzeigen + Nachrichtenverlauf anzeigen - Browse History - Nachrichtenverlauf + Nachrichtenverlauf - Friends - Freunde + Freunde - - Paste Friend Link - RetroShare Link einfügen + RetroShare Link einfügen - location - Standort + Standort @@ -9070,7 +9411,7 @@ Lockdatei: Die Datei wurde zur Downloadliste hinzugefügt. - + File Request canceled Dateianforderung abgebrochen @@ -9654,7 +9995,7 @@ p, li { white-space: pre-wrap; } RetroshareDirModel - + Anonymous Anonym @@ -12051,13 +12392,13 @@ p, li { white-space: pre-wrap; } TreeStyle_RDM - - + + FILE DATEI - + Files Dateien @@ -12068,7 +12409,7 @@ p, li { white-space: pre-wrap; } - + DIR ORDNER