Pull Request ์ž‘์„ฑ๊ธฐ - wpfui (1)

wpfui (https://github.com/lepoco/wpfui)

๐Ÿ› ๏ธ WPF ๊ฐœ๋ฐœ, โ€˜wpfuiโ€™์™€์˜ ์„ค๋ ˆ๋Š” ์ฒซ ๋งŒ๋‚จ๊ณผ ์˜์™ธ์˜ ๋‚œ๊ด€

์ตœ๊ทผ ํ† ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ WPF๋กœ ์„ธ๋ จ๋œ UI๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์€ ์—ด๋ง์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋˜ ์ค‘ Fluent Design System ์Šคํƒ€์ผ์˜ ์ปจํŠธ๋กค์„ ์ œ๊ณตํ•˜๋Š” โ€˜wpfuiโ€™๋ผ๋Š” UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊น”๋”ํ•œ ๋””์ž์ธ๊ณผ ๋›ฐ์–ด๋‚œ ์‚ฌ์šฉ์„ฑ์— ๋งค๋ฃŒ๋˜์–ด ์ฃผ์ € ์—†์ด ํ”„๋กœ์ ํŠธ์— ๋„์ž…ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ดˆ๊ธฐ์—๋Š” ๋งŒ์กฑ์Šค๋Ÿฝ๊ฒŒ ์‚ฌ์šฉํ•˜๋˜ ์ค‘, ํŠน์ • ์ปจํŠธ๋กค์—์„œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋™์ž‘์„ ๋ฐœ๊ฒฌํ•˜๊ณ  ์˜์•„ํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ SplitButton์—์„œ ๋ฐœ์ƒํ•œ ์ด์ƒ ํ˜„์ƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿคจ SplitButton, ๊ธฐ๋Œ€์™€ ๋‹ฌ๋ž๋˜ ์ž‘๋™ ๋ฐฉ์‹์— ํ˜ผ๋ž€

์ œ๊ฐ€ ๋งˆ์ฃผ์นœ ๋ฌธ์ œ๋Š” SplitButton์˜ Flyout(ํŒ์—… ๋ฉ”๋‰ด) ์ž‘๋™ ๋ฐฉ์‹์— ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ SplitButton์€ ๋‘ ๊ฐœ์˜ distinctํ•œ ์˜์—ญ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋ฉ”์ธ ๋ฒ„ํŠผ ์˜์—ญ์„ ํด๋ฆญํ•˜๋ฉด ํŠน์ • ๊ธฐ๋Šฅ์ด ์‹คํ–‰๋˜๊ณ , ์˜ค๋ฅธ์ชฝ์˜ ์ž‘์€ ํ† ๊ธ€ ๋ฒ„ํŠผ ์˜์—ญ์„ ํด๋ฆญํ•˜๋ฉด Flyout์ด ์—ด๋ฆฌ๋Š” ๊ฒƒ์ด standardํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ โ€˜wpfuiโ€™์˜ SplitButton์€ ์™„์ „ํžˆ ๋‹ฌ๋ž์Šต๋‹ˆ๋‹ค. ํ† ๊ธ€ ๋ฒ„ํŠผ ์˜์—ญ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ๊ฐ„ํ˜น ๋ฉ”์ธ ๋ฒ„ํŠผ์˜ ์ปค๋งจ๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ฑฐ๋‚˜ Flyout์ด ์—ด๋ฆฌ์ง€ ์•Š๋Š” ํ˜„์ƒ์ด ์ง€์†์ ์œผ๋กœ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ์ œ ์ฝ”๋“œ์—์„œ SplitButton์˜ ์ด๋ฒคํŠธ๋ฅผ ์ž˜๋ชป ์ฒ˜๋ฆฌํ–ˆ๋‚˜ ์˜์‹ฌํ•˜๋ฉฐ ์—ฌ๋Ÿฌ ์ฐจ๋ก€ ๋””๋ฒ„๊น…์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ์•„๋ฌด๋ฆฌ ๊ผผ๊ผผํžˆ ์‚ดํŽด๋ณด์•„๋„ ์ œ ์‹ค์ˆ˜๋กœ ๋ณด์ด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ โ€˜wpfuiโ€™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ํŒŒํ—ค์น˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ControlTemplate๊ณผ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋กœ์ง์„ ๋ฉด๋ฐ€ํžˆ ์ถ”์ ํ•˜์—ฌ ๋ฌธ์ œ์˜ ๊ทผ๋ณธ ์›์ธ์„ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿšจ ๋ฌธ์ œ์˜ ํ•ต์‹ฌ: ํด๋ฆญ ์˜์—ญ ์ œํ•œ๊ณผ Flyout์˜ ๋ถ€์ž์—ฐ์Šค๋Ÿฌ์šด ๋™์ž‘

๊ธฐ์กด ๊ตฌํ˜„์—์„œ๋Š” ๋ฒ„ํŠผ์˜ ๋งค์šฐ ์ œํ•œ๋œ ๋ถ€๋ถ„, ํŠนํžˆ ํ…์ŠคํŠธ๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ์˜์—ญ์„ ์ •ํ™•ํžˆ ํด๋ฆญํ•ด์•ผ๋งŒ Flyout์ด ์ •์ƒ์ ์œผ๋กœ ์—ด๋ฆฌ๋„๋ก ๋˜์–ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ ๋ฌธ์ œ ํ™”๋ฉด:

ํ† ๊ธ€๋ฒ„ํŠผ์˜ ๋นจ๊ฐ„ ์˜์—ญ์„ ํด๋ฆญํ•ด์•ผ๋งŒ Flyout์ด ๋‚˜ํƒ€๋‚œ๋‹ค.

์ด๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ทน๋„๋กœ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ํ† ๊ธ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋™์ž‘(๋ฉ”์ธ ์ปค๋งจ๋“œ ์‹คํ–‰ ๋˜๋Š” ์•„๋ฌด ๋ฐ˜์‘ ์—†์Œ)์œผ๋กœ ์ธํ•ด UI๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋А๊ปด์กŒ์Šต๋‹ˆ๋‹ค.

โœ๏ธ ControlTemplate ์ˆ˜์ •์œผ๋กœ ํ•ด๊ฒฐ, ๋น„๋กœ์†Œ ์ฐพ์•„์˜จ ์‹œ์›ํ•จ

์ƒํ™ฉ์ด ๋„์ €ํžˆ ๊ฐœ์„ ๋  ์ˆ˜ ์—†๋‹ค๊ณ  ํŒ๋‹จํ•˜๊ณ , โ€˜wpfuiโ€™์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ SplitButton์˜ ControlTemplate์„ ์ง์ ‘ ์žฌ์ •์˜ํ•˜๊ณ  ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•ต์‹ฌ์€ ํ† ๊ธ€ ๋ฒ„ํŠผ์˜ ์–ด๋А ์˜์—ญ์„ ํด๋ฆญํ•˜๋”๋ผ๋„ ์ผ๊ด€์ ์œผ๋กœ Flyout์ด ์—ด๋ฆฌ๋„๋ก ์ด๋ฒคํŠธ ํŠธ๋ฆฌ๊ฑฐ ์กฐ๊ฑด์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋ฒˆ์˜ ์‹œ๋„ ๋์— ์›ํ•˜๋Š” ๋Œ€๋กœ ๋™์ž‘ํ•˜๋„๋ก ์ˆ˜์ •ํ–ˆ์„ ๋•Œ, ๋งˆ์Œ์† ๊นŠ์€ ๊ณณ์—์„œ ์‹œ์›ํ•จ์„ ๋А๊ผˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ ์ˆ˜์ • ํ›„ ํ™”๋ฉด:

์ด์ œ ํ† ๊ธ€๋ฒ„ํŠผ์˜ ์–ด๋””๋“  ํด๋ฆญํ•˜๋ฉด Flyout์ด ๋‚˜ํƒ€๋‚œ๋‹ค.

๋งˆ์นจ๋‚ด ์ œ๊ฐ€ ๊ธฐ๋Œ€ํ–ˆ๋˜ ์ž์—ฐ์Šค๋Ÿฌ์šด SplitButton์˜ ๋™์ž‘์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿš€ ๋‚˜๋งŒ์˜ ํ•ด๊ฒฐ์ฑ…์„ ๋„˜์–ด, ์˜คํ”ˆ์†Œ์Šค ๊ธฐ์—ฌ๋กœ ๋ฐœ๊ฑธ์Œ์„ ๋‚ด๋”›๋‹ค

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ํ›„, ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋“ค๋„ ์ด์™€ ์œ ์‚ฌํ•œ ์–ด๋ ค์›€์„ ๊ฒช์—ˆ์„ ๊ฒƒ์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

ํ˜ธ๊ธฐ์‹ฌ์— โ€˜wpfuiโ€™์˜ GitHub ์ €์žฅ์†Œ๋ฅผ ๋ฐฉ๋ฌธํ•ด Issues ๋ชฉ๋ก์„ ์‚ดํŽด๋ณด์•˜๊ณ , ๊ณผ์—ฐ ์ œ๊ฐ€ ๊ฒช์€ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ ํ•œ ์ด์Šˆ๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•˜๊ณ  ์•„์ง ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์ƒํƒœ์˜€์Šต๋‹ˆ๋‹ค!

์ด๋Š” ์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ๋„ ์‹ค์งˆ์ ์ธ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰์‹œ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ์— Pull Request(PR)๋ฅผ ํ†ตํ•ด ๊ธฐ์—ฌํ•  ๊ธฐํšŒ๋ผ๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

์ˆ˜์ •ํ•œ ์ฝ”๋“œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ โ€˜wpfuiโ€™ ์ €์žฅ์†Œ๋ฅผ ํฌํฌํ•˜๊ณ , ์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ปค๋ฐ‹ํ•˜๊ณ  ํ‘ธ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฌธ์ œ ์ด์Šˆ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํ˜•ํƒœ๋กœ PR์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ PR ํ™”๋ฉด:

PR ํ…œํ”Œ๋ฆฟ์ด ์ž˜ ๋˜์–ด์žˆ๋‹ค.

PR ํ…œํ”Œ๋ฆฟ์ด ์ž˜ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด ๋ฌธ์ œ ์„ค๋ช…๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ƒ์„ธํžˆ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ํฐ ์–ด๋ ค์›€์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๋ฐœ๊ฒฌํ•˜๊ณ  ํ•ด๊ฒฐํ•œ ์ž‘์€ ๋ฌธ์ œ๊ฐ€ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์— ๋ฟŒ๋“ฏํ•จ์„ ๋А๊ผˆ์Šต๋‹ˆ๋‹ค.

โณ Merge๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ, ์˜คํ”ˆ์†Œ์Šค ์ปจํŠธ๋ฆฌ๋ทฐํ„ฐ๊ฐ€ ๋˜๋Š” ๊ฟˆ

์ด์ œ ์ œ๊ฐ€ ์ œ์ถœํ•œ PR์ด ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ์ž๋“ค์˜ ๋ฆฌ๋ทฐ๋ฅผ ๊ฑฐ์ณ ๋ณ‘ํ•ฉ(Merge)๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. GitHub์— ์Œ“์—ฌ ์žˆ๋Š” ์ˆ˜๋งŽ์€ PR๋“ค์„ ๋ณด๋ฉฐ โ€˜์–ธ์ œ์ฏค ๋‚ด PR์ด ๊ฒ€ํ† ๋ ๊นŒ?โ€™ ํ•˜๋Š” ์ƒ๊ฐ๋„ ๋“ค์ง€๋งŒ, ์ œ๊ฐ€ ์ˆ˜์ •ํ•œ ์ฝ”๋“œ๊ฐ€ ๋ฐ˜์˜๋˜์–ด โ€˜wpfuiโ€™๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ๋„์›€์ด ๋˜๊ณ , ๋‚˜์•„๊ฐ€ ์ด ํ›Œ๋ฅญํ•œ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ์˜ ๊ณต์‹ Contributor ๋ชฉ๋ก์— ์ œ ์ด๋ฆ„(์•„์ด๋””)์ด ์ƒˆ๊ฒจ์ง€๋Š” ๋‚ ์„ ๊ฐ„์ ˆํžˆ ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!

๋น„๋ก ์ž‘์€ ๊ธฐ์—ฌ์ผ์ง€๋ผ๋„, ์ œ๊ฐ€ ๊ฒช์€ ๋ถˆํŽธํ•จ์„ ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋„ ๊ธ์ •์ ์ธ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์— ํฐ ๋ณด๋žŒ์„ ๋А๋‚๋‹ˆ๋‹ค. ์•ž์œผ๋กœ๋„ ์˜คํ”ˆ์†Œ์Šค ํ™œ๋™์— ๊พธ์ค€ํžˆ ์ฐธ์—ฌํ•˜๊ณ  ์‹ถ๋‹ค๋Š” ๋™๊ธฐ ๋ถ€์—ฌ๊ฐ€ ๋œ ๊ฒฝํ—˜์ด์—ˆ์Šต๋‹ˆ๋‹ค. Merge๋˜๋Š” ๊ทธ๋‚ ๊นŒ์ง€ ์„ค๋ ˆ๋Š” ๋งˆ์Œ์œผ๋กœ ๊ธฐ๋‹ค๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค!

๊ณต์œ ํ•˜๊ธฐ