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

9 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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. mWidget->addItem(fellowText(fellow));
  17. item = mWidget->item(mWidget->count()-1);
  18. }
  19. else
  20. {
  21. item->setText(fellowText(fellow));
  22. }
  23. item->setData(Qt::UserRole, QVariant::fromValue((void*)&fellow));
  24. }
  25. void FellowListWidget::top(const Fellow &fellow)
  26. {
  27. auto item = findFirstItem(fellow);
  28. if (item != nullptr)
  29. {
  30. mWidget->takeItem(mWidget->row(item));
  31. mWidget->insertItem(0, item);
  32. mWidget->scrollToItem(item);
  33. mWidget->setCurrentItem(item);
  34. }
  35. }
  36. //TODO:take->insert的方式或导致如果item是当前焦点,则移动后焦点丢失
  37. void FellowListWidget::topSecond(const Fellow &fellow)
  38. {
  39. auto item = findFirstItem(fellow);
  40. if (item != nullptr)
  41. {
  42. mWidget->takeItem(mWidget->row(item));
  43. mWidget->insertItem(1, item);
  44. }
  45. }
  46. void FellowListWidget::mark(const Fellow &fellow, const QString &info)
  47. {
  48. auto item = findFirstItem(fellow);
  49. if (item != nullptr)
  50. {
  51. if (info.isEmpty())
  52. item->setText(fellowText(fellow));
  53. else
  54. {
  55. item->setText("("+info+")"+fellowText(fellow));
  56. if (mWidget->row(item)!=0)
  57. {
  58. if (mWidget->currentRow() == 0)
  59. topSecond(fellow);
  60. else
  61. top(fellow);
  62. }
  63. }
  64. }
  65. }
  66. void FellowListWidget::itemChosen(QListWidgetItem *item)
  67. {
  68. if (item == nullptr)
  69. return;
  70. auto fellow = static_cast<const Fellow*>(item->data(Qt::UserRole).value<void*>());
  71. emit select(fellow);
  72. }
  73. QString FellowListWidget::fellowText(const Fellow &fellow)
  74. {
  75. auto text = fellow.getName()+","+fellow.getIp();
  76. if (!fellow.isOnLine())
  77. {
  78. text = "[离线]"+text;
  79. }
  80. return QString(text.c_str());
  81. }
  82. QListWidgetItem *FellowListWidget::findFirstItem(const Fellow &fellow)
  83. {
  84. auto count = mWidget->count();
  85. for (int i = 0; i < count; i++)
  86. {
  87. auto widget = mWidget->item(i);
  88. auto f = static_cast<const Fellow*>(widget->data(Qt::UserRole).value<void*>());
  89. if (f->getIp() == fellow.getIp())
  90. return widget;
  91. }
  92. return nullptr;
  93. }

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

Contributors (1)