diff --git a/kindlecomicconverter/KCC_gui.py b/kindlecomicconverter/KCC_gui.py index 54616da..50f290b 100644 --- a/kindlecomicconverter/KCC_gui.py +++ b/kindlecomicconverter/KCC_gui.py @@ -1433,6 +1433,64 @@ class KCCGUI(KCC_ui.Ui_mainWindow): class KCCGUI_MetaEditor(KCC_ui_editor.Ui_editorDialog): + def _buildBulkFieldToolTip(self, fieldLabel, valuesByFile): + """Build HTML tooltip for bulk metadata mismatch fields. + + valuesByFile: list of (file_path, value_str) + - if <= 20 rows: show File | Value + - else: show Value | Count + """ + note = '

Note: Changing this field will overwrite all values in all selected files.

' + + if len(valuesByFile) <= 20: + rows = ''.join( + '' + f'{escape(os.path.basename(f))}' + f'{escape(v)}' + '' + for f, v in valuesByFile + ) + + table = ( + '' + '' + '' + '' + '' + f'{rows}' + '
FileValue
' + ) + else: + counts = {} + for _, v in valuesByFile: + counts[v] = counts.get(v, 0) + 1 + + rows = ''.join( + '' + f'{escape(v)}' + f'{c}' + '' + for v, c in sorted(counts.items(), key=lambda t: (-t[1], t[0])) + ) + + table = ( + '' + '' + '' + '' + '' + f'{rows}' + '
ValueCount
' + ) + + tooltipHTML = f'\ + {escape(fieldLabel)}\ + {note}\ + {table}\ + ' + + return tooltipHTML + def loadData(self, files): self.files = files if isinstance(files, list) else [files] self.bulkMode = len(self.files) > 1 @@ -1455,25 +1513,44 @@ class KCCGUI_MetaEditor(KCC_ui_editor.Ui_editorDialog): self.editorWidget.setEnabled(True) self.okButton.setEnabled(True) self.statusLabel.setText(f'Editing {len(self.files)} files.') - + # Show bulk volume checkbox self.bulkVolumeCheck.setVisible(True) self.bulkVolumeCheck.setChecked(False) - + for field in (self.volumeLine, self.numberLine, self.titleLine): field.setEnabled(False) field.setText('') field.setPlaceholderText('(multiple files)') - - for field in (self.seriesLine,): - field.setEnabled(True) - field.setPlaceholderText('') - field.setText(self.parser.data[field.objectName().capitalize()[:-4]]) - - for field in (self.writerLine, self.pencillerLine, self.inkerLine, self.coloristLine): - field.setEnabled(True) - field.setPlaceholderText('') - field.setText(', '.join(self.parser.data[field.objectName().capitalize()[:-4] + 's'])) + field.setToolTip('') + + # Load metadata for all files and show common values, or “(multiple values)” + tooltip. + parsed = [] + for file in self.files: + parsed.append((file, metadata.MetadataParser(file))) + + field_specs = [ + (self.seriesLine, 'Series', lambda p: (p.data.get('Series', '') or '')), + (self.writerLine, 'Writer', lambda p: ', '.join(p.data.get('Writers', []) or [])), + (self.pencillerLine, 'Penciller', lambda p: ', '.join(p.data.get('Pencillers', []) or [])), + (self.inkerLine, 'Inker', lambda p: ', '.join(p.data.get('Inkers', []) or [])), + (self.coloristLine, 'Colorist', lambda p: ', '.join(p.data.get('Colorists', []) or [])), + ] + + for line, label, extractor in field_specs: + line.setEnabled(True) + valuesByFile = [(f, extractor(p)) for f, p in parsed] + uniqueValues = {v for _, v in valuesByFile} + + if len(uniqueValues) == 1: + common_value = valuesByFile[0][1] if valuesByFile else '' + line.setPlaceholderText('') + line.setToolTip('') + line.setText(common_value) + else: + line.setText('') + line.setPlaceholderText('(multiple values)') + line.setToolTip(self._buildBulkFieldToolTip(label, valuesByFile)) else: file = self.files[0] self.parser = metadata.MetadataParser(file)