⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kdatetbl.cpp

📁 PIXIL is a small footprint operating environment, complete with PDA PIM applications, a browser and
💻 CPP
字号:
/* This file is part of the KDE libraries    Copyright (C) 1997 Tim D. Gilman (tdgilman@best.org)              (C) 1998, 1999 Mirko Sucker (mirko@kde.org)    This library is free software; you can redistribute it and/or    modify it under the terms of the GNU Library General Public    License as published by the Free Software Foundation; either    version 2 of the License, or (at your option) any later version.    This library 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    Library General Public License for more details.    You should have received a copy of the GNU Library General Public License    along with this library; see the file COPYING.LIB.  If not, write to    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,    Boston, MA 02111-1307, USA.*//////////////////// KDateTable widget class ////////////////////////// Copyright (C) 1997 Tim D. Gilman//           (C) 1998, 1999 Mirko Sucker// Original header from Tim:// Written using Qt (http://www.troll.no) for the// KDE project (http://www.kde.org)//// This is a support class for the KDatePicker class.  It just// draws the calender table without titles, but could theoretically// be used as a standalone.//// When a date is selected by the user, it emits a signal: //      dateSelected(QDate)#include <qpainter.h>#include <qstring.h>#include <kapp.h>#include "kdatetbl.h"#include "kdatetbl.h"KDateTable::KDateTable(QWidget *parent, QDate date, 		       const char *name, WFlags f)   : QTableView(parent, name, f),    fontsize(10){  initMetaObject();  // Mirko, March 17 1998: translate day names  Days[0]=i18n("Sun"); Days[1]=i18n("Mon"); Days[2]=i18n("Tue");   Days[3]=i18n("Wed"); Days[4]=i18n("Thu"); Days[5]=i18n("Fri");   Days[6]=i18n("Sat");  // ^^^^^^^^^^^^^^^^^^^^^^^^^  setBackgroundColor(white);  setNumRows(7);  setNumCols(7);  setTableFlags(Tbl_clipCellPainting);  QRect rec = contentsRect();  setCellWidth(rec.width()/7);  setCellHeight(rec.height()/7);     m_oldRow = m_oldCol = 0;  m_selRow = m_selCol = 0;  m_bSelection = FALSE;  setFocusPolicy(StrongFocus);  // initialize date  m_date = date;  // get the day of the week on the first day  QDate dayone(m_date.year(), m_date.month(), 1);  m_firstDayOfWeek = dayone.dayOfWeek();  // determine number of days in previous month  QDate prvmonth;  getPrevMonth(m_date, prvmonth);     m_daysInPrevMonth = prvmonth.daysInMonth();}KDateTable::~KDateTable(){}void KDateTable::paintCell( QPainter *p, int row, int col ){  const int w = cellWidth();  const int h = cellHeight();  bool bSelected = FALSE;  if (row==0)     { // paint headline      p->setPen(darkBlue);      p->setFont(QFont("Arial", fontsize, QFont::Bold, false));      p->drawText(0, 0, w, h, AlignCenter, Days[col]);      p->setPen(black);      p->moveTo(0, h-1);      p->lineTo(w-1, h-1);    } else { // paint day cell      int nDay = dayNum(row, col);      p->setFont(QFont("Arial", fontsize));      /* Will be implemented the next time: the preset date       * will be drawn with a gray background to give feedback        * to the user. --Mirko       {       int x, y;        // calculate row & column of current date:       // this is missing       // test if we are displaying the right year and month:       // this is missing       // draw the current date with a gray background:       if(row==y && col==x)       {       p->setPen(lightGray);       p->setBrush(lightGray);       p->drawRect(0, 0, w, h);       }       }      */      if (m_bSelection && row==m_selRow && col==m_selCol) 	{  // item is selected	  bSelected = TRUE;	  p->setBrush(darkBlue);	  p->setPen(red);	  p->drawEllipse(4,h/2-(w-8)/3,w-8,2*(w-8)/3); // think of better way	}      QString day;      day.sprintf("%i", nDay);      p->setPen(bSelected? white : black);      if (nDay > 0 && nDay <= m_date.daysInMonth()) 	{	  p->drawText(0, 0, w, h, AlignCenter, day);	} else if (nDay <= 0) 	  {	    int nDayPrv = m_daysInPrevMonth + nDay;	    day.sprintf("%i", nDayPrv);	    p->setPen(bSelected? white : gray);	    p->drawText(0, 0, w, h, AlignCenter, day);	  } else {	    int nDayNext = nDay - m_date.daysInMonth();	    day.sprintf("%i", nDayNext);	    p->setPen(bSelected? white : gray);	    p->drawText(0, 0, w, h, AlignCenter, day);	  }      if (bSelected && hasFocus()) 	{	  if ( style() == WindowsStyle)	    {	      p->drawWinFocusRect(1, 1, w-2, h-2);	    } else {	      QColorGroup g = colorGroup();	      p->setPen( black );	      p->setBrush( NoBrush );	      p->drawRect(0, 0, w, h			  /*1, 1, w-2, h-2 */);	    }	}      //      m_bSelected = FALSE;    }}void KDateTable::mousePressEvent(QMouseEvent *e){  if (e->type() != Event_MouseButtonPress)    return;     int row, col;     QPoint mouseCoord = e->pos();  row = findRow(mouseCoord.y());  col = findCol(mouseCoord.x());  if (row > 0)    setSelection(row, col);   }void KDateTable::setSelection(int row, int col){  int nDay = dayNum(row, col);  bool bDayInMonth =      (row > 0 && nDay > 0 && nDay <= m_date.daysInMonth())     ? TRUE : FALSE;  // -----  if(bDayInMonth)    {      m_selRow = row;      m_selCol = col;      // if we clicked on a valid day for the current       // month and there is something already      // selected, then update it      if (m_bSelection) 	{ // if something already selected	  updateCell(m_oldRow, m_oldCol);	}      // update new selection      m_bSelection = TRUE;  // validating selection      m_date.setYMD(m_date.year(),m_date.month(),nDay);      updateCell(row, col);      emit dateSelected(m_date);      // remember last selected location      m_oldRow = row;      m_oldCol = col;     } // else .. do nothing}void KDateTable::resizeEvent( QResizeEvent *){  QRect rec = contentsRect();  setCellWidth(rec.width()/7);  setCellHeight(rec.height()/7);}void KDateTable::goForward(){  // remember old number of days in month  m_daysInPrevMonth = m_date.daysInMonth();      // get next month and set new date and first day of the week  QDate dtnext;  getNextMonth(m_date, dtnext);  m_date = dtnext;  m_firstDayOfWeek = m_date.dayOfWeek();     m_bSelection = FALSE;     emit monthChanged(m_date);  update();}void KDateTable::goBackward(){  // get previous month and set new date and first day of the week  QDate dtprev;  getPrevMonth(m_date, dtprev);  m_date = dtprev;  m_firstDayOfWeek = m_date.dayOfWeek();     // now get the month previous to that and find out number of days  getPrevMonth(m_date, dtprev);  m_daysInPrevMonth = dtprev.daysInMonth();     m_bSelection = FALSE;     emit monthChanged(m_date);  update();}// gets a date on the first day of the previous monthvoid KDateTable::getPrevMonth(QDate dtnow, QDate &dtprv){  int month = dtnow.month() > 1 ? dtnow.month()-1 : 12;  int year = dtnow.month() > 1 ? dtnow.year() : dtnow.year()-1;  dtprv = QDate(year, month, 1);}// gets a date on the first day of the next monthvoid KDateTable::getNextMonth(QDate dtnow, QDate &dtnxt){  int month = dtnow.month() < 12 ? dtnow.month()+1 : 1;  int year = dtnow.month() < 12 ? dtnow.year() : dtnow.year()+1;  dtnxt = QDate(year, month, 1);}int KDateTable::dayNum(int row, int col){  return 7*row - 7 + 1 + col - m_firstDayOfWeek;}/* Mirko: Implementation of sizeHint and setDate methods. * March 17 1998 */QSize KDateTable::sizeHint() const {  const int Spacing=2; // pixels  int x=0;  int y, count, temp;  for(count=0; count<7; count++)    {      temp=fontMetrics().width(Days[count]);      if(temp>x) x=temp;    }  x=7*x+8*Spacing;  y=7*fontMetrics().height()+7*Spacing;  debug("KDateTable::sizeHint: recommending %ix%i "	"pixels.\n", x, y);  // the widget has 7 rows and 7 columns  return QSize(x, y);}void KDateTable::setDate(QDate date){  if(date.isValid())    {      m_date=date;       emit dateSelected(m_date);      repaint(false);    } else {      debug("KDateTable::setDate: "	    "date is invalid, not set.\n");    }}// end of new methods from March 17 1998/**********************************************************/// highstick: added May 13 1998void KDateTable::goDown(){  // remember old number of days in month  m_daysInPrevMonth = m_date.daysInMonth();	// get next month and set new date and first day of the week  QDate dtnext;  getNextYear(m_date, dtnext);  m_date = dtnext;  m_firstDayOfWeek = m_date.dayOfWeek();  m_bSelection = FALSE;  emit(yearChanged(m_date));  update();}// highstick: added May 13 1998void KDateTable::goUp(){  // get previous month and set new date and first day of the week  QDate dtprev;  getPrevYear(m_date, dtprev);  m_date = dtprev;  m_firstDayOfWeek = m_date.dayOfWeek();  // now get the month previous to that and find out number of days  getPrevYear(m_date, dtprev);  m_daysInPrevMonth = dtprev.daysInMonth();  m_bSelection = FALSE;  emit(yearChanged(m_date));  update();}// highstick: added May 13 1998// gets a date on the first day of the previous monthvoid KDateTable::getPrevYear(QDate dtnow, QDate &dtprv){  dtprv = QDate(dtnow.year()-1, dtnow.month(), 1);}// highstick: added May 13 1998// gets a date on the first day of the next monthvoid KDateTable::getNextYear(QDate dtnow, QDate &dtnxt){  dtnxt = QDate(dtnow.year()+1, dtnow.month(), 1);}// end of new methods from May 13 1998 by highstick/* Mirko: Aug 21 1998 */void KDateTable::setFontSize(int size){  if(size>0)    {      fontsize=size;    }}/**********************************************************/#include "kdatetbl.moc"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -