// This file is part of Desktop App Toolkit, // a set of libraries for developing nice desktop applications. // // For license and copyright information please follow this link: // https://github.com/desktop-app/legal/blob/master/LEGAL // #pragma once #include "ui/effects/animations.h" #include "ui/widgets/scroll_area.h" namespace Ui { class RpWidget; class VerticalLayout; class VerticalLayoutReorder final { public: enum class State : uchar { Started, Applied, Cancelled, }; struct Single { not_null widget; int oldPosition = 0; int newPosition = 0; State state = State::Started; }; VerticalLayoutReorder( not_null layout, not_null scroll); void start(); void cancel(); void finishReordering(); [[nodiscard]] rpl::producer updates() const; private: struct Entry { not_null widget; Ui::Animations::Simple shiftAnimation; int shift = 0; int finalShift = 0; int deltaShift = 0; }; void mouseMove(not_null widget, QPoint position); void mousePress( not_null widget, Qt::MouseButton button, QPoint position); void mouseRelease(Qt::MouseButton button); void checkForStart(QPoint position); void updateOrder(int index, QPoint position); void cancelCurrent(); void finishCurrent(); void cancelCurrent(int index); [[nodiscard]] int indexOf(not_null widget) const; void moveToShift(int index, int shift); void updateShift(not_null widget, int indexHint); void updateScrollCallback(); void checkForScrollAnimation(); int deltaFromEdge(); const not_null _layout; const not_null _scroll; Ui::Animations::Basic _scrollAnimation; RpWidget *_currentWidget = nullptr; int _currentStart = 0; int _currentDesiredIndex = 0; State _currentState = State::Cancelled; std::vector _entries; rpl::event_stream _updates; rpl::lifetime _lifetime; }; } // namespace Ui