From: Dmintriy L. Kruglikov Date: Mon, 23 Jun 2008 15:30:25 +0000 (+0300) Subject: Calendar and Calcilator muved into src/lib. X-Git-Url: https://gitweb.ananas.su/?a=commitdiff_plain;h=94275ffbf807d84bcc9bb57ebd22f589c3ca5f42;p=projects%2Fananas-labs.git Calendar and Calcilator muved into src/lib. Patched bugs in Calendar. Added Menu->Tools-> Calendar and Calculator --- diff --git a/src/ananas/ananas.pro b/src/ananas/ananas.pro index e9a7575..9888838 100644 --- a/src/ananas/ananas.pro +++ b/src/ananas/ananas.pro @@ -3,10 +3,8 @@ TARGET = ananas include ( ../ananas.pri ) SOURCES += main.cpp \ - ananasmainform.cpp \ - aminicalc.cpp -HEADERS += ananasmainform.h \ - aminicalc.h + ananasmainform.cpp +HEADERS += ananasmainform.h #load(qsa) @@ -29,7 +27,8 @@ INSTALLS += ananas #FORMS = qadocjournal.ui IMAGES = images/a-system.png \ - images/calc.png \ + images/calc.png \ + images/calendar.png \ images/msg_info.png \ images/msg_warning.png \ images/msg_error.png \ diff --git a/src/ananas/ananasmainform.cpp b/src/ananas/ananasmainform.cpp index 1fec864..6a72de1 100644 --- a/src/ananas/ananasmainform.cpp +++ b/src/ananas/ananasmainform.cpp @@ -41,6 +41,7 @@ #include "ananas.h" #include "aminicalc.h" +#include "ananas.h" MainForm *mainform=NULL; QWorkspace *mainformws=NULL; @@ -132,6 +133,7 @@ MainForm::initMenuBar() this, SLOT( windowsMenuAboutToShow() ) ); m->insertItem(rcIcon("ananas-32x32.png"), tr( "About" ), this, SLOT( helpAbout() ), Key_F11); s->insertItem(rcIcon("calc.png"), tr( "Calculator" ), this, SLOT( miniCalc() ), Key_F10); + s->insertItem(rcIcon("calendar.png"), tr( "Calendar" ), this, SLOT( ShowCalendar() ), Key_F12); //windowsMenu->insertItem(rcIcon("ananas-32x32.png"), tr( "Windows" ), this, SLOT( windowsMenuAboutToShow() )); menubar = new AMenuBar( md, this, "menubar"); InsertMainMenu( tr("&Tools"), s ); @@ -322,3 +324,14 @@ MainForm::miniCalc() MiniCalc *calc = new MiniCalc(ws, "MiniCalc", false, 0); calc->show(); } + +/* + * Open a Calendar + */ +void +MainForm::ShowCalendar() +{ + PopupCalendar *calendar = new PopupCalendar(QDate::currentDate(), + QPoint(ws->width() / 2, ws->height() / 2 ), ws, ""); + calendar->show(); +} diff --git a/src/ananas/ananasmainform.h b/src/ananas/ananasmainform.h index 189f614..f4af300 100644 --- a/src/ananas/ananasmainform.h +++ b/src/ananas/ananasmainform.h @@ -46,7 +46,8 @@ #include "atoolbar.h" #include "awindowslist.h" #include "engine.h" - +#include "aminicalc.h" +#include "acalendar.h" class QVBoxLayout; class QHBoxLayout; @@ -76,6 +77,8 @@ public: QPopupMenu *windowsMenu; QWorkspace* ws; aWindowsList* wl; + MiniCalc* calc; + PopupCalendar* calendar; QString rcfile; public slots: @@ -88,6 +91,8 @@ public slots: void Exit(int code); void close(); void helpAbout(); + void miniCalc(); + void ShowCalendar(); void statusMessage( const QString &msg ); void windowsMenuAboutToShow(); void windowsMenuActivated( int id ); diff --git a/src/ananas/images/calendar.png b/src/ananas/images/calendar.png new file mode 100644 index 0000000..cb1f845 Binary files /dev/null and b/src/ananas/images/calendar.png differ diff --git a/src/lib/acalendar.cpp b/src/lib/acalendar.cpp new file mode 100644 index 0000000..240e571 --- /dev/null +++ b/src/lib/acalendar.cpp @@ -0,0 +1,246 @@ +/**************************************************************************** +** $Id: acalendar.dkr,v 1.73 2008/06/09 11:45:27 app Exp $ +** +**********************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ananas.h" +#include "alog.h" +#include "acalendar.h" + + +/** + * \ru + * \brief Запрашивает дату у пользователя, показав ему календарик. + * \return дату, указанную пользователем. + * \_ru + */ +QDate +PopupCalendar::getDate(QWidget *parent, const QDate &day, QPoint pos) +{ + PopupCalendar *calendar = new PopupCalendar(day, pos, parent); + calendar->exec(); + QDate date = calendar->day(); + delete calendar; + return date; +} + + +/** + * \ru + * \brief Осуществляет отрисовку календарика, обрабатывая событие PaintEvent виджета PopupCalendar. + * \_ru + */ +void +PopupCalendar::paintEvent(QPaintEvent *event) +{ + QPainter painter(this); + painter.setClipRegion(event->region()); + painter.setFont(smallFont); + int w = width();// Ширина окна + int h = height(); // Высота окна + int dayw = w / COLS; // Ширина ячейки + int dayh = h / (ROWS + 2); // Высота ячейки + + QRect rect; + QColor color = colorGroup().light(); + QColor f_color = "red"; + QColor g_color = "green"; + QColor b_color = "blue"; + // Формируем строку с годом и месяцем + painter.fillRect(1, 1, dayw - 2, dayh - 1, color); + painter.drawText(1, 1, dayw - 1, dayh - 1, AlignHCenter, today.toString("<< "), -1, &rect); + painter.fillRect(dayw, 1, dayw - 2, dayh - 1, color); + painter.drawText(dayw, 1, dayw - 1, dayh - 1, AlignHCenter, today.toString(" < "), -1, &rect); + painter.drawText(dayw*2+1, 1, dayw*3- 1, dayh - 1, AlignHCenter, today.toString("MMM, yyyy"), -1, &rect); + painter.fillRect(w-(dayw*2), 1, dayw - 2, dayh - 1, color); + painter.drawText(w-(dayw*2), 1, dayw - 1, dayh - 1, AlignHCenter, today.toString(" > "), -1, &rect); + painter.fillRect(w-dayw, 1, dayw - 2, dayh - 1, color); + painter.drawText(w-dayw, 1, dayw - 1, dayh - 1, AlignHCenter, today.toString(" >>"), -1, &rect); + +// Формируем строку с днями недели + int i; + int y = dayh; + for (i = 0; i < 7; i++) { + + painter.drawText(dayw * i + 1, y, dayw, dayh - 1, + AlignHCenter, QDate::shortDayName(i+1), -1, &rect); + } + + // Заплняем таблицу календаря + QDate day(today.year(), today.month(), 1); + int day_pos = day.dayOfWeek()-1; + day = day.addDays(-day_pos); + y += dayh; + for (int j = 0; j < ROWS-1; ++j) + for (i = 0; i < COLS; ++i) { + color = (day == today) ? colorGroup().light() : ( ( i < 5 ) ? colorGroup().light() : colorGroup().midlight()); + if (day == today){ + painter.fillRect(dayw * i + 1, dayh * j + y + 1, dayw - 1, dayh - 1, b_color); + painter.fillRect(dayw * i + 3, dayh * j + y + 3, dayw - 5, dayh - 5, color); + }else{ + painter.fillRect(dayw * i + 1, dayh * j + y + 1, dayw - 1, dayh - 1, color); + } + (today.month() != day.month() )? painter.setPen(colorGroup().mid()): ( ( i < 5 ) ? painter.setPen(colorGroup().foreground()):painter.setPen(f_color)); + painter.drawText(dayw * i + 2, dayh * j + y + 2, dayw, dayh, AlignTop|AlignHCenter, day.toString("d")); + day = day.addDays(1); + } + // Формируем последнюю строку + painter.fillRect(1, h - dayh - 1, dayw*2, dayh - 1, b_color); + painter.fillRect(3, h - dayh + 1, dayw*2-4, dayh - 5, color); + painter.setPen(colorGroup().foreground()); + painter.drawText(2, h - dayh, dayw*2-2, dayh - 3, AlignTop|AlignHCenter, "Now"); + painter.drawText(w - dayw*3, h - dayh, dayw*3-2, dayh - 1, AlignTop|AlignHCenter, QString(tr("Week: %1").arg(today.weekNumber()))); +} + +/** + * \ru + * \brief Обрабатывает пользовательские действия по выбору даты в календарике. + * + * Записывает значение выбранной пользователем даты в свойство виджета. + * + * \_ru + */ +void +PopupCalendar::keyPressEvent(QKeyEvent *event) +{ + int days = 0; + switch (event->key()) { + case Key_Left: days = -1; break; + case Key_Right: days = 1; break; + case Key_Up: days = -COLS; break; + case Key_Down: days = COLS; break; + case Key_PageUp: days = today.daysTo(today.addMonths(-1)); break; + case Key_PageDown: days = today.daysTo(today.addMonths(1)); break; + case Key_Home: days = today.daysTo(today.addYears(-1)); break; + case Key_End: days = today.daysTo(today.addYears(1)); break; + case Key_Escape: today = original; accept(); break; + case Key_Space: // fallthrough + case Key_Enter: // fallthrough + case Key_Return: accept(); return; + default: QDialog::keyPressEvent(event); return; + } + + QDate day = today.addDays(days); + if (day != today) + setDay(day); +} + +/** + * \ru + * \brief Обрабатывает пользовательские действия мышкой по выбору даты в календарике. + * Записывает значение выбранной пользователем даты в свойство виджета. + * + * \_ru + */ +void +PopupCalendar::mousePressEvent(QMouseEvent *event) +{ + QDate day = today; + int w = width(); + int h = height(); + int dayh2 = (h / (ROWS + 2)) * 2; + int dayh = h / (ROWS + 2); // Высота строки + int dayw = w / COLS; // Ширина колонки + if (event->y() < dayh) { + if (event->x() > 1 && event->x() < dayw) day = day.addYears(-1); + if (event->x() > dayw && event->x() < dayw*2 ) day = day.addMonths(-1); + if (event->x() > (w - dayw*2) && event->x() < (w - dayw) ) day = day.addMonths(1); + if (event->x() > (w - dayw) ) day = day.addYears(1); + } else { + if (event->y() > dayh2 && event->y() < h - dayh) { + int xday = event->x() / (width() / (COLS) ); + int yday = (event->y() - dayh2) / ((h - dayh2) / ROWS); + day = QDate(today.year(), today.month(), 1); + int day_pos = day.dayOfWeek()-1; + day = day.addDays(xday + (COLS * yday) - (day_pos)); + }else{ + if (event->x() > 1 && event->x() < dayw*2) { + day = today.currentDate(); + } + } + } + if (day != today) setDay(day); +} + +/** + * \ru + * \brief Обрабатывает двойной клик мышкой в календарике. + * + * Записывает значение выбранной пользователем даты в свойство виджета. + * + * \_ru + */ +void +PopupCalendar::mouseDoubleClickEvent(QMouseEvent *event) +{ + QDate day = today; + int w = width(); + int h = height(); + int dayh2 = (h / (ROWS + 2)) * 2; + int dayh = h / (ROWS + 2); // Высота строки + int dayw = w / COLS; // Ширина колонки + + if (event->y() > dayh2 && event->y() < h - dayh) { + int xday = event->x() / (width() / (COLS) ); + int yday = (event->y() - dayh2) / ((h - dayh2) / ROWS); + day = QDate(today.year(), today.month(), 1); + int day_pos = day.dayOfWeek()-1; + day = day.addDays(xday + (COLS * yday) - (day_pos)); + if (day != today) setDay(day); + accept(); + } +} + +QSize +PopupCalendar::sizeHint() const +{ + QFontMetrics fm(smallFont); + return QSize(COLS * (fm.width(tr("Wed"))+2), (ROWS + 2) * fm.height() * 1.2); +} + +/** + * \ru + * \brief Сеттер задающий дату виджету. + * + * Вызывает перерисовку виджета. + * + * \_ru + */ +void +PopupCalendar::setDay(const QDate &day) +{ + today = day; + update(); +} + + +/** + * \ru + * \brief Конструктор. Инициализирует свойства виджета, задает надпись в шапке виджета. + * + * \_ru + */ +PopupCalendar::PopupCalendar(const QDate &day, QPoint pos, + QWidget *parent, const char *name) + : QDialog(parent, name), today(day), original(day) +{ + setCaption(tr("A-Calendar")); + if (!pos.isNull()) move(pos); + smallFont = font(); + if (smallFont.pointSize() >= 10) { + smallFont.setPointSize(smallFont.pointSize() - 2); + smallFont.setBold(true); + } + + setFixedSize(sizeHint()); + setFocusPolicy(StrongFocus); +} diff --git a/src/lib/acalendar.h b/src/lib/acalendar.h new file mode 100644 index 0000000..fcf98e0 --- /dev/null +++ b/src/lib/acalendar.h @@ -0,0 +1,53 @@ +/**************************************************************************** +** $Id: acalendar.h,v 1.37 2008/06/09 11:44:27 dkr Exp $ +** +** +**********************************************************************/ + +#ifndef CALENDAR_H +#define CALENDAR_H + +#include +#include +#include +#include +#include "ananas.h" + +/*! + * \en PopupCalendar for DateEdit field editor. \_en + * \ru + * \brief Всплывающий календарь для выбора даты. + * + * Используется как дополнение к виджету поля ввода/редактирования + * атрибута типа Дата бизнес объекта Ананаса. + * + * \_ru + */ +class PopupCalendar : public QDialog +{ +Q_OBJECT +public: + PopupCalendar(const QDate &day = QDate::currentDate(), + QPoint pos = QPoint(), QWidget *parent = 0, const char *name = 0); + + static QDate getDate(QWidget *parent = 0, const QDate &day = QDate::currentDate(), + QPoint pos = QPoint()); + + const QDate& day() const { return today; } + void setDay(const QDate &day); + QSize sizeHint() const; + +protected: + void mousePressEvent(QMouseEvent *event); + void mouseDoubleClickEvent(QMouseEvent *event); + void keyPressEvent(QKeyEvent *event); + void paintEvent(QPaintEvent *event); + +private: + enum { ROWS = 7, COLS = 7 }; + QFont smallFont; + QDate today; + const QDate original; +}; + +#endif diff --git a/src/ananas/aminicalc.cpp b/src/lib/aminicalc.cpp similarity index 100% rename from src/ananas/aminicalc.cpp rename to src/lib/aminicalc.cpp diff --git a/src/ananas/aminicalc.h b/src/lib/aminicalc.h similarity index 100% rename from src/ananas/aminicalc.h rename to src/lib/aminicalc.h diff --git a/src/plugins/wfield.cpp b/src/plugins/wfield.cpp index 628a93d..bb63c9a 100644 --- a/src/plugins/wfield.cpp +++ b/src/plugins/wfield.cpp @@ -146,13 +146,13 @@ wField::widgetInit() checkBox->hide(); disconnect( checkBox, SIGNAL( valueChanged ( const QString & ) ), this, SLOT( setValue( const QString & ) ) ); - + disconnect( checkBox, SIGNAL( toggled (bool) ), checkBox, SLOT( on_toggled() ) ); // checkBox->disconnect(); layout()->remove(checkBox); //TODO: need rewrite if (!vFieldType.isEmpty()) sscanf((const char *)vFieldType,"%s %i %i", s1, &n1, &n2); - + switch (vEditorType) { case Numberic: @@ -184,12 +184,12 @@ wField::widgetInit() connect( lineEdit, SIGNAL( textChanged( const QString & ) ), this, SLOT( setValue( const QString & ) ) ); connect( lineEdit, SIGNAL( lostFocus() ), this, SLOT( focusOutEvent()) ); - + setFocusProxy(lineEdit); layout()->add( lineEdit ); lineEdit->show(); break; - + case String: if(vFieldType.isEmpty()) { @@ -204,12 +204,12 @@ wField::widgetInit() connect( lineEdit, SIGNAL( textChanged( const QString & ) ), this, SLOT( setValue( const QString & ) ) ); connect( lineEdit, SIGNAL( lostFocus() ), this, SLOT( focusOutEvent()) ); - + setFocusProxy(lineEdit); layout()->add( lineEdit ); lineEdit->show(); break; - + case Date: case DateTime: // used object wDateTime, inherits QDateTime @@ -231,7 +231,7 @@ wField::widgetInit() objButton->show(); dateEdit->show(); break; - + case Catalogue: md_oid = n1; objLabel->setFrameShape( QFrame::Box ); @@ -242,7 +242,7 @@ wField::widgetInit() objButton->setPixmap( QPixmap::fromMimeSource( "wcatalogue.png" ) ); connect( objButton, SIGNAL( clicked() ), this, SLOT( fieldSelect() ) ); - + setFocusProxy(objButton); layout()->add( objLabel ); layout()->add( objButton ); @@ -268,18 +268,18 @@ wField::widgetInit() objLabel->show(); objButton->show(); break; - + case Boolean: // connect( checkBox, SIGNAL( lostFocus() ), this, SLOT( focusOutEvent()) ); connect( checkBox, SIGNAL( valueChanged ( const QString & ) ), this, SLOT( setValue( const QString & ) ) ); - + connect( checkBox, SIGNAL( toggled (bool) ), checkBox, SLOT( on_toggled() ) ); setFocusProxy(checkBox); layout()->add(checkBox); checkBox->show(); break; - + default: objLabel->setText("UnknownField"); objLabel->setFrameShape(QFrame::Box); @@ -389,7 +389,7 @@ wField::setValue(const QString &newvalue) // conventering date-time to date, and if new value is NULL set up current locale date. // date must be stored in server in format ISO str = newvalue; - if(newvalue.isEmpty()) + if(newvalue.isEmpty()) { str= QDateTime::currentDateTime(Qt::LocalTime).toString(Qt::ISODate); } @@ -404,11 +404,11 @@ wField::setValue(const QString &newvalue) break; case Boolean: vValue = newvalue; - if(newvalue == "1") + if(newvalue == "1") { checkBox->setChecked(true); } - else + else { checkBox->setChecked(false); } @@ -481,7 +481,7 @@ wField::fieldSelect() switch (vEditorType) { case Catalogue: - if ( engine ) + if ( engine ) { int fid = md->getDefaultFormId( md->find( md_oid ), md_action_view); if ( !fid ) @@ -490,13 +490,13 @@ wField::fieldSelect() return; } f = engine->openForm( md_oid, 0, md_action_view, 0, false ); - if ( f ) + if ( f ) { connect(f, SIGNAL(selected( Q_ULLONG )), this, SLOT(on_selected( Q_ULLONG ))); f->closeAfterSelect = true; } } - else + else { aLog::print(aLog::MT_ERROR, tr("wField::fieldSelect no engine")); } @@ -520,7 +520,7 @@ wField::fieldSelect() connect(f, SIGNAL(selected( Q_ULLONG )), this, SLOT(on_selected( Q_ULLONG ))); f->closeAfterSelect = true; } - + } else { @@ -601,12 +601,16 @@ wField::SetReadOnly(bool fl) { switch (vEditorType) { case Numberic: + lineEdit->setReadOnly(fl); + objButton->setDisabled( fl ); + break; case String: lineEdit->setReadOnly(fl); break; case Date: case DateTime: dateEdit->setDisabled(fl); + objButton->setDisabled( fl ); break; case Catalogue: objButton->setDisabled( fl ); @@ -614,7 +618,7 @@ wField::SetReadOnly(bool fl) case Document: objButton->setDisabled( fl ); break; - case Boolean: + case Boolean: checkBox->setDisabled( fl ); break; default: @@ -690,7 +694,7 @@ wCheckBox::on_toggled() /** - * \ru + * \ru * \brief Задает значение полю dateEdit запросив его у пользователя. * \_ru */ @@ -703,203 +707,3 @@ wField::popupCalendar() dateEdit->setDate(date); dateEdit->setFocus(); } - -/** - * \ru - * \brief Запрашивает дату у пользователя, показав ему календарик. - * \return дату, указанную пользователем. - * \_ru - */ -QDate -PopupCalendar::getDate(QWidget *parent, const QDate &day, QPoint pos) -{ - PopupCalendar *calendar = new PopupCalendar(day, pos, parent); - calendar->exec(); - QDate date = calendar->day(); - delete calendar; - return date; -} - - -/** - * \ru - * \brief Осуществляет отрисовку календарика, обрабатывая событие PaintEvent виджета PopupCalendar. - * \_ru - */ -void -PopupCalendar::paintEvent(QPaintEvent *event) -{ - QPainter painter(this); - painter.setClipRegion(event->region()); - painter.setFont(smallFont); - int w = width();// Ширина окна - int h = height(); // Высота окна - int dayw = w / COLS; // Ширина ячейки - int dayh = h / (ROWS + 2); // Высота ячейки - - QRect rect; - QColor color = colorGroup().light(); - QColor f_color = "red"; - QColor g_color = "green"; - QColor b_color = "blue"; - // Формируем строку с годом и месяцем - painter.fillRect(1, 1, dayw - 2, dayh - 1, color); - painter.drawText(1, 1, dayw - 1, dayh - 1, AlignHCenter, today.toString("<< "), -1, &rect); - painter.fillRect(dayw, 1, dayw - 2, dayh - 1, color); - painter.drawText(dayw, 1, dayw - 1, dayh - 1, AlignHCenter, today.toString(" < "), -1, &rect); - painter.drawText(dayw*2+1, 1, dayw*3- 1, dayh - 1, AlignHCenter, today.toString("MMM, yyyy"), -1, &rect); - painter.fillRect(w-(dayw*2), 1, dayw - 2, dayh - 1, color); - painter.drawText(w-(dayw*2), 1, dayw - 1, dayh - 1, AlignHCenter, today.toString(" > "), -1, &rect); - painter.fillRect(w-dayw, 1, dayw - 2, dayh - 1, color); - painter.drawText(w-dayw, 1, dayw - 1, dayh - 1, AlignHCenter, today.toString(" >>"), -1, &rect); - -// Формируем строку с днями недели - int i; - int y = dayh; - for (i = 0; i < 7; i++) { - - painter.drawText(dayw * i + 1, y, dayw, dayh - 1, - AlignHCenter, QDate::shortDayName(i+1), -1, &rect); - } - - // Заплняем таблицу календаря - QDate day(today.year(), today.month(), 1); - int day_pos = day.dayOfWeek()-1; - day = day.addDays(-day_pos); - y += dayh; - for (int j = 0; j < ROWS-1; ++j) - for (i = 0; i < COLS; ++i) { - color = (day == today) ? colorGroup().light() : ( ( i < 5 ) ? colorGroup().light() : colorGroup().midlight()); - if (day == today){ - painter.fillRect(dayw * i + 1, dayh * j + y + 1, dayw - 1, dayh - 1, b_color); - painter.fillRect(dayw * i + 3, dayh * j + y + 3, dayw - 5, dayh - 5, color); - }else{ - painter.fillRect(dayw * i + 1, dayh * j + y + 1, dayw - 1, dayh - 1, color); - } - (today.month() != day.month() )? painter.setPen(colorGroup().mid()): ( ( i < 5 ) ? painter.setPen(colorGroup().foreground()):painter.setPen(f_color)); - painter.drawText(dayw * i + 2, dayh * j + y + 2, dayw, dayh, AlignTop|AlignHCenter, day.toString("d")); - day = day.addDays(1); - } - // Формируем последнюю строку - painter.fillRect(1, h - dayh - 1, dayw*2, dayh - 1, b_color); - painter.fillRect(3, h - dayh + 1, dayw*2-4, dayh - 5, color); - painter.setPen(colorGroup().foreground()); - painter.drawText(2, h - dayh, dayw*2-2, dayh - 3, AlignTop|AlignHCenter, "Now"); - painter.drawText(w - dayw*3, h - dayh, dayw*3-2, dayh - 1, AlignTop|AlignHCenter, QString(tr("Week: %1").arg(today.weekNumber()))); -} - -/** - * \ru - * \brief Обрабатывает пользовательские действия по выбору даты в календарике. - * - * Записывает значение выбранной пользователем даты в свойство виджета. - * - * \_ru - */ -void -PopupCalendar::keyPressEvent(QKeyEvent *event) -{ - int days = 0; - switch (event->key()) { - case Key_Left: days = -1; break; - case Key_Right: days = 1; break; - case Key_Up: days = -COLS; break; - case Key_Down: days = COLS; break; - case Key_PageUp: days = today.daysTo(today.addMonths(-1)); break; - case Key_PageDown: days = today.daysTo(today.addMonths(1)); break; - case Key_Home: days = today.daysTo(today.addYears(-1)); break; - case Key_End: days = today.daysTo(today.addYears(1)); break; - case Key_Escape: today = original; accept(); break; - case Key_Space: // fallthrough - case Key_Enter: // fallthrough - case Key_Return: accept(); return; - default: QDialog::keyPressEvent(event); return; - } - - QDate day = today.addDays(days); - if (day != today) - setDay(day); -} - -/** - * \ru - * \brief Обрабатывает пользовательские действия мышкой по выбору даты в календарике. - * - * Записывает значение выбранной пользователем даты в свойство виджета. - * - * \_ru - */ -void -PopupCalendar::mousePressEvent(QMouseEvent *event) -{ - QDate day = today; - int w = width(); - int h = height(); - int dayh2 = (h / (ROWS + 2)) * 2; - int dayh = h / (ROWS + 2); // Высота строки - int dayw = w / COLS; // Ширина колонки - if (event->y() < dayh) { - if (event->x() > 1 && event->x() < dayw) day = day.addYears(-1); - if (event->x() > dayw && event->x() < dayw*2 ) day = day.addMonths(-1); - if (event->x() > (w - dayw*2) && event->x() < (w - dayw) ) day = day.addMonths(1); - if (event->x() > (w - dayw) ) day = day.addYears(1); - } else { - if (event->y() > dayh2 && event->y() < h - dayh) { - int xday = event->x() / (width() / (COLS) ); - int yday = (event->y() - dayh2) / ((h - dayh2) / ROWS); - day = QDate(today.year(), today.month(), 1); - int day_pos = day.dayOfWeek()-1; - day = day.addDays(xday + (COLS * yday) - (day_pos)); - }else{ - if (event->x() > 1 && event->x() < dayw*2) { - day = today.currentDate(); - } - } - } - if (day != today) setDay(day); -} - -QSize -PopupCalendar::sizeHint() const -{ - QFontMetrics fm(smallFont); - return QSize(COLS * (fm.width(tr("Wed"))+2), (ROWS + 2) * fm.height() * 1.2); -} - -/** - * \ru - * \brief Сеттер задающий дату виджету. - * - * Вызывает перерисовку виджета. - * - * \_ru - */ -void -PopupCalendar::setDay(const QDate &day) -{ - today = day; - update(); -} - - -/** - * \ru - * \brief Конструктор. Инициализирует свойства виджета, задает надпись в шапке виджета. - * - * \_ru - */ -PopupCalendar::PopupCalendar(const QDate &day, QPoint pos, - QWidget *parent, const char *name) - : QDialog(parent, name), today(day), original(day) -{ - setCaption(tr("A-Calendar")); - if (!pos.isNull()) move(pos); - smallFont = font(); - if (smallFont.pointSize() >= 10) { - smallFont.setPointSize(smallFont.pointSize() - 2); - smallFont.setBold(true); - } - - setFixedSize(sizeHint()); - setFocusPolicy(StrongFocus); -}