|
73 | 73 | )
|
74 | 74 |
|
75 | 75 |
|
| 76 | +def bit_not(num): |
| 77 | + """Bitwise not, unsigned""" |
| 78 | + return num ^ ((1 << num.bit_length()) - 1) |
| 79 | + |
| 80 | + |
76 | 81 | class TagStatus:
|
77 | 82 | NONE = 0
|
78 | 83 | NOCHANGE = 1
|
@@ -185,6 +190,12 @@ def tag_status(self, tag):
|
185 | 190 | return s
|
186 | 191 | return TagStatus.NOCHANGE
|
187 | 192 |
|
| 193 | + def set_bits(self, tag, bits): |
| 194 | + self.status[tag] |= bits |
| 195 | + |
| 196 | + def unset_bits(self, tag, bits): |
| 197 | + self.status[tag] &= bit_not(bits) |
| 198 | + |
188 | 199 |
|
189 | 200 | class TableTagEditorDelegate(TagEditorDelegate):
|
190 | 201 |
|
@@ -474,7 +485,7 @@ def _edit_selected_tag(self):
|
474 | 485 | self._edit_tag(tags[0])
|
475 | 486 |
|
476 | 487 | def _toggle_preserved(self):
|
477 |
| - for tag in self._selected_tags(filter_func=self._tag_is_editable): |
| 488 | + for tag in self._selected_tags(filter_func=lambda t: t != '~length'): |
478 | 489 | if tag in self.preserved_tags:
|
479 | 490 | self.preserved_tags.discard(tag)
|
480 | 491 | else:
|
@@ -714,11 +725,14 @@ def _update_items(self, result=None, error=None):
|
714 | 725 | if not new_item:
|
715 | 726 | new_item = QtWidgets.QTableWidgetItem()
|
716 | 727 | new_item.setTextAlignment(alignment)
|
717 |
| - if tag == '~length': |
718 |
| - new_item.setFlags(orig_flags) |
719 |
| - else: |
720 |
| - new_item.setFlags(new_flags) |
721 | 728 | self.setItem(i, self.COLUMN_NEW, new_item)
|
| 729 | + if is_preserved or tag == '~length': |
| 730 | + self.tag_diff.set_bits(tag, TagStatus.NOTREMOVABLE | TagStatus.READONLY) |
| 731 | + new_item.setFlags(orig_flags) |
| 732 | + else: |
| 733 | + if tag != '~length': |
| 734 | + self.tag_diff.unset_bits(tag, TagStatus.NOTREMOVABLE | TagStatus.READONLY) |
| 735 | + new_item.setFlags(new_flags) |
722 | 736 | self._set_item_value(new_item, self.tag_diff.new, tag)
|
723 | 737 | font = new_item.font()
|
724 | 738 | strikeout = self.tag_diff.tag_status(tag) == TagStatus.REMOVED
|
|
0 commit comments