[PICARD-519] Fix up hacky resize/restore/save of metadata box columns

Replace `metadata_box_sizes` option by QByteArray `metadatabox_header_state` and
simply rely on Qt `QHeaderView::restoreState()` and `QHeaderView::saveState()`

This change implies metadata box columns aren't auto resized when changing main window size, but instead scrollbar may appear.

Overall, it is still user-friendly enough and much more reliable.

See http://tickets.musicbrainz.org/browse/PICARD-519
This commit is contained in:
Laurent Monin
2014-08-03 12:16:53 +02:00
parent 01fa31ab7f
commit af184bce4f

View File

@@ -144,7 +144,7 @@ class TagDiff(object):
class MetadataBox(QtGui.QTableWidget):
options = (
config.IntListOption("persist", "metadata_box_sizes", [150, 300, 300]),
config.Option("persist", "metadatabox_header_state", QtCore.QByteArray()),
config.BoolOption("persist", "show_changes_first", False)
)
@@ -462,43 +462,12 @@ class MetadataBox(QtGui.QTableWidget):
font.setItalic(italic)
item.setFont(font)
def _resize_column(self, i, size):
header = self.horizontalHeader()
nsize = max(size, header.sectionSizeHint(i))
header.resizeSection(i, nsize)
def restore_state(self):
sizes = config.persist["metadata_box_sizes"]
state = config.persist["metadatabox_header_state"]
header = self.horizontalHeader()
try:
for i in range(header.count() - 1):
self._resize_column(i, sizes[i])
except IndexError:
pass
self.resize_columns()
header.restoreState(state)
def save_state(self):
sizes = []
header = self.horizontalHeader()
for i in range(header.count()):
sizes.append(header.sectionSize(i))
config.persist["metadata_box_sizes"] = sizes
def resize_columns(self):
header = self.horizontalHeader()
width = header.length()
ncols = header.count()
visible_width = self.contentsRect().width()
scroll = self.verticalScrollBar()
if scroll.isVisible():
width -= scroll.width()
visible_width -= scroll.width()
if width != visible_width:
for i in range(ncols - 1):
newsize = int(round((float(visible_width) * header.sectionSize(i)) / float(width)))
self._resize_column(i, newsize)
def resizeEvent(self, event):
if abs(event.size().width() - event.oldSize().width()) > self.verticalScrollBar().width():
self.resize_columns()
super(MetadataBox, self).resizeEvent(event)
state = header.saveState()
config.persist["metadatabox_header_state"] = state