181 QSetValueOnDestroy<QPointF> setPreviousPoint(m_previous_point, mousePos);
183 if (resetAction && resetAction->isSeparator()) {
184 m_reset_action =
nullptr;
185 m_use_reset_action =
true;
186 }
else if (m_reset_action != resetAction) {
187 if (m_use_reset_action && resetAction) {
188 const QList<QAction *> actions = m_menu->actions();
189 const int resetIdx = actions.indexOf(resetAction);
190 const int originIdx = actions.indexOf(m_origin_action);
191 if (resetIdx > -1 && originIdx > -1 && qAbs(resetIdx - originIdx) > 1)
192 m_use_reset_action =
false;
194 m_reset_action = resetAction;
197 if (m_action_rect.contains(mousePos)) {
202 if (m_uni_directional && !m_first_mouse && resetAction != m_origin_action) {
203 bool left_to_right = m_menu->layoutDirection() == Qt::LeftToRight;
204 QRect sub_menu_rect = m_sub_menu->geometry();
205 QPoint sub_menu_top =
206 left_to_right? sub_menu_rect.topLeft() : sub_menu_rect.topRight();
207 QPoint sub_menu_bottom =
208 left_to_right? sub_menu_rect.bottomLeft() : sub_menu_rect.bottomRight();
209 qreal prev_slope_top = slope(m_previous_point, sub_menu_top);
210 qreal prev_slope_bottom = slope(m_previous_point, sub_menu_bottom);
212 qreal current_slope_top = slope(mousePos, sub_menu_top);
213 qreal current_slope_bottom = slope(mousePos, sub_menu_bottom);
215 bool slopeTop = checkSlope(prev_slope_top, current_slope_top, sub_menu_top.y() < mousePos.y());
216 bool slopeBottom = checkSlope(prev_slope_bottom, current_slope_bottom, sub_menu_bottom.y() > mousePos.y());
217 bool rightDirection =
false;
218 int mouseDir =
int(m_previous_point.y() - mousePos.y());
220 rightDirection = rightDirection || slopeTop;
223 rightDirection = rightDirection || slopeBottom;
226 if (m_uni_dir_discarded_count >= m_uni_dir_fail_at_count && !rightDirection) {
227 m_uni_dir_discarded_count = 0;
232 m_uni_dir_discarded_count++;
234 m_uni_dir_discarded_count = 0;