panel.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <draw.h>
  4. #include <thread.h>
  5. #include <mouse.h>
  6. #include <jay.h>
  7. #include "fns.h"
  8. void _hoverPanel(Widget *w, Mouse *m);
  9. void _unhoverPanel(Widget *w);
  10. void _drawPanel(Widget *w, Image *dst);
  11. void _redrawPanel(Widget *w);
  12. int _addWidgetToPanel(Widget *me, Widget *new, Point pos);
  13. void _resizePanel(Widget *w, Point d);
  14. void _clickPanel(Widget *w, Mouse *m);
  15. void _dclickPanel(Widget *w, Mouse *m);
  16. void _mPressDownPanel(Widget *w, Mouse *m);
  17. void _mPressUpPanel(Widget *w, Mouse *m);
  18. void _freePanel(Widget *w);
  19. void _deleteWidgetPanel(Widget *me, char *id);
  20. int _listWidgetsPanel(Widget *me, char ***list);
  21. Widget * _extractWidgetPanel(Widget *me, char *id);
  22. Widget * _getWidgetPanel(Widget *me, char *id);
  23. static void
  24. genPanel(Widget *w, Panel *paux, Point p){
  25. paux->w=w;
  26. paux->l = nil;
  27. paux->backColor = jayconfig->mainBackColor;
  28. w->_hover=_hoverPanel;
  29. w->_unhover=_unhoverPanel;
  30. w->_draw=_drawPanel;
  31. w->_redraw=_redrawPanel;
  32. w->addWidget=_addWidgetToPanel;
  33. w->_resize=_resizePanel;
  34. w->_click=_clickPanel;
  35. w->_dclick=_dclickPanel;
  36. w->_mpressdown=_mPressDownPanel;
  37. w->_mpressup=_mPressUpPanel;
  38. w->freeWidget=_freePanel;
  39. w->deleteWidget=_deleteWidgetPanel;
  40. w->listWidgets=_listWidgetsPanel;
  41. w->extractWidget=_extractWidgetPanel;
  42. w->getWidget=_getWidgetPanel;
  43. w->p=p;
  44. }
  45. Widget *
  46. createPanel1(char *id, Rectangle r, Point p){
  47. Panel *paux = malloc(sizeof(Panel));
  48. if (paux == nil){
  49. return nil;
  50. }
  51. Widget *w = createWidget1(id, r, PANEL, paux);
  52. if (w == nil){
  53. return nil;
  54. }
  55. genPanel(w, paux, p);
  56. return w;
  57. }
  58. Widget *
  59. createPanel(char *id, int height, int width, Point p){
  60. Panel *paux = malloc(sizeof(Panel));
  61. if (paux == nil){
  62. return nil;
  63. }
  64. Widget *w = createWidget(id, height, width, PANEL, paux);
  65. if (w == nil){
  66. return nil;
  67. }
  68. genPanel(w, paux, p);
  69. return w;
  70. }
  71. static int
  72. checkPanel(Widget *w){
  73. if (w == nil || w->t != PANEL || w->w == nil || !w->visible){
  74. return 0;
  75. }
  76. return 1;
  77. }
  78. void
  79. _hoverPanel(Widget *w, Mouse *m){
  80. if(!checkPanel(w)){
  81. return;
  82. }
  83. Panel *p = (Panel *)w->w;
  84. w->hovered=1;
  85. if(w->lh != nil){
  86. if(ptinrect(m->xy, w->lh->r)){
  87. if(w->lh->t == PANEL){
  88. //It's a container, so we need to send again the _hover event
  89. w->lh->_hover(w->lh, m);
  90. }
  91. return;
  92. }
  93. w->lh->_unhover(w->lh);
  94. w->lh=nil;
  95. }
  96. for (WListElement *i=p->l; i != nil; i=i->next){
  97. if(ptinrect(m->xy, i->w->r)){
  98. if (!i->w->hovered){
  99. i->w->_hover(i->w, m);
  100. w->lh = i->w;
  101. return;
  102. }
  103. }
  104. }
  105. if(w->hover!=nil){
  106. w->hover(w);
  107. w->_redraw(w);
  108. }
  109. }
  110. void
  111. _unhoverPanel(Widget *w){
  112. if(!checkPanel(w)){
  113. return;
  114. }
  115. w->hovered = 0;
  116. if (w->unhover != nil){
  117. w->unhover(w);
  118. w->_redraw(w);
  119. }
  120. }
  121. void
  122. _drawPanel(Widget *w, Image *dst) {
  123. if(!checkPanel(w)){
  124. return;
  125. }
  126. Panel *p = (Panel *)w->w;
  127. if (w->i != nil){
  128. freeimage(w->i);
  129. }
  130. w->i = allocimage(display, w->r, RGB24, 1, p->backColor);
  131. if(w->i == nil){
  132. sysfatal("_drawPanel: %r");
  133. }
  134. for (WListElement *e=p->l; e != nil; e=e->next){
  135. if(e->w->visible){
  136. e->w->_draw(e->w, w->i);
  137. }
  138. }
  139. draw(dst, w->r, w->i, nil, w->p);
  140. flushimage(display, 1);
  141. }
  142. int
  143. _addWidgetToPanel(Widget *me, Widget *new, Point pos){
  144. Point real;
  145. if (me == nil || me->t != PANEL || me->w == nil){
  146. return 0;
  147. }
  148. Panel *p = (Panel *)me->w;
  149. real.x = me->r.min.x + pos.x;
  150. real.y = me->r.min.y + pos.y;
  151. new->p = real;
  152. new->pos = pos;
  153. if (!new->autosize){
  154. new->r = Rect(real.x, real.y, real.x + new->width, real.y + new->height);
  155. }
  156. if(p->l == nil){
  157. p->l = createWListElement(new);
  158. if (p->l == nil){
  159. return 0;
  160. }
  161. } else if (!addWListElement(p->l, new)) {
  162. return 0;
  163. }
  164. new->father = me;
  165. return 1;
  166. }
  167. void
  168. _redrawPanel(Widget *w){
  169. if(!checkPanel(w)){
  170. return;
  171. }
  172. if(w->father==nil || !w->autosize){
  173. w->_draw(w, screen);
  174. } else {
  175. w->father->_redraw(w->father);
  176. }
  177. }
  178. void
  179. _resizePanel(Widget *w, Point d){
  180. if(!checkPanel(w)){
  181. return;
  182. }
  183. Panel *p = (Panel *)w->w;
  184. _simpleResize(w, d);
  185. for (WListElement *e=p->l; e != nil; e=e->next){
  186. e->w->_resize(e->w, d);
  187. }
  188. if(w->father == nil){
  189. //I'm the main panel
  190. w->_draw(w, screen);
  191. }
  192. flushimage(display, 1);
  193. }
  194. void
  195. _clickPanel(Widget *w, Mouse *m){
  196. if(!checkPanel(w)){
  197. return;
  198. }
  199. w->_hover(w, m);
  200. if (w->lh == nil){
  201. //Click on the panel
  202. if(w->click != nil){
  203. w->click(w, m);
  204. w->_redraw(w);
  205. }
  206. }else{
  207. //Click on a widget over the panel
  208. w->lh->_click(w->lh, m);
  209. }
  210. }
  211. void
  212. _dclickPanel(Widget *w, Mouse *m){
  213. if(!checkPanel(w)){
  214. return;
  215. }
  216. w->_hover(w, m);
  217. if (w->lh == nil){
  218. //Click on the panel
  219. if(w->dclick != nil){
  220. w->dclick(w, m);
  221. w->_redraw(w);
  222. }
  223. }else{
  224. //Click on a widget over the panel
  225. w->lh->_dclick(w->lh, m);
  226. }
  227. }
  228. void
  229. _mPressDownPanel(Widget *w, Mouse *m){
  230. if(!checkPanel(w)){
  231. return;
  232. }
  233. w->_hover(w, m);
  234. if (w->lh == nil){
  235. //Press down mouse button on the panel
  236. if(w->mpressdown != nil){
  237. w->mpressdown(w, m);
  238. w->_redraw(w);
  239. }
  240. }else{
  241. //Press down mouse button on a widget over the panel
  242. w->lh->_mpressdown(w->lh, m);
  243. }
  244. }
  245. void
  246. _mPressUpPanel(Widget *w, Mouse *m){
  247. if(!checkPanel(w)){
  248. return;
  249. }
  250. w->_hover(w, m);
  251. if (w->lh == nil){
  252. //Press down mouse button on the panel
  253. if(w->mpressup != nil){
  254. w->mpressup(w, m);
  255. w->_redraw(w);
  256. }
  257. }else{
  258. //Press down mouse button on a widget over the panel
  259. w->lh->_mpressup(w->lh, m);
  260. }
  261. }
  262. void
  263. _freePanel(Widget *w){
  264. if(!checkPanel(w)){
  265. return;
  266. }
  267. Panel *p = w->w;
  268. destroyWList(p->l);
  269. free(p);
  270. freeWidget(w);
  271. }
  272. Widget *
  273. _getWidgetPanel(Widget *me, char *id){
  274. if(!checkPanel(me)){
  275. return nil;
  276. }
  277. Panel *p = me->w;
  278. WListElement *e = getWListElementByID(p->l, id);
  279. if (e == nil){
  280. return nil;
  281. }
  282. return e->w;
  283. }
  284. Widget *
  285. _extractWidgetPanel(Widget *me, char *id){
  286. if(!checkPanel(me)){
  287. return nil;
  288. }
  289. Panel *p = me->w;
  290. return extractWidgetByID(p->l, id);
  291. }
  292. int
  293. _listWidgetsPanel(Widget *me, char ***list){
  294. if(!checkPanel(me)){
  295. return 0;
  296. }
  297. Panel *p = me->w;
  298. int n = countWListElements(p->l);
  299. *list = malloc(n);
  300. int i=0;
  301. for(WListElement *e = p->l; e != nil ; e=e->next ){
  302. *((*list)+i) = strdup(e->w->id);
  303. i++;
  304. }
  305. return n;
  306. }
  307. void
  308. _deleteWidgetPanel(Widget *me, char *id){
  309. if(!checkPanel(me)){
  310. return;
  311. }
  312. Panel *p = me->w;
  313. Widget *w = extractWidgetByID(p->l, id);
  314. w->freeWidget(w);
  315. me->_redraw(me);
  316. }