| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 | 
							- #include "calendarex.h"
 
- #include <QEvent>
 
- #include <QScreen>
 
- #include <QKeyEvent>
 
- #include <QApplication>
 
- #include <QDesktopWidget>
 
- #include <QHBoxLayout>
 
- #include <QDebug>
 
- #include "scopeselectionmodel.h"
 
- #include "PaintHelper/painthelper.h"
 
- CalendarInterface::CalendarInterface(QWidget *parent)
 
-     : QWidget(parent)
 
-     , IDropShadowable(this)
 
-     , m_pLayout(new QHBoxLayout)
 
- {
 
-     setWindowFlag(Qt::Popup);
 
-     setWindowFlag(Qt::NoDropShadowWindowHint);
 
-     //设置无边框属性
 
-     setWindowFlag(Qt::FramelessWindowHint);
 
-     //设置背景透明属性
 
-     setAttribute(Qt::WA_TranslucentBackground, true);
 
-     //关闭对话框时,删除自身对象
 
-     setAttribute(Qt::WA_DeleteOnClose, true);
 
- }
 
- CalendarInterface::~CalendarInterface()
 
- {
 
-     //qDebug()<<"~ScopeCalendar";
 
- }
 
- /**
 
-  * @brief 这个只是坐标位移?
 
-  * @param q
 
-  */
 
- void CalendarInterface::positionCalendarPopup(QWidget *q)
 
- {
 
-     if (nullptr == m_pLayout) return;
 
-     QPoint pos = (q->layoutDirection() == Qt::RightToLeft) ? q->rect().bottomRight() : q->rect().bottomLeft();
 
-     QPoint pos2 = (q->layoutDirection() == Qt::RightToLeft) ? q->rect().topRight() : q->rect().topLeft();
 
-     pos = q->mapToGlobal(pos);
 
-     pos2 = q->mapToGlobal(pos2);
 
-     QSize size = QSize(CALENDAR_WIDTH * m_pLayout->count() + 2 * SHADOW_RADIUS, CALENDAR_HEIGHT + 2 * SHADOW_RADIUS);
 
-     //QRect screen = QApplication::desktop()->availableGeometry(pos);
 
-     QRect screen = QGuiApplication::screenAt(pos)->availableGeometry();
 
-     //handle popup falling "off screen"
 
-     if (q->layoutDirection() == Qt::RightToLeft) {
 
-         pos.setX(pos.x()-size.width());
 
-         pos2.setX(pos2.x()-size.width());
 
-         if (pos.x() < screen.left())
 
-             pos.setX(qMax(pos.x(), screen.left()));
 
-         else if (pos.x()+size.width() > screen.right())
 
-             pos.setX(qMax(pos.x()-size.width(), screen.right()-size.width()));
 
-     } else {
 
-         if (pos.x()+size.width() > screen.right())
 
-             pos.setX(screen.right()-size.width());
 
-         pos.setX(qMax(pos.x(), screen.left()));
 
-     }
 
-     if (pos.y() + size.height() > screen.bottom())
 
-         pos.setY(pos2.y() - size.height());
 
-     else if (pos.y() < screen.top())
 
-         pos.setY(screen.top());
 
-     if (pos.y() < screen.top())
 
-         pos.setY(screen.top());
 
-     if (pos.y()+size.height() > screen.bottom())
 
-         pos.setY(screen.bottom()-size.height());
 
-     pos.setX(pos.rx() - SHADOW_RADIUS);
 
-     pos.setY(pos.ry() - SHADOW_RADIUS + SPACING);
 
-     move(pos);
 
- }
 
- CalendarEx::CalendarEx(const QDate& defaultDate, QWidget* parent) :
 
-     CalendarInterface(parent),
 
-     m_pCalendar(nullptr)
 
- {
 
-     QHBoxLayout* pLay = new QHBoxLayout(this);
 
-     QWidget* pMain = new QWidget(this);
 
-     pMain->setLayout(m_pLayout);
 
-     pLay->addWidget(pMain);
 
-     pLay->setMargin(SHADOW_RADIUS);
 
-     m_pCalendar = new CalendarWidgetEx(this);
 
-     m_pCalendar->setStyleSheet("QCalendarView{background-color: transparent;}");
 
-     m_pLayout->addWidget(m_pCalendar);
 
-     connect(m_pCalendar, &CalendarWidgetEx::clicked, this, [this](const QDate& date){
 
-         emit sig_DateChanged(date);
 
-         close();
 
-     });
 
-     m_pLayout->setMargin(0);
 
-     pMain->resize(CALENDAR_WIDTH, CALENDAR_HEIGHT);
 
-     SetCalendarSync(defaultDate);
 
-     /* 设置大小,包含阴影的大小 */
 
-     resize(CALENDAR_WIDTH + 2 * SHADOW_RADIUS, CALENDAR_HEIGHT + 2 * SHADOW_RADIUS);
 
-     /* 设置阴影 */
 
-     SetDropShadow(BoxShadow{0, 0, SHADOW_RADIUS, 0, QColor(0, 0, 0, 60), QSize(0, 0), QImage()}, pMain->size());
 
- }
 
- void CalendarEx::SetCalendarSync(const QDate &defaultDate)
 
- {
 
-     if (nullptr == m_pCalendar || !defaultDate.isValid()) return;
 
-     m_pCalendar->setCurrentPage(defaultDate.year(), defaultDate.month());
 
-     m_pCalendar->setSelectedDate(defaultDate);
 
- }
 
- ScopedCalendar::ScopedCalendar(const QDate &from, const QDate &to, QWidget *parent) :
 
-     CalendarInterface(parent),
 
-     m_pCalendar_L(nullptr),
 
-     m_pCalendar_R(nullptr)
 
- {
 
-     QHBoxLayout* pLay = new QHBoxLayout(this);
 
-     QWidget* pMain = new QWidget(this);
 
-     pMain->setLayout(m_pLayout);
 
-     pLay->addWidget(pMain);
 
-     pLay->setMargin(SHADOW_RADIUS);
 
-     ScopeSelectionModel *pDateScopeModel = new ScopeSelectionModel();
 
-     if(from.isValid() && to.isValid())
 
-     {
 
-         pDateScopeModel->dtFirst = from;
 
-         pDateScopeModel->dtSecond = to;
 
-         pDateScopeModel->bLocked = true;
 
-     }
 
-     m_pCalendar_L = new CalendarWidgetEx(this);
 
-     m_pCalendar_L->setStyleSheet("QCalendarView{background-color: transparent;}");
 
-     m_pCalendar_L->SetSelectMode(CalendarWidgetEx::Scope, pDateScopeModel);
 
-     m_pCalendar_L->hideNavigatioinButton(false, false, true, true);
 
-     m_pLayout->addWidget(m_pCalendar_L);
 
-     m_pCalendar_R = new CalendarWidgetEx(this);
 
-     m_pCalendar_R->setStyleSheet("QCalendarView{background-color: transparent;}");
 
-     m_pCalendar_R->SetSelectMode(CalendarWidgetEx::Scope, pDateScopeModel);
 
-     m_pCalendar_R->hideNavigatioinButton(true, true, false, false);
 
-     m_pLayout->addWidget(m_pCalendar_R);
 
-     m_pLayout->setSpacing(0);
 
-     m_pLayout->setMargin(0);
 
-     pMain->resize(2 * CALENDAR_WIDTH, CALENDAR_HEIGHT);
 
-     SetCalendarSync(from);
 
-     connect(pDateScopeModel, &ScopeSelectionModel::sig_ScopeSelected, this, &ScopedCalendar::OnScopeSelected);
 
-     resize(2 * CALENDAR_WIDTH + 2 * SHADOW_RADIUS, CALENDAR_HEIGHT + 2 * SHADOW_RADIUS);
 
-     SetDropShadow(BoxShadow{0, 0, SHADOW_RADIUS, 0, QColor(0, 0, 0, 60), QSize(0, 0), QImage()}, pMain->size());
 
- }
 
- void ScopedCalendar::SetMinimumDate(const QDate &date)
 
- {
 
-     if (nullptr == m_pCalendar_L || nullptr == m_pCalendar_R) return;
 
-     m_pCalendar_L->setMinimumDate(date);
 
-     m_pCalendar_R->setMinimumDate(date);
 
- }
 
- void ScopedCalendar::SetMaximumDate(const QDate &date)
 
- {
 
-     if (nullptr == m_pCalendar_L || nullptr == m_pCalendar_R) return;
 
-     m_pCalendar_L->setMaximumDate(date);
 
-     m_pCalendar_R->setMaximumDate(date);
 
- }
 
- void ScopedCalendar::OnScopeSelected(const QDate &from, const QDate &to)
 
- {
 
-     emit sig_ScopeSelected(from, to);
 
-     close();
 
- }
 
- void ScopedCalendar::SetCalendarSync(const QDate &defaultDate)
 
- {
 
-     if (nullptr == m_pCalendar_L || nullptr == m_pCalendar_R || !defaultDate.isValid()) return;
 
-     m_pCalendar_L->setCurrentPage(defaultDate.year(), defaultDate.month());
 
-     connect(m_pCalendar_L, &QCalendarWidget::currentPageChanged, this, [&](int year, int month) {
 
-         QDate nextMonth = QDate(year, month, 1).addMonths(1);
 
-         m_pCalendar_R->setCurrentPage(nextMonth.year(), nextMonth.month());
 
-     });
 
-     m_pCalendar_R->setCurrentPage(defaultDate.addMonths(1).year(), defaultDate.addMonths(1).month());
 
-     connect(m_pCalendar_R, &QCalendarWidget::currentPageChanged, this, [&](int year, int month) {
 
-         QDate prevMonth = QDate(year, month, 1).addMonths(-1);
 
-         m_pCalendar_L->setCurrentPage(prevMonth.year(), prevMonth.month());
 
-     });
 
- }
 
 
  |