| 672 | |
| 673 | |
| 674 | void ThreadFramesWidget::onDoubleClicked() |
| 675 | { |
| 676 | QModelIndexList sel = selectionModel()->selectedIndexes(); |
| 677 | if (sel.empty()) |
| 678 | return; |
| 679 | |
| 680 | auto column = sel[0].column(); |
| 681 | |
| 682 | if (column == ThreadFrameModel::FrameIndexColumn || column == ThreadFrameModel::ModuleColumn) |
| 683 | return; |
| 684 | |
| 685 | FrameItem* frameItem = static_cast<FrameItem*>(sel[0].internalPointer()); |
| 686 | if (!frameItem) |
| 687 | return; |
| 688 | |
| 689 | if (!frameItem->isFrame() && column > ThreadFrameModel::ThreadColumn) |
| 690 | return; |
| 691 | |
| 692 | if (frameItem->isFrame() && column <= ThreadFrameModel::ThreadColumn) |
| 693 | return; |
| 694 | |
| 695 | // Double clicking on thread column changes active thread |
| 696 | if (!frameItem->isFrame() && column == ThreadFrameModel::ThreadColumn) |
| 697 | { |
| 698 | uint32_t tid = frameItem->tid(); |
| 699 | uint32_t currentTid = m_debugger->GetActiveThread().m_tid; |
| 700 | |
| 701 | if (tid != currentTid && !m_debugger->IsRunning()) |
| 702 | m_debugger->SetActiveThread(tid); |
| 703 | |
| 704 | return; |
| 705 | } |
| 706 | |
| 707 | // double clicking on state column toggles thread state |
| 708 | if (!frameItem->isFrame() && column == ThreadFrameModel::StateColumn) |
| 709 | { |
| 710 | if (frameItem->isFrozen()) |
| 711 | m_debugger->ResumeThread(frameItem->tid()); |
| 712 | else |
| 713 | m_debugger->SuspendThread(frameItem->tid()); |
| 714 | |
| 715 | return; |
| 716 | } |
| 717 | |
| 718 | uint64_t addrToJump = 0; |
| 719 | switch (column) |
| 720 | { |
| 721 | case ThreadFrameModel::FunctionColumn: |
| 722 | case ThreadFrameModel::PcColumn: |
| 723 | addrToJump = frameItem->framePc(); |
| 724 | break; |
| 725 | case ThreadFrameModel::SpColumn: |
| 726 | addrToJump = frameItem->sp(); |
| 727 | break; |
| 728 | case ThreadFrameModel::FpColumn: |
| 729 | addrToJump = frameItem->fp(); |
| 730 | break; |
| 731 | } |
nothing calls this directly
no test coverage detected