ChatOptions.cpp 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. #include "ChatOptions.h"
  2. #include <FileSystem.h>
  3. #include "FactoryClient.h"
  4. #include "Globals.h"
  5. #include "Initialization.h"
  6. #include "World.h"
  7. ChatOptions::ChatOptions()
  8. : Window()
  9. {
  10. LTDBFile iconsDat;
  11. iconsDat.setFile(new Text("data/images/gui_icons.ltdb"));
  12. iconsDat.readData(0);
  13. setStyle(Window::Style::Allowed | Window::Style::Border
  14. | Window::Style::BodyBAlpha | Window::Style::Title
  15. | Window::Style::TitleBAlpha | Window::Style::Closable
  16. | Window::Style::ClosingBAlpha | Window::Style::ClosingBuffer
  17. | Window::Style::TitleBackground | Window::Style::BodyBackground
  18. | Window::Style::ClosingBackground | Window::Style::MEIgnoreInside
  19. | Window::Style::Movable | Style::ClosingBImage
  20. | Style::ClosingBuffer);
  21. removeStyle(Window::Style::Visible);
  22. setTitel("Chat options");
  23. setClosingMe([this](void* p, void* o, Framework::MouseEvent me) {
  24. if (me.id == Framework::ME_RLeft)
  25. {
  26. removeStyle(Window::Style::Visible);
  27. }
  28. return 1;
  29. });
  30. setSize(262, 367);
  31. setPosition(5, uiFactory.initParam.bildschirm->getBackBufferSize().y - 680);
  32. setMouseEvent(Framework::_ret1ME);
  33. setKeyboardEvent(Framework::_ret1TE);
  34. setBorderWidth(1);
  35. setBorderColor(0xFF52525E);
  36. setBodyBgColor(0xA0000000);
  37. setTBgColor(0xA0000000);
  38. setCloseBgColor(0xA0000000);
  39. setTFontZ(dynamic_cast<Font*>(uiFactory.initParam.font->getThis()));
  40. zTTextField()->setSize(0, 20);
  41. zTTextField()->addStyle(TextField::Style::Center);
  42. setCloseAfStrength(10);
  43. setCloseAfColor(0x5F9C0A0A);
  44. setCloseBgImageZ(iconsDat.load(0, new Text("close.png")));
  45. setCloseClickAfColor(0xFF9C0A0A);
  46. setCloseAfStrength(10);
  47. infoChannel = initCheckBox(5,
  48. 5,
  49. 250,
  50. 20,
  51. Framework::CheckBox::Style::Normal
  52. & ~Framework::CheckBox::Style::Border,
  53. "Show info messages");
  54. infoChannel->setPostMouseEvent([this](void* p, void* o, MouseEvent me) {
  55. if (me.id == ME_RLeft)
  56. {
  57. char msg[13];
  58. msg[0] = infoChannel->hasStyle(CheckBox::Style::Selected) ? 1 : 2;
  59. msg[1] = 11;
  60. memcpy(msg + 2, "system:INFO", 11);
  61. World::INSTANCE->zClient()->chatAPIRequest(msg, 13);
  62. }
  63. return 1;
  64. });
  65. addMember(infoChannel);
  66. warningChannel = initCheckBox(5,
  67. 30,
  68. 250,
  69. 20,
  70. Framework::CheckBox::Style::Normal
  71. & ~Framework::CheckBox::Style::Border,
  72. "Show warning messages");
  73. warningChannel->setPostMouseEvent([this](void* p, void* o, MouseEvent me) {
  74. if (me.id == ME_RLeft)
  75. {
  76. char msg[16];
  77. msg[0]
  78. = warningChannel->hasStyle(CheckBox::Style::Selected) ? 1 : 2;
  79. msg[1] = 14;
  80. memcpy(msg + 2, "system:WARNING", 14);
  81. World::INSTANCE->zClient()->chatAPIRequest(msg, 16);
  82. }
  83. return 1;
  84. });
  85. addMember(warningChannel);
  86. errorChannel = initCheckBox(5,
  87. 55,
  88. 250,
  89. 20,
  90. Framework::CheckBox::Style::Normal
  91. & ~Framework::CheckBox::Style::Border,
  92. "Show error messages");
  93. errorChannel->setPostMouseEvent([this](void* p, void* o, MouseEvent me) {
  94. if (me.id == ME_RLeft)
  95. {
  96. char msg[14];
  97. msg[0] = errorChannel->hasStyle(CheckBox::Style::Selected) ? 1 : 2;
  98. msg[1] = 12;
  99. memcpy(msg + 2, "system:ERROR", 12);
  100. World::INSTANCE->zClient()->chatAPIRequest(msg, 14);
  101. }
  102. return 1;
  103. });
  104. addMember(errorChannel);
  105. TextField* blackListLabel = initTextField(5,
  106. 90,
  107. 250,
  108. 20,
  109. Framework::TextField::Style::Text
  110. | Framework::TextField::Style::VCenter,
  111. "Ignored players:");
  112. addMember(blackListLabel);
  113. plus = iconsDat.load(0, new Text("plus.png"));
  114. trash = iconsDat.load(0, new Text("trash.png"));
  115. playerName = initTextField(
  116. 5, 115, 225, 20, Framework::TextField::Style::TextField, "");
  117. playerName->setKeyboardEvent([this](void* o, void* p, KeyboardEvent te) {
  118. if (te.id == TE_Release && te.virtualKey == T_Enter)
  119. {
  120. if (playerName->zText()->getLength())
  121. {
  122. addIgnoredPlayer(playerName->zText()->getText(), 1);
  123. playerName->setText("");
  124. }
  125. }
  126. return 1;
  127. });
  128. addMember(playerName);
  129. addButton = initButton(235,
  130. 115,
  131. 20,
  132. 20,
  133. Framework::Button::Style::BImage | Framework::Button::Style::BAlpha
  134. | Framework::Button::Style::Background,
  135. "");
  136. addButton->setAlphaFieldColor(0x5F337AB7);
  137. addButton->setToolTipText("Add player to list of ignored players",
  138. uiFactory.initParam.bildschirm,
  139. uiFactory.initParam.font);
  140. addButton->setBackgroundImageZ(dynamic_cast<Image*>(plus->getThis()));
  141. addButton->setMouseEvent([this](void* o, void* p, MouseEvent me) {
  142. if (me.id == ME_RLeft)
  143. {
  144. if (playerName->zText()->getLength())
  145. {
  146. addIgnoredPlayer(playerName->zText()->getText(), 1);
  147. playerName->setText("");
  148. }
  149. }
  150. return 1;
  151. });
  152. addMember(addButton);
  153. blackList = initObjTable(5,
  154. 140,
  155. 250,
  156. 200,
  157. Framework::ObjTable::Style::normal
  158. | Framework::ObjTable::Style::VScroll,
  159. {
  160. {"Player", 212, 212, 212},
  161. {"Remove", 20, 20, 20 }
  162. },
  163. 0);
  164. addMember(blackList);
  165. }
  166. ChatOptions::~ChatOptions()
  167. {
  168. if (plus) plus->release();
  169. if (trash) trash->release();
  170. }
  171. void ChatOptions::init(char* data)
  172. {
  173. infoChannel->removeStyle(CheckBox::Style::Selected);
  174. warningChannel->removeStyle(CheckBox::Style::Selected);
  175. errorChannel->removeStyle(CheckBox::Style::Selected);
  176. int len = *(int*)data;
  177. data += 4;
  178. for (int i = 0; i < len; i++)
  179. {
  180. char len = *(data++);
  181. data += len;
  182. if (len == 11)
  183. {
  184. infoChannel->addStyle(CheckBox::Style::Selected);
  185. }
  186. if (len == 12)
  187. {
  188. errorChannel->addStyle(CheckBox::Style::Selected);
  189. }
  190. if (len == 14)
  191. {
  192. warningChannel->addStyle(CheckBox::Style::Selected);
  193. }
  194. }
  195. uiFactory.initParam.bildschirm->postAction([this]() {
  196. while (blackList->getRowCount())
  197. {
  198. blackList->removeRow(0);
  199. }
  200. });
  201. len = *(int*)data;
  202. data += 4;
  203. for (int i = 0; i < len; i++)
  204. {
  205. char len = *(data++);
  206. char* name = new char[len + 1];
  207. memcpy(name, data, len);
  208. name[len] = 0;
  209. data += len;
  210. addIgnoredPlayer(name, 0);
  211. delete[] name;
  212. }
  213. }
  214. void ChatOptions::addIgnoredPlayer(Framework::Text playerName, bool msg)
  215. {
  216. if (blackList->getRowNumber(playerName) >= 0) return;
  217. if (msg)
  218. {
  219. char* msg = new char[2 + playerName.getLength()];
  220. msg[0] = 3;
  221. msg[1] = (char)playerName.getLength();
  222. memcpy(msg + 2, playerName, playerName.getLength());
  223. World::INSTANCE->zClient()->chatAPIRequest(
  224. msg, 2 + playerName.getLength());
  225. delete[] msg;
  226. }
  227. uiFactory.initParam.bildschirm->postAction([this, playerName]() {
  228. if (blackList->getRowNumber(playerName) >= 0) return;
  229. blackList->addRow(playerName);
  230. blackList->setDrawableZ("Player",
  231. playerName,
  232. initTextField(0,
  233. 0,
  234. 0,
  235. 0,
  236. TextField::Style::Text | TextField::Style::VCenter,
  237. playerName.getText()));
  238. Button* removeButton = initButton(0,
  239. 0,
  240. 0,
  241. 0,
  242. Framework::Button::Style::BImage | Framework::Button::Style::BAlpha
  243. | Framework::Button::Style::Background,
  244. "");
  245. removeButton->removeStyle(Button::Style::Border);
  246. removeButton->setAlphaFieldColor(0x5F337AB7);
  247. removeButton->setToolTipText(
  248. "Remove player from list of ignored players",
  249. uiFactory.initParam.bildschirm,
  250. uiFactory.initParam.font);
  251. removeButton->setBackgroundImageZ(
  252. dynamic_cast<Image*>(trash->getThis()));
  253. removeButton->setMouseEvent(
  254. [this, playerName](void* o, void* p, MouseEvent me) {
  255. if (me.id == ME_RLeft)
  256. {
  257. uiFactory.initParam.bildschirm->postAction(
  258. [this, playerName]() {
  259. char* msg = new char[2 + playerName.getLength()];
  260. msg[0] = 4;
  261. msg[1] = (char)playerName.getLength();
  262. memcpy(msg + 2, playerName, playerName.getLength());
  263. World::INSTANCE->zClient()->chatAPIRequest(
  264. msg, 2 + playerName.getLength());
  265. delete[] msg;
  266. blackList->removeRow(playerName);
  267. });
  268. }
  269. return 1;
  270. });
  271. blackList->setDrawableZ("Remove", playerName, removeButton);
  272. });
  273. }