/*************************************************************************** * Copyright (C) 2006-2019 by Ilya Kotov * * forkotov02@ya.ru * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #ifndef LISTWIDGET_H #define LISTWIDGET_H #include #include #include #include #include "listwidgetdrawer.h" class QFont; class QFontMetrics; class QMenu; class QAction; class QTimer; class PlayListModel; class Skin; class PlayListItem; class QmmpUiSettings; class PlayListHeader; class HorizontalSlider; namespace PlayListPopup{ class PopupWidget; } /** @author Ilya Kotov */ class ListWidget : public QWidget { Q_OBJECT public: ListWidget(QWidget *parent = nullptr); ~ListWidget(); /*! * Returns count of currently visible rows. */ int visibleRows() const; /*! * Returns index of the first visible item. */ int firstVisibleIndex() const; int anchorIndex() const; void setAnchorIndex(int index); QMenu *menu(); PlayListModel *model(); public slots: void readSettings(); void updateList(int flags); void setViewPosition(int sc); void setModel(PlayListModel *selected, PlayListModel *previous = nullptr); signals: void doubleClicked(); void positionChanged(int, int); //current position, maximum value protected: void paintEvent(QPaintEvent *) override; void mouseDoubleClickEvent(QMouseEvent *) override; void mousePressEvent(QMouseEvent *) override; void mouseMoveEvent(QMouseEvent *) override; void mouseReleaseEvent(QMouseEvent *) override; void resizeEvent(QResizeEvent *) override; void wheelEvent(QWheelEvent *) override; int indexAt(int)const; void dragEnterEvent(QDragEnterEvent *event) override; void dropEvent(QDropEvent *event) override; void dragLeaveEvent(QDragLeaveEvent *) override; void dragMoveEvent(QDragMoveEvent *event) override; void contextMenuEvent (QContextMenuEvent * event) override; bool event (QEvent *e) override; private slots: void updateSkin(); void autoscroll(); void updateRepeatIndicator(); void scrollTo(int index); private: enum ScrollDirection { NONE = 0,TOP,DOWN }; void recenterTo(int index); /*! * Returns string with queue number or(and) repeate flag for the item number \b i. */ const QString getExtraString(int i); bool updateRowCount(); void restoreFirstVisible(); bool m_update; int m_pressed_index; QMenu *m_menu; PlayListModel *m_model; int m_row_count, m_first, m_count; //visible rows, first visible index, total item count PlayListItem *m_firstItem; //first visible item Skin *m_skin; int m_anchor_index; /*! * Scroll direction that is performing in current moment. */ ScrollDirection m_scroll_direction; int m_prev_y; bool m_select_on_release; bool m_show_protocol; int m_drop_index; QList m_rows; QmmpUiSettings *m_ui_settings; PlayListPopup::PopupWidget *m_popupWidget; QTimer *m_timer; ListWidgetDrawer m_drawer; PlayListHeader *m_header; HorizontalSlider *m_hslider; }; #endif