semigraphics.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. package tview
  2. import "github.com/gdamore/tcell/v2"
  3. // Semigraphics provides an easy way to access unicode characters for drawing.
  4. //
  5. // Named like the unicode characters, 'Semigraphics'-prefix used if unicode block
  6. // isn't prefixed itself.
  7. const (
  8. // Block: General Punctation U+2000-U+206F (http://unicode.org/charts/PDF/U2000.pdf)
  9. SemigraphicsHorizontalEllipsis rune = '\u2026' // …
  10. // Block: Box Drawing U+2500-U+257F (http://unicode.org/charts/PDF/U2500.pdf)
  11. BoxDrawingsLightHorizontal rune = '\u2500' // ─
  12. BoxDrawingsHeavyHorizontal rune = '\u2501' // ━
  13. BoxDrawingsLightVertical rune = '\u2502' // │
  14. BoxDrawingsHeavyVertical rune = '\u2503' // ┃
  15. BoxDrawingsLightTripleDashHorizontal rune = '\u2504' // ┄
  16. BoxDrawingsHeavyTripleDashHorizontal rune = '\u2505' // ┅
  17. BoxDrawingsLightTripleDashVertical rune = '\u2506' // ┆
  18. BoxDrawingsHeavyTripleDashVertical rune = '\u2507' // ┇
  19. BoxDrawingsLightQuadrupleDashHorizontal rune = '\u2508' // ┈
  20. BoxDrawingsHeavyQuadrupleDashHorizontal rune = '\u2509' // ┉
  21. BoxDrawingsLightQuadrupleDashVertical rune = '\u250a' // ┊
  22. BoxDrawingsHeavyQuadrupleDashVertical rune = '\u250b' // ┋
  23. BoxDrawingsLightDownAndRight rune = '\u250c' // ┌
  24. BoxDrawingsDownLighAndRightHeavy rune = '\u250d' // ┍
  25. BoxDrawingsDownHeavyAndRightLight rune = '\u250e' // ┎
  26. BoxDrawingsHeavyDownAndRight rune = '\u250f' // ┏
  27. BoxDrawingsLightDownAndLeft rune = '\u2510' // ┐
  28. BoxDrawingsDownLighAndLeftHeavy rune = '\u2511' // ┑
  29. BoxDrawingsDownHeavyAndLeftLight rune = '\u2512' // ┒
  30. BoxDrawingsHeavyDownAndLeft rune = '\u2513' // ┓
  31. BoxDrawingsLightUpAndRight rune = '\u2514' // └
  32. BoxDrawingsUpLightAndRightHeavy rune = '\u2515' // ┕
  33. BoxDrawingsUpHeavyAndRightLight rune = '\u2516' // ┖
  34. BoxDrawingsHeavyUpAndRight rune = '\u2517' // ┗
  35. BoxDrawingsLightUpAndLeft rune = '\u2518' // ┘
  36. BoxDrawingsUpLightAndLeftHeavy rune = '\u2519' // ┙
  37. BoxDrawingsUpHeavyAndLeftLight rune = '\u251a' // ┚
  38. BoxDrawingsHeavyUpAndLeft rune = '\u251b' // ┛
  39. BoxDrawingsLightVerticalAndRight rune = '\u251c' // ├
  40. BoxDrawingsVerticalLightAndRightHeavy rune = '\u251d' // ┝
  41. BoxDrawingsUpHeavyAndRightDownLight rune = '\u251e' // ┞
  42. BoxDrawingsDownHeacyAndRightUpLight rune = '\u251f' // ┟
  43. BoxDrawingsVerticalHeavyAndRightLight rune = '\u2520' // ┠
  44. BoxDrawingsDownLightAnbdRightUpHeavy rune = '\u2521' // ┡
  45. BoxDrawingsUpLightAndRightDownHeavy rune = '\u2522' // ┢
  46. BoxDrawingsHeavyVerticalAndRight rune = '\u2523' // ┣
  47. BoxDrawingsLightVerticalAndLeft rune = '\u2524' // ┤
  48. BoxDrawingsVerticalLightAndLeftHeavy rune = '\u2525' // ┥
  49. BoxDrawingsUpHeavyAndLeftDownLight rune = '\u2526' // ┦
  50. BoxDrawingsDownHeavyAndLeftUpLight rune = '\u2527' // ┧
  51. BoxDrawingsVerticalheavyAndLeftLight rune = '\u2528' // ┨
  52. BoxDrawingsDownLightAndLeftUpHeavy rune = '\u2529' // ┨
  53. BoxDrawingsUpLightAndLeftDownHeavy rune = '\u252a' // ┪
  54. BoxDrawingsHeavyVerticalAndLeft rune = '\u252b' // ┫
  55. BoxDrawingsLightDownAndHorizontal rune = '\u252c' // ┬
  56. BoxDrawingsLeftHeavyAndRightDownLight rune = '\u252d' // ┭
  57. BoxDrawingsRightHeavyAndLeftDownLight rune = '\u252e' // ┮
  58. BoxDrawingsDownLightAndHorizontalHeavy rune = '\u252f' // ┯
  59. BoxDrawingsDownHeavyAndHorizontalLight rune = '\u2530' // ┰
  60. BoxDrawingsRightLightAndLeftDownHeavy rune = '\u2531' // ┱
  61. BoxDrawingsLeftLightAndRightDownHeavy rune = '\u2532' // ┲
  62. BoxDrawingsHeavyDownAndHorizontal rune = '\u2533' // ┳
  63. BoxDrawingsLightUpAndHorizontal rune = '\u2534' // ┴
  64. BoxDrawingsLeftHeavyAndRightUpLight rune = '\u2535' // ┵
  65. BoxDrawingsRightHeavyAndLeftUpLight rune = '\u2536' // ┶
  66. BoxDrawingsUpLightAndHorizontalHeavy rune = '\u2537' // ┷
  67. BoxDrawingsUpHeavyAndHorizontalLight rune = '\u2538' // ┸
  68. BoxDrawingsRightLightAndLeftUpHeavy rune = '\u2539' // ┹
  69. BoxDrawingsLeftLightAndRightUpHeavy rune = '\u253a' // ┺
  70. BoxDrawingsHeavyUpAndHorizontal rune = '\u253b' // ┻
  71. BoxDrawingsLightVerticalAndHorizontal rune = '\u253c' // ┼
  72. BoxDrawingsLeftHeavyAndRightVerticalLight rune = '\u253d' // ┽
  73. BoxDrawingsRightHeavyAndLeftVerticalLight rune = '\u253e' // ┾
  74. BoxDrawingsVerticalLightAndHorizontalHeavy rune = '\u253f' // ┿
  75. BoxDrawingsUpHeavyAndDownHorizontalLight rune = '\u2540' // ╀
  76. BoxDrawingsDownHeavyAndUpHorizontalLight rune = '\u2541' // ╁
  77. BoxDrawingsVerticalHeavyAndHorizontalLight rune = '\u2542' // ╂
  78. BoxDrawingsLeftUpHeavyAndRightDownLight rune = '\u2543' // ╃
  79. BoxDrawingsRightUpHeavyAndLeftDownLight rune = '\u2544' // ╄
  80. BoxDrawingsLeftDownHeavyAndRightUpLight rune = '\u2545' // ╅
  81. BoxDrawingsRightDownHeavyAndLeftUpLight rune = '\u2546' // ╆
  82. BoxDrawingsDownLightAndUpHorizontalHeavy rune = '\u2547' // ╇
  83. BoxDrawingsUpLightAndDownHorizontalHeavy rune = '\u2548' // ╈
  84. BoxDrawingsRightLightAndLeftVerticalHeavy rune = '\u2549' // ╉
  85. BoxDrawingsLeftLightAndRightVerticalHeavy rune = '\u254a' // ╊
  86. BoxDrawingsHeavyVerticalAndHorizontal rune = '\u254b' // ╋
  87. BoxDrawingsLightDoubleDashHorizontal rune = '\u254c' // ╌
  88. BoxDrawingsHeavyDoubleDashHorizontal rune = '\u254d' // ╍
  89. BoxDrawingsLightDoubleDashVertical rune = '\u254e' // ╎
  90. BoxDrawingsHeavyDoubleDashVertical rune = '\u254f' // ╏
  91. BoxDrawingsDoubleHorizontal rune = '\u2550' // ═
  92. BoxDrawingsDoubleVertical rune = '\u2551' // ║
  93. BoxDrawingsDownSingleAndRightDouble rune = '\u2552' // ╒
  94. BoxDrawingsDownDoubleAndRightSingle rune = '\u2553' // ╓
  95. BoxDrawingsDoubleDownAndRight rune = '\u2554' // ╔
  96. BoxDrawingsDownSingleAndLeftDouble rune = '\u2555' // ╕
  97. BoxDrawingsDownDoubleAndLeftSingle rune = '\u2556' // ╖
  98. BoxDrawingsDoubleDownAndLeft rune = '\u2557' // ╗
  99. BoxDrawingsUpSingleAndRightDouble rune = '\u2558' // ╘
  100. BoxDrawingsUpDoubleAndRightSingle rune = '\u2559' // ╙
  101. BoxDrawingsDoubleUpAndRight rune = '\u255a' // ╚
  102. BoxDrawingsUpSingleAndLeftDouble rune = '\u255b' // ╛
  103. BoxDrawingsUpDobuleAndLeftSingle rune = '\u255c' // ╜
  104. BoxDrawingsDoubleUpAndLeft rune = '\u255d' // ╝
  105. BoxDrawingsVerticalSingleAndRightDouble rune = '\u255e' // ╞
  106. BoxDrawingsVerticalDoubleAndRightSingle rune = '\u255f' // ╟
  107. BoxDrawingsDoubleVerticalAndRight rune = '\u2560' // ╠
  108. BoxDrawingsVerticalSingleAndLeftDouble rune = '\u2561' // ╡
  109. BoxDrawingsVerticalDoubleAndLeftSingle rune = '\u2562' // ╢
  110. BoxDrawingsDoubleVerticalAndLeft rune = '\u2563' // ╣
  111. BoxDrawingsDownSingleAndHorizontalDouble rune = '\u2564' // ╤
  112. BoxDrawingsDownDoubleAndHorizontalSingle rune = '\u2565' // ╥
  113. BoxDrawingsDoubleDownAndHorizontal rune = '\u2566' // ╦
  114. BoxDrawingsUpSingleAndHorizontalDouble rune = '\u2567' // ╧
  115. BoxDrawingsUpDoubleAndHorizontalSingle rune = '\u2568' // ╨
  116. BoxDrawingsDoubleUpAndHorizontal rune = '\u2569' // ╩
  117. BoxDrawingsVerticalSingleAndHorizontalDouble rune = '\u256a' // ╪
  118. BoxDrawingsVerticalDoubleAndHorizontalSingle rune = '\u256b' // ╫
  119. BoxDrawingsDoubleVerticalAndHorizontal rune = '\u256c' // ╬
  120. BoxDrawingsLightArcDownAndRight rune = '\u256d' // ╭
  121. BoxDrawingsLightArcDownAndLeft rune = '\u256e' // ╮
  122. BoxDrawingsLightArcUpAndLeft rune = '\u256f' // ╯
  123. BoxDrawingsLightArcUpAndRight rune = '\u2570' // ╰
  124. BoxDrawingsLightDiagonalUpperRightToLowerLeft rune = '\u2571' // ╱
  125. BoxDrawingsLightDiagonalUpperLeftToLowerRight rune = '\u2572' // ╲
  126. BoxDrawingsLightDiagonalCross rune = '\u2573' // ╳
  127. BoxDrawingsLightLeft rune = '\u2574' // ╴
  128. BoxDrawingsLightUp rune = '\u2575' // ╵
  129. BoxDrawingsLightRight rune = '\u2576' // ╶
  130. BoxDrawingsLightDown rune = '\u2577' // ╷
  131. BoxDrawingsHeavyLeft rune = '\u2578' // ╸
  132. BoxDrawingsHeavyUp rune = '\u2579' // ╹
  133. BoxDrawingsHeavyRight rune = '\u257a' // ╺
  134. BoxDrawingsHeavyDown rune = '\u257b' // ╻
  135. BoxDrawingsLightLeftAndHeavyRight rune = '\u257c' // ╼
  136. BoxDrawingsLightUpAndHeavyDown rune = '\u257d' // ╽
  137. BoxDrawingsHeavyLeftAndLightRight rune = '\u257e' // ╾
  138. BoxDrawingsHeavyUpAndLightDown rune = '\u257f' // ╿
  139. // Block Elements.
  140. BlockUpperHalfBlock rune = '\u2580' // ▀
  141. BlockLowerOneEighthBlock rune = '\u2581' // ▁
  142. BlockLowerOneQuarterBlock rune = '\u2582' // ▂
  143. BlockLowerThreeEighthsBlock rune = '\u2583' // ▃
  144. BlockLowerHalfBlock rune = '\u2584' // ▄
  145. BlockLowerFiveEighthsBlock rune = '\u2585' // ▅
  146. BlockLowerThreeQuartersBlock rune = '\u2586' // ▆
  147. BlockLowerSevenEighthsBlock rune = '\u2587' // ▇
  148. BlockFullBlock rune = '\u2588' // █
  149. BlockLeftSevenEighthsBlock rune = '\u2589' // ▉
  150. BlockLeftThreeQuartersBlock rune = '\u258A' // ▊
  151. BlockLeftFiveEighthsBlock rune = '\u258B' // ▋
  152. BlockLeftHalfBlock rune = '\u258C' // ▌
  153. BlockLeftThreeEighthsBlock rune = '\u258D' // ▍
  154. BlockLeftOneQuarterBlock rune = '\u258E' // ▎
  155. BlockLeftOneEighthBlock rune = '\u258F' // ▏
  156. BlockRightHalfBlock rune = '\u2590' // ▐
  157. BlockLightShade rune = '\u2591' // ░
  158. BlockMediumShade rune = '\u2592' // ▒
  159. BlockDarkShade rune = '\u2593' // ▓
  160. BlockUpperOneEighthBlock rune = '\u2594' // ▔
  161. BlockRightOneEighthBlock rune = '\u2595' // ▕
  162. BlockQuadrantLowerLeft rune = '\u2596' // ▖
  163. BlockQuadrantLowerRight rune = '\u2597' // ▗
  164. BlockQuadrantUpperLeft rune = '\u2598' // ▘
  165. BlockQuadrantUpperLeftAndLowerLeftAndLowerRight rune = '\u2599' // ▙
  166. BlockQuadrantUpperLeftAndLowerRight rune = '\u259A' // ▚
  167. BlockQuadrantUpperLeftAndUpperRightAndLowerLeft rune = '\u259B' // ▛
  168. BlockQuadrantUpperLeftAndUpperRightAndLowerRight rune = '\u259C' // ▜
  169. BlockQuadrantUpperRight rune = '\u259D' // ▝
  170. BlockQuadrantUpperRightAndLowerLeft rune = '\u259E' // ▞
  171. BlockQuadrantUpperRightAndLowerLeftAndLowerRight rune = '\u259F' // ▟
  172. )
  173. // SemigraphicJoints is a map for joining semigraphic (or otherwise) runes.
  174. // So far only light lines are supported but if you want to change the border
  175. // styling you need to provide the joints, too.
  176. // The matching will be sorted ascending by rune value, so you don't need to
  177. // provide all rune combinations,
  178. // e.g. (─) + (│) = (┼) will also match (│) + (─) = (┼)
  179. var SemigraphicJoints = map[string]rune{
  180. // (─) + (│) = (┼)
  181. string([]rune{BoxDrawingsLightHorizontal, BoxDrawingsLightVertical}): BoxDrawingsLightVerticalAndHorizontal,
  182. // (─) + (┌) = (┬)
  183. string([]rune{BoxDrawingsLightHorizontal, BoxDrawingsLightDownAndRight}): BoxDrawingsLightDownAndHorizontal,
  184. // (─) + (┐) = (┬)
  185. string([]rune{BoxDrawingsLightHorizontal, BoxDrawingsLightDownAndLeft}): BoxDrawingsLightDownAndHorizontal,
  186. // (─) + (└) = (┴)
  187. string([]rune{BoxDrawingsLightHorizontal, BoxDrawingsLightUpAndRight}): BoxDrawingsLightUpAndHorizontal,
  188. // (─) + (┘) = (┴)
  189. string([]rune{BoxDrawingsLightHorizontal, BoxDrawingsLightUpAndLeft}): BoxDrawingsLightUpAndHorizontal,
  190. // (─) + (├) = (┼)
  191. string([]rune{BoxDrawingsLightHorizontal, BoxDrawingsLightVerticalAndRight}): BoxDrawingsLightVerticalAndHorizontal,
  192. // (─) + (┤) = (┼)
  193. string([]rune{BoxDrawingsLightHorizontal, BoxDrawingsLightVerticalAndLeft}): BoxDrawingsLightVerticalAndHorizontal,
  194. // (─) + (┬) = (┬)
  195. string([]rune{BoxDrawingsLightHorizontal, BoxDrawingsLightDownAndHorizontal}): BoxDrawingsLightDownAndHorizontal,
  196. // (─) + (┴) = (┴)
  197. string([]rune{BoxDrawingsLightHorizontal, BoxDrawingsLightUpAndHorizontal}): BoxDrawingsLightUpAndHorizontal,
  198. // (─) + (┼) = (┼)
  199. string([]rune{BoxDrawingsLightHorizontal, BoxDrawingsLightVerticalAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
  200. // (│) + (┌) = (├)
  201. string([]rune{BoxDrawingsLightVertical, BoxDrawingsLightDownAndRight}): BoxDrawingsLightVerticalAndRight,
  202. // (│) + (┐) = (┤)
  203. string([]rune{BoxDrawingsLightVertical, BoxDrawingsLightDownAndLeft}): BoxDrawingsLightVerticalAndLeft,
  204. // (│) + (└) = (├)
  205. string([]rune{BoxDrawingsLightVertical, BoxDrawingsLightUpAndRight}): BoxDrawingsLightVerticalAndRight,
  206. // (│) + (┘) = (┤)
  207. string([]rune{BoxDrawingsLightVertical, BoxDrawingsLightUpAndLeft}): BoxDrawingsLightVerticalAndLeft,
  208. // (│) + (├) = (├)
  209. string([]rune{BoxDrawingsLightVertical, BoxDrawingsLightVerticalAndRight}): BoxDrawingsLightVerticalAndRight,
  210. // (│) + (┤) = (┤)
  211. string([]rune{BoxDrawingsLightVertical, BoxDrawingsLightVerticalAndLeft}): BoxDrawingsLightVerticalAndLeft,
  212. // (│) + (┬) = (┼)
  213. string([]rune{BoxDrawingsLightVertical, BoxDrawingsLightDownAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
  214. // (│) + (┴) = (┼)
  215. string([]rune{BoxDrawingsLightVertical, BoxDrawingsLightUpAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
  216. // (│) + (┼) = (┼)
  217. string([]rune{BoxDrawingsLightVertical, BoxDrawingsLightVerticalAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
  218. // (┌) + (┐) = (┬)
  219. string([]rune{BoxDrawingsLightDownAndRight, BoxDrawingsLightDownAndLeft}): BoxDrawingsLightDownAndHorizontal,
  220. // (┌) + (└) = (├)
  221. string([]rune{BoxDrawingsLightDownAndRight, BoxDrawingsLightUpAndRight}): BoxDrawingsLightVerticalAndRight,
  222. // (┌) + (┘) = (┼)
  223. string([]rune{BoxDrawingsLightDownAndRight, BoxDrawingsLightUpAndLeft}): BoxDrawingsLightVerticalAndHorizontal,
  224. // (┌) + (├) = (├)
  225. string([]rune{BoxDrawingsLightDownAndRight, BoxDrawingsLightVerticalAndRight}): BoxDrawingsLightVerticalAndRight,
  226. // (┌) + (┤) = (┼)
  227. string([]rune{BoxDrawingsLightDownAndRight, BoxDrawingsLightVerticalAndLeft}): BoxDrawingsLightVerticalAndHorizontal,
  228. // (┌) + (┬) = (┬)
  229. string([]rune{BoxDrawingsLightDownAndRight, BoxDrawingsLightDownAndHorizontal}): BoxDrawingsLightDownAndHorizontal,
  230. // (┌) + (┴) = (┼)
  231. string([]rune{BoxDrawingsLightDownAndRight, BoxDrawingsLightUpAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
  232. // (┌) + (┴) = (┼)
  233. string([]rune{BoxDrawingsLightDownAndRight, BoxDrawingsLightVerticalAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
  234. // (┐) + (└) = (┼)
  235. string([]rune{BoxDrawingsLightDownAndLeft, BoxDrawingsLightUpAndRight}): BoxDrawingsLightVerticalAndHorizontal,
  236. // (┐) + (┘) = (┤)
  237. string([]rune{BoxDrawingsLightDownAndLeft, BoxDrawingsLightUpAndLeft}): BoxDrawingsLightVerticalAndLeft,
  238. // (┐) + (├) = (┼)
  239. string([]rune{BoxDrawingsLightDownAndLeft, BoxDrawingsLightVerticalAndRight}): BoxDrawingsLightVerticalAndHorizontal,
  240. // (┐) + (┤) = (┤)
  241. string([]rune{BoxDrawingsLightDownAndLeft, BoxDrawingsLightVerticalAndLeft}): BoxDrawingsLightVerticalAndLeft,
  242. // (┐) + (┬) = (┬)
  243. string([]rune{BoxDrawingsLightDownAndLeft, BoxDrawingsLightDownAndHorizontal}): BoxDrawingsLightDownAndHorizontal,
  244. // (┐) + (┴) = (┼)
  245. string([]rune{BoxDrawingsLightDownAndLeft, BoxDrawingsLightUpAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
  246. // (┐) + (┼) = (┼)
  247. string([]rune{BoxDrawingsLightDownAndLeft, BoxDrawingsLightVerticalAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
  248. // (└) + (┘) = (┴)
  249. string([]rune{BoxDrawingsLightUpAndRight, BoxDrawingsLightUpAndLeft}): BoxDrawingsLightUpAndHorizontal,
  250. // (└) + (├) = (├)
  251. string([]rune{BoxDrawingsLightUpAndRight, BoxDrawingsLightVerticalAndRight}): BoxDrawingsLightVerticalAndRight,
  252. // (└) + (┤) = (┼)
  253. string([]rune{BoxDrawingsLightUpAndRight, BoxDrawingsLightVerticalAndLeft}): BoxDrawingsLightVerticalAndHorizontal,
  254. // (└) + (┬) = (┼)
  255. string([]rune{BoxDrawingsLightUpAndRight, BoxDrawingsLightDownAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
  256. // (└) + (┴) = (┴)
  257. string([]rune{BoxDrawingsLightUpAndRight, BoxDrawingsLightUpAndHorizontal}): BoxDrawingsLightUpAndHorizontal,
  258. // (└) + (┼) = (┼)
  259. string([]rune{BoxDrawingsLightUpAndRight, BoxDrawingsLightVerticalAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
  260. // (┘) + (├) = (┼)
  261. string([]rune{BoxDrawingsLightUpAndLeft, BoxDrawingsLightVerticalAndRight}): BoxDrawingsLightVerticalAndHorizontal,
  262. // (┘) + (┤) = (┤)
  263. string([]rune{BoxDrawingsLightUpAndLeft, BoxDrawingsLightVerticalAndLeft}): BoxDrawingsLightVerticalAndLeft,
  264. // (┘) + (┬) = (┼)
  265. string([]rune{BoxDrawingsLightUpAndLeft, BoxDrawingsLightDownAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
  266. // (┘) + (┴) = (┴)
  267. string([]rune{BoxDrawingsLightUpAndLeft, BoxDrawingsLightUpAndHorizontal}): BoxDrawingsLightUpAndHorizontal,
  268. // (┘) + (┼) = (┼)
  269. string([]rune{BoxDrawingsLightUpAndLeft, BoxDrawingsLightVerticalAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
  270. // (├) + (┤) = (┼)
  271. string([]rune{BoxDrawingsLightVerticalAndRight, BoxDrawingsLightVerticalAndLeft}): BoxDrawingsLightVerticalAndHorizontal,
  272. // (├) + (┬) = (┼)
  273. string([]rune{BoxDrawingsLightVerticalAndRight, BoxDrawingsLightDownAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
  274. // (├) + (┴) = (┼)
  275. string([]rune{BoxDrawingsLightVerticalAndRight, BoxDrawingsLightUpAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
  276. // (├) + (┼) = (┼)
  277. string([]rune{BoxDrawingsLightVerticalAndRight, BoxDrawingsLightVerticalAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
  278. // (┤) + (┬) = (┼)
  279. string([]rune{BoxDrawingsLightVerticalAndLeft, BoxDrawingsLightDownAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
  280. // (┤) + (┴) = (┼)
  281. string([]rune{BoxDrawingsLightVerticalAndLeft, BoxDrawingsLightUpAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
  282. // (┤) + (┼) = (┼)
  283. string([]rune{BoxDrawingsLightVerticalAndLeft, BoxDrawingsLightVerticalAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
  284. // (┬) + (┴) = (┼)
  285. string([]rune{BoxDrawingsLightDownAndHorizontal, BoxDrawingsLightUpAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
  286. // (┬) + (┼) = (┼)
  287. string([]rune{BoxDrawingsLightDownAndHorizontal, BoxDrawingsLightVerticalAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
  288. // (┴) + (┼) = (┼)
  289. string([]rune{BoxDrawingsLightUpAndHorizontal, BoxDrawingsLightVerticalAndHorizontal}): BoxDrawingsLightVerticalAndHorizontal,
  290. }
  291. // PrintJoinedSemigraphics prints a semigraphics rune into the screen at the given
  292. // position with the given style, joining it with any existing semigraphics
  293. // rune.At this point, only regular single line borders are supported.
  294. func PrintJoinedSemigraphics(screen tcell.Screen, x, y int, ch rune, style tcell.Style) {
  295. previous, _, _, _ := screen.GetContent(x, y)
  296. // What's the resulting rune?
  297. var result rune
  298. if ch == previous {
  299. result = ch
  300. } else {
  301. if ch < previous {
  302. previous, ch = ch, previous
  303. }
  304. result = SemigraphicJoints[string([]rune{previous, ch})]
  305. }
  306. if result == 0 {
  307. result = ch
  308. }
  309. // We only print something if we have something.
  310. screen.SetContent(x, y, result, nil, style)
  311. }