/src/SearchFromGitHubDialog.cpp

https://github.com/soramimi/Guitar · C++ · 167 lines · 142 code · 25 blank · 0 comment · 10 complexity · 4fe2accb364f73db4b92ed99277e2507 MD5 · raw file

  1. #include "SearchFromGitHubDialog.h"
  2. #include "ui_SearchFromGitHubDialog.h"
  3. #include "MainWindow.h"
  4. #include "common/misc.h"
  5. #include "urlencode.h"
  6. #include <QDebug>
  7. #include <QDesktopServices>
  8. #include <QThread>
  9. #include <QUrl>
  10. #include <functional>
  11. using SearchResultItem = GitHubAPI::SearchResultItem;
  12. static QString toQString(std::string const &s)
  13. {
  14. return QString::fromUtf8(s.c_str(), s.size());
  15. }
  16. SearchFromGitHubDialog::SearchFromGitHubDialog(QWidget *parent, MainWindow *mw)
  17. : QDialog(parent)
  18. , ui(new Ui::SearchFromGitHubDialog)
  19. , mainwindow(mw)
  20. {
  21. ui->setupUi(this);
  22. Qt::WindowFlags flags = windowFlags();
  23. flags &= ~Qt::WindowContextHelpButtonHint;
  24. setWindowFlags(flags);
  25. ui->tableWidget->setItemDelegate(&item_delegate);
  26. connect(ui->label_hyperlink, &HyperLinkLabel::clicked, this, &SearchFromGitHubDialog::onHyperlinkClicked);
  27. ui->pushButton_ok->setEnabled(false);
  28. }
  29. SearchFromGitHubDialog::~SearchFromGitHubDialog()
  30. {
  31. delete ui;
  32. }
  33. QString SearchFromGitHubDialog::url() const
  34. {
  35. return url_;
  36. }
  37. void SearchFromGitHubDialog::on_pushButton_search_clicked()
  38. {
  39. std::string q = ui->lineEdit_keywords->text().trimmed().toStdString();
  40. q = url_encode(q);
  41. if (q.empty()) return;
  42. GitHubAPI github(mainwindow);
  43. items = github.searchRepository(q);
  44. QStringList cols = {
  45. tr("Name"),
  46. tr("Owner"),
  47. tr("Score"),
  48. tr("Description"),
  49. };
  50. ui->tableWidget->setColumnCount(cols.size());
  51. ui->tableWidget->setRowCount(items.size());
  52. for (int col = 0; col < cols.size(); col++) {
  53. auto *p = new QTableWidgetItem();
  54. p->setText(cols[col]);
  55. ui->tableWidget->setHorizontalHeaderItem(col, p);
  56. }
  57. for (int row = 0; row < items.size(); row++) {
  58. SearchResultItem const &item = items[row];
  59. QTableWidgetItem *p;
  60. QString name = QString::fromStdString(item.full_name);
  61. QString owner;
  62. int i = name.indexOf('/');
  63. if (i > 0) {
  64. owner = name.mid(0, i);
  65. name = name.mid(i + 1);
  66. }
  67. int col = 0;
  68. auto AddItem = [&](std::function<void(QTableWidgetItem *)> callback){
  69. p = new QTableWidgetItem();
  70. callback(p);
  71. ui->tableWidget->setItem(row, col, p);
  72. col++;
  73. };
  74. AddItem([&](QTableWidgetItem *p){
  75. p->setData(Qt::UserRole, (int)row);
  76. p->setText(name);
  77. });
  78. AddItem([&](QTableWidgetItem *p){
  79. p->setText(owner);
  80. });
  81. AddItem([&](QTableWidgetItem *p){
  82. char tmp[100];
  83. sprintf(tmp, "%.2f", item.score);
  84. p->setText(tmp);
  85. p->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
  86. });
  87. AddItem([&](QTableWidgetItem *p){
  88. p->setText(toQString(item.description));
  89. });
  90. ui->tableWidget->setRowHeight(row, 24);
  91. }
  92. ui->tableWidget->resizeColumnsToContents();
  93. ui->tableWidget->horizontalHeader()->setStretchLastSection(true);
  94. }
  95. void SearchFromGitHubDialog::updateUI()
  96. {
  97. auto Check = [&](){
  98. if (ui->radioButton_ssh->isChecked()) {
  99. url_ = ui->lineEdit_ssh->text();
  100. if (!url_.isEmpty()) {
  101. return true;
  102. }
  103. }
  104. if (ui->radioButton_http->isChecked()) {
  105. url_ = ui->lineEdit_http->text();
  106. if (!url_.isEmpty()) {
  107. return true;
  108. }
  109. }
  110. url_ = QString();
  111. return false;
  112. };
  113. ui->pushButton_ok->setEnabled(Check());
  114. }
  115. void SearchFromGitHubDialog::on_tableWidget_currentItemChanged(QTableWidgetItem * /*current*/, QTableWidgetItem * /*previous*/)
  116. {
  117. int row = ui->tableWidget->currentRow();
  118. QTableWidgetItem *p = ui->tableWidget->item(row, 0);
  119. if (p) {
  120. int i = p->data(Qt::UserRole).toInt();
  121. if (i < items.size()) {
  122. SearchResultItem const &item = items[i];
  123. ui->lineEdit_ssh->setText(toQString(item.ssh_url));
  124. ui->lineEdit_http->setText(toQString(item.clone_url));
  125. ui->label_hyperlink->setText(toQString(item.html_url));
  126. }
  127. }
  128. updateUI();
  129. }
  130. void SearchFromGitHubDialog::on_radioButton_ssh_clicked()
  131. {
  132. updateUI();
  133. }
  134. void SearchFromGitHubDialog::on_radioButton_http_clicked()
  135. {
  136. updateUI();
  137. }
  138. void SearchFromGitHubDialog::onHyperlinkClicked()
  139. {
  140. QString url = ui->label_hyperlink->text();
  141. QDesktopServices::openUrl(QUrl(url));
  142. }