//static void TBRadioCheckBox::UpdateGroupWidgets(TBWidget *new_leader) { assert(new_leader->GetValue() && new_leader->GetGroupID()); // Find the group root widget. TBWidget *group = new_leader; while (group && !group->GetIsGroupRoot() && group->GetParent()) group = group->GetParent(); for (TBWidget *child = group; child; child = child->GetNextDeep(group)) if (child != new_leader && child->GetGroupID() == new_leader->GetGroupID()) child->SetValue(0); }
bool TBWidgetSkinConditionContext::GetCondition(TBSkinCondition::TARGET target, const TBSkinCondition::CONDITION_INFO &info) { switch (target) { case TBSkinCondition::TARGET_THIS: return GetCondition(m_widget, info); case TBSkinCondition::TARGET_PARENT: return m_widget->GetParent() && GetCondition(m_widget->GetParent(), info); case TBSkinCondition::TARGET_ANCESTORS: { TBWidget *widget = m_widget->GetParent(); while (widget) { if (GetCondition(widget, info)) return true; widget = widget->GetParent(); } } case TBSkinCondition::TARGET_PREV_SIBLING: return m_widget->GetPrev() && GetCondition(m_widget->GetPrev(), info); case TBSkinCondition::TARGET_NEXT_SIBLING: return m_widget->GetNext() && GetCondition(m_widget->GetNext(), info); } return false; }
void UIDragDrop::HandleMouseDown(StringHash eventType, VariantMap& eventData) { using namespace MouseButtonDown; Input* input = GetSubsystem<Input>(); if (!input->IsMouseVisible()) return; if ((eventData[P_BUTTONS].GetUInt() & MOUSEB_LEFT) && TBWidget::hovered_widget) { // see if we have a widget TBWidget* tbw = TBWidget::hovered_widget; while(tbw && !tbw->GetDelegate()) { tbw = tbw->GetParent(); } if (!tbw) return; UIWidget* widget = (UIWidget*) tbw->GetDelegate(); currentTargetWidget_ = widget; dragSourceWidget_ = widget; } }
bool ImageWindow::OnEvent(const TBWidgetEvent &ev) { if (ev.type == EVENT_TYPE_CLICK && ev.target->GetID() == TBIDC("remove")) { TBWidget *image = ev.target->GetParent(); image->GetParent()->RemoveChild(image); delete image; return true; } return DemoWindow::OnEvent(ev); }
bool TBMover::OnEvent(const TBWidgetEvent &ev) { TBWidget *target = GetParent(); if (!target) return false; if (ev.type == EVENT_TYPE_POINTER_MOVE && captured_widget == this) { int dx = ev.target_x - pointer_down_widget_x; int dy = ev.target_y - pointer_down_widget_y; TBRect rect = target->GetRect().Offset(dx, dy); if (target->GetParent()) { // Apply limit. rect.x = CLAMP(rect.x, -pointer_down_widget_x, target->GetParent()->GetRect().w - pointer_down_widget_x); rect.y = CLAMP(rect.y, -pointer_down_widget_y, target->GetParent()->GetRect().h - pointer_down_widget_y); } target->SetRect(rect); return true; } return false; }
void TBScroller::GetTargetScrollXY(int &x, int &y) const { x = 0; y = 0; TBWidget *tmp = m_target->GetScrollRoot(); while (tmp) { TBWidget::ScrollInfo info = tmp->GetScrollInfo(); x += info.x; y += info.y; tmp = tmp->GetParent(); } }
void UIDragDrop::HandleMouseDown(StringHash eventType, VariantMap& eventData) { using namespace MouseButtonDown; Input* input = GetSubsystem<Input>(); if (!input->IsMouseVisible()) return; if ((eventData[P_BUTTONS].GetUInt() & MOUSEB_LEFT) && TBWidget::hovered_widget) { // see if we have a widget with a drag object TBWidget* tbw = TBWidget::hovered_widget; UIWidget* widget = nullptr; while(tbw) { if (tbw->GetDelegate()) { widget = (UIWidget*) tbw->GetDelegate(); if (widget->GetDragObject()) { // TODO: check if we're in widget bounds // this is going to need to be updated for drag/drop multiselect break; } widget = nullptr; } tbw = tbw->GetParent(); } if (!widget) return; currentTargetWidget_ = widget; dragSourceWidget_ = widget; mouseDownPosition_ = input->GetMousePosition(); } }
bool ListViewItemWidget::OnEvent(const TBWidgetEvent &ev) { if (ev.type == EVENT_TYPE_WHEEL) { return false; } if (ev.type == EVENT_TYPE_POINTER_DOWN || ev.type == EVENT_TYPE_RIGHT_POINTER_UP) { TBWidget* parent = GetParent(); while (parent) { if (parent->IsOfType<TBSelectList>()) { TBWidgetEvent nev = ev; nev.ref_id = item_->id; parent->InvokeEvent(nev); break; } parent = parent->GetParent(); } return true; } // get clicks this way, not sure we want to if (ev.type == EVENT_TYPE_CLICK && ev.target == expandBox_ && ev.target->GetID() == item_->id) { item_->SetExpanded(!item_->GetExpanded()); source_->list_->InvalidateList(); // want to bubble return false; } return TBLayout::OnEvent(ev); }
void TBRadioCheckBox::SetValue(int value) { if (m_value == value) return; m_value = value; SetState(WIDGET_STATE_SELECTED, value ? true : false); Invalidate(); TBWidgetEvent ev(EVENT_TYPE_CHANGED); InvokeEvent(ev); if (!value || !GetGroupID()) return; // Toggle all other widgets in the same group. First get a root widget // for the search. TBWidget *group = this; while (group && !group->GetIsGroupRoot()) group = group->GetParent(); if (group) { ToggleGroup(group, this); } }
UIView* UIWidget::GetView() { if (!widget_) return 0; if (GetType() == UIView::GetTypeStatic()) return (UIView*) this; TBWidget* tbw = widget_->GetParent(); while(tbw) { TBWidgetDelegate* delegate = tbw->GetDelegate(); if (delegate) { UIWidget* d = (UIWidget*) delegate; if (d->GetType() == UIView::GetTypeStatic()) return (UIView*) d; } tbw = tbw->GetParent(); } return 0; }
static bool InvokeShortcut(UI* ui, int key, SPECIAL_KEY special_key, MODIFIER_KEYS modifierkeys, bool down) { #ifdef __APPLE__ bool shortcut_key = (modifierkeys & TB_SUPER) ? true : false; #else bool shortcut_key = (modifierkeys & TB_CTRL) ? true : false; #endif if (!down || (!shortcut_key && special_key ==TB_KEY_UNDEFINED)) return false; bool reverse_key = (modifierkeys & TB_SHIFT) ? true : false; int upper_key = toupr_ascii(key); TBID id; if (upper_key == 'X') id = TBIDC("cut"); else if (upper_key == 'C' || special_key == TB_KEY_INSERT) id = TBIDC("copy"); else if (upper_key == 'V' || (special_key == TB_KEY_INSERT && reverse_key)) id = TBIDC("paste"); else if (upper_key == 'A') id = TBIDC("selectall"); else if (upper_key == 'Z' || upper_key == 'Y') { bool undo = upper_key == 'Z'; if (reverse_key) undo = !undo; id = undo ? TBIDC("undo") : TBIDC("redo"); } else if (upper_key == 'N') id = TBIDC("new"); else if (upper_key == 'O') id = TBIDC("open"); else if (upper_key == 'S') id = TBIDC("save"); else if (upper_key == 'W') id = TBIDC("close"); else if (upper_key == 'F') id = TBIDC("find"); #ifdef ATOMIC_PLATFORM_OSX else if (upper_key == 'G' && (modifierkeys & TB_SHIFT)) id = TBIDC("findprev"); else if (upper_key == 'G') id = TBIDC("findnext"); #else else if (special_key == TB_KEY_F3 && (modifierkeys & TB_SHIFT)) id = TBIDC("findprev"); else if (special_key == TB_KEY_F3) id = TBIDC("findnext"); #endif else if (upper_key == 'P') id = TBIDC("play"); else if (special_key == TB_KEY_PAGE_UP) id = TBIDC("prev_doc"); else if (special_key == TB_KEY_PAGE_DOWN) id = TBIDC("next_doc"); else return false; TBWidgetEvent ev(EVENT_TYPE_SHORTCUT); ev.modifierkeys = modifierkeys; ev.ref_id = id; TBWidget* eventWidget = TBWidget::focused_widget; if (id == TBIDC("save") || id == TBIDC("close")) { while (eventWidget && !eventWidget->GetDelegate()) { eventWidget = eventWidget->GetParent(); } } if (!eventWidget || !eventWidget->InvokeEvent(ev)) { VariantMap evData; evData[UIUnhandledShortcut::P_REFID] = id; ui->SendEvent(E_UIUNHANDLEDSHORTCUT, evData); return false; } return true; }
void UIDragDrop::HandleMouseMove(StringHash eventType, VariantMap& eventData) { if (dragObject_.Null() && dragSourceWidget_.Null()) return; if (dragObject_.Null()) { dragObject_ = dragSourceWidget_->GetDragObject(); if (dragObject_.Null()) { dragSourceWidget_ = 0; return; } } using namespace MouseMove; int x = eventData[P_X].GetInt(); int y = eventData[P_Y].GetInt(); // tolerance to 8 pixels to start drag/drop operation IntVector2 mousePos(x, y); mousePos -= mouseDownPosition_; if (Abs(mousePos.x_) < 8 && Abs(mousePos.y_) < 8) return; // initialize if necessary if (dragLayout_->GetVisibility() == UI_WIDGET_VISIBILITY_GONE) { dragLayout_->GetInternalWidget()->SetZ(WIDGET_Z_TOP); dragLayout_->SetVisibility(UI_WIDGET_VISIBILITY_VISIBLE); dragText_->SetText(dragObject_->GetText()); UIPreferredSize* sz = dragLayout_->GetPreferredSize(); dragLayout_->SetRect(IntRect(0, 0, sz->GetMinWidth(), sz->GetMinHeight())); } // see if we have a widget TBWidget* tbw = TBWidget::hovered_widget; while(tbw && (!tbw->GetDelegate() || tbw->IsOfType<TBLayout>())) { tbw = tbw->GetParent(); } if (!tbw || !tbw->GetParent()) return; UIWidget* hoverWidget = (UIWidget*) tbw->GetDelegate(); if (!hoverWidget->GetInternalWidget()) return; if (hoverWidget != currentTargetWidget_) { if (currentTargetWidget_) { VariantMap exitData; exitData[DragExitWidget::P_WIDGET] = currentTargetWidget_; exitData[DragExitWidget::P_DRAGOBJECT] = dragObject_; currentTargetWidget_->SendEvent(E_DRAGEXITWIDGET, exitData); } currentTargetWidget_ = hoverWidget; VariantMap enterData; enterData[DragEnterWidget::P_WIDGET] = currentTargetWidget_; enterData[DragEnterWidget::P_DRAGOBJECT] = dragObject_; currentTargetWidget_->SendEvent(E_DRAGENTERWIDGET, enterData); } dragLayout_->SetPosition(x, y - 20); }