mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-01-14 00:49:41 -05:00
fixed sorting by state and cleaned up column show/hide menu
This commit is contained in:
parent
13f1343ae5
commit
9686fc5546
@ -271,14 +271,17 @@ QModelIndex RsFriendListModel::index(int row, int column, const QModelIndex& par
|
||||
|
||||
EntryIndex parent_index ;
|
||||
convertInternalIdToIndex(parent.internalId(),parent_index);
|
||||
|
||||
#ifdef DEBUG_MODEL
|
||||
RsDbg() << "Index row=" << row << " col=" << column << " parent=" << parent << std::endl;
|
||||
#endif
|
||||
|
||||
quintptr ref;
|
||||
EntryIndex new_index = parent_index.child(row,mTopLevel);
|
||||
convertIndexToInternalId(new_index,ref);
|
||||
|
||||
#ifdef DEBUG_MODEL
|
||||
RsDbg() << " returning " << createIndex(row,column,ref) << std::endl;
|
||||
#endif
|
||||
|
||||
return createIndex(row,column,ref);
|
||||
}
|
||||
@ -445,10 +448,12 @@ uint32_t RsFriendListModel::updateFilterStatus(ForumModelIndex i,int column,cons
|
||||
|
||||
void RsFriendListModel::setFilter(FilterType filter_type, const QStringList& strings)
|
||||
{
|
||||
#ifdef DEBUG_MODEL
|
||||
std::cerr << "Setting filter to filter_type=" << int(filter_type) << " and strings to " ;
|
||||
foreach(const QString& str,strings)
|
||||
std::cerr << "\"" << str.toStdString() << "\" " ;
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
|
||||
preMods();
|
||||
|
||||
@ -580,7 +585,9 @@ QVariant RsFriendListModel::onlineRole(const EntryIndex& e, int col) const
|
||||
|
||||
QVariant RsFriendListModel::fontRole(const EntryIndex& e, int col) const
|
||||
{
|
||||
#ifdef DEBUG_MODEL
|
||||
std::cerr << " font role " << e.type << ", (" << (int)e.group_index << ","<< (int)e.profile_index << ","<< (int)e.node_index << ") col="<< col<<": " << std::endl;
|
||||
#endif
|
||||
|
||||
bool b = onlineRole(e,col).toBool();
|
||||
|
||||
@ -597,7 +604,9 @@ QVariant RsFriendListModel::fontRole(const EntryIndex& e, int col) const
|
||||
|
||||
QVariant RsFriendListModel::displayRole(const EntryIndex& e, int col) const
|
||||
{
|
||||
#ifdef DEBUG_MODEL
|
||||
std::cerr << " Display role " << e.type << ", (" << (int)e.group_index << ","<< (int)e.profile_index << ","<< (int)e.node_index << ") col="<< col<<": " << std::endl;
|
||||
#endif
|
||||
|
||||
switch(e.type)
|
||||
{
|
||||
@ -621,7 +630,9 @@ QVariant RsFriendListModel::displayRole(const EntryIndex& e, int col) const
|
||||
switch(col)
|
||||
{
|
||||
case COLUMN_THREAD_NAME:
|
||||
#ifdef DEBUG_MODEL
|
||||
std::cerr << group->group_info.name.c_str() << std::endl;
|
||||
#endif
|
||||
|
||||
if(!group->child_profile_indices.empty())
|
||||
return QVariant(QString::fromUtf8(group->group_info.name.c_str())+" (" + QString::number(nb_online) + "/" + QString::number(group->child_profile_indices.size()) + ")");
|
||||
@ -733,7 +744,9 @@ const RsFriendListModel::HierarchicalNodeInformation *RsFriendListModel::getNode
|
||||
|
||||
if(node.last_update_ts + NODE_DETAILS_UPDATE_DELAY < now)
|
||||
{
|
||||
#ifdef DEBUG_MODEL
|
||||
std::cerr << "Updating ID " << node.node_info.id << std::endl;
|
||||
#endif
|
||||
RsPeerId id(node.node_info.id); // this avoids zeroing the id field when writing the node data
|
||||
rsPeers->getPeerDetails(id,node.node_info);
|
||||
node.last_update_ts = now;
|
||||
|
@ -113,16 +113,22 @@ public:
|
||||
FriendListSortFilterProxyModel(const QHeaderView *header,QObject *parent = NULL): QSortFilterProxyModel(parent),
|
||||
m_header(header),
|
||||
m_sortingEnabled(false),
|
||||
m_hideOfflineNodes(false) {}
|
||||
m_showOfflineNodes(true) {}
|
||||
|
||||
bool lessThan(const QModelIndex& left, const QModelIndex& right) const override
|
||||
{
|
||||
bool online1 = left .data(RsFriendListModel::OnlineRole).toBool();
|
||||
bool online2 = right.data(RsFriendListModel::OnlineRole).toBool();
|
||||
|
||||
if(online1 != online2 && m_sortByState)
|
||||
return (m_header->sortIndicatorOrder()==Qt::AscendingOrder)?online1:online2 ; // always put online nodes first
|
||||
|
||||
return left.data(RsFriendListModel::SortRole) < right.data(RsFriendListModel::SortRole) ;
|
||||
}
|
||||
|
||||
bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override
|
||||
{
|
||||
if(m_hideOfflineNodes && !sourceModel()->index(source_row,0,source_parent).data(RsFriendListModel::OnlineRole).toBool())
|
||||
if(!m_showOfflineNodes && !sourceModel()->index(source_row,0,source_parent).data(RsFriendListModel::OnlineRole).toBool())
|
||||
return false;
|
||||
|
||||
return sourceModel()->index(source_row,0,source_parent).data(RsFriendListModel::FilterRole).toString() == RsFriendListModel::FilterString ;
|
||||
@ -136,15 +142,15 @@ public:
|
||||
|
||||
void setSortingEnabled(bool b) { m_sortingEnabled = b ; }
|
||||
void setSortByState(bool b) { m_sortByState = b ; }
|
||||
void setHideOfflineNodes(bool b) { m_hideOfflineNodes = b ; }
|
||||
void setShowOfflineNodes(bool b) { m_showOfflineNodes = b ; }
|
||||
|
||||
bool hideOfflineNodes() const { return m_hideOfflineNodes ; }
|
||||
bool showOfflineNodes() const { return m_showOfflineNodes ; }
|
||||
|
||||
private:
|
||||
const QHeaderView *m_header ;
|
||||
bool m_sortingEnabled;
|
||||
bool m_sortByState;
|
||||
bool m_hideOfflineNodes;
|
||||
bool m_showOfflineNodes;
|
||||
};
|
||||
|
||||
NewFriendList::NewFriendList(QWidget *parent) :
|
||||
@ -156,19 +162,6 @@ NewFriendList::NewFriendList(QWidget *parent) :
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
connect(ui->peerTreeWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(peerTreeWidgetCustomPopupMenu()));
|
||||
//connect(ui->peerTreeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(expandItem(QTreeWidgetItem *)) );
|
||||
|
||||
connect(NotifyQt::getInstance(), SIGNAL(groupsChanged(int)), this, SLOT(groupsChanged()));
|
||||
|
||||
connect(ui->actionHideOfflineFriends, SIGNAL(triggered(bool)), this, SLOT(setHideUnconnected(bool)));
|
||||
connect(ui->actionShowState, SIGNAL(triggered(bool)), this, SLOT(setShowState(bool)));
|
||||
connect(ui->actionShowGroups, SIGNAL(triggered(bool)), this, SLOT(setShowGroups(bool)));
|
||||
connect(ui->actionExportFriendlist, SIGNAL(triggered()), this, SLOT(exportFriendlistClicked()));
|
||||
connect(ui->actionImportFriendlist, SIGNAL(triggered()), this, SLOT(importFriendlistClicked()));
|
||||
|
||||
connect(ui->filterLineEdit, SIGNAL(textChanged(QString)), this, SLOT(filterItems(QString)));
|
||||
|
||||
ui->filterLineEdit->setPlaceholderText(tr("Search")) ;
|
||||
ui->filterLineEdit->showFilterIcon();
|
||||
|
||||
@ -184,8 +177,6 @@ NewFriendList::NewFriendList(QWidget *parent) :
|
||||
|
||||
ui->peerTreeWidget->setModel(mProxyModel);
|
||||
|
||||
connect(NotifyQt::getInstance(), SIGNAL(friendsChanged()), mModel, SLOT(updateInternalData()));
|
||||
|
||||
/* Add filter actions */
|
||||
QString headerText = mModel->headerData(RsFriendListModel::COLUMN_THREAD_NAME,Qt::Horizontal,Qt::DisplayRole).toString();
|
||||
ui->filterLineEdit->addFilter(QIcon(), headerText, RsFriendListModel::COLUMN_THREAD_NAME, QString("%1 %2").arg(tr("Search"), headerText));
|
||||
@ -193,7 +184,6 @@ NewFriendList::NewFriendList(QWidget *parent) :
|
||||
|
||||
mActionSortByState = new QAction(tr("Display online friends on top"), this);
|
||||
mActionSortByState->setCheckable(true);
|
||||
connect(mActionSortByState, SIGNAL(toggled(bool)), this, SLOT(toggleSortByState(bool)));
|
||||
|
||||
//setting default filter by column as subject
|
||||
ui->filterLineEdit->setCurrentFilter(RsFriendListModel::COLUMN_THREAD_NAME);
|
||||
@ -202,12 +192,9 @@ NewFriendList::NewFriendList(QWidget *parent) :
|
||||
/* Set sort */
|
||||
sortByColumn(RsFriendListModel::COLUMN_THREAD_NAME, Qt::AscendingOrder);
|
||||
toggleSortByState(false);
|
||||
connect(ui->peerTreeWidget->header(),SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)), this, SLOT(sortColumn(int,Qt::SortOrder)));
|
||||
|
||||
// workaround for Qt bug, should be solved in next Qt release 4.7.0
|
||||
// workaround for Qt bug, should be solved in next Qt release 4.7.0
|
||||
// http://bugreports.qt.nokia.com/browse/QTBUG-8270
|
||||
QShortcut *Shortcut = new QShortcut(QKeySequence(Qt::Key_Delete), ui->peerTreeWidget, 0, 0, Qt::WidgetShortcut);
|
||||
connect(Shortcut, SIGNAL(activated()), this, SLOT(removefriend()));
|
||||
|
||||
/* Initialize tree */
|
||||
// ui->peerTreeWidget->enableColumnCustomize(true);
|
||||
@ -232,11 +219,27 @@ NewFriendList::NewFriendList(QWidget *parent) :
|
||||
|
||||
QHeaderView *h = ui->peerTreeWidget->header();
|
||||
h->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(h, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(headerContextMenuRequested(QPoint)));
|
||||
|
||||
QTimer *timer = new QTimer;
|
||||
QObject::connect(timer,SIGNAL(timeout()),mModel,SLOT(debug_dump()));
|
||||
timer->start(2000);
|
||||
// QTimer *timer = new QTimer;
|
||||
// QObject::connect(timer,SIGNAL(timeout()),mModel,SLOT(debug_dump()));
|
||||
// timer->start(2000);
|
||||
|
||||
connect(Shortcut, SIGNAL(activated()), this, SLOT(removefriend()));
|
||||
connect(ui->peerTreeWidget->header(),SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)), this, SLOT(sortColumn(int,Qt::SortOrder)));
|
||||
connect(mActionSortByState, SIGNAL(toggled(bool)), this, SLOT(toggleSortByState(bool)));
|
||||
connect(NotifyQt::getInstance(), SIGNAL(friendsChanged()), mModel, SLOT(updateInternalData()));
|
||||
connect(ui->peerTreeWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(peerTreeWidgetCustomPopupMenu()));
|
||||
connect(NotifyQt::getInstance(), SIGNAL(groupsChanged(int)), this, SLOT(groupsChanged()));
|
||||
|
||||
connect(ui->actionShowOfflineFriends, SIGNAL(triggered(bool)), this, SLOT(setShowUnconnected(bool)));
|
||||
connect(ui->actionShowState, SIGNAL(triggered(bool)), this, SLOT(setShowState(bool)));
|
||||
connect(ui->actionShowGroups, SIGNAL(triggered(bool)), this, SLOT(setShowGroups(bool)));
|
||||
|
||||
connect(ui->actionExportFriendlist, SIGNAL(triggered()), this, SLOT(exportFriendlistClicked()));
|
||||
connect(ui->actionImportFriendlist, SIGNAL(triggered()), this, SLOT(importFriendlistClicked()));
|
||||
|
||||
connect(ui->filterLineEdit, SIGNAL(textChanged(QString)), this, SLOT(filterItems(QString)));
|
||||
connect(h, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(headerContextMenuRequested(QPoint)));
|
||||
}
|
||||
|
||||
NewFriendList::~NewFriendList()
|
||||
@ -255,14 +258,39 @@ void NewFriendList::headerContextMenuRequested(QPoint p)
|
||||
{
|
||||
QMenu displayMenu(tr("Show Items"), this);
|
||||
|
||||
displayMenu.addAction(ui->actionHideOfflineFriends);
|
||||
QWidget *widget = new QWidget(&displayMenu);
|
||||
widget->setStyleSheet( ".QWidget{background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1,stop:0 #FEFEFE, stop:1 #E8E8E8); border: 1px solid #CCCCCC;}");
|
||||
|
||||
// create menu header
|
||||
QHBoxLayout *hbox = new QHBoxLayout(widget);
|
||||
hbox->setMargin(0);
|
||||
hbox->setSpacing(6);
|
||||
|
||||
QLabel *iconLabel = new QLabel(widget);
|
||||
QPixmap pix = QPixmap(":/images/user/friends24.png").scaledToHeight(QFontMetricsF(iconLabel->font()).height()*1.5);
|
||||
iconLabel->setPixmap(pix);
|
||||
iconLabel->setMaximumSize(iconLabel->frameSize().height() + pix.height(), pix.width());
|
||||
hbox->addWidget(iconLabel);
|
||||
|
||||
QLabel *textLabel = new QLabel("<strong>Show/hide...</strong>", widget);
|
||||
hbox->addWidget(textLabel);
|
||||
|
||||
QSpacerItem *spacerItem = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
|
||||
hbox->addItem(spacerItem);
|
||||
|
||||
widget->setLayout(hbox);
|
||||
|
||||
QWidgetAction *widgetAction = new QWidgetAction(this);
|
||||
widgetAction->setDefaultWidget(widget);
|
||||
displayMenu.addAction(widgetAction);
|
||||
|
||||
displayMenu.addAction(mActionSortByState);
|
||||
|
||||
displayMenu.addAction(ui->actionShowOfflineFriends);
|
||||
displayMenu.addAction(ui->actionShowState);
|
||||
displayMenu.addAction(ui->actionShowGroups);
|
||||
|
||||
displayMenu.addAction(ui->actionExportFriendlist);
|
||||
displayMenu.addAction(ui->actionImportFriendlist);
|
||||
|
||||
ui->actionHideOfflineFriends->setChecked(mProxyModel->hideOfflineNodes());
|
||||
ui->actionShowOfflineFriends->setChecked(mProxyModel->showOfflineNodes());
|
||||
ui->actionShowState->setChecked(mShowState);
|
||||
ui->actionShowGroups->setChecked(mModel->getDisplayGroups());
|
||||
|
||||
@ -320,10 +348,14 @@ void NewFriendList::processSettings(bool load)
|
||||
// restoreState would corrupt the internal sectionCount
|
||||
|
||||
// states
|
||||
setHideUnconnected(Settings->value("hideUnconnected", mProxyModel->hideOfflineNodes()).toBool());
|
||||
setShowUnconnected(!Settings->value("hideUnconnected", mProxyModel->showOfflineNodes()).toBool());
|
||||
setShowState(Settings->value("showState", mShowState).toBool());
|
||||
setShowGroups(Settings->value("showGroups", mModel->getDisplayGroups()).toBool());
|
||||
|
||||
setColumnVisible(RsFriendListModel::COLUMN_THREAD_IP,Settings->value("showIP", isColumnVisible(RsFriendListModel::COLUMN_THREAD_IP)).toBool());
|
||||
setColumnVisible(RsFriendListModel::COLUMN_THREAD_ID,Settings->value("showID", isColumnVisible(RsFriendListModel::COLUMN_THREAD_ID)).toBool());
|
||||
setColumnVisible(RsFriendListModel::COLUMN_THREAD_LAST_CONTACT,Settings->value("showLastContact", isColumnVisible(RsFriendListModel::COLUMN_THREAD_LAST_CONTACT)).toBool());
|
||||
|
||||
// sort
|
||||
toggleSortByState(Settings->value("sortByState", isSortByState()).toBool());
|
||||
|
||||
@ -348,10 +380,14 @@ void NewFriendList::processSettings(bool load)
|
||||
// save settings
|
||||
|
||||
// states
|
||||
Settings->setValue("hideUnconnected", mProxyModel->hideOfflineNodes());
|
||||
Settings->setValue("hideUnconnected", !mProxyModel->showOfflineNodes());
|
||||
Settings->setValue("showState", mShowState);
|
||||
Settings->setValue("showGroups", mModel->getDisplayGroups());
|
||||
|
||||
Settings->setValue("showIP",isColumnVisible(RsFriendListModel::COLUMN_THREAD_IP));
|
||||
Settings->setValue("showID",isColumnVisible(RsFriendListModel::COLUMN_THREAD_ID));
|
||||
Settings->setValue("showLastContact",isColumnVisible(RsFriendListModel::COLUMN_THREAD_LAST_CONTACT));
|
||||
|
||||
// sort
|
||||
Settings->setValue("sortByState", isSortByState());
|
||||
|
||||
@ -371,6 +407,7 @@ void NewFriendList::processSettings(bool load)
|
||||
void NewFriendList::toggleSortByState(bool sort)
|
||||
{
|
||||
mProxyModel->setSortByState(sort);
|
||||
mProxyModel->setFilterRegExp(QRegExp(QString(RsFriendListModel::FilterString))) ;// triggers a re-display.
|
||||
}
|
||||
|
||||
void NewFriendList::changeEvent(QEvent *e)
|
||||
@ -410,7 +447,7 @@ void NewFriendList::peerTreeWidgetCustomPopupMenu()
|
||||
iconLabel->setMaximumSize(iconLabel->frameSize().height() + pix.height(), pix.width());
|
||||
hbox->addWidget(iconLabel);
|
||||
|
||||
QLabel *textLabel = new QLabel("<strong>RetroShare</strong>", widget);
|
||||
QLabel *textLabel = new QLabel("<strong>Friend list</strong>", widget);
|
||||
hbox->addWidget(textLabel);
|
||||
|
||||
QSpacerItem *spacerItem = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
|
||||
@ -421,7 +458,6 @@ void NewFriendList::peerTreeWidgetCustomPopupMenu()
|
||||
QWidgetAction *widgetAction = new QWidgetAction(this);
|
||||
widgetAction->setDefaultWidget(widget);
|
||||
contextMenu.addAction(widgetAction);
|
||||
contextMenu.addAction(mActionSortByState);
|
||||
|
||||
// create menu entries
|
||||
if(index.isValid())
|
||||
@ -579,6 +615,11 @@ void NewFriendList::peerTreeWidgetCustomPopupMenu()
|
||||
contextMenu.addAction(QIcon(IMAGE_EXPAND), tr("Expand all"), ui->peerTreeWidget, SLOT(expandAll()));
|
||||
contextMenu.addAction(QIcon(IMAGE_COLLAPSE), tr("Collapse all"), ui->peerTreeWidget, SLOT(collapseAll()));
|
||||
|
||||
contextMenu.addSeparator();
|
||||
|
||||
contextMenu.addAction(ui->actionExportFriendlist);
|
||||
contextMenu.addAction(ui->actionImportFriendlist);
|
||||
|
||||
// contextMenu = ui->peerTreeWidget->createStandardContextMenu(contextMenu);
|
||||
|
||||
contextMenu.exec(QCursor::pos());
|
||||
@ -1392,12 +1433,16 @@ bool NewFriendList::getOrCreateGroup(const std::string& name, uint flag, RsNodeG
|
||||
}
|
||||
|
||||
|
||||
void NewFriendList::setHideUnconnected(bool hidden)
|
||||
void NewFriendList::setShowUnconnected(bool show)
|
||||
{
|
||||
mProxyModel->setHideOfflineNodes(hidden);
|
||||
mProxyModel->setShowOfflineNodes(show);
|
||||
mProxyModel->setFilterRegExp(QRegExp(QString(RsFriendListModel::FilterString))) ;// triggers a re-display.
|
||||
}
|
||||
|
||||
bool NewFriendList::isColumnVisible(int col) const
|
||||
{
|
||||
return !ui->peerTreeWidget->isColumnHidden(col);
|
||||
}
|
||||
void NewFriendList::setColumnVisible(int col,bool visible)
|
||||
{
|
||||
ui->peerTreeWidget->setColumnHidden(col, !visible);
|
||||
@ -1415,6 +1460,8 @@ void NewFriendList::toggleColumnVisible()
|
||||
//emit columnVisibleChanged(column,visible);
|
||||
|
||||
ui->peerTreeWidget->setColumnHidden(column, !visible);
|
||||
|
||||
processSettings(false); // save settings
|
||||
}
|
||||
|
||||
void NewFriendList::sortByColumn(int column, Qt::SortOrder sortOrder)
|
||||
|
@ -60,6 +60,7 @@ public:
|
||||
void addPeerToExpand(const RsPgpId &gpgId);
|
||||
bool getExpandedPeers(std::set<RsPgpId> &peers) const;
|
||||
void setColumnVisible(int col,bool visible);
|
||||
bool isColumnVisible(int col) const;
|
||||
|
||||
std::string getSelectedGroupId() const;
|
||||
void sortByColumn(int column, Qt::SortOrder sortOrder);
|
||||
@ -85,7 +86,7 @@ public slots:
|
||||
|
||||
void toggleColumnVisible();
|
||||
void setShowGroups(bool show);
|
||||
void setHideUnconnected(bool hidden);
|
||||
void setShowUnconnected(bool hidden);
|
||||
void setShowState(bool show);
|
||||
void headerContextMenuRequested(QPoint);
|
||||
|
||||
|
@ -67,12 +67,15 @@
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
<action name="actionHideOfflineFriends">
|
||||
<action name="actionShowOfflineFriends">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Hide Offline Friends</string>
|
||||
<string>Offline Friends</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Show Offline Friends</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionShowState">
|
||||
@ -80,10 +83,10 @@
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Show State</string>
|
||||
<string>Status</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Show State</string>
|
||||
<string>Show status</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionShowGroups">
|
||||
@ -91,10 +94,10 @@
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Show Groups</string>
|
||||
<string>Groups</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Show Groups</string>
|
||||
<string>Show groups</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionExportFriendlist">
|
||||
|
Loading…
Reference in New Issue
Block a user