gegl_menu_gui.pas 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146
  1. {
  2. * Copyright (c) 2021 SSW
  3. *
  4. * This software is provided 'as-is', without any express or
  5. * implied warranty. In no event will the authors be held
  6. * liable for any damages arising from the use of this software.
  7. *
  8. * Permission is granted to anyone to use this software for any purpose,
  9. * including commercial applications, and to alter it and redistribute
  10. * it freely, subject to the following restrictions:
  11. *
  12. * 1. The origin of this software must not be misrepresented;
  13. * you must not claim that you wrote the original software.
  14. * If you use this software in a product, an acknowledgment
  15. * in the product documentation would be appreciated but
  16. * is not required.
  17. *
  18. * 2. Altered source versions must be plainly marked as such,
  19. * and must not be misrepresented as being the original software.
  20. *
  21. * 3. This notice may not be removed or altered from any
  22. * source distribution.
  23. }
  24. (* Обратить внимание! Если будет использоваться тачскрин, то могут происходить множественные нажатия,
  25. а это означает, что по процедурам надо проходиться несколько раз, и это не будет зависеть от
  26. возможностей??? Будет ли возможность записать все данные тачскрина, лишь бы не делать 10 проходов для
  27. каждого нажатия???
  28. *)
  29. unit gegl_menu_gui;
  30. {$I zgl_config.cfg}
  31. interface
  32. const
  33. NameShift: UTF8String = 'Shift';
  34. NameLatin = 'Latin';
  35. NameRus = 'Rus';
  36. NameSymb = 'symb...';
  37. NameKeyboard = 'Keyb';
  38. NameHome = 'Home';
  39. NameEnd = 'End';
  40. NameCtrl = 'Ctrl';
  41. NameEnter = 'Enter';
  42. NameTab = 'Tab';
  43. NameCapsLock = 'Caps';
  44. NameInsert = 'Ins';
  45. NameBackSpace = 'BS';
  46. NameSave01 = 'Save';
  47. NameSave02 = 'Сохранить';
  48. NameLoad01 = 'Load';
  49. NameLoad02 = 'Загрузить';
  50. NameExit01 = 'Exit';
  51. NameExit02 = 'Выход';
  52. NameChange = '...';
  53. GuiJoystick1 = 1;
  54. GuiJoystick2 = 2;
  55. GuiKeyboardSymb = 4;
  56. GuiKeyboardNumeric = 8;
  57. // данные только для подобных клавиатур!!! Для создания своей клавиатуры, вы должны задавать свои данные!
  58. _Tab = 35;
  59. _CapsLock = 36;
  60. _Enter = 37;
  61. _Shift = 38;
  62. _Space = 39;
  63. _Latin = 40;
  64. _Rus = 41;
  65. _symb = 42;
  66. _Ctrl = 36;
  67. _Home = 40;
  68. _End = 41;
  69. _Keyboard = 42;
  70. _Insert = 43;
  71. _Del = 44;
  72. _Up = 24;
  73. _Left = 25;
  74. _Down = 26;
  75. _Right = 27;
  76. type
  77. // кнопка от текстуры
  78. _touchButton = record
  79. X, Y, Angle: Single;
  80. bPush: LongWord;
  81. _key: LongWord;
  82. end;
  83. // обычная кнопка от символа
  84. _oneTouchButtonJoy = record
  85. X, Y: Single;
  86. _key: LongWord;
  87. symb: UTF8String; // использовать юникод везде????
  88. bPush: LongWord; // в джойстиках это отвечает за каждую клавишу в отдельности
  89. end;
  90. // "ролик" для использования в джойстике
  91. _touchRolling = record
  92. X, Y, R, _x, _y: Single;
  93. direction: Single;
  94. bPush: LongWord;
  95. end;
  96. // джойстик с одними кнопками
  97. _keyTouchJoy = record
  98. textScale: LongWord;
  99. count: LongWord;
  100. Width, Height: Single;
  101. BArrow: array[1..9] of _touchButton;
  102. OneButton: array[1..8] of _oneTouchButtonJoy;
  103. TextureUp, TextureDown: Cardinal; // текстура используемая для стрелок
  104. end;
  105. // джойстик с кнопками и роликом
  106. _keyTouchJoyRolling = record
  107. textScale: LongWord;
  108. count: LongWord;
  109. Width, Height: Single;
  110. Rolling: _touchRolling;
  111. OneButton: array[1..8] of _oneTouchButtonJoy;
  112. end;
  113. // для четырёх разных символов (основное)
  114. _oneTouchButton = record
  115. X, Y: Single;
  116. _key: LongWord;
  117. symb: array [1..4] of LongWord;
  118. end;
  119. // для двух разных символов
  120. _oneDoubleTouchButton = record
  121. X, Y: Single;
  122. _key: LongWord;
  123. symb: array [1..2] of UTF8String; // подменить
  124. end;
  125. _stringTouchButton = record
  126. X, Y: Single ;
  127. Width: Single;
  128. _key: LongWord;
  129. bString: UTF8String;
  130. end;
  131. // для обычной клавиатуры
  132. _keyTouch = record
  133. textScale: LongWord;
  134. count: LongWord;
  135. OWidth, Height: Single;
  136. OneButton: array[1..34] of _oneTouchButton;
  137. StringButton: array[35..44] of _stringTouchButton;
  138. end;
  139. _touchBArrow = record
  140. X, Y, Angle: Single;
  141. _key: LongWord;
  142. end;
  143. // для символьной клавиатуры
  144. _keyTouchSymb = record
  145. textScale: LongWord;
  146. count: LongWord;
  147. OWidth, Height: Single;
  148. OneDoubleButton: array[1..23] of _oneDoubleTouchButton; // обычные клавиши
  149. BArrow: array[24..27] of _touchBArrow; // стрелки (управляющие клавиши)
  150. StringButton: array[36..44] of _stringTouchButton; // литеральные клавиши (в основном управляющие)
  151. TextureUp, TextureDown: Cardinal; // текстура используемая для стрелок
  152. end;
  153. var
  154. TouchJoy: _keyTouchJoy;
  155. TouchJoyRolling: _keyTouchJoyRolling;
  156. TouchKey: _keyTouch;
  157. TouchKeySymb: _keyTouchSymb;
  158. _wndWidth, _wndHeight: Single;
  159. procedure SetMenuProcess(NumMenu: Byte);
  160. // ни где не создаются ни джойстики, ни клавиатура!!!
  161. // на данный момент создаю в 3-й демке для android.
  162. // джойстик с роликом
  163. procedure CreateGameJoy01;
  164. // джойстик только с клавишами
  165. procedure CreateGameJoy02;
  166. // создание клавиатуры
  167. procedure CreateTouchKeyboard;
  168. procedure CreateTouchSymbol;
  169. procedure GameJoy01Up(num: LongWord);
  170. procedure GameJoy02Up(num: LongWord);
  171. procedure TouchKeyboardUp(num: LongWord);
  172. procedure TouchSymbolUp(num: LongWord);
  173. procedure GameJoy01Down(num: LongWord);
  174. procedure GameJoy02Down(num: LongWord);
  175. procedure TouchKeyboardDown(num: LongWord);
  176. procedure TouchSymbolDown(num: LongWord);
  177. procedure ShowVKeyboard; {$IfDef USE_INLINE}inline;{$EndIf}
  178. procedure HideVKeyboard; {$IfDef USE_INLINE}inline;{$EndIf}
  179. implementation
  180. uses
  181. gegl_utils,
  182. zgl_window,
  183. zgl_keyboard,
  184. zgl_math_2d,
  185. zgl_application,
  186. gegl_draw_gui,
  187. zgl_text,
  188. zgl_utils,
  189. zgl_log,
  190. zgl_file,
  191. zgl_types,
  192. zgl_mouse,
  193. zgl_touch;
  194. {$IfDef LINUX}
  195. var
  196. rs0: Single = 0;
  197. rs045: Single = 0.45;
  198. rs1_5: Single = 1.5;
  199. rs2: Single = 2;
  200. rs3: Single = 3;
  201. rs4: Single = 4;
  202. rs5: Single = 5;
  203. rs6: Single = 6;
  204. rs9: Single = 9;
  205. rs11: Single = 11;
  206. rs13: Single = 13;
  207. rs40: Single = 40;
  208. rs41: Single = 41;
  209. rs45: Single = 45;
  210. rs50: Single = 50;
  211. rs55: Single = 55;
  212. rs90: Single = 90;
  213. rs100: Single = 100;
  214. rs135: Single = 135;
  215. rs150: Single = 150;
  216. rs180: Single = 180;
  217. rs225: Single = 225;
  218. rs251: Single = 251;
  219. rs270: Single = 270;
  220. rs315: Single = 315;
  221. rs1200: Single = 1200;
  222. {$EndIf}
  223. {$IfDef MOBILE}
  224. var
  225. lockTouchKeyboard: Boolean = False;
  226. {$EndIf}
  227. // определиться как работать с фонтом. Должна быть загрузка "как бы" по умолчанию
  228. // но делать приходится вручную.
  229. procedure SetMenuProcess(NumMenu: Byte);
  230. begin
  231. if (NumMenu = 0) or (NumMenu > MaxNumMenu) then exit;
  232. if NumMenu = 1 then
  233. begin
  234. app_UseMenuDown := @GameJoy01Down;
  235. app_UseMenuUp := @GameJoy01Up;
  236. app_DrawGui := @DrawGameJoy01;
  237. setFontTextScale(22, fontUse);
  238. // setTextColor(MenuColorText);
  239. end;
  240. if NumMenu = 2 then
  241. begin
  242. app_UseMenuDown := @GameJoy02Down;
  243. app_UseMenuUp := @GameJoy02Up;
  244. app_DrawGui := @DrawGameJoy02;
  245. setFontTextScale(22, fontUse);
  246. // setTextColor(MenuColorText);
  247. end;
  248. if NumMenu = 3 then
  249. begin
  250. app_UseMenuDown := @TouchKeyboardDown;
  251. app_UseMenuUp := @TouchKeyboardUp;
  252. app_DrawGui := @DrawTouchKeyboard;
  253. setFontTextScale(TouchKey.textScale, fontUse);
  254. // setTextColor(MenuColorText);
  255. end;
  256. if NumMenu = 4 then
  257. begin
  258. app_UseMenuDown := @TouchSymbolDown;
  259. app_UseMenuUp := @TouchSymbolUp;
  260. app_DrawGui := @DrawTouchSymbol;
  261. setFontTextScale(TouchKeySymb.textScale, fontUse);
  262. // setTextColor(MenuColorText);
  263. end;
  264. end;
  265. procedure CreateGameJoy01;
  266. begin
  267. _wndWidth := wndWidth;
  268. _wndHeight := wndHeight;
  269. TouchJoyRolling.count := 4;
  270. TouchJoyRolling.textScale := 22;
  271. TouchJoyRolling.Rolling.X := {$IfDef LINUX}rs55{$Else}55{$EndIf};
  272. TouchJoyRolling.Rolling.Y := _wndHeight - {$IfDef LINUX}rs55{$Else}55{$EndIf};
  273. TouchJoyRolling.Rolling.R := {$IfDef LINUX}rs50{$Else}50{$EndIf};
  274. TouchJoyRolling.Rolling.bPush := 0;
  275. TouchJoyRolling.Width := {$IfDef LINUX}rs45{$Else}45{$EndIf};
  276. TouchJoyRolling.Height := {$IfDef LINUX}rs45{$Else}45{$EndIf};
  277. TouchJoyRolling.OneButton[1].X := _wndWidth - {$IfDef LINUX}rs100{$Else}100{$EndIf};
  278. TouchJoyRolling.OneButton[1].Y := _wndHeight - {$IfDef LINUX}rs100{$Else}100{$EndIf};
  279. TouchJoyRolling.OneButton[1].bPush := 0;
  280. TouchJoyRolling.OneButton[2].X := TouchJoyRolling.OneButton[1].X + {$IfDef LINUX}rs50{$Else}50{$EndIf};
  281. TouchJoyRolling.OneButton[2].Y := TouchJoyRolling.OneButton[1].Y;
  282. TouchJoyRolling.OneButton[2].bPush := 0;
  283. TouchJoyRolling.OneButton[3].X := TouchJoyRolling.OneButton[1].X;
  284. TouchJoyRolling.OneButton[3].Y := TouchJoyRolling.OneButton[1].Y + {$IfDef LINUX}rs50{$Else}50{$EndIf};
  285. TouchJoyRolling.OneButton[3].bPush := 0;
  286. TouchJoyRolling.OneButton[4].X := TouchJoyRolling.OneButton[1].X + {$IfDef LINUX}rs50{$Else}50{$EndIf};
  287. TouchJoyRolling.OneButton[4].Y := TouchJoyRolling.OneButton[1].Y + {$IfDef LINUX}rs50{$Else}50{$EndIf};
  288. TouchJoyRolling.OneButton[4].bPush := 0;
  289. TouchJoyRolling.OneButton[1]._key := K_A;
  290. TouchJoyRolling.OneButton[2]._key := K_B;
  291. TouchJoyRolling.OneButton[3]._key := K_C;
  292. TouchJoyRolling.OneButton[4]._key := K_D;
  293. TouchJoyRolling.OneButton[1].symb := 'A';
  294. TouchJoyRolling.OneButton[2].symb := 'B';
  295. TouchJoyRolling.OneButton[3].symb := 'C';
  296. TouchJoyRolling.OneButton[4].symb := 'D';
  297. MenuChange := GuiJoystick1;
  298. SetMenuProcess(1);
  299. end;
  300. procedure CreateGameJoy02;
  301. begin
  302. _wndWidth := wndWidth;
  303. _wndHeight := wndHeight;
  304. TouchJoy.count := 5;
  305. TouchJoy.textScale := 22;
  306. TouchJoy.Width := {$IfDef LINUX}rs45{$Else}45{$EndIf};
  307. TouchJoy.Height := {$IfDef LINUX}rs45{$Else}45{$EndIf};
  308. TouchJoy.BArrow[7].X := {$IfDef LINUX}rs5{$Else}5{$EndIf};
  309. TouchJoy.BArrow[7].Y := _wndHeight - {$IfDef LINUX}rs150{$Else}150{$EndIf};
  310. TouchJoy.BArrow[7].Angle := {$IfDef LINUX}rs315{$Else}315{$EndIf};
  311. TouchJoy.BArrow[7].bPush := 0;
  312. TouchJoy.BArrow[8].X := TouchJoy.BArrow[7].X + {$IfDef LINUX}rs50{$Else}50{$EndIf};
  313. TouchJoy.BArrow[8].Y := TouchJoy.BArrow[7].Y;
  314. TouchJoy.BArrow[8].Angle := {$IfDef LINUX}rs0{$Else}0{$EndIf};
  315. TouchJoy.BArrow[8].bPush := 0;
  316. TouchJoy.BArrow[9].X := TouchJoy.BArrow[7].X + {$IfDef LINUX}rs100{$Else}100{$EndIf};
  317. TouchJoy.BArrow[9].Y := TouchJoy.BArrow[7].Y;
  318. TouchJoy.BArrow[9].Angle := {$IfDef LINUX}rs45{$Else}45{$EndIf};
  319. TouchJoy.BArrow[9].bPush := 0;
  320. TouchJoy.BArrow[4].X := TouchJoy.BArrow[7].X;
  321. TouchJoy.BArrow[4].Y := TouchJoy.BArrow[7].Y + {$IfDef LINUX}rs50{$Else}50{$EndIf};
  322. TouchJoy.BArrow[4].Angle := {$IfDef LINUX}rs270{$Else}270{$EndIf};
  323. TouchJoy.BArrow[4].bPush := 0;
  324. TouchJoy.OneButton[1].X := TouchJoy.BArrow[7].X + {$IfDef LINUX}rs50{$Else}50{$EndIf};
  325. TouchJoy.OneButton[1].Y := TouchJoy.BArrow[7].Y + {$IfDef LINUX}rs50{$Else}50{$EndIf};
  326. TouchJoy.OneButton[1].bPush := 0;
  327. TouchJoy.BArrow[6].X := TouchJoy.BArrow[7].X + {$IfDef LINUX}rs100{$Else}100{$EndIf};
  328. TouchJoy.BArrow[6].Y := TouchJoy.BArrow[7].Y + {$IfDef LINUX}rs50{$Else}50{$EndIf};
  329. TouchJoy.BArrow[6].Angle := {$IfDef LINUX}rs90{$Else}90{$EndIf};
  330. TouchJoy.BArrow[6].bPush := 0;
  331. TouchJoy.BArrow[1].X := TouchJoy.BArrow[7].X;
  332. TouchJoy.BArrow[1].Y := TouchJoy.BArrow[7].Y + {$IfDef LINUX}rs100{$Else}100{$EndIf};
  333. TouchJoy.BArrow[1].Angle := {$IfDef LINUX}rs225{$Else}225{$EndIf};
  334. TouchJoy.BArrow[1].bPush := 0;
  335. TouchJoy.BArrow[2].X := TouchJoy.BArrow[7].X + {$IfDef LINUX}rs50{$Else}50{$EndIf};
  336. TouchJoy.BArrow[2].Y := TouchJoy.BArrow[7].Y + {$IfDef LINUX}rs100{$Else}100{$EndIf};
  337. TouchJoy.BArrow[2].Angle := {$IfDef LINUX}rs180{$Else}180{$EndIf};
  338. TouchJoy.BArrow[2].bPush := 0;
  339. TouchJoy.BArrow[3].X := TouchJoy.BArrow[7].X + {$IfDef LINUX}rs100{$Else}100{$EndIf};
  340. TouchJoy.BArrow[3].Y := TouchJoy.BArrow[7].Y + {$IfDef LINUX}rs100{$Else}100{$EndIf};
  341. TouchJoy.BArrow[3].Angle := {$IfDef LINUX}rs135{$Else}135{$EndIf};
  342. TouchJoy.BArrow[3].bPush := 0;
  343. TouchJoy.BArrow[1]._key := K_KP_1;
  344. TouchJoy.BArrow[2]._key := K_KP_2;
  345. TouchJoy.BArrow[3]._key := K_KP_3;
  346. TouchJoy.BArrow[4]._key := K_KP_4;
  347. TouchJoy.BArrow[6]._key := K_KP_6;
  348. TouchJoy.BArrow[7]._key := K_KP_7;
  349. TouchJoy.BArrow[8]._key := K_KP_8;
  350. TouchJoy.BArrow[9]._key := K_KP_9;
  351. TouchJoy.TextureUp := 1;
  352. TouchJoy.TextureDown := 2;
  353. TouchJoy.OneButton[2].X := _wndWidth - {$IfDef LINUX}rs100{$Else}100{$EndIf};
  354. TouchJoy.OneButton[2].Y := _wndHeight - {$IfDef LINUX}rs100{$Else}100{$EndIf};
  355. TouchJoy.OneButton[2].bPush := 0;
  356. TouchJoy.OneButton[3].X := TouchJoy.OneButton[2].X + {$IfDef LINUX}rs50{$Else}50{$EndIf};
  357. TouchJoy.OneButton[3].Y := TouchJoy.OneButton[2].Y;
  358. TouchJoy.OneButton[3].bPush := 0;
  359. TouchJoy.OneButton[4].X := TouchJoy.OneButton[2].X;
  360. TouchJoy.OneButton[4].Y := TouchJoy.OneButton[2].Y + {$IfDef LINUX}rs50{$Else}50{$EndIf};
  361. TouchJoy.OneButton[4].bPush := 0;
  362. TouchJoy.OneButton[5].X := TouchJoy.OneButton[2].X + {$IfDef LINUX}rs50{$Else}50{$EndIf};
  363. TouchJoy.OneButton[5].Y := TouchJoy.OneButton[2].Y + {$IfDef LINUX}rs50{$Else}50{$EndIf};
  364. TouchJoy.OneButton[5].bPush := 0;
  365. TouchJoy.OneButton[1]._key := K_SPACE;
  366. TouchJoy.OneButton[2]._key := K_A;
  367. TouchJoy.OneButton[3]._key := K_B;
  368. TouchJoy.OneButton[4]._key := K_C;
  369. TouchJoy.OneButton[5]._key := K_D;
  370. TouchJoy.OneButton[1].symb := ' ';
  371. TouchJoy.OneButton[2].symb := 'A';
  372. TouchJoy.OneButton[3].symb := 'B';
  373. TouchJoy.OneButton[4].symb := 'C';
  374. TouchJoy.OneButton[5].symb := 'D';
  375. MenuChange := GuiJoystick2;
  376. SetMenuProcess(2);
  377. end;
  378. procedure CreateTouchKeyboard;
  379. var
  380. dw, dh, x0, y0, _xx0: Single;
  381. i, n: integer;
  382. m: Integer;
  383. kodeSymb: array[1..34] of byte = (K_TILDE, K_Q, K_W, K_E, K_R, K_T, K_Y, K_U, K_I, K_O, K_P, K_BRACKET_L, K_BRACKET_R, K_A,
  384. K_S, K_D, K_F, K_G, K_H, K_J, K_K, K_L, K_SEMICOLON, K_APOSTROPHE, K_Z, K_X, K_C, K_V,
  385. K_B, K_N, K_M, K_SEPARATOR, K_DECIMAL, K_SLASH);
  386. procedure CreateOneButton(key: LongWord);
  387. begin
  388. TouchKey.OneButton[n].symb[1] := utf8_GetID(LoadText, m, @m);
  389. TouchKey.OneButton[n].symb[2] := utf8_GetID(LoadText, m, @m);
  390. TouchKey.OneButton[n].symb[3] := utf8_GetID(LoadText, m, @m);
  391. TouchKey.OneButton[n].symb[4] := utf8_GetID(LoadText, m, @m);
  392. TouchKey.OneButton[n]._key := key;
  393. end;
  394. begin
  395. TouchKey.count := 34;
  396. if wndWidth < 1200 then
  397. dw := _wndWidth
  398. else
  399. dw := {$IfDef LINUX}rs1200{$Else}1200{$EndIf};
  400. if wndHeight < 500 then
  401. dh := (_wndHeight / {$IfDef LINUX}rs2{$Else}2{$EndIf})
  402. else
  403. dh := {$IfDef LINUX}rs251{$Else}251{$EndIf};
  404. TouchKey.OWidth := ((dw - {$IfDef LINUX}rs41{$Else}41{$EndIf}) / {$IfDef LINUX}rs13{$Else}13{$EndIf}); //((dw - 5 - 36) / 13);
  405. x0 := {$IfDef LINUX}rs2{$Else}2{$EndIf};
  406. dw := {$IfDef LINUX}rs3{$Else}3{$EndIf} + TouchKey.OWidth;
  407. y0 := _wndHeight - dh;
  408. dh := {$IfDef LINUX}rs3{$Else}3{$EndIf} + ((dh - {$IfDef LINUX}rs11{$Else}11{$EndIf}) / {$IfDef LINUX}rs4{$Else}4{$EndIf});
  409. TouchKey.Height := dh - {$IfDef LINUX}rs3{$Else}3{$EndIf};
  410. if dw >= dh then
  411. TouchKey.textScale := round(dh * {$IfDef LINUX}rs045{$Else}0.45{$EndIf})
  412. else
  413. TouchKey.textScale := round(dw * {$IfDef LINUX}rs045{$Else}0.45{$EndIf});
  414. for i := 1 to 13 do
  415. begin
  416. TouchKey.OneButton[i].X := x0 + dw * (i - 1);
  417. TouchKey.OneButton[i].Y := y0;
  418. end;
  419. y0 := y0 + dh;
  420. TouchKey.StringButton[_Tab].X := x0;
  421. TouchKey.StringButton[_Tab].Y := y0;
  422. // каждая ширина на 3 пикселя больше...
  423. TouchKey.StringButton[_Tab].Width := (TouchKey.OWidth * {$IfDef LINUX}rs1_5{$Else}1.5{$EndIf}) + {$IfDef LINUX}rs3{$Else}3{$EndIf};
  424. TouchKey.StringButton[_Tab].bString := NameTab;
  425. TouchKey.StringButton[_Tab]._key := K_TAB;
  426. _xx0 := x0 + TouchKey.StringButton[_Tab].Width + {$IfDef LINUX}rs3{$Else}3{$EndIf};
  427. for i := 14 to 24 do
  428. begin
  429. TouchKey.OneButton[i].X := _xx0 + dw * (i - 14);
  430. TouchKey.OneButton[i].Y := y0;
  431. end;
  432. y0 := y0 + dh;
  433. TouchKey.StringButton[_CapsLock].X := x0;
  434. TouchKey.StringButton[_CapsLock].Y := y0;
  435. TouchKey.StringButton[_CapsLock].Width := TouchKey.OWidth * {$IfDef LINUX}rs2{$Else}2{$EndIf} + {$IfDef LINUX}rs3{$Else}3{$EndIf};
  436. TouchKey.StringButton[_CapsLock].bString := NameCapsLock;
  437. TouchKey.StringButton[_CapsLock]._key := K_CAPSLOCK;
  438. _xx0 := x0 + TouchKey.StringButton[_CapsLock].Width + {$IfDef LINUX}rs3{$Else}3{$EndIf};
  439. for i := 25 to 33 do
  440. begin
  441. TouchKey.OneButton[i].X := _xx0 + dw * (i - 25);
  442. TouchKey.OneButton[i].Y := y0;
  443. end;
  444. TouchKey.StringButton[_Enter].X := TouchKey.OneButton[33].X + dw;
  445. TouchKey.StringButton[_Enter].Y := y0;
  446. TouchKey.StringButton[_Enter].Width := TouchKey.OWidth * {$IfDef LINUX}rs2{$Else}2{$EndIf} + {$IfDef LINUX}rs3{$Else}3{$EndIf};
  447. TouchKey.StringButton[_Enter].bString := NameEnter;
  448. TouchKey.StringButton[_Enter]._key := K_ENTER;
  449. y0 := y0 + dh;
  450. TouchKey.StringButton[_Shift].X := x0;
  451. TouchKey.StringButton[_Shift].Y := y0;
  452. TouchKey.StringButton[_Shift].Width := TouchKey.OWidth * {$IfDef LINUX}rs2{$Else}2{$EndIf} + {$IfDef LINUX}rs3{$Else}3{$EndIf};
  453. TouchKey.StringButton[_Shift].bString := NameShift;
  454. TouchKey.StringButton[_Shift]._key := K_SHIFT_L;
  455. TouchKey.StringButton[_Space].X := x0 + TouchKey.StringButton[_Shift].Width + {$IfDef LINUX}rs3{$Else}3{$EndIf};
  456. TouchKey.StringButton[_Space].Y := y0;
  457. TouchKey.StringButton[_Space].Width := (TouchKey.OWidth * {$IfDef LINUX}rs2{$Else}2{$EndIf} + {$IfDef LINUX}rs3{$Else}3{$EndIf});
  458. TouchKey.StringButton[_Space].bString := ' ';
  459. TouchKey.StringButton[_Space]._key := K_SPACE;
  460. TouchKey.StringButton[_Latin].X := TouchKey.StringButton[_Space].X + TouchKey.StringButton[_Space].Width + {$IfDef LINUX}rs3{$Else}3{$EndIf};
  461. TouchKey.StringButton[_Latin].Y := y0;
  462. TouchKey.StringButton[_Latin].Width := TouchKey.OWidth * {$IfDef LINUX}rs2{$Else}2{$EndIf} + {$IfDef LINUX}rs3{$Else}3{$EndIf};
  463. TouchKey.StringButton[_Latin].bString := NameLatin;
  464. TouchKey.StringButton[_Latin]._key := K_F12;
  465. TouchKey.StringButton[_Rus].X := TouchKey.StringButton[_Space].X + TouchKey.StringButton[_Space].Width + {$IfDef LINUX}rs3{$Else}3{$EndIf};
  466. TouchKey.StringButton[_Rus].Y := y0;
  467. TouchKey.StringButton[_Rus].Width := TouchKey.OWidth * {$IfDef LINUX}rs2{$Else}2{$EndIf} + {$IfDef LINUX}rs3{$Else}3{$EndIf};
  468. TouchKey.StringButton[_Rus].bString := NameRus;
  469. TouchKey.StringButton[_Rus]._key := K_F12;
  470. TouchKey.StringButton[_symb].X := TouchKey.StringButton[_Latin].X + TouchKey.StringButton[_Latin].Width + {$IfDef LINUX}rs3{$Else}3{$EndIf};
  471. TouchKey.StringButton[_symb].Y := y0;
  472. TouchKey.StringButton[_symb].Width := (TouchKey.OWidth * {$IfDef LINUX}rs3{$Else}3{$EndIf} + {$IfDef LINUX}rs6{$Else}6{$EndIf});
  473. TouchKey.StringButton[_symb].bString := NameSymb;
  474. TouchKey.StringButton[_symb]._key := K_F2;
  475. TouchKey.OneButton[34].X := TouchKey.StringButton[_symb].X + TouchKey.StringButton[_symb].Width + {$IfDef LINUX}rs3{$Else}3{$EndIf};
  476. TouchKey.OneButton[34].Y := y0;
  477. TouchKey.StringButton[_Insert].X := TouchKey.OneButton[34].X + TouchKey.OWidth + {$IfDef LINUX}rs3{$Else}3{$EndIf};
  478. TouchKey.StringButton[_Insert].Y := y0;
  479. TouchKey.StringButton[_Insert].Width := (TouchKey.OWidth * {$IfDef LINUX}rs1_5{$Else}1.5{$EndIf} + {$IfDef LINUX}rs3{$Else}3{$EndIf});
  480. TouchKey.StringButton[_Insert].bString := NameInsert;
  481. TouchKey.StringButton[_Insert]._key := K_INSERT;
  482. TouchKey.StringButton[_Del].X := TouchKey.StringButton[_Insert].X + TouchKey.StringButton[_Insert].Width + {$IfDef LINUX}rs3{$Else}3{$EndIf};
  483. TouchKey.StringButton[_Del].Y := y0;
  484. TouchKey.StringButton[_Del].Width := (TouchKey.OWidth * {$IfDef LINUX}rs1_5{$Else}1.5{$EndIf});
  485. TouchKey.StringButton[_Del].bString := NameBackSpace;
  486. TouchKey.StringButton[_Del]._key := K_BACKSPACE;
  487. (* kodeSymb[1] := K_TILDE; kodeSymb[2] := K_Q; kodeSymb[3] := K_W;
  488. kodeSymb[4] := K_E; kodeSymb[5] := K_R; kodeSymb[6] := K_T;
  489. kodeSymb[7] := K_Y; kodeSymb[8] := K_U; kodeSymb[9] := K_I;
  490. kodeSymb[10] := K_O; kodeSymb[11] := K_P; kodeSymb[12] := K_BRACKET_L;
  491. kodeSymb[13] := K_BRACKET_R; kodeSymb[14] := K_A; kodeSymb[15] := K_S;
  492. kodeSymb[16] := K_D; kodeSymb[17] := K_F; kodeSymb[18] := K_G;
  493. kodeSymb[19] := K_H; kodeSymb[20] := K_J; kodeSymb[21] := K_K;
  494. kodeSymb[22] := K_L; kodeSymb[23] := K_SEMICOLON;
  495. kodeSymb[24] := K_APOSTROPHE; kodeSymb[25] := K_Z; kodeSymb[26] := K_X;
  496. kodeSymb[27] := K_C; kodeSymb[28] := K_V; kodeSymb[29] := K_B;
  497. kodeSymb[30] := K_N; kodeSymb[31] := K_M; kodeSymb[32] := K_SEPARATOR;
  498. kodeSymb[33] := K_DECIMAL; kodeSymb[34] := K_SLASH; *)
  499. m := 4;
  500. for n := 1 to 34 do
  501. CreateOneButton(kodeSymb[n]);
  502. set_FlagForLoadText(True);
  503. MenuChange := 3;
  504. SetMenuProcess(3);
  505. CreateTouchSymbol;
  506. end;
  507. procedure CreateTouchSymbol;
  508. var
  509. dw, dh, x0, y0, _xx0: Single;
  510. i: integer;
  511. begin
  512. TouchKeySymb.count := 23;
  513. if wndWidth < 1200 then
  514. dw := _wndWidth
  515. else
  516. dw := {$IfDef LINUX}rs1200{$Else}1200{$EndIf};
  517. if wndHeight < 500 then
  518. dh := _wndHeight / {$IfDef LINUX}rs2{$Else}2{$EndIf}
  519. else
  520. dh := {$IfDef LINUX}rs251{$Else}251{$EndIf};
  521. TouchKeySymb.OWidth := ((dw - {$IfDef LINUX}rs40{$Else}40{$EndIf}) / {$IfDef LINUX}rs11{$Else}11{$EndIf});
  522. x0 := {$IfDef LINUX}rs2{$Else}2{$EndIf};
  523. dw := {$IfDef LINUX}rs3{$Else}3{$EndIf} + TouchKeySymb.OWidth;
  524. y0 := _wndHeight - dh;
  525. dh := {$IfDef LINUX}rs3{$Else}3{$EndIf} + ((dh - {$IfDef LINUX}rs11{$Else}11{$EndIf}) / {$IfDef LINUX}rs4{$Else}4{$EndIf});
  526. TouchKeySymb.Height := dh - {$IfDef LINUX}rs3{$Else}3{$EndIf};
  527. if dw >= dh then
  528. TouchKeySymb.textScale := round(dh * {$IfDef LINUX}rs045{$Else}0.45{$EndIf})
  529. else
  530. TouchKeySymb.textScale := round(dw * {$IfDef LINUX}rs045{$Else}0.45{$EndIf});
  531. for i := 1 to 10 do
  532. begin
  533. TouchKeySymb.OneDoubleButton[i].X := x0 + dw * (i - 1);
  534. TouchKeySymb.OneDoubleButton[i].Y := y0;
  535. end;
  536. TouchKeySymb.OneDoubleButton[1]._key := K_1;
  537. TouchKeySymb.OneDoubleButton[2]._key := K_2;
  538. TouchKeySymb.OneDoubleButton[3]._key := K_3;
  539. TouchKeySymb.OneDoubleButton[4]._key := K_4;
  540. TouchKeySymb.OneDoubleButton[5]._key := K_5;
  541. TouchKeySymb.OneDoubleButton[6]._key := K_6;
  542. TouchKeySymb.OneDoubleButton[7]._key := K_7;
  543. TouchKeySymb.OneDoubleButton[8]._key := K_8;
  544. TouchKeySymb.OneDoubleButton[9]._key := K_9;
  545. TouchKeySymb.OneDoubleButton[10]._key := K_0;
  546. TouchKeySymb.OneDoubleButton[1].symb[1] := '1';
  547. TouchKeySymb.OneDoubleButton[2].symb[1] := '2';
  548. TouchKeySymb.OneDoubleButton[3].symb[1] := '3';
  549. TouchKeySymb.OneDoubleButton[4].symb[1] := '4';
  550. TouchKeySymb.OneDoubleButton[5].symb[1] := '5';
  551. TouchKeySymb.OneDoubleButton[6].symb[1] := '6';
  552. TouchKeySymb.OneDoubleButton[7].symb[1] := '7';
  553. TouchKeySymb.OneDoubleButton[8].symb[1] := '8';
  554. TouchKeySymb.OneDoubleButton[9].symb[1] := '9';
  555. TouchKeySymb.OneDoubleButton[10].symb[1] := '0';
  556. TouchKeySymb.OneDoubleButton[1].symb[2] := '!';
  557. TouchKeySymb.OneDoubleButton[2].symb[2] := '@';
  558. TouchKeySymb.OneDoubleButton[3].symb[2] := '#';
  559. TouchKeySymb.OneDoubleButton[4].symb[2] := '$';
  560. TouchKeySymb.OneDoubleButton[5].symb[2] := '%';
  561. TouchKeySymb.OneDoubleButton[6].symb[2] := '^';
  562. TouchKeySymb.OneDoubleButton[7].symb[2] := '&';
  563. TouchKeySymb.OneDoubleButton[8].symb[2] := '*';
  564. TouchKeySymb.OneDoubleButton[9].symb[2] := '(';
  565. TouchKeySymb.OneDoubleButton[10].symb[2] := ')';
  566. TouchKeySymb.StringButton[_Home].X := TouchKeySymb.OneDoubleButton[10].X + TouchKeySymb.OWidth + {$IfDef LINUX}rs3{$Else}3{$EndIf};
  567. TouchKeySymb.StringButton[_Home].Y := y0;
  568. TouchKeySymb.StringButton[_Home].Width := TouchKeySymb.OWidth;
  569. TouchKeySymb.StringButton[_Home].bString := NameHome;
  570. TouchKeySymb.StringButton[_Home]._key := K_HOME;
  571. y0 := y0 + dh;
  572. for i := 11 to 20 do
  573. begin
  574. TouchKeySymb.OneDoubleButton[i].X := x0 + dw * (i - 11);
  575. TouchKeySymb.OneDoubleButton[i].Y := y0;
  576. end;
  577. TouchKeySymb.OneDoubleButton[11]._key := K_TILDE;
  578. TouchKeySymb.OneDoubleButton[12]._key := K_SEPARATOR;
  579. TouchKeySymb.OneDoubleButton[13]._key := K_DECIMAL;
  580. TouchKeySymb.OneDoubleButton[14]._key := K_SEMICOLON;
  581. TouchKeySymb.OneDoubleButton[15]._key := K_APOSTROPHE;
  582. TouchKeySymb.OneDoubleButton[16]._key := K_BRACKET_L;
  583. TouchKeySymb.OneDoubleButton[17]._key := K_BRACKET_R;
  584. TouchKeySymb.OneDoubleButton[18]._key := K_MINUS;
  585. TouchKeySymb.OneDoubleButton[19]._key := K_EQUALS;
  586. TouchKeySymb.OneDoubleButton[20]._key := K_BACKSLASH;
  587. TouchKeySymb.OneDoubleButton[11].symb[1] := '`';
  588. TouchKeySymb.OneDoubleButton[12].symb[1] := ',';
  589. TouchKeySymb.OneDoubleButton[13].symb[1] := '.';
  590. TouchKeySymb.OneDoubleButton[14].symb[1] := ';';
  591. TouchKeySymb.OneDoubleButton[15].symb[1] := chr($27);
  592. TouchKeySymb.OneDoubleButton[16].symb[1] := '[';
  593. TouchKeySymb.OneDoubleButton[17].symb[1] := ']';
  594. TouchKeySymb.OneDoubleButton[18].symb[1] := '-';
  595. TouchKeySymb.OneDoubleButton[19].symb[1] := '=';
  596. TouchKeySymb.OneDoubleButton[20].symb[1] := '/';
  597. TouchKeySymb.OneDoubleButton[11].symb[2] := '~';
  598. TouchKeySymb.OneDoubleButton[12].symb[2] := '<';
  599. TouchKeySymb.OneDoubleButton[13].symb[2] := '>';
  600. TouchKeySymb.OneDoubleButton[14].symb[2] := ':';
  601. TouchKeySymb.OneDoubleButton[15].symb[2] := '"';
  602. TouchKeySymb.OneDoubleButton[16].symb[2] := '{';
  603. TouchKeySymb.OneDoubleButton[17].symb[2] := '}';
  604. TouchKeySymb.OneDoubleButton[18].symb[2] := '_';
  605. TouchKeySymb.OneDoubleButton[19].symb[2] := '+';
  606. TouchKeySymb.OneDoubleButton[20].symb[2] := '\';
  607. TouchKeySymb.StringButton[_End].X := TouchKeySymb.OneDoubleButton[20].X + TouchKeySymb.OWidth + {$IfDef LINUX}rs3{$Else}3{$EndIf};
  608. TouchKeySymb.StringButton[_End].Y := y0;
  609. TouchKeySymb.StringButton[_End].Width := TouchKeySymb.OWidth;
  610. TouchKeySymb.StringButton[_End].bString := NameEnd;
  611. TouchKeySymb.StringButton[_End]._key := K_END;
  612. TouchKeySymb.TextureDown := 3;
  613. TouchKeySymb.TextureUp := 3;
  614. y0 := y0 + dh;
  615. TouchKeySymb.StringButton[_Ctrl].X := x0;
  616. TouchKeySymb.StringButton[_Ctrl].Y := y0;
  617. TouchKeySymb.StringButton[_Ctrl].Width := TouchKeySymb.OWidth * {$IfDef LINUX}rs2{$Else}2{$EndIf} + {$IfDef LINUX}rs3{$Else}3{$EndIf};
  618. TouchKeySymb.StringButton[_Ctrl].bString := NameCtrl;
  619. TouchKeySymb.StringButton[_Ctrl]._key := K_CTRL_L;
  620. _xx0 := x0 + TouchKeySymb.StringButton[_Ctrl].Width + {$IfDef LINUX}rs3{$Else}3{$EndIf};
  621. for i := 21 to 23 do
  622. begin
  623. TouchKeySymb.OneDoubleButton[i].X := _xx0 + dw * (i - 21);
  624. TouchKeySymb.OneDoubleButton[i].Y := y0;
  625. end;
  626. // застрелитесь со всеми этими долбанными кодировками!!! ('№')
  627. TouchKeySymb.OneDoubleButton[21].symb[1] := ID_toUTF8(8470);
  628. TouchKeySymb.OneDoubleButton[21].symb[2] := TouchKeySymb.OneDoubleButton[21].symb[1];
  629. TouchKeySymb.OneDoubleButton[21]._key := K_KP_3;
  630. TouchKeySymb.OneDoubleButton[22].symb[1] := '?';
  631. TouchKeySymb.OneDoubleButton[22].symb[2] := '?';
  632. TouchKeySymb.OneDoubleButton[22]._key := K_KP_2;
  633. TouchKeySymb.OneDoubleButton[23].symb[1] := '|';
  634. TouchKeySymb.OneDoubleButton[23].symb[2] := '|';
  635. TouchKeySymb.OneDoubleButton[23]._key := K_KP_1;
  636. TouchKeySymb.BArrow[_Up].X := TouchKeySymb.OneDoubleButton[23].X + {$IfDef LINUX}rs3{$Else}3{$EndIf} * TouchKeySymb.OWidth + {$IfDef LINUX}rs9{$Else}9{$EndIf};
  637. TouchKeySymb.BArrow[_Up].Y := y0;
  638. TouchKeySymb.BArrow[_Up].Angle := {$IfDef LINUX}rs0{$Else}0{$EndIf};
  639. TouchKeySymb.BArrow[_Up]._key := K_UP;
  640. TouchKeySymb.StringButton[_Enter].X := TouchKeySymb.BArrow[_Up].X + {$IfDef LINUX}rs6{$Else}6{$EndIf} + TouchKeySymb.OWidth * {$IfDef LINUX}rs2{$Else}2{$EndIf};
  641. TouchKeySymb.StringButton[_Enter].Y := y0;
  642. TouchKeySymb.StringButton[_Enter].Width := TouchKeySymb.StringButton[_Ctrl].Width;
  643. TouchKeySymb.StringButton[_Enter].bString := NameEnter;
  644. TouchKeySymb.StringButton[_Enter]._key := K_ENTER;
  645. y0 := y0 + dh;
  646. TouchKeySymb.StringButton[_Shift].X := x0;
  647. TouchKeySymb.StringButton[_Shift].Y := y0;
  648. TouchKeySymb.StringButton[_Shift].Width := TouchKeySymb.StringButton[_Ctrl].Width;
  649. TouchKeySymb.StringButton[_Shift].bString := NameShift;
  650. TouchKeySymb.StringButton[_Shift]._key := K_SHIFT_L;
  651. TouchKeySymb.StringButton[_Space].X := TouchKeySymb.StringButton[_Shift].X + TouchKeySymb.StringButton[_Shift].Width + {$IfDef LINUX}rs3{$Else}3{$EndIf};
  652. TouchKeySymb.StringButton[_Space].Y := y0;
  653. TouchKeySymb.StringButton[_Space].Width := TouchKeySymb.StringButton[_Shift].Width;
  654. TouchKeySymb.StringButton[_Space].bString := ' ';
  655. TouchKeySymb.StringButton[_Space]._key := K_SPACE;
  656. TouchKeySymb.StringButton[_Keyboard].X := TouchKeySymb.StringButton[_Space].X + TouchKeySymb.StringButton[_Space].Width + {$IfDef LINUX}rs3{$Else}3{$EndIf};
  657. TouchKeySymb.StringButton[_Keyboard].Y := y0;
  658. TouchKeySymb.StringButton[_Keyboard].Width := TouchKeySymb.StringButton[_Space].Width;
  659. TouchKeySymb.StringButton[_Keyboard].bString := NameKeyboard;
  660. TouchKeySymb.StringButton[_Keyboard]._key := K_F2;
  661. TouchKeySymb.BArrow[_Left].X := TouchKeySymb.StringButton[_Keyboard].X + TouchKeySymb.StringButton[_Keyboard].Width + {$IfDef LINUX}rs3{$Else}3{$EndIf};
  662. TouchKeySymb.BArrow[_Left].Y := y0;
  663. TouchKeySymb.BArrow[_Left].Angle := {$IfDef LINUX}rs270{$Else}270{$EndIf};
  664. TouchKeySymb.BArrow[_Left]._key := K_LEFT;
  665. TouchKeySymb.BArrow[_Down].X := TouchKeySymb.BArrow[_Left].X + TouchKeySymb.OWidth + {$IfDef LINUX}rs3{$Else}3{$EndIf};
  666. TouchKeySymb.BArrow[_Down].Y := y0;
  667. TouchKeySymb.BArrow[_Down].Angle := {$IfDef LINUX}rs180{$Else}180{$EndIf};
  668. TouchKeySymb.BArrow[_Down]._key := K_DOWN;
  669. TouchKeySymb.BArrow[_Right].X := TouchKeySymb.BArrow[_Down].X + TouchKeySymb.OWidth + {$IfDef LINUX}rs3{$Else}3{$EndIf};
  670. TouchKeySymb.BArrow[_Right].Y := y0;
  671. TouchKeySymb.BArrow[_Right].Angle := {$IfDef LINUX}rs90{$Else}90{$EndIf};
  672. TouchKeySymb.BArrow[_Right]._key := K_RIGHT;
  673. TouchKeySymb.StringButton[_Insert].X := TouchKeySymb.BArrow[_Down].X + {$IfDef LINUX}rs6{$Else}6{$EndIf} + TouchKeySymb.OWidth * {$IfDef LINUX}rs2{$Else}2{$EndIf};
  674. TouchKeySymb.StringButton[_Insert].Y := y0;
  675. TouchKeySymb.StringButton[_Insert].Width := TouchKeySymb.OWidth;
  676. TouchKeySymb.StringButton[_Insert].bString := NameInsert;
  677. TouchKeySymb.StringButton[_Insert]._key := K_INSERT;
  678. TouchKeySymb.StringButton[_Del].X := TouchKeySymb.StringButton[_Insert].X + {$IfDef LINUX}rs3{$Else}3{$EndIf} + TouchKeySymb.OWidth;
  679. TouchKeySymb.StringButton[_Del].Y := y0;
  680. TouchKeySymb.StringButton[_Del].Width := TouchKeySymb.OWidth;
  681. TouchKeySymb.StringButton[_Del].bString := NameBackSpace;
  682. TouchKeySymb.StringButton[_Del]._key := K_BACKSPACE;
  683. end;
  684. procedure GameJoy01Down(num: LongWord);
  685. var
  686. i: Integer;
  687. _X, _Y: Integer;
  688. begin
  689. {$IfDef MOBILE}
  690. _X := Mobile_Touch[num].newX;
  691. _Y := Mobile_Touch[num].newY;
  692. {$Else}
  693. _X := mouseX;
  694. _Y := mouseY;
  695. {$EndIf}
  696. if ((Sqr(_X - TouchJoyRolling.Rolling.X) + Sqr(_Y - TouchJoyRolling.Rolling.Y)) <= Sqr(TouchJoyRolling.Rolling.R)) then
  697. begin
  698. TouchJoyRolling.Rolling._x := _X;
  699. TouchJoyRolling.Rolling._y := _Y;
  700. TouchJoyRolling.Rolling.bPush := 1;
  701. TouchJoyRolling.Rolling.direction := m_Angle(TouchJoyRolling.Rolling.X, TouchJoyRolling.Rolling.Y, TouchJoyRolling.Rolling._x, TouchJoyRolling.Rolling._y);
  702. exit;
  703. end
  704. else
  705. TouchJoyRolling.Rolling.bPush := 0;
  706. for i := 1 to TouchJoyRolling.count do
  707. begin
  708. if ((_X > TouchJoyRolling.OneButton[i].X) and (_X < (TouchJoyRolling.OneButton[i].X + TouchJoyRolling.Width)) and
  709. (_Y > TouchJoyRolling.OneButton[i].Y) and (_Y < (TouchJoyRolling.OneButton[i].Y + TouchJoyRolling.Height))) then
  710. begin
  711. // если было нажатие, то отмечаем.
  712. TouchJoyRolling.OneButton[i].bPush := 1;
  713. keysDown[TouchJoyRolling.OneButton[i]._key] := True;
  714. exit;
  715. end
  716. else begin
  717. // в противном случае, "обнуляем", но по сути проще обнулить все? Или возможно множественное нажатие?
  718. keysDown[TouchJoyRolling.OneButton[i]._key] := False;
  719. TouchJoyRolling.OneButton[i].bPush := 0;
  720. end;
  721. end;
  722. end;
  723. procedure GameJoy02Down(num: LongWord);
  724. var
  725. i: Integer;
  726. _X, _Y: Integer;
  727. begin
  728. {$IfDef MOBILE}
  729. _X := Mobile_Touch[num].newX;
  730. _Y := Mobile_Touch[num].newY;
  731. {$Else}
  732. _X := mouseX;
  733. _Y := mouseY;
  734. {$EndIf}
  735. for i := 1 to 9 do
  736. if i <> 5 then
  737. begin
  738. if ((_X > TouchJoy.BArrow[i].X) and (_X < (TouchJoy.BArrow[i].X + TouchJoy.Width)) and
  739. (_Y > TouchJoy.BArrow[i].Y) and (_Y < (TouchJoy.BArrow[i].Y + TouchJoy.Height))) then
  740. begin
  741. TouchJoy.BArrow[i].bPush := 1;
  742. keysDown[TouchJoy.BArrow[i]._key] := true;
  743. end
  744. else begin
  745. TouchJoy.BArrow[i].bPush := 0;
  746. keysDown[TouchJoy.BArrow[i]._key] := false;
  747. end;
  748. end;
  749. for i := 1 to TouchJoy.count do
  750. begin
  751. if ((_X > TouchJoy.OneButton[i].X) and (_X < (TouchJoy.OneButton[i].X + TouchJoy.Width)) and
  752. (_Y > TouchJoy.OneButton[i].Y) and (_Y < (TouchJoy.OneButton[i].Y + TouchJoy.Height))) then
  753. begin
  754. TouchJoy.OneButton[i].bPush := 1;
  755. keysDown[TouchJoy.OneButton[i]._key] := True;
  756. end
  757. else begin
  758. keysDown[TouchJoy.OneButton[i]._key] := False;
  759. TouchJoy.OneButton[i].bPush := 0;
  760. end;
  761. end;
  762. end;
  763. procedure TouchKeyboardDown(num: LongWord);
  764. var
  765. i: Integer;
  766. lastKey: LongWord;
  767. _X, _Y: Integer;
  768. label
  769. toCompareKey;
  770. begin
  771. {$IfDef MOBILE}
  772. _X := Mobile_Touch[num].newX;
  773. _Y := Mobile_Touch[num].newY;
  774. {$Else}
  775. _X := mouseX;
  776. _Y := mouseY;
  777. {$EndIf}
  778. for i := 35 to 45 do
  779. begin
  780. if ((_X > TouchKey.StringButton[i].X) and (_X < (TouchKey.StringButton[i].X + TouchKey.StringButton[i].Width)) and
  781. (_Y > TouchKey.StringButton[i].Y) and (_Y < (TouchKey.StringButton[i].Y + TouchKey.Height))) then
  782. begin
  783. { if (i = _Rus) then
  784. Continue; }
  785. // выставляем какой код был на мышке последний. Но с тачпадом надо будет проверять именно номер "клика"
  786. lastKey := TouchKey.StringButton[i]._key;
  787. if (firstTapKey = is_notTouch) or ((firstTapKey = num) and (mouseLastVKey[num] = lastKey)) or (lastKey = K_SHIFT_L) or (lastKey = K_CAPSLOCK) then
  788. keyboardDown(lastKey)
  789. else
  790. lastKey := 0;
  791. goto toCompareKey;
  792. end;
  793. end;
  794. for i := 1 to TouchKey.count do
  795. begin
  796. if ((_X > TouchKey.OneButton[i].X) and (_X < (TouchKey.OneButton[i].X + TouchKey.OWidth)) and
  797. (_Y > TouchKey.OneButton[i].Y) and (_Y < (TouchKey.OneButton[i].Y + TouchKey.Height))) then
  798. begin
  799. // выставляем какой код был на мышке последний. Но с тачпадом надо будет проверять именно номер "клика"
  800. lastKey := TouchKey.OneButton[i]._key;
  801. if (firstTapKey = is_notTouch) or ((firstTapKey = num) and (mouseLastVKey[num] = lastKey)) then
  802. keyboardDown(lastKey)
  803. else
  804. break;
  805. goto toCompareKey;
  806. end;
  807. end;
  808. lastKey := 0;
  809. toCompareKey:
  810. if (mouseLastVKey[num] <> 0) and (lastKey <> mouseLastVKey[num]) then
  811. begin
  812. keyboardUp(mouseLastVKey[num]);
  813. mouseLastVKey[num] := 0;
  814. end;
  815. case lastKey of
  816. K_PAUSE, K_INSERT, K_CTRL_L, K_CTRL_R, K_ALT_L, K_ALT_R, K_SHIFT_L, K_SHIFT_R, K_SUPER_L, K_SUPER_R, K_BACKSPACE,
  817. K_APP_MENU, K_CAPSLOCK, K_NUMLOCK, K_SCROLL, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12: ;
  818. else begin
  819. if (lastKey > 0) and (firstTapKey = is_notTouch) then
  820. firstTapKey := num;
  821. mouseLastVKey[num] := lastKey;
  822. end;
  823. end;
  824. end;
  825. procedure TouchSymbolDown(num: LongWord);
  826. var
  827. i: Integer;
  828. lastKey: LongWord;
  829. _X, _Y: Integer;
  830. label
  831. toCompareKey;
  832. begin
  833. {$IfDef MOBILE}
  834. _X := Mobile_Touch[num].newX;
  835. _Y := Mobile_Touch[num].newY;
  836. {$Else}
  837. _X := mouseX;
  838. _Y := mouseY;
  839. {$EndIf}
  840. for i := 1 to TouchKeySymb.count do
  841. begin
  842. { if ((_X > TouchKeySymb.OneDoubleButton[i].X) and (_X < (TouchKeySymb.OneDoubleButton[i].X + TouchKeySymb.OWidth)) and
  843. (_Y > TouchKeySymb.OneDoubleButton[i].Y) and (_Y < (TouchKeySymb.OneDoubleButton[i].Y + TouchKeySymb.Height))) then }
  844. if (_X > TouchKeySymb.OneDoubleButton[i].X) then
  845. if (_X < (TouchKeySymb.OneDoubleButton[i].X + TouchKeySymb.OWidth)) then
  846. if (_Y > TouchKeySymb.OneDoubleButton[i].Y) then
  847. if (_Y < (TouchKeySymb.OneDoubleButton[i].Y + TouchKeySymb.Height)) then
  848. begin
  849. // выставляем какой код был на мышке последний. Но с тачпадом надо будет проверять именно номер "клика"
  850. lastKey := TouchKeySymb.OneDoubleButton[i]._key;
  851. // if (keysLast[KT_DOWN] = 0) or (keysLast[KT_DOWN] = lastKey) then
  852. if (firstTapKey = is_notTouch) or ((firstTapKey = num) and (mouseLastVKey[num] = lastKey)) then
  853. keyboardDown(lastKey)
  854. else
  855. lastKey := 0;
  856. goto toCompareKey;
  857. end;
  858. end;
  859. for i := 24 to 27 do
  860. begin
  861. if ((_X > TouchKeySymb.BArrow[i].X) and (_X < (TouchKeySymb.BArrow[i].X + TouchKeySymb.OWidth)) and
  862. (_Y > TouchKeySymb.BArrow[i].Y) and (_Y < (TouchKeySymb.BArrow[i].Y + TouchKeySymb.Height))) then
  863. begin
  864. // выставляем какой код был на мышке последний. Но с тачпадом надо будет проверять именно номер "клика"
  865. lastKey := TouchKeySymb.BArrow[i]._key;
  866. // if (keysLast[KT_DOWN] = 0) or (keysLast[KT_DOWN] = lastKey) then
  867. if (firstTapKey = is_notTouch) or ((firstTapKey = num) and (mouseLastVKey[num] = lastKey)) then
  868. keyboardDown(lastKey)
  869. else
  870. lastKey := 0;
  871. goto toCompareKey;
  872. end;
  873. end;
  874. for i := 36 to 44 do
  875. Begin
  876. if ((_X > TouchKeySymb.StringButton[i].X) and (_X < (TouchKeySymb.StringButton[i].X + TouchKeySymb.StringButton[i].Width)) and
  877. (_Y > TouchKeySymb.StringButton[i].Y) and (_Y < (TouchKeySymb.StringButton[i].Y + TouchKeySymb.Height))) then
  878. begin
  879. // выставляем какой код был на мышке последний. Но с тачпадом надо будет проверять именно номер "клика"
  880. lastKey := TouchKeySymb.StringButton[i]._key;
  881. // if (keysLast[KT_DOWN] = 0) or (keysLast[KT_DOWN] = lastKey) or ((keysLast[KT_DOWN] <> 0) and ((lastKey = K_SHIFT_L) or (lastKey = K_CTRL_L))) then
  882. if (firstTapKey = is_notTouch) or ((firstTapKey = num) and (mouseLastVKey[num] = lastKey)) or (lastKey = K_SHIFT_L) or (lastKey = K_CTRL_L) then
  883. keyboardDown(lastKey)
  884. else
  885. Break;
  886. goto toCompareKey;
  887. end;
  888. end;
  889. lastKey := 0;
  890. toCompareKey:
  891. if (mouseLastVKey[num] <> 0) and (lastKey <> mouseLastVKey[num]) then
  892. begin
  893. keyboardUp(mouseLastVKey[num]);
  894. mouseLastVKey[num] := 0;
  895. end;
  896. case lastKey of
  897. K_PAUSE, K_INSERT, K_CTRL_L, K_CTRL_R, K_ALT_L, K_ALT_R, K_SHIFT_L, K_SHIFT_R, K_SUPER_L, K_SUPER_R,
  898. K_APP_MENU, K_CAPSLOCK, K_NUMLOCK, K_SCROLL, K_F1, K_F2, K_F3, K_F4, K_F5, K_F6, K_F7, K_F8, K_F9, K_F10, K_F11, K_F12: ;
  899. else begin
  900. if (lastKey > 0) and (firstTapKey = is_notTouch) then
  901. firstTapKey := num;
  902. mouseLastVKey[num] := lastKey;
  903. end;
  904. end;
  905. end;
  906. procedure ShowVKeyboard;
  907. begin
  908. VisibleMenuChange := true;
  909. end;
  910. procedure HideVKeyboard;
  911. begin
  912. VisibleMenuChange := False;
  913. end;
  914. procedure GameJoy01Up(num: LongWord);
  915. var
  916. i: Integer;
  917. begin
  918. TouchJoyRolling.Rolling.bPush := 0;
  919. for i := 1 to TouchJoyRolling.count do
  920. begin
  921. TouchJoyRolling.OneButton[i].bPush := 0;
  922. keyboardUp(TouchJoyRolling.OneButton[i]._key);
  923. end;
  924. end;
  925. procedure GameJoy02Up(num: LongWord);
  926. var
  927. i: Integer;
  928. begin
  929. for i := 1 to 9 do
  930. if i <> 5 then
  931. begin
  932. TouchJoy.BArrow[i].bPush := 0;
  933. keyboardUp(TouchJoy.BArrow[i]._key);
  934. end;
  935. for i := 1 to TouchJoy.count do
  936. begin
  937. TouchJoy.OneButton[i].bPush := 0;
  938. keyboardUp(TouchJoy.OneButton[i]._key);
  939. end;
  940. end;
  941. procedure TouchKeyboardUp(num: LongWord);
  942. var
  943. i: Integer;
  944. lastKey: LongWord;
  945. _X, _Y: Integer;
  946. begin
  947. {$IfDef MOBILE}
  948. _X := Mobile_Touch[num].oldX;
  949. _Y := Mobile_Touch[num].oldY;
  950. {$Else}
  951. _X := mouseX;
  952. _Y := mouseY;
  953. {$EndIf}
  954. for i := 35 to 45 do
  955. begin
  956. if ((_X > TouchKey.StringButton[i].X) and (_X < (TouchKey.StringButton[i].X + TouchKey.StringButton[i].Width)) and
  957. (_Y > TouchKey.StringButton[i].Y) and (_Y < (TouchKey.StringButton[i].Y + TouchKey.Height))) then
  958. begin
  959. if (i = _Rus) then
  960. Continue;
  961. lastKey := TouchKey.StringButton[i]._key;
  962. if firstTapKey = num then
  963. firstTapKey := is_notTouch;
  964. keyboardUp(lastKey);
  965. mouseLastVKey[num] := 0;
  966. exit;
  967. end;
  968. end;
  969. for i := 1 to TouchKey.count do
  970. begin
  971. if ((_X > TouchKey.OneButton[i].X) and (_X < (TouchKey.OneButton[i].X + TouchKey.OWidth)) and
  972. (_Y > TouchKey.OneButton[i].Y) and (_Y < (TouchKey.OneButton[i].Y + TouchKey.Height))) then
  973. begin
  974. lastKey := TouchKey.OneButton[i]._key;
  975. if firstTapKey = num then
  976. firstTapKey := is_notTouch;
  977. keyboardUp(lastKey);
  978. break;
  979. end;
  980. end;
  981. mouseLastVKey[num] := 0;
  982. end;
  983. procedure TouchSymbolUp(num: LongWord);
  984. var
  985. i: Integer;
  986. lastKey: LongWord;
  987. _X, _Y: Integer;
  988. begin
  989. {$IfDef MOBILE}
  990. _X := Mobile_Touch[num].oldX;
  991. _Y := Mobile_Touch[num].oldY;
  992. {$Else}
  993. _X := mouseX;
  994. _Y := mouseY;
  995. {$EndIf}
  996. for i := 1 to TouchKeySymb.count do
  997. begin
  998. if ((_X > TouchKeySymb.OneDoubleButton[i].X) and (_X < (TouchKeySymb.OneDoubleButton[i].X + TouchKeySymb.OWidth)) and
  999. (_Y > TouchKeySymb.OneDoubleButton[i].Y) and (_Y < (TouchKeySymb.OneDoubleButton[i].Y + TouchKeySymb.Height))) then
  1000. begin
  1001. lastKey := TouchKeySymb.OneDoubleButton[i]._key;
  1002. if firstTapKey = num then
  1003. firstTapKey := is_notTouch;
  1004. keyboardUp(lastKey);
  1005. mouseLastVKey[num] := 0;
  1006. exit;
  1007. end;
  1008. end;
  1009. for i := 24 to 27 do
  1010. begin
  1011. if ((_X > TouchKeySymb.BArrow[i].X) and (_X < (TouchKeySymb.BArrow[i].X + TouchKeySymb.OWidth)) and
  1012. (_Y > TouchKeySymb.BArrow[i].Y) and (_Y < (TouchKeySymb.BArrow[i].Y + TouchKeySymb.Height))) then
  1013. begin
  1014. lastKey := TouchKeySymb.BArrow[i]._key;
  1015. if firstTapKey = num then
  1016. firstTapKey := is_notTouch;
  1017. keyboardUp(lastKey);
  1018. mouseLastVKey[num] := 0;
  1019. exit;
  1020. end;
  1021. end;
  1022. for i := 36 to 44 do
  1023. Begin
  1024. if ((_X > TouchKeySymb.StringButton[i].X) and (_X < (TouchKeySymb.StringButton[i].X + TouchKeySymb.StringButton[i].Width)) and
  1025. (_Y > TouchKeySymb.StringButton[i].Y) and (_Y < (TouchKeySymb.StringButton[i].Y + TouchKeySymb.Height))) then
  1026. begin
  1027. lastKey := TouchKeySymb.StringButton[i]._key;
  1028. if firstTapKey = num then
  1029. firstTapKey := is_notTouch;
  1030. keyboardUp(lastKey);
  1031. // if (i = _Shift) or (i = _Ctrl) then
  1032. break;
  1033. end;
  1034. end;
  1035. mouseLastVKey[num] := 0;
  1036. end;
  1037. end.