status.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include "macs.hpp"
  2. #include "status.hpp"
  3. #include "dprint.hpp"
  4. status_manager *stat_man=NULL;
  5. class text_status_node
  6. {
  7. public :
  8. char *name;
  9. text_status_node *next;
  10. visual_object *show;
  11. int last_update;
  12. text_status_node(char *Name, visual_object *Show, text_status_node *Next)
  13. { name=strcpy((char *)jmalloc(strlen(Name)+1,"status name"),Name);
  14. show=Show;
  15. next=Next;
  16. last_update=0;
  17. }
  18. ~text_status_node() { jfree(name); if (show) delete show; }
  19. } ;
  20. text_status_manager::text_status_manager()
  21. {
  22. first=NULL;
  23. level=0;
  24. }
  25. void text_status_manager::push(char *name, visual_object *show)
  26. {
  27. level++;
  28. first=new text_status_node(name,show,first);
  29. }
  30. void text_status_manager::update(int percentage)
  31. {
  32. // return;
  33. if (level==1 && percentage-first->last_update>4)
  34. {
  35. char s[256], len;
  36. first->last_update=percentage;
  37. sprintf(s,"\r%s [",first->name);
  38. len = strlen(s);
  39. int t=percentage*40/100;
  40. int i=0;
  41. for (;i<t;i++)
  42. s[len+i] = '.';
  43. for (;i<40;i++)
  44. s[len+i] = ' ';
  45. s[len+i++] = ']';
  46. s[len+i] = 0;
  47. dprintf("%s",s);
  48. }
  49. }
  50. void text_status_manager::pop()
  51. {
  52. CONDITION(first,"No status's to pop!");
  53. if (level==1) dprintf("\n");
  54. level--;
  55. text_status_node *p=first; first=first->next;
  56. delete p;
  57. }