#ifndef FM_DAYTIME_H #define FM_DAYTIME_H #if (USE_DATE_TIME_LIST) #include #include #include #include "../fm_event_types.h" class FMDayTime; class RMVideoItem; class FMTimeBar : public QWidget { friend class FMDayTime; Q_OBJECT public: explicit FMTimeBar(int min, int max, int unit, int labelUnit, QWidget *parent = nullptr); bool bDisabled; ///!< 파일 로딩시 잠김 protected: int mMin; ///!< 시간/분 모두 0, int mMax; ///!< 시간일 경우 24, 분일경우 60 int mUnit; ///!< 시간:1 분:5 int mLabelUnit; ///!< 시간:3(시간에 한번 표시), 분:5(분에 한번 표시) int mMarginLR; ///!< 좌우 최소 마진 (+ 소숫점 오차가 최종 마진이 됨) void showEvent(QShowEvent*) override; void drawGrid(QPainter& p); void paintEvent(QPaintEvent *) override; virtual void mousePressEvent(QMouseEvent* event) override; void mouseReleaseEvent(QMouseEvent* event) override; bool eventFilter(QObject *watched, QEvent *event); bool mPressed; ///!< 마우스 눌린 상태 int mHoverTime; ///!< 마우스 HOVER 시간(분) int mSelectedTime; ///!< 선택 시간(분) QSet mExists; ///!< 영상이 존재하는 시작시간(분) //! \brief 초기화 virtual void reset(); //! \brief 마우스 좌표에서 선택된 시간(분) 확인 //! \param xy: 마우스 좌표 //! \return 선택된 시간 virtual int getTime(QPoint xy); signals: //! \brief 시간 또는 분 선택됨 //! \param nSelected: 선택된 시간, 분 //! \param playTime: 리스트 또는 다음파일로 재생된 경우 //! \parma moveList: 리스트 업데이트 void timeSelected(int nSelected, QDateTime* playTime,bool moveList); }; class FMTimeBarMinute : public FMTimeBar { Q_OBJECT public: explicit FMTimeBarMinute(QWidget *parent = nullptr); QList> mFiles; ///!< 0~3600 초로 구성된 재생시간 영역 QList> mAreas; void createAreaBox(); void reset() override; //! \brief 시간과 동일한 AREA INDEX 리턴 //! \param time //! \return int findAreaFromTime(QDateTime* time); protected: bool mMenu; ///!< 메뉴 표시 여부 int mStartBackup; int mEndBackup; QList backups; //! \brief XY 로 시간확인하는 방식이 다름 //! \param xy: 좌표 //! \return 선택된 mAreas 리스트 int getTime(QPoint xy) override; void mousePressEvent(QMouseEvent* event) override; //! \brief 우측 메뉴 클릭을 위해 처리 //! \param event void mouseReleaseEvent(QMouseEvent* event) override; //! \brief 백업 메뉴 표시 //! \param pos: 좌표 void showMenu(QPoint pos); void paintEvent(QPaintEvent *) override; signals: void backupSelected(QList&); public slots: void onSetBackup(); }; //! \brief 시간/분 통합 컨트롤 class FMDayTime : public QWidget { Q_OBJECT public: explicit FMDayTime(QWidget *parent = nullptr); protected: FMTimeBar* mHours; FMTimeBarMinute* mMinutes; QDateTime mLastPlayTime; ///!< 재생시간을 확인하여 분으로 선택된 경우 LOOP 방지 //! \brief 파일 리스트 중 지정된 날짜에 포함된 시간리스트 리턴 //! \param hours: 영상이 존재하는 시간(0~23) 리스트 void getHour(QSet& hours); //! \brief 파일 리스트 중 지정된 날짜, 시간에 포함된 분리스트 리턴 //! \param hours: 영상이 존재하는 분(0~59) 리스트 //void getMinute(QSet& minutes); //! \brief 파일 리스트 확인하여 시작분(초), 끝분(초) 영역 생성 void loadMinutes(QList>& files); //QDate mDate; ///!< 선택된 날짜 QList mDayList; ///!< 날짜에 포함된 아이템 리스트 RMVideoItem* findSelectedItem(); //! \brief 선택된 시간의 최초 아이템 리턴 //! \return RMVideoItem* findFirstSelectedHourItem(); //! \brief 시간선택 (영상이 존재하는 시간만 선택됨) //! \param tihourme: 선택할 시간 //! \param fromCalendar: 캘린더 UI 에서 선택됨 //! \param moveList: 리스트 업데이트 void selectHour(int hour, QDateTime* playTime, bool moveList); signals: //! \brief 시간선택시 리스트 이동 //! \param selected void listMove(RMVideoItem* selected); public slots: //! \brief 재생시작 완료까지 비활성화 void onEnable(); //! \brief 날짜 변경되어 시간/분 그래프 업데이트 필요 //! 리스트에서 파일 선택시에도 호출됨?? //! \param playTime: 다음파일, 리스트 등에서 재생되어 지정된 시간이 존재할 경우 //! \param bSelectFirst: 최초의 시간/분 강제 선택 (달력 컨트롤에서 요청) //! \param moveList: 리스트 이동 void onDateSelected(QList*,QDateTime* playTime, bool moveList); //! \brief 날짜 변경없이 다음파일, 리스트 등에서 재생되어 시간이 업데이트 된 경우 //! \param playTime: 재생된 파일의 시간 void onPlayTime(QDateTime* playTime, bool moveList); //! \brief 시간 선택됨-> 분(BAR) 업데이트 //! \param hour //! \param playTime: 다음파일, 리스트 등에서 재생되어 지정된 시간이 존재할 경우 //! \param moveList: 리스트 위치 이동 void onHourSelected(int hour,QDateTime* playTime,bool moveList); //! \brief 분 선택됨-> 분(BAR) 업데이트 //! \param minute //! \param playTime: 다음파일, 리스트 등에서 재생되어 지정된 시간이 존재할 경우 //! \param moveList: 리스트 위치 이동 void onMinuteSelected(int minute,QDateTime* playTime,bool moveList); void onBackupSelected(QList& lst); //! \brief 선택된 월에 영상이 존재하지 않아 초기화 void onClearDate(); void onPlayEvent(PLAY_EVENT event,RMVideoItem* item); }; #endif // #if (USE_DATE_TIME_LIST) #endif // FM_DAYTIME_H