UIMLProgressAndStateView.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. #include "UIMLProgressAndStateView.h"
  2. #include <FileSystem.h>
  3. #include <Image.h>
  4. #include <TextField.h>
  5. #include <ToolTip.h>
  6. #include "FactoryClient.h"
  7. #include "Globals.h"
  8. #include "World.h"
  9. #undef max
  10. UIMLProgressAndStateView::UIMLProgressAndStateView(Framework::Text id,
  11. Framework::Text background,
  12. Framework::Text foreground,
  13. int* targetAddress,
  14. int addressLength,
  15. char registerMessage,
  16. char unregisterMessage,
  17. Framework::Text toolTipPrefix,
  18. Framework::Text toolTipSuffix)
  19. : Framework::Drawable(),
  20. NetworkAPIProcessor(),
  21. id(id),
  22. background(0),
  23. foreground(0),
  24. registerMessage(registerMessage),
  25. unregisterMessage(unregisterMessage),
  26. toolTipPrefix(toolTipPrefix),
  27. toolTipSuffix(toolTipSuffix),
  28. targetAddress(targetAddress),
  29. addressLength(addressLength),
  30. max(0),
  31. current(0)
  32. {
  33. Framework::LTDBFile file;
  34. file.setFile(
  35. background.getTeilText(0, background.positionOf(".ltdb/") + 5));
  36. file.readData(0);
  37. this->background = file.load(
  38. 0, background.getTeilText(background.positionOf(".ltdb/") + 6));
  39. file.setFile(
  40. foreground.getTeilText(0, foreground.positionOf(".ltdb/") + 5));
  41. file.readData(0);
  42. this->foreground = file.load(
  43. 0, foreground.getTeilText(foreground.positionOf(".ltdb/") + 6));
  44. char* msg = new char[id.getLength() + 6];
  45. msg[0] = registerMessage; // register progress/state observer
  46. msg[1] = (char)id.getLength();
  47. memcpy(msg + 2, id.getText(), id.getLength());
  48. *(int*)(msg + 2 + id.getLength()) = NetworkAPIProcessor::getId();
  49. World::INSTANCE->zClient()->componentAPIRequest(
  50. targetAddress, addressLength, msg, id.getLength() + 6);
  51. delete[] msg;
  52. }
  53. UIMLProgressAndStateView::~UIMLProgressAndStateView()
  54. {
  55. char* msg = new char[id.getLength() + 6];
  56. msg[0] = unregisterMessage; // unregister fuel state observer
  57. msg[1] = (char)id.getLength();
  58. memcpy(msg + 2, id.getText(), id.getLength());
  59. *(int*)(msg + 2 + id.getLength()) = NetworkAPIProcessor::getId();
  60. World::INSTANCE->zClient()->componentAPIRequest(
  61. targetAddress, addressLength, msg, id.getLength() + 6);
  62. delete[] msg;
  63. if (background)
  64. {
  65. background->release();
  66. }
  67. if (foreground)
  68. {
  69. foreground->release();
  70. }
  71. delete[] targetAddress;
  72. }
  73. void UIMLProgressAndStateView::api(char* message)
  74. {
  75. max = *(int*)message;
  76. current = *(int*)(message + 4);
  77. Framework::Text toolTipText;
  78. toolTipText.append() << toolTipPrefix.getText() << current << " / " << max
  79. << toolTipSuffix;
  80. if (!toolTip)
  81. {
  82. setToolTipText(toolTipText,
  83. uiFactory.initParam.bildschirm,
  84. uiFactory.initParam.font);
  85. }
  86. else
  87. {
  88. Framework::TextField* textField
  89. = dynamic_cast<Framework::TextField*>(toolTip->zMember(0));
  90. if (textField)
  91. {
  92. textField->setText(toolTipText);
  93. textField->setSize(
  94. textField->getNeededWidth(), textField->getNeededHeight());
  95. }
  96. else
  97. {
  98. setToolTipText(toolTipText,
  99. uiFactory.initParam.bildschirm,
  100. uiFactory.initParam.font);
  101. }
  102. }
  103. toolTip->setRender();
  104. rend = 1;
  105. }
  106. void UIMLProgressAndStateView::render(Framework::Image& rObj)
  107. {
  108. if (hasStyleNot(Style::Visible)) return;
  109. readLock().lock();
  110. if (!rObj.setDrawOptions(pos.x, pos.y, gr.x, gr.y))
  111. {
  112. readLock().unlock();
  113. return;
  114. }
  115. Drawable::render(rObj);
  116. rObj.alphaImage(0, 0, gr.x, gr.y, *background);
  117. if (max > 0 && current > 0)
  118. {
  119. double progrss = (double)current / max;
  120. if (hasStyle(Style::Vertical))
  121. {
  122. int height = (int)(gr.y * progrss);
  123. if (hasStyle(Style::Reversed))
  124. {
  125. if (rObj.setDrawOptions(0, gr.y - height, gr.x, height))
  126. {
  127. rObj.alphaImage(0, height - gr.y, gr.x, gr.y, *foreground);
  128. rObj.releaseDrawOptions();
  129. }
  130. }
  131. else
  132. {
  133. rObj.alphaImage(0, 0, gr.x, height, *foreground);
  134. }
  135. }
  136. else
  137. {
  138. int width = (int)(gr.x * progrss);
  139. if (hasStyle(Style::Reversed))
  140. {
  141. if (rObj.setDrawOptions(gr.x - width, 0, width, gr.y))
  142. {
  143. rObj.alphaImage(width - gr.x, 0, gr.x, gr.y, *foreground);
  144. rObj.releaseDrawOptions();
  145. }
  146. }
  147. else
  148. {
  149. rObj.alphaImage(0, 0, width, gr.y, *foreground);
  150. }
  151. }
  152. }
  153. rObj.releaseDrawOptions();
  154. readLock().unlock();
  155. }