bool FindToolBar::focusNextPrevChild(bool next) { QAbstractButton *optionsButton = m_ui.findEdit->button(Utils::FancyLineEdit::Left); // close tab order if (next && m_ui.advancedButton->hasFocus()) optionsButton->setFocus(Qt::TabFocusReason); else if (next && optionsButton->hasFocus()) m_ui.findEdit->setFocus(Qt::TabFocusReason); else if (!next && optionsButton->hasFocus()) m_ui.advancedButton->setFocus(Qt::TabFocusReason); else if (!next && m_ui.findEdit->hasFocus()) optionsButton->setFocus(Qt::TabFocusReason); else return Utils::StyledBar::focusNextPrevChild(next); return true; }
void EditMetadataDialog::showSaveMenu() { popup = new MythPopupBox(GetMythMainWindow(), "Menu"); QLabel *label = popup->addLabel(tr("Save Changes?"), MythPopupBox::Large, false); label->setAlignment(Qt::AlignCenter | Qt::WordBreak); QAbstractButton *topButton; if (metadataOnly) { topButton = popup->addButton(tr("Save Changes"), this, SLOT(saveToMetadata())); } else { topButton = popup->addButton(tr("Save Changes"), this, SLOT(saveAll())); } popup->addButton(tr("Exit/Do Not Save"), this, SLOT(closeDialog())); popup->addButton(tr("Cancel"), this, SLOT(cancelPopup())); popup->ShowPopup(this, SLOT(cancelPopup())); topButton->setFocus(); }
bool DictWidget::handleLeftRightKey(const int checked_id, const int key) { QAbstractButton *button = button_group_.button(checked_id); if (button) { int target_focus_id = getNextFocusButtonId(checked_id); if (Qt::Key_Left == key) { target_focus_id = getPreviousFocusButtonId(checked_id); } QAbstractButton *next = button_group_.button(target_focus_id); if (next) { next->setFocus(); changeDescription(target_focus_id); } return true; } else { return false; } }
void QAbstractButtonPrivate::moveFocus(int key) { QList<QAbstractButton *> buttonList = queryButtonList();; #ifndef QT_NO_BUTTONGROUP bool exclusive = group ? group->d_func()->exclusive : autoExclusive; #else bool exclusive = autoExclusive; #endif QWidget *f = QApplication::focusWidget(); QAbstractButton *fb = qobject_cast<QAbstractButton *>(f); if (!fb || !buttonList.contains(fb)) return; QAbstractButton *candidate = 0; int bestScore = -1; QRect target = f->rect().translated(f->mapToGlobal(QPoint(0,0))); QPoint goal = target.center(); uint focus_flag = qt_tab_all_widgets ? Qt::TabFocus : Qt::StrongFocus; for (int i = 0; i < buttonList.count(); ++i) { QAbstractButton *button = buttonList.at(i); if (button != f && button->window() == f->window() && button->isEnabled() && !button->isHidden() && (autoExclusive || (button->focusPolicy() & focus_flag) == focus_flag)) { QRect buttonRect = button->rect().translated(button->mapToGlobal(QPoint(0,0))); QPoint p = buttonRect.center(); //Priority to widgets that overlap on the same coordinate. //In that case, the distance in the direction will be used as significant score, //take also in account orthogonal distance in case two widget are in the same distance. int score; if ((buttonRect.x() < target.right() && target.x() < buttonRect.right()) && (key == Qt::Key_Up || key == Qt::Key_Down)) { //one item's is at the vertical of the other score = (qAbs(p.y() - goal.y()) << 16) + qAbs(p.x() - goal.x()); } else if ((buttonRect.y() < target.bottom() && target.y() < buttonRect.bottom()) && (key == Qt::Key_Left || key == Qt::Key_Right) ) { //one item's is at the horizontal of the other score = (qAbs(p.x() - goal.x()) << 16) + qAbs(p.y() - goal.y()); } else { score = (1 << 30) + (p.y() - goal.y()) * (p.y() - goal.y()) + (p.x() - goal.x()) * (p.x() - goal.x()); } if (score > bestScore && candidate) continue; switch(key) { case Qt::Key_Up: if (p.y() < goal.y()) { candidate = button; bestScore = score; } break; case Qt::Key_Down: if (p.y() > goal.y()) { candidate = button; bestScore = score; } break; case Qt::Key_Left: if (p.x() < goal.x()) { candidate = button; bestScore = score; } break; case Qt::Key_Right: if (p.x() > goal.x()) { candidate = button; bestScore = score; } break; } } } if (exclusive #ifdef QT_KEYPAD_NAVIGATION && !QApplication::keypadNavigationEnabled() #endif && candidate && fb->d_func()->checked && candidate->d_func()->checkable) candidate->click(); if (candidate) { if (key == Qt::Key_Up || key == Qt::Key_Left) candidate->setFocus(Qt::BacktabFocusReason); else candidate->setFocus(Qt::TabFocusReason); } }