diff --git a/retroshare-gui/src/RetroShare.pro b/retroshare-gui/src/RetroShare.pro index bb1b4970d..0dd1cfd70 100644 --- a/retroshare-gui/src/RetroShare.pro +++ b/retroshare-gui/src/RetroShare.pro @@ -60,6 +60,7 @@ HEADERS += rshare.h \ gui/ExampleDialog.h \ gui/GamesDialog.h \ gui/PhotoDialog.h \ + gui/LinksDialog.h \ gui/MessengerWindow.h \ gui/PeersDialog.h \ gui/SearchDialog.h \ @@ -146,6 +147,7 @@ FORMS += gui/ChatDialog.ui \ gui/ExampleDialog.ui \ gui/GamesDialog.ui \ gui/PhotoDialog.ui \ + gui/LinksDialog.ui \ gui/MessengerWindow.ui \ gui/PeersDialog.ui \ gui/SearchDialog.ui \ @@ -207,6 +209,7 @@ SOURCES += main.cpp \ gui/ExampleDialog.cpp \ gui/GamesDialog.cpp \ gui/PhotoDialog.cpp \ + gui/LinksDialog.cpp \ gui/MessengerWindow.cpp \ gui/PeersDialog.cpp \ gui/SearchDialog.cpp \ diff --git a/retroshare-gui/src/gui/ApplicationWindow.cpp b/retroshare-gui/src/gui/ApplicationWindow.cpp index c3a1da63d..8d473756d 100644 --- a/retroshare-gui/src/gui/ApplicationWindow.cpp +++ b/retroshare-gui/src/gui/ApplicationWindow.cpp @@ -40,6 +40,7 @@ #include "gui/connect/InviteDialog.h" #include "gui/connect/AddFriendDialog.h" +#include "LinksDialog.h" #include "GamesDialog.h" #include "PhotoDialog.h" @@ -85,17 +86,20 @@ ApplicationWindow::ApplicationWindow(QWidget* parent, Qt::WFlags flags) /* Create the config pages and actions */ QActionGroup *grp = new QActionGroup(this); + LinksDialog *linksDialog = NULL; + ui.stackPages->add(linksDialog = new LinksDialog(ui.stackPages), + createPageAction(QIcon(IMAGE_TRANSFERS), tr("Links Cloud"), grp)); - ui.stackPages->add(exampleDialog = new ExampleDialog(ui.stackPages), - createPageAction(QIcon(IMAGE_MESSAGES), tr("Example Application"), grp)); +// ui.stackPages->add(exampleDialog = new ExampleDialog(ui.stackPages), +// createPageAction(QIcon(IMAGE_MESSAGES), tr("Example Application"), grp)); GamesDialog *gamesDialog = NULL; ui.stackPages->add(gamesDialog = new GamesDialog(ui.stackPages), createPageAction(QIcon(IMAGE_MESSAGES), tr("Games Launcher"), grp)); - PhotoDialog *photoDialog = NULL; - ui.stackPages->add(photoDialog = new PhotoDialog(ui.stackPages), - createPageAction(QIcon(IMAGE_MESSAGES), tr("Photo View"), grp)); +// PhotoDialog *photoDialog = NULL; +// ui.stackPages->add(photoDialog = new PhotoDialog(ui.stackPages), +// createPageAction(QIcon(IMAGE_MESSAGES), tr("Photo View"), grp)); //ui.stackPages->add(groupsDialog = new GroupsDialog(ui.stackPages), @@ -104,9 +108,9 @@ ApplicationWindow::ApplicationWindow(QWidget* parent, Qt::WFlags flags) //ui.stackPages->add(new StatisticDialog(ui.stackPages), // createPageAction(QIcon(IMAGE_STATISTIC), tr("Statistics"), grp)); - statusBar()->addWidget(new QLabel(tr("Application Users: 0 Files: 0 "))); - statusBar()->addPermanentWidget(new QLabel(tr("Down: 0.0 Up: 0.0 "))); - statusBar()->addPermanentWidget(new QLabel(tr("Connections: 0/45 "))); + // statusBar()->addWidget(new QLabel(tr("Application Users: 0 Files: 0 "))); + // statusBar()->addPermanentWidget(new QLabel(tr("Down: 0.0 Up: 0.0 "))); + // statusBar()->addPermanentWidget(new QLabel(tr("Connections: 0/45 "))); /* Create the toolbar */ ui.toolBar->addActions(grp->actions()); diff --git a/retroshare-gui/src/gui/ApplicationWindow.ui b/retroshare-gui/src/gui/ApplicationWindow.ui index f229e7bcc..1cab8dc9f 100644 --- a/retroshare-gui/src/gui/ApplicationWindow.ui +++ b/retroshare-gui/src/gui/ApplicationWindow.ui @@ -5,8 +5,8 @@ 0 0 - 724 - 613 + 679 + 542 @@ -506,1052 +506,500 @@ - - 1 - - - 1 - - - - Qt::Vertical + + + + 120 + 0 + + + + + 120 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 120 + 120 + 120 + + + + + + + 160 + 160 + 160 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 10 + 36 + 106 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + 0 + 0 + 0 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 120 + 120 + 120 + + + + + + + 160 + 160 + 160 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 212 + 208 + 200 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + 120 + 120 + 120 + + + + + + + 208 + 208 + 208 + + + + + + + 255 + 255 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + 120 + 120 + 120 + + + + + + + 160 + 160 + 160 + + + + + + + 120 + 120 + 120 + + + + + + + 255 + 255 + 255 + + + + + + + 120 + 120 + 120 + + + + + + + 240 + 240 + 240 + + + + + + + 240 + 240 + 240 + + + + + + + 0 + 0 + 0 + + + + + + + 10 + 36 + 106 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + 247 + 247 + 247 + + + + + + + + + 50 + false + + + + Qt::NoContextMenu - - - true - - - 0 - - - - Home - - - - 0 - - - 0 - - - - - - 70 - 16777215 - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - 0 - - - - - - 4 - 5 - 0 - 0 - - - - - 64 - 0 - - - - - 70 - 16777215 - - - - 1 - - - 0 - - - - - 0 - 0 - 68 - 255 - - - - General - - - - 9 - - - 6 - - - - - Qt::NonModal - - - - 0 - 0 - 0 - 0 - - - - - 48 - 32 - - - - - 32 - 32 - - - - - - - :/images/exit_24x24.png - - - - 24 - 24 - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - 0 - - - 7 - - - - - - 0 - 0 - 0 - 0 - - - - - 48 - 32 - - - - - 32 - 32 - - - - - - - :/images/invite-friend24.png - - - - 24 - 24 - - - - - - - - - 0 - 0 - 0 - 0 - - - - - 48 - 32 - - - - - 32 - 32 - - - - - - - :/images/add-friend24.png - - - - 24 - 24 - - - - - - - - - 0 - 0 - 0 - 0 - - - - - 48 - 32 - - - - - 32 - 32 - - - - - - - :/images/settings.png - - - - 24 - 24 - - - - - - - - - 0 - 0 - 0 - 0 - - - - - 48 - 32 - - - - - 32 - 32 - - - - - - - :/images/add-share24.png - - - - 24 - 24 - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - 0 - 0 - 96 - 26 - - - - Advanced - - - - - - - - - - - 0 - - - 0 - - - - - - 14 - 31 - - - - - 14 - 32 - - - - - - - :/images/hide_toolbox_frame.png - - - - 16 - 31 - - - - true - - - - - - - Qt::Vertical - - - - 14 - 191 - - - - - - - - - - - 120 - 0 - - - - - 120 - 0 - - - - - - - - - 0 - 0 - 0 - - - - - - - 208 - 208 - 208 - - - - - - - 255 - 255 - 255 - - - - - - - 247 - 247 - 247 - - - - - - - 120 - 120 - 120 - - - - - - - 160 - 160 - 160 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 240 - 240 - 240 - - - - - - - 0 - 0 - 0 - - - - - - - 10 - 36 - 106 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 255 - - - - - - - 255 - 0 - 255 - - - - - - - 247 - 247 - 247 - - - - - - - - - 0 - 0 - 0 - - - - - - - 208 - 208 - 208 - - - - - - - 255 - 255 - 255 - - - - - - - 247 - 247 - 247 - - - - - - - 120 - 120 - 120 - - - - - - - 160 - 160 - 160 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 240 - 240 - 240 - - - - - - - 0 - 0 - 0 - - - - - - - 212 - 208 - 200 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 255 - - - - - - - 255 - 0 - 255 - - - - - - - 247 - 247 - 247 - - - - - - - - - 120 - 120 - 120 - - - - - - - 208 - 208 - 208 - - - - - - - 255 - 255 - 255 - - - - - - - 247 - 247 - 247 - - - - - - - 120 - 120 - 120 - - - - - - - 160 - 160 - 160 - - - - - - - 120 - 120 - 120 - - - - - - - 255 - 255 - 255 - - - - - - - 120 - 120 - 120 - - - - - - - 240 - 240 - 240 - - - - - - - 240 - 240 - 240 - - - - - - - 0 - 0 - 0 - - - - - - - 10 - 36 - 106 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 255 - - - - - - - 255 - 0 - 255 - - - - - - - 247 - 247 - 247 - - - - - - - - - 50 - false - - - - Qt::NoContextMenu - - - - - - - - - - 7 - 7 - 0 - 0 - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - Qt::NoContextMenu - - - QFrame::StyledPanel - - - QFrame::Raised - - - - 0 - - - 0 - - - - - true - - - true - - - QTextBrowser { - background-color: rgb(192,192,192); - - } - - - - - - - - - 0 - - - 6 - - - - - - 18 - 18 - - - - - 18 - 18 - - - - true - - - QPushButton - { - border-image: url(:/images/console-small-up.png) - } - - QPushButton:hover { - border-image: url(:/images/console-small-hover.png) - - } - - QPushButton:pressed { - border-image: url(:/images/console-small-down.png) - } - - - - - - - true - - - false - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 10 - 20 - - - - - - - - - 0 - 18 - - - - - 16777215 - 18 - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 4 - 20 - - - - - - @@ -1563,7 +1011,7 @@ true - Qt::TopToolBarArea + Qt::TopToolBarArea Qt::Horizontal @@ -1578,29 +1026,20 @@ Qt::ToolButtonTextUnderIcon - 4 + TopToolBarArea + + + false MainPageStack - QStackedPageWidget + QWidget
gui/mainpagestack.h
- - tabWidget - addfriendButton - invitefriendButton - addshareButton - optionsButton - quitButton - textBrowser - lineEdit - btnToggleConsole - btntoggletoolbox - diff --git a/retroshare-gui/src/gui/LinksDialog.cpp b/retroshare-gui/src/gui/LinksDialog.cpp new file mode 100644 index 000000000..c6e15731f --- /dev/null +++ b/retroshare-gui/src/gui/LinksDialog.cpp @@ -0,0 +1,745 @@ +/**************************************************************** + * RetroShare is distributed under the following license: + * + * Copyright (C) 2008 Robert Fernie + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + ****************************************************************/ + +#include +#include +#include + +#include +#include + +#include "common/vmessagebox.h" + +//#include "rshare.h" +#include "LinksDialog.h" +#include "rsiface/rspeers.h" +#include "rsiface/rsrank.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + + +/* Images for context menu icons */ +#define IMAGE_REMOVEFRIEND ":/images/removefriend16.png" +#define IMAGE_EXPIORTFRIEND ":/images/exportpeers_16x16.png" +#define IMAGE_CHAT ":/images/chat.png" +/* Images for Status icons */ +#define IMAGE_ONLINE ":/images/donline.png" +#define IMAGE_OFFLINE ":/images/dhidden.png" + +/** Constructor */ +LinksDialog::LinksDialog(QWidget *parent) +: MainPage(parent) +{ + /* Invoke the Qt Designer generated object setup routine */ + ui.setupUi(this); + + connect( ui.linkTreeWidget, SIGNAL( customContextMenuRequested( QPoint ) ), this, SLOT( linkTreeWidgetCostumPopupMenu( QPoint ) ) ); + + + /* link combos */ + connect( ui.rankComboBox, SIGNAL( currentIndexChanged( int ) ), this, SLOT( changedSortRank( int ) ) ); + connect( ui.periodComboBox, SIGNAL( currentIndexChanged( int ) ), this, SLOT( changedSortPeriod( int ) ) ); + connect( ui.fromComboBox, SIGNAL( currentIndexChanged( int ) ), this, SLOT( changedSortFrom( int ) ) ); + connect( ui.topComboBox, SIGNAL( currentIndexChanged( int ) ), this, SLOT( changedSortTop( int ) ) ); + + /* add button */ + connect( ui.addButton, SIGNAL( clicked( void ) ), this, SLOT( addLinkComment( void ) ) ); + connect( ui.expandButton, SIGNAL( clicked( void ) ), this, SLOT( toggleWindows( void ) ) ); + + connect( ui.linkTreeWidget, SIGNAL( currentItemChanged ( QTreeWidgetItem *, QTreeWidgetItem * ) ), + this, SLOT( changedItem ( QTreeWidgetItem *, QTreeWidgetItem * ) ) ); + + connect( ui.linkTreeWidget, SIGNAL( itemDoubleClicked ( QTreeWidgetItem *, int ) ), + this, SLOT( openLink ( QTreeWidgetItem *, int ) ) ); + + + + + mStart = 0; + + + /* hide the Tree +/- */ +// ui.linkTreeWidget -> setRootIsDecorated( false ); + + /* Set header resize modes and initial section sizes */ + QHeaderView * _header = ui.linkTreeWidget->header () ; +// _header->setResizeMode (0, QHeaderView::Custom); + _header->setResizeMode (0, QHeaderView::Interactive); + _header->setResizeMode (1, QHeaderView::Interactive); + _header->setResizeMode (2, QHeaderView::Interactive); + + _header->resizeSection ( 0, 400 ); + _header->resizeSection ( 1, 50 ); + _header->resizeSection ( 2, 150 ); + + /* Hide platform specific features */ +#ifdef Q_WS_WIN + +#endif +} + +void LinksDialog::linkTreeWidgetCostumPopupMenu( QPoint point ) +{ + + QMenu contextMnu( this ); + QMouseEvent *mevent = new QMouseEvent( QEvent::MouseButtonPress, point, Qt::RightButton, Qt::RightButton, Qt::NoModifier ); + + voteupAct = new QAction(QIcon(IMAGE_EXPIORTFRIEND), tr( "Vote Link Up" ), this ); + connect( voteupAct , SIGNAL( triggered() ), this, SLOT( voteup() ) ); + + //votedownAct = new QAction(QIcon(IMAGE_REMOVEFRIEND), tr( "Vote Down" ), this ); + //connect( votedownAct , SIGNAL( triggered() ), this, SLOT( votedown() ) ); + + contextMnu.clear(); + contextMnu.addAction(voteupAct); + //contextMnu.addSeparator(); + //contextMnu.addAction(votedownAct); + contextMnu.exec( mevent->globalPos() ); +} + +void LinksDialog::changedSortRank( int index ) +{ + /* update */ + if (!rsRanks) + return; + + /* translate */ + uint32_t type = 0; + switch (index) + { + case 1: + type = RS_RANK_TIME; + break; + case 2: + type = RS_RANK_SCORE; + break; + default: + case 0: + type = RS_RANK_ALG; + break; + } + + if (type) + { + rsRanks->setSortMethod(type); + } + updateLinks(); +} + +void LinksDialog::changedSortPeriod( int index ) +{ + /* update */ + if (!rsRanks) + return; + + /* translate */ + uint32_t period = 0; + switch (index) + { + case 1: + period = 60 * 60 * 24 * 7; /* WEEK */ + break; + case 2: + period = 60 * 60 * 24; /* DAY */ + break; + default: + case 0: + period = 60 * 60 * 24 * 30; /* MONTH */ + break; + } + + if (period) + { + rsRanks->setSortPeriod(period); + } + updateLinks(); +} + +void LinksDialog::changedSortFrom( int index ) +{ + /* update */ + if (!rsRanks) + return; + + std::list peers; + + /* translate */ + switch (index) + { + default: + case 0: + break; + case 1: + peers.push_back(rsPeers->getOwnId()); + break; + } + + if (peers.size() < 1) + { + rsRanks->clearPeerFilter(); + } + else + { + rsRanks->setPeerFilter(peers); + } + updateLinks(); +} + + +void LinksDialog::changedSortTop( int index ) +{ + /* update */ + if (!rsRanks) + return; + + std::list peers; + + /* translate */ + switch (index) + { + default: + case 0: + mStart = 0; + break; + case 2: + mStart = 100; + break; + case 3: + mStart = 200; + break; + case 4: + mStart = 300; + break; + case 5: + mStart = 400; + break; + case 6: + mStart = -1; + break; + } + updateLinks(); +} + + +/* get the list of Links from the RsRanks. */ +void LinksDialog::updateLinks() +{ + + std::list rids; + std::list::iterator rit; + std::list::iterator cit; + + /* Work out the number/entries to show */ + uint32_t count = rsRanks->getRankingsCount(); + uint32_t start; + + uint32_t entries = 100; + if (count < entries) + { + entries = count; + } + + if (mStart == -1) + { + /* backwards */ + start = count-entries; + } + else + { + start = mStart; + if (start + entries > count) + { + start = count - entries; + } + } + + /* get a link to the table */ + QTreeWidget *linkWidget = ui.linkTreeWidget; + QList items; + + rsRanks->getRankings(start, entries, rids); + float maxRank = rsRanks->getMaxRank(); + + for(rit = rids.begin(); rit != rids.end(); rit++) + { + RsRankDetails detail; + if (!rsRanks->getRankDetails(*rit, detail)) + { + continue; + } + + /* create items */ + QTreeWidgetItem *item = new QTreeWidgetItem((QTreeWidget*)0); + + /* (0) Title */ + { + item -> setText(0, QString::fromStdWString(detail.title)); + /* Bold and bigger */ + QFont font = item->font(0); + font.setBold(true); + font.setPointSize(font.pointSize() + 2); + item->setFont(0, font); + } + + /* (1) Rank */ + { + std::ostringstream out; + out << 100 * (detail.rank / (maxRank + 0.01)); + item -> setText(1, QString::fromStdString(out.str())); + /* Bold and bigger */ + QFont font = item->font(1); + //font.setBold(true); + font.setPointSize(font.pointSize() + 2); + item->setFont(1, font); + } + + /* (2) Link */ + { + item -> setText(2, QString::fromStdWString(detail.link)); + /* Bold and bigger */ + QFont font = item->font(2); + font.setBold(true); + font.setPointSize(font.pointSize() + 2); + item->setFont(2, font); + } + + /* (4) rid */ + item -> setText(4, QString::fromStdString(detail.rid)); + + + /* add children */ + int i = 0; + for(cit = detail.comments.begin(); + cit != detail.comments.end(); cit++, i++) + { + /* create items */ + QTreeWidgetItem *child = new QTreeWidgetItem((QTreeWidget*)0); + + /* (0) Comment */ + child -> setText(0, QString::fromStdWString(cit->comment)); + + /* (2) Peer / Date */ + { + QDateTime qtime; + qtime.setTime_t(cit->timestamp); + QString timestamp = qtime.toString("yyyy-MM-dd hh:mm:ss"); + + QString peerLabel = QString::fromStdString(rsPeers->getPeerName(cit->id)); + peerLabel += " "; + peerLabel += timestamp; + child -> setText(2, peerLabel); + + } + + /* (4) Id */ + child -> setText(4, QString::fromStdString(cit->id)); + + if (i % 2 == 1) + { + /* set to light gray background */ + child->setBackground(0,QBrush(Qt::lightGray)); + child->setBackground(1,QBrush(Qt::lightGray)); + child->setBackground(2,QBrush(Qt::lightGray)); + } + + /* push to items */ + item->addChild(child); + } + + /* add to the list */ + items.append(item); + } + + /* remove old items */ + linkWidget->clear(); + linkWidget->setColumnCount(3); + + /* add the items in! */ + linkWidget->insertTopLevelItems(0, items); + + linkWidget->update(); /* update display */ + + +} + +void LinksDialog::openLink ( QTreeWidgetItem * item, int column ) +{ + std::cerr << "LinksDialog::openLink()" << std::endl; + + /* work out the ids */ + if (!item) + { + std::cerr << "LinksDialog::openLink() Failed Item" << std::endl; + return; + } + + std::string rid; + std::string pid; + + QTreeWidgetItem *parent = item->parent(); + if (parent) + { + /* a child comment -> ignore double click */ + std::cerr << "LinksDialog::openLink() Failed Child" << std::endl; + return; + } + + std::cerr << "LinksDialog::openLink() " << (item->text(0)).toStdString() << std::endl; + /* open a browser */ + QUrl url(item->text(0)); + QDesktopServices::openUrl ( url ); + + /* close expansion */ + //ui.linkTreeWidget->collapseItem(item); + + bool state = item->isExpanded(); + item->setExpanded(!state); +} + +void LinksDialog::changedItem(QTreeWidgetItem *curr, QTreeWidgetItem *prev) +{ + /* work out the ids */ + if (!curr) + { + updateComments("", ""); + return; + } + + std::string rid; + std::string pid; + + QTreeWidgetItem *parent = curr->parent(); + if (parent) + { + rid = (parent->text(4)).toStdString(); + pid = (curr->text(4)).toStdString(); + + std::cerr << "LinksDialog::changedItem() Rid: " << rid << " Pid: " << pid; + std::cerr << std::endl; + + updateComments(rid, pid); + } + else + { + rid = (curr->text(4)).toStdString(); + + std::cerr << "LinksDialog::changedItem() Rid: " << rid << " Pid: NULL"; + std::cerr << std::endl; + + updateComments(rid, ""); + } +} + + + +/* get the list of Links from the RsRanks. */ +void LinksDialog::updateComments(std::string rid, std::string pid) +{ + std::list::iterator cit; + + if (rid == "") + { + /* clear it up */ + ui.titleLineEdit->setText(""); + ui.linkLineEdit->setText(""); + ui.linkTextEdit->setText(""); + mLinkId = rid; + return; + } + + RsRankDetails detail; + if (!rsRanks->getRankDetails(rid, detail)) + { + /* clear it up */ + ui.titleLineEdit->setText(""); + ui.linkLineEdit->setText(""); + ui.linkTextEdit->setText(""); + mLinkId = ""; + return; + } + + /* set Link details */ + ui.titleLineEdit->setText(QString::fromStdWString(detail.title)); + ui.linkLineEdit->setText(QString::fromStdWString(detail.link)); + + if (mLinkId != rid) + { + /* clean comments */ + ui.linkTextEdit->setText(""); + } + mLinkId = rid; + +#if 0 + + for(cit = detail.comments.begin(); cit != detail.comments.end(); cit++) + { + if (cit->id == pid) + break; + } + + if (cit != detail.comments.end()) + { + /* one comment selected */ + QString comment; + + QDateTime qtime; + qtime.setTime_t(cit->timestamp); + QString timestamp = qtime.toString("yyyy-MM-dd hh:mm:ss"); + + comment += "Submitter: "; + comment += QString::fromStdString(rsPeers->getPeerName(cit->id)); + comment += " Date: "; + comment += timestamp; + comment += "\n"; + comment += QString::fromStdWString(cit->comment); + + ui.linkTextEdit->setText(comment); + return; + } + + + QString comment; + for(cit = detail.comments.begin(); cit != detail.comments.end(); cit++) + { + /* add all comments */ + QDateTime qtime; + qtime.setTime_t(cit->timestamp); + QString timestamp = qtime.toString("yyyy-MM-dd hh:mm:ss"); + + comment += "Submitter: "; + comment += QString::fromStdString(rsPeers->getPeerName(cit->id)); + comment += " Date: "; + comment += timestamp; + comment += "\n"; + comment += QString::fromStdWString(cit->comment); + comment += "\n===================================================="; + comment += "====================================================\n"; + } + + ui.linkTextEdit->setText(comment); + + /* .... + * */ + /** + mLinkId = rid; + mPeerId = pid; + mCommentFilled = true; + **/ +#endif + +} + +void LinksDialog::addLinkComment( void ) +{ + /* get the title / link / comment */ + QString title = ui.titleLineEdit->text(); + QString link = ui.linkLineEdit->text(); + QString comment = ui.linkTextEdit->toPlainText(); + + if (mLinkId == "") + { + if ((link == "") || (title == "")) + { + QMessageBox::StandardButton sb = QMessageBox::warning ( NULL, + "Add Link Failure", + "Missing Link and/or Title", + QMessageBox::Ok); + /* can't do anything */ + return; + } + rsRanks->newRankMsg( + link.toStdWString(), + title.toStdWString(), + comment.toStdWString()); + } + + /* get existing details */ + + RsRankDetails detail; + if (!rsRanks->getRankDetails(mLinkId, detail)) + { + /* strange error! */ + QMessageBox::StandardButton sb = QMessageBox::warning ( NULL, + "Add Link Failure", + "Missing Link Data", + QMessageBox::Ok); + return; + } + + if (link.toStdWString() == detail.link) /* same link! - we can add a comment */ + { + if (comment == "") /* no comment! */ + { + QMessageBox::StandardButton sb = QMessageBox::warning ( NULL, + "Add Link Failure", + "Missing Comment", + QMessageBox::Ok); + return; + } + + rsRanks->updateComment(mLinkId, + comment.toStdWString()); + } + else + { + QMessageBox::StandardButton sb = QMessageBox::Yes; + + if ((title.toStdWString() == detail.title) /* same title! - wrong */ + || (title == "")) + { + sb = QMessageBox::question ( NULL, "Link Title Not Changed", + "Do you want to continue?", + (QMessageBox::Yes | QMessageBox::No)); + } + + /* add Link! */ + if (sb == QMessageBox::Yes) + { + rsRanks->newRankMsg( + link.toStdWString(), + title.toStdWString(), + comment.toStdWString()); + } + } + updateLinks(); + return; +} + +void LinksDialog::toggleWindows( void ) +{ + /* if msg header visible -> hide by changing splitter + */ + + QList sizeList = ui.msgSplitter->sizes(); + QList::iterator it; + + int listSize = 0; + int msgSize = 0; + int i = 0; + + for(it = sizeList.begin(); it != sizeList.end(); it++, i++) + { + if (i == 0) + { + listSize = (*it); + } + else if (i == 1) + { + msgSize = (*it); + } + } + + int totalSize = listSize + msgSize; + + bool toShrink = true; + if (msgSize < (int) totalSize / 10) + { + toShrink = false; + } + + QList newSizeList; + if (toShrink) + { + newSizeList.push_back(totalSize); + newSizeList.push_back(0); + } + else + { + newSizeList.push_back(totalSize * 3/4); + newSizeList.push_back(totalSize * 1/4); + } + + ui.msgSplitter->setSizes(newSizeList); + return; +} + + +QTreeWidgetItem *LinksDialog::getCurrentLine() +{ + /* get the current, and extract the Id */ + + /* get a link to the table */ + QTreeWidget *peerWidget = ui.linkTreeWidget; + QTreeWidgetItem *item = peerWidget -> currentItem(); + if (!item) + { + std::cerr << "Invalid Current Item" << std::endl; + return NULL; + } + + /* Display the columns of this item. */ + std::ostringstream out; + out << "CurrentPeerItem: " << std::endl; + + for(int i = 1; i < 6; i++) + { + QString txt = item -> text(i); + out << "\t" << i << ":" << txt.toStdString() << std::endl; + } + std::cerr << out.str(); + return item; +} + +void LinksDialog::voteup() +{ + //QTreeWidgetItem *c = getCurrentLine(); + + if (mLinkId == "") + { + return; + } + + RsRankDetails detail; + if (!rsRanks->getRankDetails(mLinkId, detail)) + { + /* not there! */ + return; + } + + QString link = QString::fromStdWString(detail.link); + std::cerr << "LinksDialog::voteup() : " << link.toStdString() << std::endl; +} + +void LinksDialog::votedown() +{ + QTreeWidgetItem *c = getCurrentLine(); + std::cerr << "LinksDialog::votedown()" << std::endl; + + /* need to get the input address / port */ + /* + std::string addr; + unsigned short port; + rsServer->FriendSetAddress(getPeerRsCertId(c), addr, port); + */ +} + + + diff --git a/retroshare-gui/src/gui/LinksDialog.h b/retroshare-gui/src/gui/LinksDialog.h new file mode 100644 index 000000000..f6083af77 --- /dev/null +++ b/retroshare-gui/src/gui/LinksDialog.h @@ -0,0 +1,87 @@ +/**************************************************************** + * RetroShare GUI is distributed under the following license: + * + * Copyright (C) 2008 Robert Fernie + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + ****************************************************************/ + +#ifndef _LINKS_DIALOG_H +#define _LINKS_DIALOG_H + +#include + +#include "mainpage.h" +#include "ui_LinksDialog.h" + + +class LinksDialog : public MainPage +{ + Q_OBJECT + +public: + /** Default Constructor */ + LinksDialog(QWidget *parent = 0); + /** Default Destructor */ + + void insertExample(); + +private slots: + /** Create the context popup menu and it's submenus */ + void linkTreeWidgetCostumPopupMenu( QPoint point ); + + void voteup(); + void votedown(); + +void changedSortRank( int index ); +void changedSortPeriod( int index ); +void changedSortFrom( int index ); +void changedSortTop( int index ); + +void updateLinks(); +void addLinkComment( void ); +void toggleWindows( void ); + +void openLink ( QTreeWidgetItem * item, int column ); +void changedItem(QTreeWidgetItem *curr, QTreeWidgetItem *prev); + +private: + +void updateComments(std::string rid, std::string pid); + + int mStart; /* start of rank list */ + std::string mLinkId; + + /* Worker Functions */ + /* (1) Update Display */ + + /* (2) Utility Fns */ + QTreeWidgetItem *getCurrentLine(); + + /** Define the popup menus for the Context menu */ + QMenu* contextMnu; + /** Defines the actions for the context menu */ + QAction* voteupAct; + QAction* votedownAct; + + QTreeWidget *exampletreeWidget; + + /** Qt Designer generated object */ + Ui::LinksDialog ui; +}; + +#endif + diff --git a/retroshare-gui/src/gui/LinksDialog.ui b/retroshare-gui/src/gui/LinksDialog.ui new file mode 100644 index 000000000..fb043f3be --- /dev/null +++ b/retroshare-gui/src/gui/LinksDialog.ui @@ -0,0 +1,388 @@ + + LinksDialog + + + + 0 + 0 + 633 + 552 + + + + Form + + + + + + Qt::Vertical + + + + + + + + 12 + + + + Qt::CustomContextMenu + + + + Title / Comment + + + + + Score + + + + + Peer / Link + + + + + + + + + + + :/images/add_24x24.png + + + + + + + Qt::Horizontal + + + + 16 + 20 + + + + + + + + + 10 + 75 + true + + + + Sort by + + + + + + + + 12 + + + + + Combo + + + + + Time + + + + + Ranking + + + + + + + + Qt::Horizontal + + + + 16 + 20 + + + + + + + + + 10 + 75 + true + + + + In last + + + + + + + + 12 + + + + + Month + + + + + Week + + + + + Day + + + + + + + + Qt::Horizontal + + + + 16 + 20 + + + + + + + + + 10 + 75 + true + + + + From + + + + + + + + 12 + + + + + All Peers + + + + + Own Links + + + + + + + + Qt::Horizontal + + + + 16 + 20 + + + + + + + + + 10 + 75 + true + + + + Show + + + + + + + + 12 + + + + + Top 100 + + + + + 101-200 + + + + + 201-300 + + + + + 301-400 + + + + + 401-500 + + + + + Bottom 100 + + + + + + + + + + + + + + Qt::Horizontal + + + + 441 + 20 + + + + + + + + + 12 + + + + Add Link/Comment + + + + + + + + + + + + 12 + 75 + true + + + + Title: + + + + + + + + 12 + + + + + + + + + 12 + 75 + true + + + + Url: + + + + + + + + 12 + + + + + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + + 12 + + + + + + + + + + + + + + + diff --git a/retroshare-gui/src/rsiface/rsrank.h b/retroshare-gui/src/rsiface/rsrank.h new file mode 100644 index 000000000..5c6197d78 --- /dev/null +++ b/retroshare-gui/src/rsiface/rsrank.h @@ -0,0 +1,90 @@ +#ifndef RETROSHARE_RANKING_GUI_INTERFACE_H +#define RETROSHARE_RANKING_GUI_INTERFACE_H + +/* + * libretroshare/src/rsiface: rsrank.h + * + * RetroShare C++ Interface. + * + * Copyright 2007-2008 by Robert Fernie. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License Version 2 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + * + * Please report all bugs and problems to "retroshare@lunamutt.com". + * + */ + +#include +#include +#include + +/* The Main Interface Class - for information about your Peers */ +class RsRanks; +extern RsRanks *rsRanks; + +class RsRankComment +{ + public: + + std::string id; + std::wstring comment; + time_t timestamp; +}; + +class RsRankDetails +{ + public: + + std::string rid; + std::wstring link; + std::wstring title; + float rank; + bool ownTag; + + std::list comments; +}; + +const uint32_t RS_RANK_SCORE = 0x0001; +const uint32_t RS_RANK_TIME = 0x0002; +const uint32_t RS_RANK_ALG = 0x0003; + +std::ostream &operator<<(std::ostream &out, const RsRankDetails &detail); + +class RsRanks +{ + public: + + RsRanks() { return; } +virtual ~RsRanks() { return; } + + /* Set Sort Methods */ +virtual bool setSortPeriod(uint32_t period) = 0; +virtual bool setSortMethod(uint32_t type) = 0; +virtual bool clearPeerFilter() = 0; +virtual bool setPeerFilter(std::list peers) = 0; + + /* get Ids */ +virtual uint32_t getRankingsCount() = 0; +virtual float getMaxRank() = 0; +virtual bool getRankings(uint32_t first, uint32_t count, std::list &rids) = 0; +virtual bool getRankDetails(std::string rid, RsRankDetails &details) = 0; + + /* Add New Comment / Msg */ +virtual std::string newRankMsg(std::wstring link, std::wstring title, std::wstring comment) = 0; +virtual bool updateComment(std::string rid, std::wstring comment) = 0; + +}; + +#endif