| 105 | |
| 106 | |
| 107 | class ExportsTreeView(QTreeView, FilterTarget): |
| 108 | def __init__(self, parent, view, data): |
| 109 | QTreeView.__init__(self, parent) |
| 110 | FilterTarget.__init__(self) |
| 111 | self.data = data |
| 112 | self.parent = parent |
| 113 | self.view = view |
| 114 | |
| 115 | # Allow view-specific shortcuts when exports are focused |
| 116 | self.actionHandler = UIActionHandler() |
| 117 | self.actionHandler.setupActionHandler(self) |
| 118 | self.actionHandler.setActionContext(lambda: self.view.actionContext()) |
| 119 | |
| 120 | self.model = GenericExportsModel(self.data) |
| 121 | self.setModel(self.model) |
| 122 | self.setRootIsDecorated(False) |
| 123 | self.setUniformRowHeights(True) |
| 124 | self.setSortingEnabled(True) |
| 125 | self.sortByColumn(0, Qt.AscendingOrder) |
| 126 | if self.model.ordinal_col is not None: |
| 127 | self.setColumnWidth(self.model.ordinal_col, 55) |
| 128 | |
| 129 | self.setFont(binaryninjaui.getMonospaceFont(self)) |
| 130 | |
| 131 | self.selectionModel().currentChanged.connect(self.exportSelected) |
| 132 | self.doubleClicked.connect(self.exportDoubleClicked) |
| 133 | |
| 134 | def exportSelected(self, cur, prev): |
| 135 | sym = self.model.getSymbol(cur) |
| 136 | if sym is not None: |
| 137 | self.view.setCurrentOffset(sym.address) |
| 138 | |
| 139 | def exportDoubleClicked(self, cur): |
| 140 | sym = self.model.getSymbol(cur) |
| 141 | if sym is not None: |
| 142 | viewFrame = ViewFrame.viewFrameForWidget(self) |
| 143 | if len(self.data.get_functions_at(sym.address)) > 0: |
| 144 | viewFrame.navigate("Graph:" + viewFrame.getCurrentDataType(), sym.address) |
| 145 | else: |
| 146 | viewFrame.navigate("Linear:" + viewFrame.getCurrentDataType(), sym.address) |
| 147 | |
| 148 | def setFilter(self, filterText): |
| 149 | self.model.setFilter(filterText) |
| 150 | |
| 151 | def scrollToFirstItem(self): |
| 152 | self.scrollToTop() |
| 153 | |
| 154 | def scrollToCurrentItem(self): |
| 155 | self.scrollTo(self.currentIndex()) |
| 156 | |
| 157 | def selectFirstItem(self): |
| 158 | self.setCurrentIndex(self.model.index(0, 0, QModelIndex())) |
| 159 | |
| 160 | def activateFirstItem(self): |
| 161 | self.exportDoubleClicked(self.model.index(0, 0, QModelIndex())) |
| 162 | |
| 163 | def closeFilter(self): |
| 164 | self.setFocus(Qt.OtherFocusReason) |