summaryrefslogtreecommitdiff
path: root/python/examples/kaitai
diff options
context:
space:
mode:
authorAndrew Lamoureux <andrew@vector35.com>2019-03-22 01:53:20 -0400
committerAndrew Lamoureux <andrew@vector35.com>2019-03-22 01:53:20 -0400
commitbb13d08b8ae39998db6c87108f3983a72f034143 (patch)
tree29530d8b8ed2d15bd76f65d700b133481b1cc526 /python/examples/kaitai
parent243bf0c8ff0fc1ec0a40e276541ed6be1888d2af (diff)
kaitai: initial minimal tree expansion until rows filled
Diffstat (limited to 'python/examples/kaitai')
-rw-r--r--python/examples/kaitai/view.py79
1 files changed, 64 insertions, 15 deletions
diff --git a/python/examples/kaitai/view.py b/python/examples/kaitai/view.py
index 260700b1..8a7cf51c 100644
--- a/python/examples/kaitai/view.py
+++ b/python/examples/kaitai/view.py
@@ -28,9 +28,64 @@ class MyQTreeWidget(QTreeWidget):
def __init__(self):
QTreeWidget.__init__(self)
+ self.oldWidth = 0
+ self.oldHeight = 0
+
+ self.queueInitialExpansion = False
+
def resizeEvent(self, event):
QTreeWidget.resizeEvent(self, event)
- self.scrollTo(self.currentIndex())
+
+ if self.queueInitialExpansion:
+ self.expandNicely()
+ self.queueInitialExpansion = False
+
+ newWidth = self.width()
+ newHeight = self.height()
+
+ #log.log_debug('QTreeWidget resizeEvent(), now I\'m %dx%d' % (newWidth, newHeight))
+
+ if newWidth == self.oldWidth and newHeight == self.oldHeight:
+ return
+
+ self.oldWidth = newWidth
+ self.oldHeight = newHeight
+
+ self.setColumnWidthsNicely()
+
+ def setColumnWidthsNicely(self):
+ width = self.width()
+ self.setColumnWidth(0, .6*width)
+ self.setColumnWidth(1, .2*width)
+ self.setColumnWidth(2, .1*width)
+ self.setColumnWidth(3, .1*width)
+
+ def expandNicely(self):
+ visibleRows = self.topLevelItemCount()
+ if not visibleRows:
+ return
+
+ height = self.height()
+ rowHeight = self.visualItemRect(self.topLevelItem(0)).height()
+ rowCapacity = height / rowHeight
+
+ queue = []
+ for i in range(visibleRows):
+ queue.append(self.topLevelItem(i))
+
+ while visibleRows < rowCapacity:
+ #log.log_debug('visibleRows=%d, rowCapacity=%d len(queue)=%d' % (visibleRows, rowCapacity, len(queue)))
+ if not queue:
+ break
+
+ item = queue[0]
+ queue = queue[1:]
+
+ if not item.isExpanded():
+ item.setExpanded(True)
+ for i in range(item.childCount()):
+ queue.append(item.child(i))
+ visibleRows += 1
class KaitaiView(QScrollArea, View):
def __init__(self, parent, binaryView):
@@ -86,11 +141,14 @@ class KaitaiView(QScrollArea, View):
# it SEEMS as if parsing is finished at this moment, but some parsing
# is postponed until attributes are accessed, so we must try/catch here
tree = None
- try:
+ if True:
+ try:
+ tree = kshelpers.buildQtree(parsed)
+ except Exception as e:
+ log.log_error('kaitai module %s threw exception, check file type' % ksModuleName)
+ true = None
+ else:
tree = kshelpers.buildQtree(parsed)
- except Exception as e:
- log.log_error('kaitai module %s threw exception, check file type' % ksModuleName)
- true = None
if not tree:
return
@@ -121,16 +179,7 @@ class KaitaiView(QScrollArea, View):
self.rootSelectionEnd = 1
self.hexWidget.setSelectionRange(0,1)
self.treeWidget.setUniformRowHeights(True)
-
- # Qt callbacks
- def resizeEvent(self, event):
- width = self.treeWidget.width()
- self.treeWidget.setColumnWidth(0, .6*width)
- self.treeWidget.setColumnWidth(1, .2*width)
- self.treeWidget.setColumnWidth(2, .1*width)
- self.treeWidget.setColumnWidth(3, .1*width)
-
- QScrollArea.resizeEvent(self, event)
+ self.treeWidget.queueInitialExpansion = True
# binja callbacks
def getData(self):