You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

fellowlistwidget.cpp 3.1 kB

8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #include "fellowlistwidget.h"
  2. #include <QDebug>
  3. FellowListWidget::FellowListWidget()
  4. {
  5. }
  6. void FellowListWidget::bindTo(QListWidget *widget)
  7. {
  8. mWidget = widget;
  9. connect(mWidget, &QListWidget::itemClicked, this, &FellowListWidget::itemChosen);
  10. }
  11. void FellowListWidget::update(const Fellow &fellow)
  12. {
  13. auto item = findFirstItem(fellow);
  14. if (item == nullptr)
  15. {
  16. int row = requestRow(fellow);
  17. mWidget->insertItem(row, fellowText(fellow));
  18. item = mWidget->item(row);
  19. }
  20. else
  21. {
  22. item->setText(fellowText(fellow));
  23. }
  24. item->setData(Qt::UserRole, QVariant::fromValue((void*)&fellow));
  25. }
  26. void FellowListWidget::top(const Fellow &fellow)
  27. {
  28. auto item = findFirstItem(fellow);
  29. if (item != nullptr)
  30. {
  31. mWidget->takeItem(mWidget->row(item));
  32. mWidget->insertItem(0, item);
  33. mWidget->scrollToItem(item);
  34. mWidget->setCurrentItem(item);
  35. }
  36. }
  37. //TODO:take->insert的方式或导致如果item是当前焦点,则移动后焦点丢失
  38. void FellowListWidget::topSecond(const Fellow &fellow)
  39. {
  40. auto item = findFirstItem(fellow);
  41. if (item != nullptr)
  42. {
  43. mWidget->takeItem(mWidget->row(item));
  44. mWidget->insertItem(1, item);
  45. }
  46. }
  47. void FellowListWidget::mark(const Fellow &fellow, const QString &info)
  48. {
  49. auto item = findFirstItem(fellow);
  50. if (item != nullptr)
  51. {
  52. if (info.isEmpty())
  53. item->setText(fellowText(fellow));
  54. else
  55. {
  56. item->setText("("+info+")"+fellowText(fellow));
  57. if (mWidget->row(item)!=0)
  58. {
  59. if (mWidget->currentRow() == 0)
  60. topSecond(fellow);
  61. else
  62. top(fellow);
  63. }
  64. }
  65. }
  66. }
  67. void FellowListWidget::setRankPredict(FellowListWidget::RankPredict predict)
  68. {
  69. mRankPredict = predict;
  70. }
  71. void FellowListWidget::itemChosen(QListWidgetItem *item)
  72. {
  73. if (item == nullptr)
  74. return;
  75. auto fellow = getFellow(item);
  76. emit select(fellow);
  77. }
  78. QString FellowListWidget::fellowText(const Fellow &fellow)
  79. {
  80. auto text = fellow.getName()+","+fellow.getIp();
  81. if (!fellow.isOnLine())
  82. {
  83. text = "[离线]"+text;
  84. }
  85. return QString(text.c_str());
  86. }
  87. QListWidgetItem *FellowListWidget::findFirstItem(const Fellow &fellow)
  88. {
  89. auto count = mWidget->count();
  90. for (int i = 0; i < count; i++)
  91. {
  92. auto widget = mWidget->item(i);
  93. auto f = getFellow(widget);
  94. if (f->getIp() == fellow.getIp())
  95. return widget;
  96. }
  97. return nullptr;
  98. }
  99. int FellowListWidget::requestRow(const Fellow &fellow)
  100. {
  101. auto count = mWidget->count();
  102. if (!mRankPredict)
  103. return count;
  104. int row = count;
  105. for (; row > 0; row--)
  106. {
  107. auto f = getFellow(mWidget->item(row-1));
  108. auto ret = mRankPredict(*f, fellow);
  109. if (ret >= 0)
  110. break;
  111. }
  112. return row;
  113. }
  114. const Fellow *FellowListWidget::getFellow(const QListWidgetItem *item)
  115. {
  116. return static_cast<const Fellow*>(item->data(Qt::UserRole).value<void*>());
  117. }

mac下的“飞秋”大多数只是飞鸽传书协议,而且未发现令人满意的开源项目,所以基于c++与qt实现了基础的飞秋协议。

Contributors (1)