Skip to content

Commit e151768

Browse files
committed
fix: UI duplication where “Minimum compression savings (KB)” kept getting added repeatedly.
Bound “Revert to original if larger” and “Minimum compression savings (KB)” to conversion presets (with fallbacks) so they are saved into presets correctly and show up in summaries.
1 parent f051606 commit e151768

File tree

3 files changed

+45
-13
lines changed

3 files changed

+45
-13
lines changed

src/ImageConverterSettings.ts

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ export interface ConversionPreset {
7878
desiredLongestEdge: number;
7979
enlargeOrReduce: EnlargeReduce;
8080
allowLargerFiles: boolean;
81+
revertToOriginalIfLarger?: boolean;
82+
minimumCompressionSavingsInKB?: number;
8183
skipConversionPatterns: string;
8284
pngquantExecutablePath?: string;
8385
pngquantQuality?: string;
@@ -277,6 +279,8 @@ export const DEFAULT_SETTINGS: ImageConverterSettings = {
277279
desiredLongestEdge: 1000,
278280
enlargeOrReduce: "Auto",
279281
allowLargerFiles: false,
282+
revertToOriginalIfLarger: false,
283+
minimumCompressionSavingsInKB: 30,
280284
skipConversionPatterns: "",
281285
pngquantExecutablePath: "",
282286
pngquantQuality: "65-80",
@@ -295,6 +299,8 @@ export const DEFAULT_SETTINGS: ImageConverterSettings = {
295299
desiredLongestEdge: 1000,
296300
enlargeOrReduce: "Auto",
297301
allowLargerFiles: false,
302+
revertToOriginalIfLarger: false,
303+
minimumCompressionSavingsInKB: 30,
298304
skipConversionPatterns: "",
299305
pngquantExecutablePath: "",
300306
pngquantQuality: "65-80",
@@ -313,6 +319,8 @@ export const DEFAULT_SETTINGS: ImageConverterSettings = {
313319
desiredLongestEdge: 1000,
314320
enlargeOrReduce: "Auto",
315321
allowLargerFiles: false,
322+
revertToOriginalIfLarger: false,
323+
minimumCompressionSavingsInKB: 30,
316324
skipConversionPatterns: "",
317325
pngquantExecutablePath: "",
318326
pngquantQuality: "65-80",
@@ -2143,6 +2151,9 @@ export class ImageConverterSettingTab extends PluginSettingTab {
21432151
const revertToOriginalSetting = containerEl.querySelector(
21442152
".image-converter-revert-to-original"
21452153
);
2154+
const minSavingsSettingEl = containerEl.querySelector(
2155+
".image-converter-min-savings-setting"
2156+
);
21462157
const pngquantExecutablePathSetting = containerEl.querySelector(".image-converter-pngquant-executable-path");
21472158
const pngquantQualitySetting = containerEl.querySelector(".image-converter-pngquant-quality");
21482159

@@ -2161,6 +2172,7 @@ export class ImageConverterSettingTab extends PluginSettingTab {
21612172
desiredLongestEdgeSetting?.remove();
21622173
enlargeOrReduceSetting?.remove();
21632174
revertToOriginalSetting?.remove();
2175+
minSavingsSettingEl?.remove();
21642176
pngquantExecutablePathSetting?.remove();
21652177
pngquantQualitySetting?.remove();
21662178

@@ -2766,9 +2778,9 @@ export class ImageConverterSettingTab extends PluginSettingTab {
27662778
.setDesc("If the processed image filesize is larger than the original, use the original image instead. Sometimes compression can increase file size, especially with certain formats or settings, but if you would prefer to always get smaller file sizes, enable this option.")
27672779
.addToggle((toggle) =>
27682780
toggle
2769-
.setValue(this.plugin.settings.revertToOriginalIfLarger)
2781+
.setValue(preset.revertToOriginalIfLarger ?? this.plugin.settings.revertToOriginalIfLarger)
27702782
.onChange(async (value) => {
2771-
this.plugin.settings.revertToOriginalIfLarger = value;
2783+
preset.revertToOriginalIfLarger = value;
27722784
await this.plugin.saveSettings();
27732785
updateMinSavingsVisibility();
27742786
})
@@ -2782,16 +2794,17 @@ export class ImageConverterSettingTab extends PluginSettingTab {
27822794
const minSavingsSetting = new Setting(containerEl)
27832795
// eslint-disable-next-line obsidianmd/ui/sentence-case
27842796
.setName("Minimum compression savings (KB)")
2797+
.setClass("image-converter-min-savings-setting")
27852798
// eslint-disable-next-line obsidianmd/ui/sentence-case
27862799
.setDesc("This option allows you to further specify, how much the file size must be reduced before compressing the image. Sometimes an image's size might shrink by only 3 KB, but the visible degradation in quality is significant. This option helps catch those cases and avoids compressing such images. Default is 30kb, which means if after compressing the image file size would reduce only by 30kb or less, then the original image bytes will be used instead. Set to 0 to always allow compression when the output is smaller.")
27872800
.addText((text) =>
27882801
text
27892802
.setPlaceholder("30")
2790-
.setValue(String(this.plugin.settings.minimumCompressionSavingsInKB))
2803+
.setValue(String(preset.minimumCompressionSavingsInKB ?? this.plugin.settings.minimumCompressionSavingsInKB))
27912804
.onChange(async (value) => {
27922805
const numValue = Number(value);
27932806
if (!isNaN(numValue) && numValue >= 0) {
2794-
this.plugin.settings.minimumCompressionSavingsInKB = numValue;
2807+
preset.minimumCompressionSavingsInKB = numValue;
27952808
await this.plugin.saveSettings();
27962809
}
27972810
})
@@ -2803,7 +2816,7 @@ export class ImageConverterSettingTab extends PluginSettingTab {
28032816
lastAddedSetting = minSavingsSetting.settingEl;
28042817

28052818
const updateMinSavingsVisibility = () => {
2806-
if (this.plugin.settings.revertToOriginalIfLarger) {
2819+
if (preset.revertToOriginalIfLarger ?? this.plugin.settings.revertToOriginalIfLarger) {
28072820
minSavingsSetting.settingEl.show();
28082821
} else {
28092822
minSavingsSetting.settingEl.hide();
@@ -3049,6 +3062,8 @@ export class ImageConverterSettingTab extends PluginSettingTab {
30493062
desiredLongestEdge: 1000,
30503063
enlargeOrReduce: "Auto",
30513064
allowLargerFiles: false,
3065+
revertToOriginalIfLarger: false,
3066+
minimumCompressionSavingsInKB: 30,
30523067
skipConversionPatterns: "",
30533068
ffmpegExecutablePath: this.plugin.settings.ffmpegExecutablePath || "",
30543069
ffmpegCrf: 23,
@@ -3228,6 +3243,12 @@ export class ImageConverterSettingTab extends PluginSettingTab {
32283243
if (preset.skipConversionPatterns) {
32293244
addLine(`Skip Patterns: ${preset.skipConversionPatterns}`);
32303245
}
3246+
if (preset.revertToOriginalIfLarger) {
3247+
addLine("Revert to original if larger: Yes");
3248+
if (preset.minimumCompressionSavingsInKB !== undefined) {
3249+
addLine(`Minimum compression savings (KB): ${preset.minimumCompressionSavingsInKB}`);
3250+
}
3251+
}
32313252

32323253
return fragment;
32333254
}
@@ -4059,6 +4080,10 @@ export class SaveGlobalPresetModal extends Modal {
40594080
sectionEl.appendChild(createSummaryItem("Scale", conversionP.enlargeOrReduce));
40604081
}
40614082
sectionEl.appendChild(createSummaryItem("Allow larger files", conversionP.allowLargerFiles ? "Yes" : "No"));
4083+
if (conversionP.revertToOriginalIfLarger) {
4084+
sectionEl.appendChild(createSummaryItem("Revert to original if larger", "Yes"));
4085+
sectionEl.appendChild(createSummaryItem("Minimum compression savings (KB)", conversionP.minimumCompressionSavingsInKB));
4086+
}
40624087
sectionEl.appendChild(createSummaryItem("Skip patterns", conversionP.skipConversionPatterns));
40634088
}
40644089
break;

src/main.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -762,11 +762,14 @@ export default class ImageConverterPlugin extends Plugin {
762762
// - Create the new image file in the Obsidian vault using `createBinary`.
763763
// Show space savings notification
764764
// Check if processed image is larger than original + minimum savings
765-
const minSavingsKB = (typeof this.settings.minimumCompressionSavingsInKB === 'number' && this.settings.minimumCompressionSavingsInKB >= 0)
766-
? this.settings.minimumCompressionSavingsInKB
765+
const minSavingsKB = (typeof (selectedConversionPreset?.minimumCompressionSavingsInKB ?? this.settings.minimumCompressionSavingsInKB) === 'number'
766+
&& (selectedConversionPreset?.minimumCompressionSavingsInKB ?? this.settings.minimumCompressionSavingsInKB) >= 0)
767+
? (selectedConversionPreset?.minimumCompressionSavingsInKB ?? this.settings.minimumCompressionSavingsInKB)
767768
: 30;
769+
const shouldRevertIfLarger = selectedConversionPreset?.revertToOriginalIfLarger
770+
?? this.settings.revertToOriginalIfLarger;
768771

769-
if (this.settings.revertToOriginalIfLarger && this.processedImage.byteLength + (minSavingsKB * 1024) > originalSize) {
772+
if (shouldRevertIfLarger && this.processedImage.byteLength + (minSavingsKB * 1024) > originalSize) {
770773
// User wants to revert AND processed image is larger
771774
this.showSizeComparisonNotification(originalSize, this.processedImage.byteLength);
772775
new Notice(`Using original image for "${file.name}" because size reduction was less than ${minSavingsKB} KB.`);
@@ -1100,11 +1103,14 @@ export default class ImageConverterPlugin extends Plugin {
11001103
// - Create the new image file in the Obsidian vault using `createBinary`.
11011104
// - Show space savings notification
11021105
// Check if processed image is larger than original + minimum savings
1103-
const minSavingsKB = (typeof this.settings.minimumCompressionSavingsInKB === 'number' && this.settings.minimumCompressionSavingsInKB >= 0)
1104-
? this.settings.minimumCompressionSavingsInKB
1106+
const minSavingsKB = (typeof (selectedConversionPreset?.minimumCompressionSavingsInKB ?? this.settings.minimumCompressionSavingsInKB) === 'number'
1107+
&& (selectedConversionPreset?.minimumCompressionSavingsInKB ?? this.settings.minimumCompressionSavingsInKB) >= 0)
1108+
? (selectedConversionPreset?.minimumCompressionSavingsInKB ?? this.settings.minimumCompressionSavingsInKB)
11051109
: 30;
1110+
const shouldRevertIfLarger = selectedConversionPreset?.revertToOriginalIfLarger
1111+
?? this.settings.revertToOriginalIfLarger;
11061112

1107-
if (this.settings.revertToOriginalIfLarger && this.processedImage.byteLength + (minSavingsKB * 1024) > originalSize) {
1113+
if (shouldRevertIfLarger && this.processedImage.byteLength + (minSavingsKB * 1024) > originalSize) {
11081114
// User wants to revert AND processed image is larger
11091115
this.showSizeComparisonNotification(originalSize, this.processedImage.byteLength);
11101116
new Notice(`Using original image for "${file.name}" because size reduction was less than ${minSavingsKB} KB.`);

tests/integration/main/ConflictResolution.test.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,9 @@ describe('Conflict resolution and overwrite safety (Phase 9: 27.2)', () => {
117117

118118
(plugin as any).settings.modalBehavior = 'never';
119119
(plugin as any).settings.selectedConversionPreset = 'WEBP (75, no resizing)';
120-
(plugin as any).settings.revertToOriginalIfLarger = true;
121-
(plugin as any).settings.minimumCompressionSavingsInKB = 1;
120+
const selectedPreset = (plugin as any).settings.conversionPresets.find((preset: any) => preset.name === 'WEBP (75, no resizing)');
121+
selectedPreset.revertToOriginalIfLarger = true;
122+
selectedPreset.minimumCompressionSavingsInKB = 1;
122123

123124
const processedBuffer = new ArrayBuffer(1500);
124125
(plugin as any).imageProcessor = { processImage: vi.fn(async () => processedBuffer) };

0 commit comments

Comments
 (0)