00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 from PyQt4.QtCore import *
00039 from PyQt4.QtGui import *
00040 from PyQt4.uic import *
00041 import math
00042 import locale
00043 import Common
00044 import re
00045
00046
00047 def dateToText( date ):
00048 return str( date.toString( 'dd/MM/yyyy' ) )
00049
00050
00051 def timeToText( time ):
00052 return str( time.toString( 'hh:mm:ss' ) )
00053
00054
00055 def dateTimeToText( dateTime ):
00056 return str( dateTime.toString( 'dd/MM/yyyy hh:mm:ss' ) )
00057
00058
00059 def floatTimeToText( value ):
00060
00061 value = float( value )
00062 t = '%02d:%02d' % (math.floor(abs(value)),round(abs(value)%1+0.01,2) * 60)
00063 if value<0:
00064 t = '-'+t
00065 return t
00066
00067
00068
00069 def dateToStorage( date ):
00070 if date.isValid():
00071 return str( date.toString( 'yyyy-MM-dd' ) )
00072 else:
00073 return False
00074
00075
00076
00077 def timeToStorage( time ):
00078 if time.isValid():
00079 return str( time.toString( 'hh:mm:ss' ) )
00080 else:
00081 return False
00082
00083
00084
00085 def dateTimeToStorage( dateTime ):
00086 if dateTime.isValid():
00087 return str( dateTime.toString( 'yyyy-MM-dd hh:mm:ss' ) )
00088 else:
00089 return False
00090
00091
00092 def textToDate( text ):
00093 text = unicode( text ).strip()
00094 if text == '=':
00095 return QDate.currentDate()
00096
00097 inputFormats = [
00098 'dd/MM/yyyy', 'dd-MM-yyyy', ('dd-MM-yy', 'century'), ('dd/MM/yy', 'century'),
00099 ('dd-M-yy', 'century'), ('d-M-yy', 'add'), ('d-MM-yy','century'), 'dd.MM.yyyy',
00100 ('dd.MM.yy','century'), 'ddMMyyyy', ('ddMMyy','century'), ('dd/MM', 'year'),
00101 ('dd.MM', 'year'), ('ddMM', 'year'), ('dd', 'month')
00102 ]
00103 for x in inputFormats:
00104 if isinstance(x, tuple):
00105 format = x[0]
00106 complete = x[1]
00107 else:
00108 format = x
00109 complete = None
00110
00111 date = QDate.fromString( text, format )
00112 if date.isValid():
00113 if complete == 'century':
00114 date.setDate( date.year() + 100, date.month(), date.day() )
00115 if complete == 'year':
00116 date.setDate( QDate.currentDate().year(), date.month(), date.day() )
00117 elif complete == 'month':
00118 date.setDate( QDate.currentDate().year(), QDate.currentDate().month(), date.day() )
00119 break
00120 return date
00121
00122
00123 def textToTime( text ):
00124 text = unicode( text ).strip()
00125 if text == '=':
00126 return QTime.currentTime()
00127
00128 inputFormats = ['h:m:s', 'h:m', 'hh:mm:ss', 'h.m.s', 'h.m', 'h']
00129 for x in inputFormats:
00130 time = QTime.fromString( text, x )
00131 if time.isValid():
00132 break
00133
00134 if not time.isValid():
00135 if len(text) == 4:
00136
00137 time = QTime.fromString( '%s:%s' % ( text[0:2], text[2:4] ), 'h:m' )
00138 elif len(text) == 6:
00139
00140 time = QTime.fromString( '%s:%s:%s' % ( text[0:2], text[2:4], text[4:6] ), 'h:m:s' )
00141 return time
00142
00143
00144 def textToDateTime( text ):
00145 text = unicode( text ).strip()
00146 if text == '=':
00147 return QDateTime.currentDateTime()
00148
00149 inputFormats = ['dd/MM/yyyy h:m:s', "dd/MM/yyyy", "dd-MM-yyyy", 'dd-MM-yy', 'dd/MM/yy', 'dd-M-yy', 'd-M-yy', 'd-MM-yy', 'ddMMyyyy', 'ddMMyy' ]
00150 for x in inputFormats:
00151 datetime = QDateTime.fromString( text, x )
00152 if datetime.isValid():
00153 break
00154 return datetime
00155
00156 def internalTextToFloatTime( text ):
00157 try:
00158 text = text.replace('.',':')
00159 if text and ':' in text:
00160 return round(int(text.split(':')[0]) + int(text.split(':')[1]) / 60.0,2)
00161 else:
00162 return locale.atof(text)
00163 except:
00164 return 0.0
00165
00166
00167 def textToFloatTime( text ):
00168 text = unicode( text ).strip()
00169 time = 0.0
00170 last_operation = None
00171 texts = re.split('(\+|-+)', text)
00172 for text in texts:
00173 if text in ('+','-'):
00174 last_operation = text
00175 continue
00176 value = internalTextToFloatTime( text )
00177 if last_operation == '+':
00178 time += value
00179 elif last_operation == '-':
00180 time -= value
00181 else:
00182 time = value
00183 return time
00184
00185
00186 def storageToDate( text ):
00187 if text:
00188 date = QDate.fromString( text, 'yyyy-MM-dd' )
00189 if date.isValid():
00190 return date
00191
00192 return QDateTime.fromString( text, 'yyyy-MM-dd hh:mm:ss' ).date()
00193 else:
00194 return QDate()
00195
00196
00197 def storageToTime( text ):
00198 if text:
00199 return QTime.fromString( text, 'h:m:s' )
00200 else:
00201 return QTime()
00202
00203
00204 def storageToDateTime( text ):
00205 if text:
00206 return QDateTime.fromString( text, 'yyyy-MM-dd h:m:s' )
00207 else:
00208 return QDateTime
00209
00210
00211 (PopupCalendarUi, PopupCalendarBase) = loadUiType( Common.uiPath('datetime.ui') )
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226 class PopupCalendarWidget(QWidget, PopupCalendarUi):
00227
00228
00229 def __init__(self, parent, showTime = False):
00230 QWidget.__init__(self, parent)
00231 PopupCalendarUi.__init__(self)
00232 self.setupUi( self )
00233
00234 self.showTime = showTime
00235 if self.showTime:
00236 self.uiTime.setText( textToDateTime( unicode(parent.text()) ).time().toString() )
00237 self.connect( self.uiTime, SIGNAL('returnPressed()'), self.storeOnParent )
00238 else:
00239 self.uiTime.hide()
00240 self.labelTime.hide()
00241
00242 self.setWindowFlags( Qt.Popup )
00243 self.setWindowModality( Qt.ApplicationModal )
00244 pos = parent.parent().mapToGlobal( parent.pos() )
00245 self.move( pos.x(), pos.y() + parent.height() )
00246
00247
00248 newX = self.x()
00249 newY = self.y()
00250 if self.frameGeometry().right() > QApplication.desktop().availableGeometry().right():
00251 newX = QApplication.desktop().availableGeometry().right() - self.width()
00252 if self.frameGeometry().bottom() > QApplication.desktop().availableGeometry().bottom():
00253 newY = QApplication.desktop().availableGeometry().bottom() - self.height()
00254 self.move( newX, newY )
00255
00256 self.connect( self.uiCalendar, SIGNAL('activated(QDate)'), self.storeOnParent )
00257 if self.showTime:
00258 self.uiCalendar.setSelectedDate( textToDateTime( parent.text() ).date() )
00259 else:
00260 self.uiCalendar.setSelectedDate( textToDate( parent.text() ) )
00261 self.uiCalendar.setFirstDayOfWeek( Qt.Monday )
00262 self.show()
00263 if self.showTime:
00264 self.uiTime.setFocus()
00265 else:
00266 self.uiCalendar.setFocus()
00267
00268
00269
00270 def storeOnParent(self):
00271 date = self.uiCalendar.selectedDate()
00272 text = dateToText( date )
00273 if self.showTime:
00274 time = textToTime( self.uiTime.text() )
00275 if time.isValid():
00276 text = text + ' ' + timeToText(time)
00277 else:
00278 text = text + ' ' + '00:00:00'
00279 self.parent().setText( text )
00280 self.emit(SIGNAL('selected()'))
00281 self.close()
00282