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
-
- 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