Skip to content

Commit aecdc72

Browse files
Improved settings ui
1 parent 9a9fd7a commit aecdc72

File tree

5 files changed

+74
-47
lines changed

5 files changed

+74
-47
lines changed

src/@types/Settings.d.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export interface SettingsHeading {
1313
export interface Setting {
1414
label: string
1515
description: string
16-
type: null | 'text' | 'number' | 'boolean' | 'dropdown' | 'button' | 'styles'
16+
type: null | 'text' | 'number' | 'dimension' | 'boolean' | 'dropdown' | 'button' | 'styles'
1717

1818
parse?: (value: any) => any
1919
}
@@ -33,6 +33,11 @@ export interface NumberSetting extends Setting {
3333
parse: (value: string) => number
3434
}
3535

36+
export interface DimensionSetting extends Setting {
37+
type: 'dimension'
38+
parse: (value: [string, string]) => [number, number]
39+
}
40+
3641
export interface BooleanSetting extends Setting {
3742
type: 'boolean'
3843
}

src/canvas-extensions/better-default-settings-canvas-extension.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,16 @@ export default class BetterDefaultSettingsCanvasExtension extends CanvasExtensi
4747
private modifyCanvasSettings(canvas: Canvas | null) {
4848
if (!canvas) return
4949

50+
const defaultTextNodeDimensionsArray = this.plugin.settings.getSetting('defaultTextNodeDimensions')
5051
canvas.config.defaultTextNodeDimensions = {
51-
width: this.plugin.settings.getSetting('defaultTextNodeWidth'),
52-
height: this.plugin.settings.getSetting('defaultTextNodeHeight')
52+
width: defaultTextNodeDimensionsArray[0],
53+
height: defaultTextNodeDimensionsArray[1]
5354
}
5455

56+
const defaultFileNodeDimensionsArray = this.plugin.settings.getSetting('defaultFileNodeDimensions')
5557
canvas.config.defaultFileNodeDimensions = {
56-
width: this.plugin.settings.getSetting('defaultFileNodeWidth'),
57-
height: this.plugin.settings.getSetting('defaultFileNodeHeight')
58+
width: defaultFileNodeDimensionsArray[0],
59+
height: defaultFileNodeDimensionsArray[1]
5860
}
5961

6062
canvas.config.minContainerDimension = this.plugin.settings.getSetting('minNodeSize')

src/canvas-extensions/presentation-canvas-extension.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -158,9 +158,8 @@ export default class PresentationCanvasExtension extends CanvasExtension {
158158
}
159159

160160
private getDefaultSlideSize(): Size {
161-
const slideSizeString = this.plugin.settings.getSetting('defaultSlideSize')
162-
const slideSizeArray = slideSizeString.split('x').map((value: string) => parseInt(value))
163-
return { width: slideSizeArray[0], height: slideSizeArray[1] }
161+
const slideSize = this.plugin.settings.getSetting('defaultSlideDimensions')
162+
return { width: slideSize[0], height: slideSize[1] }
164163
}
165164

166165
private getSlideAspectRatio(): number {

src/settings.ts

Lines changed: 56 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { Notice, PluginSettingTab, Setting as SettingEl } from "obsidian"
2-
import { BooleanSetting, ButtonSetting, DropdownSetting, NumberSetting, Setting, SettingsHeading, StyleAttributesSetting, TextSetting } from "./@types/Settings"
1+
import { Notice, PluginSettingTab, Setting as SettingEl, TextComponent } from "obsidian"
2+
import { BooleanSetting, ButtonSetting, DimensionSetting, DropdownSetting, NumberSetting, Setting, SettingsHeading, StyleAttributesSetting, TextSetting } from "./@types/Settings"
33
import { BUILTIN_EDGE_STYLE_ATTRIBUTES, BUILTIN_NODE_STYLE_ATTRIBUTES, StyleAttribute } from "./canvas-extensions/advanced-styles/style-config"
44
import { VARIABLE_BREAKPOINT_CSS_VAR } from "./canvas-extensions/variable-breakpoint-canvas-extension"
55
import AdvancedCanvasPlugin from "./main"
@@ -18,10 +18,8 @@ export interface AdvancedCanvasPluginSettingsValues {
1818

1919
nodeTypeOnDoubleClick: keyof typeof SETTINGS.general.children.nodeTypeOnDoubleClick.options
2020
alignNewNodesToGrid: boolean
21-
defaultTextNodeWidth: number
22-
defaultTextNodeHeight: number
23-
defaultFileNodeWidth: number
24-
defaultFileNodeHeight: number
21+
defaultTextNodeDimensions: [number, number]
22+
defaultFileNodeDimensions: [number, number]
2523
minNodeSize: number
2624
maxNodeWidth: number
2725
disableFontSizeRelativeToZoom: boolean
@@ -84,7 +82,7 @@ export interface AdvancedCanvasPluginSettingsValues {
8482

8583
presentationFeatureEnabled: boolean
8684
showSetStartNodeInPopup: boolean
87-
defaultSlideSize: string
85+
defaultSlideDimensions: [number, number]
8886
wrapInSlidePadding: number
8987
resetViewportOnPresentationEnd: boolean
9088
useArrowKeysToChangeSlides: boolean
@@ -106,10 +104,8 @@ export const DEFAULT_SETTINGS_VALUES: AdvancedCanvasPluginSettingsValues = {
106104

107105
nodeTypeOnDoubleClick: 'text',
108106
alignNewNodesToGrid: true,
109-
defaultTextNodeWidth: 260,
110-
defaultTextNodeHeight: 60,
111-
defaultFileNodeWidth: 400,
112-
defaultFileNodeHeight: 400,
107+
defaultTextNodeDimensions: [260, 60],
108+
defaultFileNodeDimensions: [400, 400],
113109
minNodeSize: 60,
114110
maxNodeWidth: -1,
115111
disableFontSizeRelativeToZoom: false,
@@ -172,7 +168,7 @@ export const DEFAULT_SETTINGS_VALUES: AdvancedCanvasPluginSettingsValues = {
172168

173169
presentationFeatureEnabled: true,
174170
showSetStartNodeInPopup: false,
175-
defaultSlideSize: '1200x675',
171+
defaultSlideDimensions: [1200, 675],
176172
wrapInSlidePadding: 20,
177173
resetViewportOnPresentationEnd: true,
178174
useArrowKeysToChangeSlides: true,
@@ -209,33 +205,29 @@ export const SETTINGS = {
209205
description: 'When enabled, new nodes will be aligned to the grid.',
210206
type: 'boolean'
211207
},
212-
defaultTextNodeWidth: {
213-
label: 'Default text node width',
214-
description: 'The default width of a text node.',
215-
type: 'number',
216-
parse: (value: string) => Math.max(1, parseInt(value) || 0)
217-
},
218-
defaultTextNodeHeight: {
219-
label: 'Default text node height',
220-
description: 'The default height of a text node.',
221-
type: 'number',
222-
parse: (value: string) => Math.max(1, parseInt(value) || 0)
223-
},
224-
defaultFileNodeWidth: {
225-
label: 'Default file node width',
226-
description: 'The default width of a file node.',
227-
type: 'number',
228-
parse: (value: string) => Math.max(1, parseInt(value) || 0)
208+
defaultTextNodeDimensions: {
209+
label: 'Default text node dimensions',
210+
description: 'The default dimensions of a text node.',
211+
type: 'dimension',
212+
parse: (value: [string, string]) => {
213+
const width = Math.max(1, parseInt(value[0]) || 0)
214+
const height = Math.max(1, parseInt(value[1]) || 0)
215+
return [width, height]
216+
}
229217
},
230-
defaultFileNodeHeight: {
231-
label: 'Default file node height',
232-
description: 'The default height of a file node.',
233-
type: 'number',
234-
parse: (value: string) => Math.max(1, parseInt(value) || 0)
218+
defaultFileNodeDimensions: {
219+
label: 'Default file node dimensions',
220+
description: 'The default dimensions of a file node.',
221+
type: 'dimension',
222+
parse: (value: [string, string]) => {
223+
const width = Math.max(1, parseInt(value[0]) || 0)
224+
const height = Math.max(1, parseInt(value[1]) || 0)
225+
return [width, height]
226+
}
235227
},
236228
minNodeSize: {
237229
label: 'Minimum node size',
238-
description: 'The minimum size of a node.',
230+
description: 'The minimum size (either width or height) of a node.',
239231
type: 'number',
240232
parse: (value: string) => Math.max(1, parseInt(value) || 0)
241233
},
@@ -427,10 +419,15 @@ export const SETTINGS = {
427419
description: 'If turned off, you can still set the start node using the corresponding command.',
428420
type: 'boolean'
429421
},
430-
defaultSlideSize: {
431-
label: 'Default slide ratio',
432-
description: 'The default ratio of the slide. For example, 16:9 is 1200x675 and 3:2 is 1350x900.',
433-
type: 'text'
422+
defaultSlideDimensions: {
423+
label: 'Default slide dimensions',
424+
description: 'The default dimensions of a slide.',
425+
type: 'dimension',
426+
parse: (value: [string, string]) => {
427+
const width = Math.max(1, parseInt(value[0]) || 0)
428+
const height = Math.max(1, parseInt(value[1]) || 0)
429+
return [width, height]
430+
}
434431
},
435432
wrapInSlidePadding: {
436433
label: 'Wrap in slide padding',
@@ -625,6 +622,9 @@ export class AdvancedCanvasPluginSettingTab extends PluginSettingTab {
625622
case 'number':
626623
this.createNumberSetting(settingsHeaderChildrenContainerEl, settingId, setting as NumberSetting)
627624
break
625+
case 'dimension':
626+
this.createDimensionSetting(settingsHeaderChildrenContainerEl, settingId, setting as DimensionSetting)
627+
break
628628
case 'boolean':
629629
this.createBooleanSetting(settingsHeaderChildrenContainerEl, settingId, setting as BooleanSetting)
630630
break
@@ -707,6 +707,23 @@ export class AdvancedCanvasPluginSettingTab extends PluginSettingTab {
707707
)
708708
}
709709

710+
private createDimensionSetting(containerEl: HTMLElement, settingId: keyof AdvancedCanvasPluginSettingsValues, setting: DimensionSetting) {
711+
let text1: TextComponent
712+
let text2: TextComponent
713+
714+
new SettingEl(containerEl)
715+
.setName(setting.label)
716+
.setDesc(setting.description)
717+
.addText(text => {
718+
text1 = text.setValue((this.settingsManager.getSetting(settingId) as [number, number])[0].toString())
719+
.onChange(async (value) => await this.settingsManager.setSetting({ [settingId]: setting.parse([value, text2.getValue()]) }))
720+
})
721+
.addText(text => {
722+
text2 = text.setValue((this.settingsManager.getSetting(settingId) as [number, number])[1].toString())
723+
.onChange(async (value) => await this.settingsManager.setSetting({ [settingId]: setting.parse([text1.getValue(), value]) }))
724+
})
725+
}
726+
710727
private createBooleanSetting(containerEl: HTMLElement, settingId: keyof AdvancedCanvasPluginSettingsValues, setting: BooleanSetting) {
711728
new SettingEl(containerEl)
712729
.setName(setting.label)

src/styles/settings.scss

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222
margin-top: var(--size-4-10) !important;
2323
}
2424

25+
&:has(.checkbox-container:not(.is-enabled)) {
26+
border-bottom-color: var(--background-modifier-border-hover);
27+
}
28+
2529
.setting-item-description {
2630
margin-inline-end: 20px;
2731
}

0 commit comments

Comments
 (0)