Otclient 1.0  14/8/2020
uiwidget.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2010-2020 OTClient <https://github.com/edubart/otclient>
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a copy
5  * of this software and associated documentation files (the "Software"), to deal
6  * in the Software without restriction, including without limitation the rights
7  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8  * copies of the Software, and to permit persons to whom the Software is
9  * furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20  * THE SOFTWARE.
21  */
22 
23 #include "uiwidget.h"
24 #include "uimanager.h"
25 #include "uianchorlayout.h"
26 #include "uitranslator.h"
27 
35 
37 {
39  m_states = Fw::DefaultState;
42  m_autoRepeatDelay = 500;
43 
44  initBaseStyle();
45  initText();
46  initImage();
47 }
48 
50 {
51 #ifndef NDEBUG
52  assert(!g_app.isTerminated());
53  if (!m_destroyed)
54  g_logger.warning(stdext::format("widget '%s' was not explicitly destroyed", m_id));
55 #endif
56 }
57 
58 void UIWidget::draw(const Rect& visibleRect, Fw::DrawPane drawPane)
59 {
60  Rect oldClipRect;
61  if (m_clipping) {
62  oldClipRect = g_painter->getClipRect();
63  g_painter->setClipRect(visibleRect);
64  }
65 
66  if (m_rotation != 0.0f) {
68  g_painter->rotate(m_rect.center(), m_rotation * (Fw::pi / 180.0));
69  }
70 
71  drawSelf(drawPane);
72 
73  if (!m_children.empty()) {
74  if (m_clipping)
76 
77  drawChildren(visibleRect, drawPane);
78  }
79 
80  if (m_rotation != 0.0f)
82 
83  if (m_clipping) {
84  g_painter->setClipRect(oldClipRect);
85  }
86 }
87 
89 {
90  if ((drawPane & Fw::ForegroundPane) == 0)
91  return;
92 
93  // draw style components in order
94  if (m_backgroundColor.aF() > Fw::MIN_ALPHA) {
95  Rect backgroundDestRect = m_rect;
98  }
99 
100  drawImage(m_rect);
101  drawIcon(m_rect);
102  drawText(m_rect);
104 }
105 
106 void UIWidget::drawChildren(const Rect& visibleRect, Fw::DrawPane drawPane)
107 {
108  // draw children
109  for (const UIWidgetPtr& child : m_children) {
110  // render only visible children with a valid rect inside parent rect
111  if (!child->isExplicitlyVisible() || !child->getRect().isValid() || child->getOpacity() < Fw::MIN_ALPHA)
112  continue;
113 
114  Rect childVisibleRect = visibleRect.intersection(child->getRect());
115  if (!childVisibleRect.isValid())
116  continue;
117 
118  // store current graphics opacity
119  float oldOpacity = g_painter->getOpacity();
120 
121  // decrease to self opacity
122  if (child->getOpacity() < oldOpacity)
123  g_painter->setOpacity(child->getOpacity());
124 
125  child->draw(childVisibleRect, drawPane);
126 
127  // debug draw box
128  if (g_ui.isDrawingDebugBoxes() && drawPane & Fw::ForegroundPane) {
130  g_painter->drawBoundingRect(child->getRect());
131  }
132  //g_fonts.getDefaultFont()->renderText(child->getId(), child->getPosition() + Point(2, 0), Color::red);
133 
134  g_painter->setOpacity(oldOpacity);
135  }
136 }
137 
138 void UIWidget::addChild(const UIWidgetPtr& child)
139 {
140  if (!child) {
141  g_logger.traceWarning("attempt to add a null child into a UIWidget");
142  return;
143  }
144 
145  if (child->isDestroyed()) {
146  g_logger.traceWarning("attemp to add a destroyed child into a UIWidget");
147  return;
148  }
149 
150  if (hasChild(child)) {
151  g_logger.traceWarning("attempt to add a child again into a UIWidget");
152  return;
153  }
154 
155  UIWidgetPtr oldLastChild = getLastChild();
156 
157  m_children.push_back(child);
158  child->setParent(static_self_cast<UIWidget>());
159 
160  // create default layout
161  if (!m_layout)
162  m_layout = UIAnchorLayoutPtr(new UIAnchorLayout(static_self_cast<UIWidget>()));
163 
164  // add to layout and updates it
165  m_layout->addWidget(child);
166 
167  // update new child states
168  child->updateStates();
169 
170  // update old child index states
171  if (oldLastChild) {
172  oldLastChild->updateState(Fw::MiddleState);
173  oldLastChild->updateState(Fw::LastState);
174  }
175 
176  g_ui.onWidgetAppear(child);
177 }
178 
179 void UIWidget::insertChild(int index, const UIWidgetPtr& child)
180 {
181  if (!child) {
182  g_logger.traceWarning("attempt to insert a null child into a UIWidget");
183  return;
184  }
185 
186  if (hasChild(child)) {
187  g_logger.traceWarning("attempt to insert a child again into a UIWidget");
188  return;
189  }
190 
191  index = index <= 0 ? (m_children.size() + index) : index - 1;
192 
193  if (!(index >= 0 && static_cast<uint>(index) <= m_children.size())) {
194  //g_logger.traceWarning("attempt to insert a child UIWidget into an invalid index, using nearest index...");
195  index = stdext::clamp<int>(index, 0, static_cast<int>(m_children.size()));
196  }
197 
198  // retrieve child by index
199  auto it = m_children.begin() + index;
200  m_children.insert(it, child);
201  child->setParent(static_self_cast<UIWidget>());
202 
203  // create default layout if needed
204  if (!m_layout)
205  m_layout = UIAnchorLayoutPtr(new UIAnchorLayout(static_self_cast<UIWidget>()));
206 
207  // add to layout and updates it
208  m_layout->addWidget(child);
209 
210  // update new child states
211  child->updateStates();
212  updateChildrenIndexStates();
213 
214  g_ui.onWidgetAppear(child);
215 }
216 
218 {
219  // remove from children list
220  if (hasChild(child)) {
221  // defocus if needed
222  bool focusAnother = false;
223  if (m_focusedChild == child) {
225  focusAnother = true;
226  }
227 
228  if (isChildLocked(child))
229  unlockChild(child);
230 
231  auto it = std::find(m_children.begin(), m_children.end(), child);
232  m_children.erase(it);
233 
234  // reset child parent
235  assert(child->getParent() == static_self_cast<UIWidget>());
236  child->setParent(nullptr);
237 
238  m_layout->removeWidget(child);
239 
240  // update child states
241  child->updateStates();
242  updateChildrenIndexStates();
243 
244  if (m_autoFocusPolicy != Fw::AutoFocusNone && focusAnother && !m_focusedChild)
246 
247  g_ui.onWidgetDisappear(child);
248  }
249  else
250  g_logger.traceError("attempt to remove an unknown child from a UIWidget");
251 }
252 
253 
255 {
256  if (m_destroyed)
257  return;
258 
259  if (child == m_focusedChild)
260  return;
261 
262  if (child && !hasChild(child)) {
263  g_logger.error("attempt to focus an unknown child in a UIWidget");
264  return;
265  }
266 
267  UIWidgetPtr oldFocused = m_focusedChild;
268  m_focusedChild = child;
269 
270  if (child) {
271  child->setLastFocusReason(reason);
272  child->updateState(Fw::FocusState);
273  child->updateState(Fw::ActiveState);
274 
275  child->onFocusChange(true, reason);
276  }
277 
278  if (oldFocused) {
279  oldFocused->setLastFocusReason(reason);
280  oldFocused->updateState(Fw::FocusState);
281  oldFocused->updateState(Fw::ActiveState);
282 
283  oldFocused->onFocusChange(false, reason);
284  }
285 
286  onChildFocusChange(child, oldFocused, reason);
287 }
288 
289 void UIWidget::focusNextChild(Fw::FocusReason reason, bool rotate)
290 {
291  if (m_destroyed)
292  return;
293 
294  UIWidgetPtr toFocus;
295 
296  if (rotate) {
297  UIWidgetList rotatedChildren(m_children);
298 
299  if (m_focusedChild) {
300  auto focusedIt = std::find(rotatedChildren.begin(), rotatedChildren.end(), m_focusedChild);
301  if (focusedIt != rotatedChildren.end()) {
302  std::rotate(rotatedChildren.begin(), focusedIt, rotatedChildren.end());
303  rotatedChildren.pop_front();
304  }
305  }
306 
307  // finds next child to focus
308  for (const UIWidgetPtr& child : rotatedChildren) {
309  if (child->isFocusable() && child->isExplicitlyEnabled() && child->isVisible()) {
310  toFocus = child;
311  break;
312  }
313  }
314  }
315  else {
316  auto it = m_children.begin();
317  if (m_focusedChild)
318  it = std::find(m_children.begin(), m_children.end(), m_focusedChild);
319 
320  for (; it != m_children.end(); ++it) {
321  const UIWidgetPtr& child = *it;
322  if (child != m_focusedChild && child->isFocusable() && child->isExplicitlyEnabled() && child->isVisible()) {
323  toFocus = child;
324  break;
325  }
326  }
327  }
328 
329  if (toFocus && toFocus != m_focusedChild)
330  focusChild(toFocus, reason);
331 }
332 
334 {
335  if (m_destroyed)
336  return;
337 
338  UIWidgetPtr toFocus;
339  if (rotate) {
340  UIWidgetList rotatedChildren(m_children);
341  std::reverse(rotatedChildren.begin(), rotatedChildren.end());
342 
343  if (m_focusedChild) {
344  auto focusedIt = std::find(rotatedChildren.begin(), rotatedChildren.end(), m_focusedChild);
345  if (focusedIt != rotatedChildren.end()) {
346  std::rotate(rotatedChildren.begin(), focusedIt, rotatedChildren.end());
347  rotatedChildren.pop_front();
348  }
349  }
350 
351  // finds next child to focus
352  for (const UIWidgetPtr& child : rotatedChildren) {
353  if (child->isFocusable() && child->isExplicitlyEnabled() && child->isVisible()) {
354  toFocus = child;
355  break;
356  }
357  }
358  }
359  else {
360  auto it = m_children.rbegin();
361  if (m_focusedChild)
362  it = std::find(m_children.rbegin(), m_children.rend(), m_focusedChild);
363 
364  for (; it != m_children.rend(); ++it) {
365  const UIWidgetPtr& child = *it;
366  if (child != m_focusedChild && child->isFocusable() && child->isExplicitlyEnabled() && child->isVisible()) {
367  toFocus = child;
368  break;
369  }
370  }
371  }
372 
373  if (toFocus && toFocus != m_focusedChild)
374  focusChild(toFocus, reason);
375 }
376 
378 {
379  if (m_destroyed)
380  return;
381 
382  if (!child)
383  return;
384 
385  // remove and push child again
386  auto it = std::find(m_children.begin(), m_children.end(), child);
387  if (it == m_children.end()) {
388  g_logger.traceError("cannot find child");
389  return;
390  }
391 
392  m_children.erase(it);
393  m_children.push_front(child);
394  updateChildrenIndexStates();
395 }
396 
398 {
399  if (m_destroyed)
400  return;
401 
402  if (!child)
403  return;
404 
405  // remove and push child again
406  auto it = std::find(m_children.begin(), m_children.end(), child);
407  if (it == m_children.end()) {
408  g_logger.traceError("cannot find child");
409  return;
410  }
411  m_children.erase(it);
412  m_children.push_back(child);
413  updateChildrenIndexStates();
414 }
415 
416 void UIWidget::moveChildToIndex(const UIWidgetPtr& child, int index)
417 {
418  if (m_destroyed)
419  return;
420 
421  if (!child)
422  return;
423 
424  if (static_cast<uint>(index) - 1 >= m_children.size()) {
425  g_logger.traceError(stdext::format("moving %s to index %d on %s", child->getId(), index, m_id));
426  return;
427  }
428 
429  // remove and push child again
430  auto it = std::find(m_children.begin(), m_children.end(), child);
431  if (it == m_children.end()) {
432  g_logger.traceError("cannot find child");
433  return;
434  }
435  m_children.erase(it);
436  m_children.insert(m_children.begin() + index - 1, child);
437  updateChildrenIndexStates();
438  updateLayout();
439 }
440 
442 {
443  if (m_destroyed)
444  return;
445 
446  if (!child)
447  return;
448 
449  if (!hasChild(child)) {
450  g_logger.traceError("cannot find child");
451  return;
452  }
453 
454  // prevent double locks
455  if (isChildLocked(child))
456  unlockChild(child);
457 
458  // disable all other children
459  for (const UIWidgetPtr& otherChild : m_children) {
460  if (otherChild == child)
461  child->setEnabled(true);
462  else
463  otherChild->setEnabled(false);
464  }
465 
466  m_lockedChildren.push_front(child);
467 
468  // lock child focus
469  if (child->isFocusable())
471 }
472 
474 {
475  if (m_destroyed)
476  return;
477 
478  if (!child)
479  return;
480 
481  if (!hasChild(child)) {
482  g_logger.traceError("cannot find child");
483  return;
484  }
485 
486  auto it = std::find(m_lockedChildren.begin(), m_lockedChildren.end(), child);
487  if (it == m_lockedChildren.end())
488  return;
489 
490  m_lockedChildren.erase(it);
491 
492  // find new child to lock
493  UIWidgetPtr lockedChild;
494  if (!m_lockedChildren.empty()) {
495  lockedChild = m_lockedChildren.front();
496  assert(hasChild(lockedChild));
497  }
498 
499  for (const UIWidgetPtr& otherChild : m_children) {
500  // lock new child
501  if (lockedChild) {
502  if (otherChild == lockedChild)
503  lockedChild->setEnabled(true);
504  else
505  otherChild->setEnabled(false);
506  }
507  // else unlock all
508  else
509  otherChild->setEnabled(true);
510  }
511 
512  if (lockedChild) {
513  if (lockedChild->isFocusable())
514  focusChild(lockedChild, Fw::ActiveFocusReason);
515  }
516 }
517 
518 void UIWidget::mergeStyle(const OTMLNodePtr& styleNode)
519 {
520  applyStyle(styleNode);
521  std::string name = m_style->tag();
522  std::string source = m_style->source();
523  m_style->merge(styleNode);
524  m_style->setTag(name);
525  m_style->setSource(source);
526  updateStyle();
527 }
528 
529 void UIWidget::applyStyle(const OTMLNodePtr& styleNode)
530 {
531  if (m_destroyed)
532  return;
533 
534  if (styleNode->size() == 0)
535  return;
536 
537  m_loadingStyle = true;
538  try {
539  // translate ! style tags
540  for (const OTMLNodePtr& node : styleNode->children()) {
541  if (node->tag()[0] == '!') {
542  std::string tag = node->tag().substr(1);
543  std::string code = stdext::format("tostring(%s)", node->value());
544  std::string origin = "@" + node->source() + ": [" + node->tag() + "]";
545  g_lua.evaluateExpression(code, origin);
546  std::string value = g_lua.popString();
547 
548  node->setTag(tag);
549  node->setValue(value);
550  }
551  }
552 
553  onStyleApply(styleNode->tag(), styleNode);
554  callLuaField("onStyleApply", styleNode->tag(), styleNode);
555 
556  if (m_firstOnStyle) {
557  UIWidgetPtr parent = getParent();
559  parent && ((!parent->getFocusedChild() && parent->getAutoFocusPolicy() == Fw::AutoFocusFirst) ||
560  parent->getAutoFocusPolicy() == Fw::AutoFocusLast)) {
561  focus();
562  }
563  }
564 
565  m_firstOnStyle = false;
566  }
567  catch (stdext::exception& e) {
568  g_logger.traceError(stdext::format("failed to apply style to widget '%s': %s", m_id, e.what()));
569  }
570  m_loadingStyle = false;
571 }
572 
573 void UIWidget::addAnchor(Fw::AnchorEdge anchoredEdge, const std::string& hookedWidgetId, Fw::AnchorEdge hookedEdge)
574 {
575  if (m_destroyed)
576  return;
577 
578  if (UIAnchorLayoutPtr anchorLayout = getAnchoredLayout())
579  anchorLayout->addAnchor(static_self_cast<UIWidget>(), anchoredEdge, hookedWidgetId, hookedEdge);
580  else
581  g_logger.traceError(stdext::format("cannot add anchors to widget '%s': the parent doesn't use anchors layout", m_id));
582 }
583 
585 {
586  addAnchor(anchoredEdge, "none", Fw::AnchorNone);
587 }
588 
589 void UIWidget::centerIn(const std::string& hookedWidgetId)
590 {
591  if (m_destroyed)
592  return;
593 
594  if (UIAnchorLayoutPtr anchorLayout = getAnchoredLayout()) {
595  anchorLayout->addAnchor(static_self_cast<UIWidget>(), Fw::AnchorHorizontalCenter, hookedWidgetId, Fw::AnchorHorizontalCenter);
596  anchorLayout->addAnchor(static_self_cast<UIWidget>(), Fw::AnchorVerticalCenter, hookedWidgetId, Fw::AnchorVerticalCenter);
597  }
598  else
599  g_logger.traceError(stdext::format("cannot add anchors to widget '%s': the parent doesn't use anchors layout", m_id));
600 }
601 
602 void UIWidget::fill(const std::string& hookedWidgetId)
603 {
604  if (m_destroyed)
605  return;
606 
607  if (UIAnchorLayoutPtr anchorLayout = getAnchoredLayout()) {
608  anchorLayout->addAnchor(static_self_cast<UIWidget>(), Fw::AnchorLeft, hookedWidgetId, Fw::AnchorLeft);
609  anchorLayout->addAnchor(static_self_cast<UIWidget>(), Fw::AnchorRight, hookedWidgetId, Fw::AnchorRight);
610  anchorLayout->addAnchor(static_self_cast<UIWidget>(), Fw::AnchorTop, hookedWidgetId, Fw::AnchorTop);
611  anchorLayout->addAnchor(static_self_cast<UIWidget>(), Fw::AnchorBottom, hookedWidgetId, Fw::AnchorBottom);
612  }
613  else
614  g_logger.traceError(stdext::format("cannot add anchors to widget '%s': the parent doesn't use anchors layout", m_id));
615 }
616 
618 {
619  if (m_destroyed)
620  return;
621 
622  if (UIAnchorLayoutPtr anchorLayout = getAnchoredLayout())
623  anchorLayout->removeAnchors(static_self_cast<UIWidget>());
624 }
625 
627 {
628  if (m_destroyed)
629  return;
630 
631  if (UIWidgetPtr parent = getParent())
632  parent->updateLayout();
633  else
634  updateLayout();
635 }
636 
638 {
639  if (m_destroyed)
640  return;
641 
642  if (m_layout)
643  m_layout->update();
644 
645  // children can affect the parent layout
646  if (UIWidgetPtr parent = getParent())
647  if (UILayoutPtr parentLayout = parent->getLayout())
648  parentLayout->updateLater();
649 }
650 
652 {
653  if (m_destroyed)
654  return;
655 
656  if (UIWidgetPtr parent = getParent())
657  parent->lockChild(static_self_cast<UIWidget>());
658 }
659 
661 {
662  if (m_destroyed)
663  return;
664 
665  if (UIWidgetPtr parent = getParent())
666  parent->unlockChild(static_self_cast<UIWidget>());
667 }
668 
670 {
671  if (m_destroyed)
672  return;
673 
674  if (!m_focusable)
675  return;
676 
677  if (UIWidgetPtr parent = getParent())
678  parent->focusChild(static_self_cast<UIWidget>(), Fw::ActiveFocusReason);
679 }
680 
682 {
683  if (m_destroyed)
684  return;
685 
686  if (UIWidgetPtr parent = getParent()) {
687  if (m_focusable)
688  parent->focusChild(static_self_cast<UIWidget>(), reason);
689  parent->recursiveFocus(reason);
690  }
691 }
692 
694 {
695  if (m_destroyed)
696  return;
697 
698  UIWidgetPtr parent = getParent();
699  if (parent)
700  parent->lowerChild(static_self_cast<UIWidget>());
701 }
702 
704 {
705  if (m_destroyed)
706  return;
707 
708  UIWidgetPtr parent = getParent();
709  if (parent)
710  parent->raiseChild(static_self_cast<UIWidget>());
711 }
712 
714 {
715  if (m_destroyed)
716  return;
717 
718  g_ui.setMouseReceiver(static_self_cast<UIWidget>());
719 }
720 
722 {
723  if (g_ui.getMouseReceiver() == static_self_cast<UIWidget>())
725 }
726 
728 {
729  if (m_destroyed)
730  return;
731 
732  g_ui.setKeyboardReceiver(static_self_cast<UIWidget>());
733 }
734 
736 {
737  if (g_ui.getKeyboardReceiver() == static_self_cast<UIWidget>())
739 }
740 
742 {
743  if (m_destroyed)
744  return;
745 
746  Rect boundRect = m_rect;
747  UIWidgetPtr parent = getParent();
748  if (parent) {
749  Rect parentRect = parent->getPaddingRect();
750  boundRect.bind(parentRect);
751  }
752 
753  setRect(boundRect);
754 }
755 
756 void UIWidget::internalDestroy()
757 {
758  m_destroyed = true;
759  m_visible = false;
760  m_enabled = false;
761  m_focusedChild = nullptr;
762  if (m_layout) {
763  m_layout->setParent(nullptr);
764  m_layout = nullptr;
765  }
766  m_parent = nullptr;
767  m_lockedChildren.clear();
768 
769  for (const UIWidgetPtr& child : m_children)
770  child->internalDestroy();
771  m_children.clear();
772 
773  callLuaField("onDestroy");
774 
776 
777  g_ui.onWidgetDestroy(static_self_cast<UIWidget>());
778 }
779 
781 {
782  if (m_destroyed)
783  g_logger.warning(stdext::format("attempt to destroy widget '%s' two times", m_id));
784 
785  // hold itself reference
786  UIWidgetPtr self = static_self_cast<UIWidget>();
787  m_destroyed = true;
788 
789  // remove itself from parent
790  if (UIWidgetPtr parent = getParent())
791  parent->removeChild(self);
792  internalDestroy();
793 }
794 
796 {
797  UILayoutPtr layout = getLayout();
798  if (layout)
799  layout->disableUpdates();
800 
801  m_focusedChild = nullptr;
802  m_lockedChildren.clear();
803  while (!m_children.empty()) {
804  UIWidgetPtr child = m_children.front();
805  m_children.pop_front();
806  child->setParent(nullptr);
807  m_layout->removeWidget(child);
808  child->destroy();
809  }
810 
811  if (layout)
812  layout->enableUpdates();
813 }
814 
815 void UIWidget::setId(const std::string& id)
816 {
817  if (id != m_id) {
818  m_id = id;
819  callLuaField("onIdChange", id);
820  }
821 }
822 
823 void UIWidget::setParent(const UIWidgetPtr& parent)
824 {
825  // remove from old parent
826  UIWidgetPtr oldParent = getParent();
827 
828  // the parent is already the same
829  if (oldParent == parent)
830  return;
831 
832  UIWidgetPtr self = static_self_cast<UIWidget>();
833  if (oldParent && oldParent->hasChild(self))
834  oldParent->removeChild(self);
835 
836  // reset parent
837  m_parent.reset();
838 
839  // set new parent
840  if (parent) {
841  m_parent = parent;
842 
843  // add to parent if needed
844  if (!parent->hasChild(self))
845  parent->addChild(self);
846  }
847 }
848 
849 void UIWidget::setLayout(const UILayoutPtr& layout)
850 {
851  if (!layout)
852  stdext::throw_exception("attempt to set a nil layout to a widget");
853 
854  if (m_layout)
856 
857  layout->setParent(static_self_cast<UIWidget>());
858  layout->disableUpdates();
859 
860  for (const UIWidgetPtr& child : m_children) {
861  if (m_layout)
862  m_layout->removeWidget(child);
863  layout->addWidget(child);
864  }
865 
866  if (m_layout) {
868  m_layout->setParent(nullptr);
869  m_layout->update();
870  }
871 
872  layout->enableUpdates();
873  m_layout = layout;
874 }
875 
876 bool UIWidget::setRect(const Rect& rect)
877 {
878  /*
879  if(rect.width() > 8192 || rect.height() > 8192) {
880  g_logger.error(stdext::format("attempt to set huge rect size (%s) for %s", stdext::to_string(rect), m_id));
881  return false;
882  }
883  */
884  // only update if the rect really changed
885  Rect oldRect = m_rect;
886  if (rect == oldRect)
887  return false;
888 
889  m_rect = rect;
890 
891  // updates own layout
892  updateLayout();
893 
894  // avoid massive update events
895  if (!m_updateEventScheduled) {
896  UIWidgetPtr self = static_self_cast<UIWidget>();
897  g_dispatcher.addEvent([self, oldRect]() {
898  self->m_updateEventScheduled = false;
899  if (oldRect != self->getRect())
900  self->onGeometryChange(oldRect, self->getRect());
901  });
902  m_updateEventScheduled = true;
903  }
904 
905  // update hovered widget when moved behind mouse area
908 
909  return true;
910 }
911 
912 void UIWidget::setStyle(const std::string& styleName)
913 {
914  OTMLNodePtr styleNode = g_ui.getStyle(styleName);
915  if (!styleNode) {
916  g_logger.traceError(stdext::format("unable to retrieve style '%s': not a defined style", styleName));
917  return;
918  }
919  styleNode = styleNode->clone();
920  applyStyle(styleNode);
921  m_style = styleNode;
922  updateStyle();
923 }
924 
926 {
927  applyStyle(styleNode);
928  m_style = styleNode;
929  updateStyle();
930 }
931 
932 void UIWidget::setEnabled(bool enabled)
933 {
934  if (enabled != m_enabled) {
935  m_enabled = enabled;
936 
937  updateState(Fw::DisabledState);
938  updateState(Fw::ActiveState);
939  }
940 }
941 
942 void UIWidget::setVisible(bool visible)
943 {
944  if (m_visible != visible) {
945  m_visible = visible;
946 
947  // hiding a widget make it lose focus
948  if (!visible && isFocused()) {
949  if (UIWidgetPtr parent = getParent())
950  parent->focusPreviousChild(Fw::ActiveFocusReason, true);
951  }
952 
953  // visibility can change change parent layout
955 
956  updateState(Fw::ActiveState);
957  updateState(Fw::HiddenState);
958 
959  // visibility can change the current hovered widget
960  if (visible)
961  g_ui.onWidgetAppear(static_self_cast<UIWidget>());
962  else
963  g_ui.onWidgetDisappear(static_self_cast<UIWidget>());
964  }
965 }
966 
967 void UIWidget::setOn(bool on)
968 {
969  setState(Fw::OnState, on);
970 }
971 
972 void UIWidget::setChecked(bool checked)
973 {
974  if (setState(Fw::CheckedState, checked))
975  callLuaField("onCheckChange", checked);
976 }
977 
978 void UIWidget::setFocusable(bool focusable)
979 {
980  if (m_focusable != focusable) {
981  m_focusable = focusable;
982 
983  // make parent focus another child
984  if (UIWidgetPtr parent = getParent()) {
985  if (!focusable && isFocused()) {
986  parent->focusPreviousChild(Fw::ActiveFocusReason, true);
987  }
988  else if (focusable && !parent->getFocusedChild() && parent->getAutoFocusPolicy() != Fw::AutoFocusNone) {
989  focus();
990  }
991  }
992  }
993 }
994 
995 void UIWidget::setPhantom(bool phantom)
996 {
997  m_phantom = phantom;
998 }
999 
1000 void UIWidget::setDraggable(bool draggable)
1001 {
1002  m_draggable = draggable;
1003 }
1004 
1005 void UIWidget::setFixedSize(bool fixed)
1006 {
1007  m_fixedSize = fixed;
1009 }
1010 
1012 {
1013  m_lastFocusReason = reason;
1014 }
1015 
1017 {
1018  m_autoFocusPolicy = policy;
1019 }
1020 
1022 {
1023  m_virtualOffset = offset;
1024  if (m_layout)
1025  m_layout->update();
1026 }
1027 
1029 {
1030  if (UIWidgetPtr parent = getParent())
1031  if (UIAnchorLayoutPtr anchorLayout = parent->getAnchoredLayout())
1032  return anchorLayout->hasAnchors(static_self_cast<UIWidget>());
1033  return false;
1034 }
1035 
1037 {
1038  auto it = std::find(m_lockedChildren.begin(), m_lockedChildren.end(), child);
1039  return it != m_lockedChildren.end();
1040 }
1041 
1043 {
1044  auto it = std::find(m_children.begin(), m_children.end(), child);
1045  if (it != m_children.end())
1046  return true;
1047  return false;
1048 }
1049 
1051 {
1052  int index = 1;
1053  for (auto& it : m_children) {
1054  if (it == child)
1055  return index;
1056  ++index;
1057  }
1058  return -1;
1059 }
1060 
1062 {
1063  Rect rect = m_rect;
1065  return rect;
1066 }
1067 
1069 {
1070  Rect rect = m_rect;
1072  return rect;
1073 }
1074 
1076 {
1077  Rect childrenRect;
1078  for (const UIWidgetPtr& child : m_children) {
1079  if (!child->isExplicitlyVisible() || !child->getRect().isValid())
1080  continue;
1081  Rect marginRect = child->getMarginRect();
1082  if (!childrenRect.isValid())
1083  childrenRect = marginRect;
1084  else
1085  childrenRect = childrenRect.united(marginRect);
1086  }
1087 
1088  Rect myClippingRect = getPaddingRect();
1089  if (!childrenRect.isValid())
1090  childrenRect = myClippingRect;
1091  else {
1092  if (childrenRect.width() < myClippingRect.width())
1093  childrenRect.setWidth(myClippingRect.width());
1094  if (childrenRect.height() < myClippingRect.height())
1095  childrenRect.setHeight(myClippingRect.height());
1096  }
1097  return childrenRect;
1098 }
1099 
1101 {
1102  UIWidgetPtr parent = getParent();
1103  if (!parent)
1104  return nullptr;
1105 
1106  UILayoutPtr layout = parent->getLayout();
1107  if (layout->isUIAnchorLayout())
1108  return layout->static_self_cast<UIAnchorLayout>();
1109  return nullptr;
1110 }
1111 
1113 {
1114  if (UIWidgetPtr parent = getParent())
1115  return parent->getRootParent();
1116  else
1117  return static_self_cast<UIWidget>();
1118 }
1119 
1121 {
1122  auto it = std::find(m_children.begin(), m_children.end(), relativeChild);
1123  if (it != m_children.end() && ++it != m_children.end())
1124  return *it;
1125  return nullptr;
1126 }
1127 
1129 {
1130  auto it = std::find(m_children.rbegin(), m_children.rend(), relativeChild);
1131  if (it != m_children.rend() && ++it != m_children.rend())
1132  return *it;
1133  return nullptr;
1134 }
1135 
1136 UIWidgetPtr UIWidget::getChildById(const std::string& childId)
1137 {
1138  for (const UIWidgetPtr& child : m_children) {
1139  if (child->getId() == childId)
1140  return child;
1141  }
1142  return nullptr;
1143 }
1144 
1146 {
1147  if (!containsPaddingPoint(childPos))
1148  return nullptr;
1149 
1150  for (auto it = m_children.rbegin(); it != m_children.rend(); ++it) {
1151  const UIWidgetPtr& child = (*it);
1152  if (child->isExplicitlyVisible() && child->containsPoint(childPos))
1153  return child;
1154  }
1155 
1156  return nullptr;
1157 }
1158 
1160 {
1161  index = index <= 0 ? (m_children.size() + index) : index - 1;
1162  if (index >= 0 && static_cast<uint>(index) < m_children.size())
1163  return m_children.at(index);
1164  return nullptr;
1165 }
1166 
1168 {
1169  UIWidgetPtr widget = getChildById(id);
1170  if (!widget) {
1171  for (const UIWidgetPtr& child : m_children) {
1172  widget = child->recursiveGetChildById(id);
1173  if (widget)
1174  break;
1175  }
1176  }
1177  return widget;
1178 }
1179 
1180 UIWidgetPtr UIWidget::recursiveGetChildByPos(const Point& childPos, bool wantsPhantom)
1181 {
1182  if (!containsPaddingPoint(childPos))
1183  return nullptr;
1184 
1185  for (auto it = m_children.rbegin(); it != m_children.rend(); ++it) {
1186  const UIWidgetPtr& child = (*it);
1187  if (child->isExplicitlyVisible() && child->containsPoint(childPos)) {
1188  UIWidgetPtr subChild = child->recursiveGetChildByPos(childPos, wantsPhantom);
1189  if (subChild)
1190  return subChild;
1191  else if (wantsPhantom || !child->isPhantom())
1192  return child;
1193  }
1194  }
1195  return nullptr;
1196 }
1197 
1199 {
1200  UIWidgetList children;
1201  for (const UIWidgetPtr& child : m_children) {
1202  UIWidgetList subChildren = child->recursiveGetChildren();
1203  if (!subChildren.empty())
1204  children.insert(children.end(), subChildren.begin(), subChildren.end());
1205  children.push_back(child);
1206  }
1207  return children;
1208 }
1209 
1211 {
1212  UIWidgetList children;
1213  if (!containsPaddingPoint(childPos))
1214  return children;
1215 
1216  for (auto it = m_children.rbegin(); it != m_children.rend(); ++it) {
1217  const UIWidgetPtr& child = (*it);
1218  if (child->isExplicitlyVisible() && child->containsPoint(childPos)) {
1219  UIWidgetList subChildren = child->recursiveGetChildrenByPos(childPos);
1220  if (!subChildren.empty())
1221  children.insert(children.end(), subChildren.begin(), subChildren.end());
1222  children.push_back(child);
1223  }
1224  }
1225  return children;
1226 }
1227 
1229 {
1230  UIWidgetList children;
1231  if (!containsPaddingPoint(childPos))
1232  return children;
1233 
1234  for (auto it = m_children.rbegin(); it != m_children.rend(); ++it) {
1235  const UIWidgetPtr& child = (*it);
1236  if (child->isExplicitlyVisible() && child->containsMarginPoint(childPos)) {
1237  UIWidgetList subChildren = child->recursiveGetChildrenByMarginPos(childPos);
1238  if (!subChildren.empty())
1239  children.insert(children.end(), subChildren.begin(), subChildren.end());
1240  children.push_back(child);
1241  }
1242  }
1243  return children;
1244 }
1245 
1247 {
1248  UIWidgetPtr widget = getChildById(id);
1249  if (!widget) {
1250  if (UIWidgetPtr parent = getParent())
1251  widget = parent->backwardsGetWidgetById(id);
1252  }
1253  return widget;
1254 }
1255 
1257 {
1258  if (state == Fw::InvalidState)
1259  return false;
1260 
1261  int oldStates = m_states;
1262  if (on)
1263  m_states |= state;
1264  else
1265  m_states &= ~state;
1266 
1267  if (oldStates != m_states) {
1268  updateStyle();
1269  return true;
1270  }
1271  return false;
1272 }
1273 
1275 {
1276  if (state == Fw::InvalidState)
1277  return false;
1278  return (m_states & state);
1279 }
1280 
1281 void UIWidget::updateState(Fw::WidgetState state)
1282 {
1283  if (m_destroyed)
1284  return;
1285 
1286  bool newStatus = true;
1287  bool oldStatus = hasState(state);
1288  bool updateChildren = false;
1289 
1290  switch (state) {
1291  case Fw::ActiveState:
1292  {
1293  UIWidgetPtr widget = static_self_cast<UIWidget>();
1294  UIWidgetPtr parent;
1295  do {
1296  parent = widget->getParent();
1297  if (!widget->isExplicitlyEnabled() ||
1298  ((parent && parent->getFocusedChild() != widget))) {
1299  newStatus = false;
1300  break;
1301  }
1302  } while ((widget = parent));
1303 
1304  updateChildren = newStatus != oldStatus;
1305  break;
1306  }
1307  case Fw::FocusState:
1308  {
1309  newStatus = (getParent() && getParent()->getFocusedChild() == static_self_cast<UIWidget>());
1310  break;
1311  }
1312  case Fw::HoverState:
1313  {
1314  newStatus = (g_ui.getHoveredWidget() == static_self_cast<UIWidget>() && isEnabled());
1315  break;
1316  }
1317  case Fw::PressedState:
1318  {
1319  newStatus = (g_ui.getPressedWidget() == static_self_cast<UIWidget>());
1320  break;
1321  }
1322  case Fw::DraggingState:
1323  {
1324  newStatus = (g_ui.getDraggingWidget() == static_self_cast<UIWidget>());
1325  break;
1326  }
1327  case Fw::DisabledState:
1328  {
1329  bool enabled = true;
1330  UIWidgetPtr widget = static_self_cast<UIWidget>();
1331  do {
1332  if (!widget->isExplicitlyEnabled()) {
1333  enabled = false;
1334  break;
1335  }
1336  } while ((widget = widget->getParent()));
1337  newStatus = !enabled;
1338  updateChildren = newStatus != oldStatus;
1339  break;
1340  }
1341  case Fw::FirstState:
1342  {
1343  newStatus = (getParent() && getParent()->getFirstChild() == static_self_cast<UIWidget>());
1344  break;
1345  }
1346  case Fw::MiddleState:
1347  {
1348  newStatus = (getParent() && getParent()->getFirstChild() != static_self_cast<UIWidget>() && getParent()->getLastChild() != static_self_cast<UIWidget>());
1349  break;
1350  }
1351  case Fw::LastState:
1352  {
1353  newStatus = (getParent() && getParent()->getLastChild() == static_self_cast<UIWidget>());
1354  break;
1355  }
1356  case Fw::AlternateState:
1357  {
1358  newStatus = (getParent() && (getParent()->getChildIndex(static_self_cast<UIWidget>()) % 2) == 1);
1359  break;
1360  }
1361  case Fw::HiddenState:
1362  {
1363  bool visible = true;
1364  UIWidgetPtr widget = static_self_cast<UIWidget>();
1365  do {
1366  if (!widget->isExplicitlyVisible()) {
1367  visible = false;
1368  break;
1369  }
1370  } while ((widget = widget->getParent()));
1371  newStatus = !visible;
1372  updateChildren = newStatus != oldStatus;
1373  break;
1374  }
1375  default:
1376  return;
1377  }
1378 
1379  if (updateChildren) {
1380  // do a backup of children list, because it may change while looping it
1381  UIWidgetList children = m_children;
1382  for (const UIWidgetPtr& child : children)
1383  child->updateState(state);
1384  }
1385 
1386  if (setState(state, newStatus)) {
1387  // disabled widgets cannot have hover state
1388  if (state == Fw::DisabledState && !newStatus && isHovered()) {
1390  }
1391  else if (state == Fw::HiddenState) {
1392  onVisibilityChange(!newStatus);
1393  }
1394  }
1395 }
1396 
1397 void UIWidget::updateStates()
1398 {
1399  if (m_destroyed)
1400  return;
1401 
1402  for (int state = 1; state != Fw::LastWidgetState; state <<= 1)
1403  updateState(static_cast<Fw::WidgetState>(state));
1404 }
1405 
1406 void UIWidget::updateChildrenIndexStates()
1407 {
1408  if (m_destroyed)
1409  return;
1410 
1411  for (const UIWidgetPtr& child : m_children) {
1412  child->updateState(Fw::FirstState);
1413  child->updateState(Fw::MiddleState);
1414  child->updateState(Fw::LastState);
1415  child->updateState(Fw::AlternateState);
1416  }
1417 }
1418 
1419 void UIWidget::updateStyle()
1420 {
1421  if (m_destroyed)
1422  return;
1423 
1424  if (m_loadingStyle && !m_updateStyleScheduled) {
1425  UIWidgetPtr self = static_self_cast<UIWidget>();
1426  g_dispatcher.addEvent([self] {
1427  self->m_updateStyleScheduled = false;
1428  self->updateStyle();
1429  });
1430  m_updateStyleScheduled = true;
1431  return;
1432  }
1433 
1434  if (!m_style)
1435  return;
1436 
1437  OTMLNodePtr newStateStyle = OTMLNode::create();
1438 
1439  // copy only the changed styles from default style
1440  if (m_stateStyle) {
1441  for (OTMLNodePtr node : m_stateStyle->children()) {
1442  if (OTMLNodePtr otherNode = m_style->get(node->tag()))
1443  newStateStyle->addChild(otherNode->clone());
1444  }
1445  }
1446 
1447  // checks for states combination
1448  for (const OTMLNodePtr& style : m_style->children()) {
1449  if (stdext::starts_with(style->tag(), "$")) {
1450  std::string statesStr = style->tag().substr(1);
1451  std::vector<std::string> statesSplit = stdext::split(statesStr, " ");
1452 
1453  bool match = true;
1454  for (std::string stateStr : statesSplit) {
1455  if (stateStr.length() == 0)
1456  continue;
1457 
1458  bool notstate = (stateStr[0] == '!');
1459  if (notstate)
1460  stateStr = stateStr.substr(1);
1461 
1462  bool stateOn = hasState(Fw::translateState(stateStr));
1463  if ((!notstate && !stateOn) || (notstate && stateOn))
1464  match = false;
1465  }
1466 
1467  // merge states styles
1468  if (match) {
1469  newStateStyle->merge(style);
1470  }
1471  }
1472  }
1473 
1474  //TODO: prevent setting already set proprieties
1475 
1476  applyStyle(newStateStyle);
1477  m_stateStyle = newStateStyle;
1478 }
1479 
1480 void UIWidget::onStyleApply(const std::string&, const OTMLNodePtr& styleNode)
1481 {
1482  if (m_destroyed)
1483  return;
1484 
1485  // first set id
1486  if (const OTMLNodePtr& node = styleNode->get("id"))
1487  setId(node->value());
1488 
1489  parseBaseStyle(styleNode);
1490  parseImageStyle(styleNode);
1491  parseTextStyle(styleNode);
1492 
1493  g_app.repaint();
1494 }
1495 
1496 void UIWidget::onGeometryChange(const Rect& oldRect, const Rect& newRect)
1497 {
1498  if (m_textWrap && oldRect.size() != newRect.size())
1499  updateText();
1500 
1501  // move children that is outside the parent rect to inside again
1502  for (const UIWidgetPtr& child : m_children) {
1503  if (!child->isAnchored() && child->isVisible())
1504  child->bindRectToParent();
1505  }
1506 
1507  callLuaField("onGeometryChange", oldRect, newRect);
1508 
1509  g_app.repaint();
1510 }
1511 
1513 {
1514  callLuaField("onLayoutUpdate");
1515 }
1516 
1517 void UIWidget::onFocusChange(bool focused, Fw::FocusReason reason)
1518 {
1519  callLuaField("onFocusChange", focused, reason);
1520 }
1521 
1522 void UIWidget::onChildFocusChange(const UIWidgetPtr& focusedChild, const UIWidgetPtr& unfocusedChild, Fw::FocusReason reason)
1523 {
1524  callLuaField("onChildFocusChange", focusedChild, unfocusedChild, reason);
1525 }
1526 
1527 void UIWidget::onHoverChange(bool hovered)
1528 {
1529  callLuaField("onHoverChange", hovered);
1530 }
1531 
1533 {
1534  if (!isAnchored())
1535  bindRectToParent();
1536  callLuaField("onVisibilityChange", visible);
1537 }
1538 
1539 bool UIWidget::onDragEnter(const Point& mousePos)
1540 {
1541  return callLuaField<bool>("onDragEnter", mousePos);
1542 }
1543 
1544 bool UIWidget::onDragLeave(UIWidgetPtr droppedWidget, const Point& mousePos)
1545 {
1546  return callLuaField<bool>("onDragLeave", droppedWidget, mousePos);
1547 }
1548 
1549 bool UIWidget::onDragMove(const Point& mousePos, const Point& mouseMoved)
1550 {
1551  return callLuaField<bool>("onDragMove", mousePos, mouseMoved);
1552 }
1553 
1554 bool UIWidget::onDrop(UIWidgetPtr draggedWidget, const Point& mousePos)
1555 {
1556  return callLuaField<bool>("onDrop", draggedWidget, mousePos);
1557 }
1558 
1559 bool UIWidget::onKeyText(const std::string& keyText)
1560 {
1561  return callLuaField<bool>("onKeyText", keyText);
1562 }
1563 
1564 bool UIWidget::onKeyDown(uchar keyCode, int keyboardModifiers)
1565 {
1566  return callLuaField<bool>("onKeyDown", keyCode, keyboardModifiers);
1567 }
1568 
1569 bool UIWidget::onKeyPress(uchar keyCode, int keyboardModifiers, int autoRepeatTicks)
1570 {
1571  return callLuaField<bool>("onKeyPress", keyCode, keyboardModifiers, autoRepeatTicks);
1572 }
1573 
1574 bool UIWidget::onKeyUp(uchar keyCode, int keyboardModifiers)
1575 {
1576  return callLuaField<bool>("onKeyUp", keyCode, keyboardModifiers);
1577 }
1578 
1579 bool UIWidget::onMousePress(const Point& mousePos, Fw::MouseButton button)
1580 {
1581  if (button == Fw::MouseLeftButton) {
1582  if (m_clickTimer.running() && m_clickTimer.ticksElapsed() <= 200) {
1583  if (onDoubleClick(mousePos))
1584  return true;
1585  m_clickTimer.stop();
1586  }
1587  else
1589  m_lastClickPosition = mousePos;
1590  }
1591 
1592  return callLuaField<bool>("onMousePress", mousePos, button);
1593 }
1594 
1595 bool UIWidget::onMouseRelease(const Point& mousePos, Fw::MouseButton button)
1596 {
1597  return callLuaField<bool>("onMouseRelease", mousePos, button);
1598 }
1599 
1600 bool UIWidget::onMouseMove(const Point& mousePos, const Point& mouseMoved)
1601 {
1602  return callLuaField<bool>("onMouseMove", mousePos, mouseMoved);
1603 }
1604 
1605 bool UIWidget::onMouseWheel(const Point& mousePos, Fw::MouseWheelDirection direction)
1606 {
1607  return callLuaField<bool>("onMouseWheel", mousePos, direction);
1608 }
1609 
1610 bool UIWidget::onClick(const Point& mousePos)
1611 {
1612  return callLuaField<bool>("onClick", mousePos);
1613 }
1614 
1615 bool UIWidget::onDoubleClick(const Point& mousePos)
1616 {
1617  return callLuaField<bool>("onDoubleClick", mousePos);
1618 }
1619 
1620 bool UIWidget::propagateOnKeyText(const std::string& keyText)
1621 {
1622  // do a backup of children list, because it may change while looping it
1623  UIWidgetList children;
1624  for (const UIWidgetPtr& child : m_children) {
1625  // events on hidden or disabled widgets are discarded
1626  if (!child->isExplicitlyEnabled() || !child->isExplicitlyVisible())
1627  continue;
1628 
1629  // key events go only to containers or focused child
1630  if (child->isFocused())
1631  children.push_back(child);
1632  }
1633 
1634  for (const UIWidgetPtr& child : children) {
1635  if (child->propagateOnKeyText(keyText))
1636  return true;
1637  }
1638 
1639  return onKeyText(keyText);
1640 }
1641 
1642 bool UIWidget::propagateOnKeyDown(uchar keyCode, int keyboardModifiers)
1643 {
1644  // do a backup of children list, because it may change while looping it
1645  UIWidgetList children;
1646  for (const UIWidgetPtr& child : m_children) {
1647  // events on hidden or disabled widgets are discarded
1648  if (!child->isExplicitlyEnabled() || !child->isExplicitlyVisible())
1649  continue;
1650 
1651  // key events go only to containers or focused child
1652  if (child->isFocused())
1653  children.push_back(child);
1654  }
1655 
1656  for (const UIWidgetPtr& child : children) {
1657  if (child->propagateOnKeyDown(keyCode, keyboardModifiers))
1658  return true;
1659  }
1660 
1661  return onKeyDown(keyCode, keyboardModifiers);
1662 }
1663 
1664 bool UIWidget::propagateOnKeyPress(uchar keyCode, int keyboardModifiers, int autoRepeatTicks)
1665 {
1666  // do a backup of children list, because it may change while looping it
1667  UIWidgetList children;
1668  for (const UIWidgetPtr& child : m_children) {
1669  // events on hidden or disabled widgets are discarded
1670  if (!child->isExplicitlyEnabled() || !child->isExplicitlyVisible())
1671  continue;
1672 
1673  // key events go only to containers or focused child
1674  if (child->isFocused())
1675  children.push_back(child);
1676  }
1677 
1678  for (const UIWidgetPtr& child : children) {
1679  if (child->propagateOnKeyPress(keyCode, keyboardModifiers, autoRepeatTicks))
1680  return true;
1681  }
1682 
1683  if (autoRepeatTicks == 0 || autoRepeatTicks >= m_autoRepeatDelay)
1684  return onKeyPress(keyCode, keyboardModifiers, autoRepeatTicks);
1685  else
1686  return false;
1687 }
1688 
1689 bool UIWidget::propagateOnKeyUp(uchar keyCode, int keyboardModifiers)
1690 {
1691  // do a backup of children list, because it may change while looping it
1692  UIWidgetList children;
1693  for (const UIWidgetPtr& child : m_children) {
1694  // events on hidden or disabled widgets are discarded
1695  if (!child->isExplicitlyEnabled() || !child->isExplicitlyVisible())
1696  continue;
1697 
1698  // key events go only to focused child
1699  if (child->isFocused())
1700  children.push_back(child);
1701  }
1702 
1703  for (const UIWidgetPtr& child : children) {
1704  if (child->propagateOnKeyUp(keyCode, keyboardModifiers))
1705  return true;
1706  }
1707 
1708  return onKeyUp(keyCode, keyboardModifiers);
1709 }
1710 
1711 bool UIWidget::propagateOnMouseEvent(const Point& mousePos, UIWidgetList& widgetList)
1712 {
1713  bool ret = false;
1714  if (containsPaddingPoint(mousePos)) {
1715  for (auto it = m_children.rbegin(); it != m_children.rend(); ++it) {
1716  const UIWidgetPtr& child = *it;
1717  if (child->isExplicitlyEnabled() && child->isExplicitlyVisible() && child->containsPoint(mousePos)) {
1718  if (child->propagateOnMouseEvent(mousePos, widgetList)) {
1719  ret = true;
1720  break;
1721  }
1722  }
1723  }
1724  }
1725 
1726  widgetList.push_back(static_self_cast<UIWidget>());
1727 
1728  if (!isPhantom())
1729  ret = true;
1730  return ret;
1731 }
1732 
1733 bool UIWidget::propagateOnMouseMove(const Point& mousePos, const Point& mouseMoved, UIWidgetList& widgetList)
1734 {
1735  if (containsPaddingPoint(mousePos)) {
1736  for (auto& child : m_children) {
1737  if (child->isExplicitlyVisible() && child->isExplicitlyEnabled() && child->containsPoint(mousePos))
1738  child->propagateOnMouseMove(mousePos, mouseMoved, widgetList);
1739 
1740  widgetList.push_back(static_self_cast<UIWidget>());
1741  }
1742  }
1743 
1744  return true;
1745 }
UIWidget::onFocusChange
virtual void onFocusChange(bool focused, Fw::FocusReason reason)
Definition: uiwidget.cpp:1517
UIWidget::unlock
void unlock()
Definition: uiwidget.cpp:660
Painter::setColor
virtual void setColor(const Color &color)
Definition: painter.h:77
EdgeGroup::right
T right
Definition: uiwidget.h:41
UIWidget::getPaddingRect
Rect getPaddingRect()
Definition: uiwidget.cpp:1061
OTMLNode::setTag
void setTag(const std::string &tag)
Definition: otmlnode.h:50
UIManager::getHoveredWidget
UIWidgetPtr getHoveredWidget()
Definition: uimanager.h:65
UIManager::onWidgetAppear
void onWidgetAppear(const UIWidgetPtr &widget)
Definition: uimanager.cpp:260
OTMLNode::setSource
void setSource(const std::string &source)
Definition: otmlnode.h:54
UIWidget::m_layout
UILayoutPtr m_layout
Definition: uiwidget.h:72
UIWidget::containsPaddingPoint
bool containsPaddingPoint(const Point &point)
Definition: uiwidget.h:251
OTMLNode::source
std::string source()
Definition: otmlnode.h:38
Fw::FirstState
@ FirstState
Definition: const.h:276
UIWidget::breakAnchors
void breakAnchors()
Definition: uiwidget.cpp:617
Fw::FocusState
@ FocusState
Definition: const.h:270
eventdispatcher.h
UIWidget::setAutoFocusPolicy
void setAutoFocusPolicy(Fw::AutoFocusPolicy policy)
Definition: uiwidget.cpp:1016
graphics.h
UIWidget::fill
void fill(const std::string &hookedWidgetId)
Definition: uiwidget.cpp:602
UIWidget::onDragEnter
virtual bool onDragEnter(const Point &mousePos)
Definition: uiwidget.cpp:1539
UIManager::onWidgetDisappear
void onWidgetDisappear(const UIWidgetPtr &widget)
Definition: uimanager.cpp:266
UIManager::getStyle
OTMLNodePtr getStyle(const std::string &styleName)
Definition: uimanager.cpp:380
UIWidget::isEnabled
bool isEnabled()
Definition: uiwidget.h:226
Painter::rotate
virtual void rotate(float angle)=0
UIWidget::focusChild
void focusChild(const UIWidgetPtr &child, Fw::FocusReason reason)
Definition: uiwidget.cpp:254
Fw::ActiveFocusReason
@ ActiveFocusReason
Definition: const.h:224
UIWidget::m_virtualOffset
Point m_virtualOffset
Definition: uiwidget.h:63
Timer::ticksElapsed
ticks_t ticksElapsed()
Definition: timer.cpp:33
UIWidget::getLayout
UILayoutPtr getLayout()
Definition: uiwidget.h:260
UIWidget::setFocusable
void setFocusable(bool focusable)
Definition: uiwidget.cpp:978
platformwindow.h
TRect< int >
Fw::ActiveState
@ ActiveState
Definition: const.h:269
Fw::WidgetState
WidgetState
Definition: const.h:266
UIWidget::isChildLocked
bool isChildLocked(const UIWidgetPtr &child)
Definition: uiwidget.cpp:1036
UIWidget::m_textWrap
stdext::boolean< false > m_textWrap
Definition: uiwidget.h:485
UILayout::removeWidget
virtual void removeWidget(const UIWidgetPtr &)
Definition: uilayout.h:41
Fw::AnchorRight
@ AnchorRight
Definition: const.h:216
UIWidget::setStyle
void setStyle(const std::string &styleName)
Definition: uiwidget.cpp:912
UIWidget::onStyleApply
virtual void onStyleApply(const std::string &styleName, const OTMLNodePtr &styleNode)
Definition: uiwidget.cpp:1480
Fw::DraggingState
@ DraggingState
Definition: const.h:280
g_dispatcher
EventDispatcher g_dispatcher
Definition: eventdispatcher.cpp:28
UIWidget::centerIn
void centerIn(const std::string &hookedWidgetId)
Definition: uiwidget.cpp:589
UIWidget::m_autoRepeatDelay
int m_autoRepeatDelay
Definition: uiwidget.h:295
UIWidget::onDrop
virtual bool onDrop(UIWidgetPtr draggedWidget, const Point &mousePos)
Definition: uiwidget.cpp:1554
UIWidget::ungrabKeyboard
void ungrabKeyboard()
Definition: uiwidget.cpp:735
UILayout::enableUpdates
void enableUpdates()
Definition: uilayout.h:43
UIWidget::propagateOnMouseMove
bool propagateOnMouseMove(const Point &mousePos, const Point &mouseMoved, UIWidgetList &widgetList)
Definition: uiwidget.cpp:1733
uitranslator.h
UIWidget::propagateOnKeyDown
bool propagateOnKeyDown(uchar keyCode, int keyboardModifiers)
Definition: uiwidget.cpp:1642
EdgeGroup::top
T top
Definition: uiwidget.h:40
UIWidget::m_borderWidth
EdgeGroup< int > m_borderWidth
Definition: uiwidget.h:290
UIWidget::recursiveGetChildByPos
UIWidgetPtr recursiveGetChildByPos(const Point &childPos, bool wantsPhantom)
Definition: uiwidget.cpp:1180
UIWidget::containsMarginPoint
bool containsMarginPoint(const Point &point)
Definition: uiwidget.h:250
UIWidget::getId
std::string getId()
Definition: uiwidget.h:254
TRect::bind
void bind(const TRect< T > &r)
Definition: rect.h:273
Fw::AnchorEdge
AnchorEdge
Definition: const.h:211
UIWidget::onHoverChange
virtual void onHoverChange(bool hovered)
Definition: uiwidget.cpp:1527
UIManager::updateHoveredWidget
void updateHoveredWidget(bool now=false)
Definition: uimanager.cpp:221
UILayout::isUIAnchorLayout
virtual bool isUIAnchorLayout()
Definition: uilayout.h:51
luainterface.h
UIAnchorLayout
Definition: uianchorlayout.h:62
UIWidget::drawSelf
virtual void drawSelf(Fw::DrawPane drawPane)
Definition: uiwidget.cpp:88
Logger::error
void error(const std::string &what)
Definition: logger.h:54
UIWidget::m_autoFocusPolicy
Fw::AutoFocusPolicy m_autoFocusPolicy
Definition: uiwidget.h:80
UIWidget::getAnchoredLayout
UIAnchorLayoutPtr getAnchoredLayout()
Definition: uiwidget.cpp:1100
UIWidget::destroy
void destroy()
Definition: uiwidget.cpp:780
UIWidget::propagateOnKeyPress
bool propagateOnKeyPress(uchar keyCode, int keyboardModifiers, int autoRepeatTicks)
Definition: uiwidget.cpp:1664
UIWidget::unlockChild
void unlockChild(const UIWidgetPtr &child)
Definition: uiwidget.cpp:473
UIManager::getPressedWidget
UIWidgetPtr getPressedWidget()
Definition: uimanager.h:66
UIWidget::isAnchored
bool isAnchored()
Definition: uiwidget.cpp:1028
texturemanager.h
UIWidget::raise
void raise()
Definition: uiwidget.cpp:703
UIWidget::onMouseWheel
virtual bool onMouseWheel(const Point &mousePos, Fw::MouseWheelDirection direction)
Definition: uiwidget.cpp:1605
UIWidget::addChild
void addChild(const UIWidgetPtr &child)
Definition: uiwidget.cpp:138
UIWidget::isPhantom
bool isPhantom()
Definition: uiwidget.h:243
UIWidget::recursiveGetChildrenByMarginPos
UIWidgetList recursiveGetChildrenByMarginPos(const Point &childPos)
Definition: uiwidget.cpp:1228
UIWidget::containsPoint
bool containsPoint(const Point &point)
Definition: uiwidget.h:252
OTMLNode::children
OTMLNodeList children()
Definition: otmlnode.cpp:171
UIWidget::mergeStyle
void mergeStyle(const OTMLNodePtr &styleNode)
Definition: uiwidget.cpp:518
Fw::AnchorLeft
@ AnchorLeft
Definition: const.h:215
UIWidget::m_focusable
stdext::boolean< true > m_focusable
Definition: uiwidget.h:66
Fw::HoverState
@ HoverState
Definition: const.h:271
uiwidget.h
UIWidget::addAnchor
void addAnchor(Fw::AnchorEdge anchoredEdge, const std::string &hookedWidgetId, Fw::AnchorEdge hookedEdge)
Definition: uiwidget.cpp:573
UIWidget::getLastChild
UIWidgetPtr getLastChild()
Definition: uiwidget.h:259
Painter::popTransformMatrix
virtual void popTransformMatrix()=0
Fw::AutoFocusLast
@ AutoFocusLast
Definition: const.h:231
stdext::format
std::string format()
Definition: format.h:84
stdext::starts_with
bool starts_with(const std::string &str, const std::string &test)
Definition: string.cpp:263
UIWidget::bindRectToParent
void bindRectToParent()
Definition: uiwidget.cpp:741
UIWidget::m_lastClickPosition
Point m_lastClickPosition
Definition: uiwidget.h:296
UIWidget::m_rect
Rect m_rect
Definition: uiwidget.h:62
UIWidget::drawBorder
void drawBorder(const Rect &screenCoords)
Definition: uiwidgetbasestyle.cpp:348
UIWidget::focus
void focus()
Definition: uiwidget.cpp:669
Fw::FocusReason
FocusReason
Definition: const.h:221
OTMLNode::addChild
void addChild(const OTMLNodePtr &newChild)
Definition: otmlnode.cpp:91
UIManager::setKeyboardReceiver
void setKeyboardReceiver(const UIWidgetPtr &widget)
Definition: uimanager.h:58
UILayout::setParent
void setParent(UIWidgetPtr parentWidget)
Definition: uilayout.h:45
UIWidget::m_lockedChildren
UIWidgetList m_lockedChildren
Definition: uiwidget.h:75
UIWidget::getChildByIndex
UIWidgetPtr getChildByIndex(int index)
Definition: uiwidget.cpp:1159
Fw::MouseLeftButton
@ MouseLeftButton
Definition: const.h:248
UIWidget::getRootParent
UIWidgetPtr getRootParent()
Definition: uiwidget.cpp:1112
UIWidget::onGeometryChange
virtual void onGeometryChange(const Rect &oldRect, const Rect &newRect)
Definition: uiwidget.cpp:1496
Fw::LastWidgetState
@ LastWidgetState
Definition: const.h:282
UIWidget::getMarginRect
Rect getMarginRect()
Definition: uiwidget.cpp:1068
UIWidget::getChildBefore
UIWidgetPtr getChildBefore(const UIWidgetPtr &relativeChild)
Definition: uiwidget.cpp:1128
Fw::MiddleState
@ MiddleState
Definition: const.h:277
UIWidget::focusPreviousChild
void focusPreviousChild(Fw::FocusReason reason, bool rotate=false)
Definition: uiwidget.cpp:333
UIWidget::getAutoFocusPolicy
Fw::AutoFocusPolicy getAutoFocusPolicy()
Definition: uiwidget.h:264
Color::green
static const Color green
Definition: color.h:105
UIWidget::ungrabMouse
void ungrabMouse()
Definition: uiwidget.cpp:721
Fw::AutoFocusFirst
@ AutoFocusFirst
Definition: const.h:230
UIManager::getDraggingWidget
UIWidgetPtr getDraggingWidget()
Definition: uimanager.h:64
UIWidget::onDragMove
virtual bool onDragMove(const Point &mousePos, const Point &mouseMoved)
Definition: uiwidget.cpp:1549
LuaObject::releaseLuaFieldsTable
void releaseLuaFieldsTable()
Release fields table reference.
Definition: luaobject.cpp:54
LuaInterface::popString
std::string popString()
Definition: luainterface.cpp:1048
g_window
PlatformWindow & g_window
Definition: platformwindow.cpp:37
UIWidget::getChildByPos
UIWidgetPtr getChildByPos(const Point &childPos)
Definition: uiwidget.cpp:1145
UIWidget::updateParentLayout
void updateParentLayout()
Definition: uiwidget.cpp:626
UILayout::addWidget
virtual void addWidget(const UIWidgetPtr &)
Definition: uilayout.h:40
UIWidget::m_id
std::string m_id
Definition: uiwidget.h:61
UIWidget::m_clipping
stdext::boolean< false > m_clipping
Definition: uiwidget.h:71
uint
unsigned int uint
Definition: types.h:31
OTMLNode::tag
std::string tag()
Definition: otmlnode.h:36
UIWidget::m_padding
EdgeGroup< int > m_padding
Definition: uiwidget.h:292
uianchorlayout.h
LuaObject::callLuaField
R callLuaField(const std::string &field, const T &... args)
Definition: luaobject.h:172
TRect::expand
void expand(T top, T right, T bottom, T left)
Definition: rect.h:95
UIWidget::onMouseRelease
virtual bool onMouseRelease(const Point &mousePos, Fw::MouseButton button)
Definition: uiwidget.cpp:1595
UIWidget::updateText
virtual void updateText()
Definition: uiwidgettext.cpp:37
UIWidget::getFirstChild
UIWidgetPtr getFirstChild()
Definition: uiwidget.h:258
g_logger
Logger g_logger
Definition: logger.cpp:35
UIWidget::m_focusedChild
UIWidgetPtr m_focusedChild
Definition: uiwidget.h:76
g_lua
LuaInterface g_lua
Definition: luainterface.cpp:31
TRect::united
TRect< T > united(const TRect< T > &r) const
Definition: rect.h:222
UIWidget::getChildrenRect
Rect getChildrenRect()
Definition: uiwidget.cpp:1075
stdext::shared_object_ptr::reset
void reset()
Definition: shared_object.h:79
UIWidget::lockChild
void lockChild(const UIWidgetPtr &child)
Definition: uiwidget.cpp:441
stdext::shared_object::static_self_cast
stdext::shared_object_ptr< T > static_self_cast()
Definition: shared_object.h:50
UIWidget::setChecked
void setChecked(bool checked)
Definition: uiwidget.cpp:972
UIWidget::getChildById
UIWidgetPtr getChildById(const std::string &childId)
Definition: uiwidget.cpp:1136
UIWidget::focusNextChild
void focusNextChild(Fw::FocusReason reason, bool rotate=false)
Definition: uiwidget.cpp:289
UIWidget::setOn
void setOn(bool on)
Definition: uiwidget.cpp:967
UIWidget::setDraggable
void setDraggable(bool draggable)
Definition: uiwidget.cpp:1000
UIWidget::isFocusable
bool isFocusable()
Definition: uiwidget.h:242
Fw::OnState
@ OnState
Definition: const.h:275
UIWidget::m_lastFocusReason
Fw::FocusReason m_lastFocusReason
Definition: uiwidget.h:79
Fw::AnchorNone
@ AnchorNone
Definition: const.h:212
UIWidget::recursiveGetChildren
UIWidgetList recursiveGetChildren()
Definition: uiwidget.cpp:1198
EventDispatcher::addEvent
EventPtr addEvent(const std::function< void()> &callback, bool pushFront=false)
Definition: eventdispatcher.cpp:104
UIWidget::setState
bool setState(Fw::WidgetState state, bool on)
Definition: uiwidget.cpp:1256
UIWidget::drawChildren
virtual void drawChildren(const Rect &visibleRect, Fw::DrawPane drawPane)
Definition: uiwidget.cpp:106
UIWidget::backwardsGetWidgetById
UIWidgetPtr backwardsGetWidgetById(const std::string &id)
Definition: uiwidget.cpp:1246
UIWidget::m_style
OTMLNodePtr m_style
Definition: uiwidget.h:77
UIManager::resetMouseReceiver
void resetMouseReceiver()
Definition: uimanager.h:60
OTMLNode::clone
OTMLNodePtr clone()
Definition: otmlnode.cpp:180
UIWidget::propagateOnKeyUp
bool propagateOnKeyUp(uchar keyCode, int keyboardModifiers)
Definition: uiwidget.cpp:1689
UIManager::getKeyboardReceiver
UIWidgetPtr getKeyboardReceiver()
Definition: uimanager.h:63
Painter::drawBoundingRect
virtual void drawBoundingRect(const Rect &dest, int innerLineWidth=1)=0
UIWidget::getParent
UIWidgetPtr getParent()
Definition: uiwidget.h:255
Fw::AnchorTop
@ AnchorTop
Definition: const.h:213
Timer::restart
void restart()
Definition: timer.cpp:27
Timer::running
bool running()
Definition: timer.h:40
OTMLNode::size
int size()
Definition: otmlnode.h:37
UIWidget::onMousePress
virtual bool onMousePress(const Point &mousePos, Fw::MouseButton button)
Definition: uiwidget.cpp:1579
UIWidget::onDoubleClick
virtual bool onDoubleClick(const Point &mousePos)
Definition: uiwidget.cpp:1615
OTMLNode::get
OTMLNodePtr get(const std::string &childTag)
Definition: otmlnode.cpp:54
UIWidget::onClick
virtual bool onClick(const Point &mousePos)
Definition: uiwidget.cpp:1610
UIWidget::moveChildToIndex
void moveChildToIndex(const UIWidgetPtr &child, int index)
Definition: uiwidget.cpp:416
UIWidget::setParent
void setParent(const UIWidgetPtr &parent)
Definition: uiwidget.cpp:823
UIWidget::m_draggable
stdext::boolean< false > m_draggable
Definition: uiwidget.h:69
UIManager::resetKeyboardReceiver
void resetKeyboardReceiver()
Definition: uimanager.h:61
UILayout::update
void update()
Definition: uilayout.cpp:28
UIWidget::onChildFocusChange
virtual void onChildFocusChange(const UIWidgetPtr &focusedChild, const UIWidgetPtr &unfocusedChild, Fw::FocusReason reason)
Definition: uiwidget.cpp:1522
Color::aF
float aF() const
Definition: color.h:49
UIWidget::lowerChild
void lowerChild(UIWidgetPtr child)
Definition: uiwidget.cpp:377
UIWidget::propagateOnKeyText
bool propagateOnKeyText(const std::string &keyText)
Definition: uiwidget.cpp:1620
UIWidget::updateLayout
void updateLayout()
Definition: uiwidget.cpp:637
Painter::pushTransformMatrix
virtual void pushTransformMatrix()=0
UIWidget::setPhantom
void setPhantom(bool phantom)
Definition: uiwidget.cpp:995
g_app
ConsoleApplication g_app
Definition: consoleapplication.cpp:32
Fw::PressedState
@ PressedState
Definition: const.h:272
stdext::throw_exception
void throw_exception(const std::string &what)
Throws a generic exception.
Definition: exception.h:43
UIWidget::drawIcon
void drawIcon(const Rect &screenCoords)
Definition: uiwidgetbasestyle.cpp:380
UIWidget::getFocusedChild
UIWidgetPtr getFocusedChild()
Definition: uiwidget.h:256
UIWidget::isExplicitlyEnabled
bool isExplicitlyEnabled()
Definition: uiwidget.h:240
UIWidget::m_margin
EdgeGroup< int > m_margin
Definition: uiwidget.h:291
Painter::setClipRect
virtual void setClipRect(const Rect &clipRect)=0
UIWidget::onLayoutUpdate
virtual void onLayoutUpdate()
Definition: uiwidget.cpp:1512
Fw::AlternateState
@ AlternateState
Definition: const.h:279
UIWidget::setStyleFromNode
void setStyleFromNode(const OTMLNodePtr &styleNode)
Definition: uiwidget.cpp:925
stdext::split
std::vector< std::string > split(const std::string &str, const std::string &separators)
Definition: string.cpp:273
Fw::DisabledState
@ DisabledState
Definition: const.h:273
UILayout::disableUpdates
void disableUpdates()
Definition: uilayout.h:42
UIWidget::onKeyDown
virtual bool onKeyDown(uchar keyCode, int keyboardModifiers)
Definition: uiwidget.cpp:1564
Timer::stop
void stop()
Definition: timer.h:34
UIWidget::m_children
UIWidgetList m_children
Definition: uiwidget.h:74
UIWidget::destroyChildren
void destroyChildren()
Definition: uiwidget.cpp:795
UIWidget::drawImage
void drawImage(const Rect &screenCoords)
Definition: uiwidgetimage.cpp:78
stdext::exception::what
virtual const char * what() const
Definition: exception.h:37
UIWidget::m_visible
stdext::boolean< true > m_visible
Definition: uiwidget.h:65
UIWidget::m_rotation
float m_rotation
Definition: uiwidget.h:294
UIWidget::m_phantom
stdext::boolean< false > m_phantom
Definition: uiwidget.h:68
UIWidget::grabKeyboard
void grabKeyboard()
Definition: uiwidget.cpp:727
uchar
unsigned char uchar
Definition: types.h:29
g_ui
UIManager g_ui
Definition: uimanager.cpp:33
UIWidget::isHovered
bool isHovered()
Definition: uiwidget.h:229
UIWidget::m_backgroundColor
Color m_backgroundColor
Definition: uiwidget.h:282
Fw::MouseWheelDirection
MouseWheelDirection
Definition: const.h:253
UIWidget::~UIWidget
virtual ~UIWidget()
Definition: uiwidget.cpp:49
Painter::getOpacity
float getOpacity()
Definition: painter.h:96
UIWidget::lower
void lower()
Definition: uiwidget.cpp:693
TRect::isValid
bool isValid() const
Definition: rect.h:50
TRect::setHeight
void setHeight(T height)
Definition: rect.h:86
otmlnode.h
Fw::DrawPane
DrawPane
Definition: const.h:285
UIWidget::recursiveFocus
void recursiveFocus(Fw::FocusReason reason)
Definition: uiwidget.cpp:681
stdext::shared_object_ptr< UIWidget >
Fw::InvalidState
@ InvalidState
Definition: const.h:267
Painter::getClipRect
Rect getClipRect()
Definition: painter.h:97
UIWidget::draw
virtual void draw(const Rect &visibleRect, Fw::DrawPane drawPane)
Definition: uiwidget.cpp:58
UIWidget::setFixedSize
void setFixedSize(bool fixed)
Definition: uiwidget.cpp:1005
OTMLNode::merge
void merge(const OTMLNodePtr &node)
Definition: otmlnode.cpp:158
UIManager::onWidgetDestroy
void onWidgetDestroy(const UIWidgetPtr &widget)
Definition: uimanager.cpp:272
uimanager.h
UIWidget::removeAnchor
void removeAnchor(Fw::AnchorEdge anchoredEdge)
Definition: uiwidget.cpp:584
UIWidget::setLayout
void setLayout(const UILayoutPtr &layout)
Definition: uiwidget.cpp:849
UIWidget::hasState
bool hasState(Fw::WidgetState state)
Definition: uiwidget.cpp:1274
UIWidget::isExplicitlyVisible
bool isExplicitlyVisible()
Definition: uiwidget.h:241
Fw::ForegroundPane
@ ForegroundPane
Definition: const.h:286
UIWidget::m_enabled
stdext::boolean< true > m_enabled
Definition: uiwidget.h:64
UIWidget::UIWidget
UIWidget()
Definition: uiwidget.cpp:36
Application::isTerminated
bool isTerminated()
Definition: application.h:50
g_painter
Painter * g_painter
Definition: painter.cpp:28
UIWidget::setLastFocusReason
void setLastFocusReason(Fw::FocusReason reason)
Definition: uiwidget.cpp:1011
UIWidget::removeChild
void removeChild(UIWidgetPtr child)
Definition: uiwidget.cpp:217
UIWidget::setEnabled
void setEnabled(bool enabled)
Definition: uiwidget.cpp:932
UIWidget::setVisible
void setVisible(bool visible)
Definition: uiwidget.cpp:942
TRect::height
T height() const
Definition: rect.h:70
PlatformWindow::getMousePosition
Point getMousePosition()
Definition: platformwindow.h:83
UIWidget::onKeyText
virtual bool onKeyText(const std::string &keyText)
Definition: uiwidget.cpp:1559
TRect::intersection
TRect< T > intersection(const TRect< T > &r) const
Definition: rect.h:231
UIWidget::onMouseMove
virtual bool onMouseMove(const Point &mousePos, const Point &mouseMoved)
Definition: uiwidget.cpp:1600
UIWidget::m_destroyed
stdext::boolean< false > m_destroyed
Definition: uiwidget.h:70
UIWidget::setVirtualOffset
void setVirtualOffset(const Point &offset)
Definition: uiwidget.cpp:1021
UIWidget::getChildAfter
UIWidgetPtr getChildAfter(const UIWidgetPtr &relativeChild)
Definition: uiwidget.cpp:1120
UIWidget::isDestroyed
bool isDestroyed()
Definition: uiwidget.h:247
UIWidget::recursiveGetChildrenByPos
UIWidgetList recursiveGetChildrenByPos(const Point &childPos)
Definition: uiwidget.cpp:1210
UIAnchorLayoutPtr
stdext::shared_object_ptr< UIAnchorLayout > UIAnchorLayoutPtr
Definition: declarations.h:51
UIWidget::applyStyle
void applyStyle(const OTMLNodePtr &styleNode)
Definition: uiwidget.cpp:529
Fw::CheckedState
@ CheckedState
Definition: const.h:274
Fw::HiddenState
@ HiddenState
Definition: const.h:281
UIManager::isDrawingDebugBoxes
bool isDrawingDebugBoxes()
Definition: uimanager.h:71
Fw::AnchorVerticalCenter
@ AnchorVerticalCenter
Definition: const.h:217
TPoint< int >
TRect::size
TSize< T > size() const
Definition: rect.h:71
Fw::AnchorBottom
@ AnchorBottom
Definition: const.h:214
UIWidget::onDragLeave
virtual bool onDragLeave(UIWidgetPtr droppedWidget, const Point &mousePos)
Definition: uiwidget.cpp:1544
EdgeGroup::bottom
T bottom
Definition: uiwidget.h:42
Fw::translateState
WidgetState translateState(std::string state)
Definition: uitranslator.cpp:71
TRect::setWidth
void setWidth(T width)
Definition: rect.h:85
UIManager::setMouseReceiver
void setMouseReceiver(const UIWidgetPtr &widget)
Definition: uimanager.h:57
EdgeGroup::left
T left
Definition: uiwidget.h:43
UIWidget::onKeyUp
virtual bool onKeyUp(uchar keyCode, int keyboardModifiers)
Definition: uiwidget.cpp:1574
UIWidget::raiseChild
void raiseChild(UIWidgetPtr child)
Definition: uiwidget.cpp:397
UIWidget::setId
void setId(const std::string &id)
Definition: uiwidget.cpp:815
UIWidget::insertChild
void insertChild(int index, const UIWidgetPtr &child)
Definition: uiwidget.cpp:179
TRect::width
T width() const
Definition: rect.h:69
TRect::center
TPoint< T > center() const
Definition: rect.h:68
UIWidget::lock
void lock()
Definition: uiwidget.cpp:651
UIWidget::onKeyPress
virtual bool onKeyPress(uchar keyCode, int keyboardModifiers, int autoRepeatTicks)
Definition: uiwidget.cpp:1569
UIWidget::drawText
void drawText(const Rect &screenCoords)
Definition: uiwidgettext.cpp:83
Fw::AutoFocusPolicy
AutoFocusPolicy
Definition: const.h:228
UIWidget::isFocused
bool isFocused()
Definition: uiwidget.h:228
UIWidget::rotate
void rotate(float degrees)
Definition: uiwidget.h:219
UIManager::getMouseReceiver
UIWidgetPtr getMouseReceiver()
Definition: uimanager.h:62
UIWidget::m_clickTimer
Timer m_clickTimer
Definition: uiwidget.h:78
UIWidget::grabMouse
void grabMouse()
Definition: uiwidget.cpp:713
UIWidgetList
std::deque< UIWidgetPtr > UIWidgetList
Definition: declarations.h:53
UIWidget::recursiveGetChildById
UIWidgetPtr recursiveGetChildById(const std::string &id)
Definition: uiwidget.cpp:1167
UIWidget::getChildIndex
int getChildIndex(const UIWidgetPtr &child)
Definition: uiwidget.cpp:1050
Fw::DefaultState
@ DefaultState
Definition: const.h:268
Fw::LastState
@ LastState
Definition: const.h:278
UIWidget::setRect
bool setRect(const Rect &rect)
Definition: uiwidget.cpp:876
Fw::MouseButton
MouseButton
Definition: const.h:246
UIWidget::m_parent
UIWidgetPtr m_parent
Definition: uiwidget.h:73
Painter::setOpacity
virtual void setOpacity(float opacity)
Definition: painter.h:91
LuaInterface::evaluateExpression
void evaluateExpression(const std::string &expression, const std::string &source="lua expression")
Definition: luainterface.cpp:365
UIWidget::hasChild
bool hasChild(const UIWidgetPtr &child)
Definition: uiwidget.cpp:1042
UIWidget::propagateOnMouseEvent
bool propagateOnMouseEvent(const Point &mousePos, UIWidgetList &widgetList)
Definition: uiwidget.cpp:1711
application.h
Fw::AutoFocusNone
@ AutoFocusNone
Definition: const.h:229
Logger::warning
void warning(const std::string &what)
Definition: logger.h:53
UIWidget::drawBackground
void drawBackground(const Rect &screenCoords)
Definition: uiwidgetbasestyle.cpp:336
UIWidget::onVisibilityChange
virtual void onVisibilityChange(bool visible)
Definition: uiwidget.cpp:1532
stdext::exception
Definition: exception.h:31
UIWidget::isVisible
bool isVisible()
Definition: uiwidget.h:238
Fw::AnchorHorizontalCenter
@ AnchorHorizontalCenter
Definition: const.h:218
OTMLNode::create
static OTMLNodePtr create(std::string tag="", bool unique=false)
Definition: otmlnode.cpp:27
UIWidget::m_fixedSize
stdext::boolean< false > m_fixedSize
Definition: uiwidget.h:67