| 480 | |
| 481 | |
| 482 | void ThreadFramesWidget::copy() |
| 483 | { |
| 484 | QModelIndexList sel = selectionModel()->selectedIndexes(); |
| 485 | if (sel.empty() || !sel[0].isValid()) |
| 486 | return; |
| 487 | |
| 488 | FrameItem* item = static_cast<FrameItem*>(sel[0].internalPointer()); |
| 489 | if (!item) |
| 490 | return; |
| 491 | |
| 492 | QString text; |
| 493 | |
| 494 | switch (sel[0].column()) |
| 495 | { |
| 496 | case ThreadFrameModel::StateColumn: |
| 497 | if (item->isFrame()) |
| 498 | return; |
| 499 | |
| 500 | text = item->isFrozen() ? "Frozen" : "Unfrozen"; |
| 501 | break; |
| 502 | case ThreadFrameModel::ThreadColumn: |
| 503 | if (item->isFrame()) |
| 504 | return; |
| 505 | |
| 506 | text = QString::asprintf("0x%x @ 0x%" PRIx64, item->tid(), item->threadPc()); |
| 507 | break; |
| 508 | case ThreadFrameModel::FrameIndexColumn: |
| 509 | text = QString::asprintf("%lu", item->frameIndex()); |
| 510 | break; |
| 511 | case ThreadFrameModel::ModuleColumn: |
| 512 | text = QString::fromStdString(item->module()); |
| 513 | break; |
| 514 | case ThreadFrameModel::FunctionColumn: |
| 515 | text = QString::fromStdString(item->function()); |
| 516 | break; |
| 517 | case ThreadFrameModel::PcColumn: |
| 518 | text = QString::asprintf("0x%" PRIx64, item->framePc()); |
| 519 | break; |
| 520 | case ThreadFrameModel::SpColumn: |
| 521 | text = QString::asprintf("0x%" PRIx64, item->sp()); |
| 522 | break; |
| 523 | case ThreadFrameModel::FpColumn: |
| 524 | text = QString::asprintf("0x%" PRIx64, item->fp()); |
| 525 | break; |
| 526 | default: |
| 527 | break; |
| 528 | } |
| 529 | |
| 530 | auto* clipboard = QGuiApplication::clipboard(); |
| 531 | clipboard->clear(); |
| 532 | auto* mime = new QMimeData(); |
| 533 | mime->setText(text); |
| 534 | clipboard->setMimeData(mime); |
| 535 | } |
| 536 | |
| 537 | |
| 538 | ThreadFramesWidget::ThreadFramesWidget(QWidget* parent, ViewFrame* frame, BinaryViewRef data) : |