487 case HbDateTimeParser::DaySection: |
487 case HbDateTimeParser::DaySection: |
488 case HbDateTimeParser::DayOfWeekSection: |
488 case HbDateTimeParser::DayOfWeekSection: |
489 mDayPicker = new HbTumbleView(q); |
489 mDayPicker = new HbTumbleView(q); |
490 mDayModel = new QStringListModel(q); |
490 mDayModel = new QStringListModel(q); |
491 mDayPicker->setModel(mDayModel); |
491 mDayPicker->setModel(mDayModel); |
492 //mDayPicker->setLoopingEnabled(true); |
492 mDayPicker->setLoopingEnabled(true); |
493 mLayout->addItem(mDayPicker); |
493 mLayout->addItem(mDayPicker); |
494 mDayPicker->primitive("highlight")->hide(); |
|
495 mDayPicker->primitive("separator")->show(); |
494 mDayPicker->primitive("separator")->show(); |
496 lastAdded = mDayPicker; |
495 lastAdded = mDayPicker; |
497 break; |
496 break; |
498 |
497 |
499 case HbDateTimeParser::MonthSection: |
498 case HbDateTimeParser::MonthSection: |
500 mMonthPicker = new HbTumbleView(q); |
499 mMonthPicker = new HbTumbleView(q); |
501 mMonthModel = new QStringListModel(q); |
500 mMonthModel = new QStringListModel(q); |
502 mMonthPicker->setModel(mMonthModel); |
501 mMonthPicker->setModel(mMonthModel); |
503 //mMonthPicker->setLoopingEnabled(true); |
502 mMonthPicker->setLoopingEnabled(true); |
504 mLayout->addItem(mMonthPicker); |
503 mLayout->addItem(mMonthPicker); |
505 mMonthPicker->primitive("highlight")->hide(); |
|
506 mMonthPicker->primitive("separator")->show(); |
504 mMonthPicker->primitive("separator")->show(); |
507 lastAdded = mMonthPicker; |
505 lastAdded = mMonthPicker; |
508 break; |
506 break; |
509 |
507 |
510 case HbDateTimeParser::YearSection: |
508 case HbDateTimeParser::YearSection: |
511 case HbDateTimeParser::YearSection2Digits: |
509 case HbDateTimeParser::YearSection2Digits: |
512 mYearPicker = new HbTumbleView(q); |
510 mYearPicker = new HbTumbleView(q); |
513 mYearModel = new QStringListModel(q); |
511 mYearModel = new QStringListModel(q); |
514 mYearPicker->setModel(mYearModel); |
512 mYearPicker->setModel(mYearModel); |
515 //mYearPicker->setLoopingEnabled(true); |
513 mYearPicker->setLoopingEnabled(true); |
516 mLayout->addItem(mYearPicker); |
514 mLayout->addItem(mYearPicker); |
517 mYearPicker->primitive("highlight")->hide(); |
|
518 mYearPicker->primitive("separator")->show(); |
515 mYearPicker->primitive("separator")->show(); |
519 lastAdded = mYearPicker; |
516 lastAdded = mYearPicker; |
520 break; |
517 break; |
521 |
518 |
522 case HbDateTimeParser::SecondSection: |
519 case HbDateTimeParser::SecondSection: |
523 mSecondPicker = new HbTumbleView(q); |
520 mSecondPicker = new HbTumbleView(q); |
524 mSecondModel = new QStringListModel(q); |
521 mSecondModel = new QStringListModel(q); |
525 mSecondPicker->setModel(mSecondModel); |
522 mSecondPicker->setModel(mSecondModel); |
526 //mSecondPicker->setLoopingEnabled(false); |
523 mSecondPicker->setLoopingEnabled(true); |
527 mLayout->addItem(mSecondPicker); |
524 mLayout->addItem(mSecondPicker); |
528 mSecondPicker->primitive("highlight")->hide(); |
|
529 mSecondPicker->primitive("separator")->show(); |
525 mSecondPicker->primitive("separator")->show(); |
530 lastAdded = mSecondPicker; |
526 lastAdded = mSecondPicker; |
531 break; |
527 break; |
532 |
528 |
533 case HbDateTimeParser::MinuteSection: |
529 case HbDateTimeParser::MinuteSection: |
534 mMinutePicker = new HbTumbleView(q); |
530 mMinutePicker = new HbTumbleView(q); |
535 mMinuteModel = new QStringListModel(q); |
531 mMinuteModel = new QStringListModel(q); |
536 mMinutePicker->setModel(mMinuteModel); |
532 mMinutePicker->setModel(mMinuteModel); |
537 //mMinutePicker->setLoopingEnabled(false); |
533 mMinutePicker->setLoopingEnabled(true); |
538 mLayout->addItem(mMinutePicker); |
534 mLayout->addItem(mMinutePicker); |
539 mMinutePicker->primitive("highlight")->hide(); |
|
540 mMinutePicker->primitive("separator")->show(); |
535 mMinutePicker->primitive("separator")->show(); |
541 lastAdded = mMinutePicker; |
536 lastAdded = mMinutePicker; |
542 break; |
537 break; |
543 |
538 |
544 case HbDateTimeParser::Hour12Section: |
539 case HbDateTimeParser::Hour12Section: |
545 case HbDateTimeParser::Hour24Section: |
540 case HbDateTimeParser::Hour24Section: |
546 mHourPicker = new HbTumbleView(q); |
541 mHourPicker = new HbTumbleView(q); |
547 mHourModel = new QStringListModel(q); |
542 mHourModel = new QStringListModel(q); |
548 mHourPicker->setModel(mHourModel); |
543 mHourPicker->setModel(mHourModel); |
549 //mHourPicker->setLoopingEnabled(true); |
544 mHourPicker->setLoopingEnabled(true); |
550 mLayout->addItem(mHourPicker); |
545 mLayout->addItem(mHourPicker); |
551 mHourPicker->primitive("highlight")->hide(); |
|
552 mHourPicker->primitive("separator")->show(); |
546 mHourPicker->primitive("separator")->show(); |
553 lastAdded = mHourPicker; |
547 lastAdded = mHourPicker; |
554 break; |
548 break; |
555 |
549 |
556 default: |
550 default: |
557 break; |
551 break; |
558 } |
552 } |
|
553 |
|
554 if(lastAdded){ |
|
555 lastAdded->primitive("highlight")->hide(); |
|
556 lastAdded->primitive("separator")->show(); |
|
557 } |
|
558 |
559 } |
559 } |
560 |
560 |
561 //For the last added tumble view, hide the separator. |
561 //For the last added tumble view, hide the separator. |
562 if(lastAdded){ |
562 if(lastAdded){ |
563 lastAdded->primitive("separator")->hide(); |
563 lastAdded->primitive("separator")->hide(); |
1011 } |
1030 } |
1012 if(newIndex > (end-start)) { |
1031 if(newIndex > (end-start)) { |
1013 newIndex = end-start; |
1032 newIndex = end-start; |
1014 } |
1033 } |
1015 |
1034 |
1016 resizeModel(mMinuteModel, |
1035 //Store the value before resizing the model. |
1017 mMinuteOffset,mMinuteOffset+mMinuteModel->rowCount()-1, |
1036 int value = mMinuteModel->index(mMinutePicker->selected()).data().toInt(); |
1018 start,end, |
1037 |
1019 &HbDateTimePickerPrivate::localeMinute, mIntervals[QDateTimeEdit::MinuteSection]); |
1038 if(mIntervals[QDateTimeEdit::MinuteSection] > 1){ |
|
1039 if((mIntervals[QDateTimeEdit::MinuteSection] <= mMinimumDate.time().minute()) && |
|
1040 !isMinimumHour()){ |
|
1041 int i = 0; |
|
1042 for(i = start; i > 0; i -= mIntervals[QDateTimeEdit::MinuteSection]){ |
|
1043 |
|
1044 } |
|
1045 |
|
1046 start = i; |
|
1047 } |
|
1048 else{ |
|
1049 start = mMinimumDate.time().minute(); |
|
1050 } |
|
1051 } |
|
1052 |
|
1053 resizeModel(mMinuteModel, mMinuteOffset,mMinuteModel->index(mMinuteModel->rowCount() - 1).data().toInt()/*mMinuteOffset+mMinuteModel->mMinuteModel->rowCount()-1*/, |
|
1054 start,end, |
|
1055 &HbDateTimePickerPrivate::localeMinute, mIntervals[QDateTimeEdit::MinuteSection]); |
1020 mMinuteOffset = start; |
1056 mMinuteOffset = start; |
1021 |
1057 |
1022 mMinutePicker->setSelected(newIndex); |
1058 //Select the nearest value when the range is set. |
|
1059 int index = newIndex; |
|
1060 if(mIntervals[QDateTimeEdit::MinuteSection] > 1){ |
|
1061 for(int i = 0; i < mMinuteModel->rowCount(); i++){ |
|
1062 |
|
1063 if(mMinuteModel->index(i,0).data().toInt() <= value){ |
|
1064 index = i; |
|
1065 } |
|
1066 else{ |
|
1067 break; |
|
1068 } |
|
1069 } |
|
1070 } |
|
1071 mMinutePicker->setSelected(index); |
|
1072 |
|
1073 mDateTime.setTime(QTime(mDateTime.time().hour(), localeMinute(mMinuteModel->index(index,0).data().toInt()).toInt(), mDateTime.time().second())); |
1023 |
1074 |
1024 //check if minute is valid |
1075 //check if minute is valid |
1025 if(mDateTime.time().minute() < start) { |
1076 if(mDateTime.time().minute() < start) { |
1026 mDateTime.setTime(QTime(mDateTime.time().hour(),start,mDateTime.time().second())); |
1077 mDateTime.setTime(QTime(mDateTime.time().hour(),start,mDateTime.time().second())); |
1027 } |
1078 } |
1143 void HbDateTimePickerPrivate::resizeModel(QStringListModel *model, |
1194 void HbDateTimePickerPrivate::resizeModel(QStringListModel *model, |
1144 int oldStart, int oldEnd, |
1195 int oldStart, int oldEnd, |
1145 int newStart, int newEnd, |
1196 int newStart, int newEnd, |
1146 QString (HbDateTimePickerPrivate::*localeFunc)(int), int interval) |
1197 QString (HbDateTimePickerPrivate::*localeFunc)(int), int interval) |
1147 { |
1198 { |
1148 if(interval > 1){ |
|
1149 model->removeRows(0, model->rowCount()); |
|
1150 } |
|
1151 |
|
1152 if((model->rowCount() == 0) && (newEnd-newStart>=0)) { |
1199 if((model->rowCount() == 0) && (newEnd-newStart>=0)) { |
1153 //initialize condition |
1200 //initialize condition |
1154 |
1201 int previous = newStart; |
1155 for(int i=0;i<=newEnd-newStart;i++) { |
1202 for(int i=0;i<=newEnd-newStart;i++) { |
1156 //model->setData(index,(this->*localeFunc)(i+newStart));//TODO:add a readable typedef |
|
1157 QString text; |
1203 QString text; |
1158 |
1204 |
1159 if(interval > 1){ |
1205 if(interval > 1){ |
1160 if(((newStart + interval) * i) <= newEnd){ |
1206 |
|
1207 if(previous <= newEnd){ |
1161 model->insertRow(i); |
1208 model->insertRow(i); |
1162 text = (this->*localeFunc)(!((newStart + interval)*i) ? newStart : (newStart + interval)*i); |
1209 text = (this->*localeFunc)(previous); |
1163 } |
1210 } |
1164 else{ |
1211 else{ |
1165 break; |
1212 break; |
1166 } |
1213 } |
|
1214 |
|
1215 previous += interval; |
1167 } |
1216 } |
1168 else{ |
1217 else{ |
1169 model->insertRow(i); |
1218 model->insertRow(i); |
1170 text = (this->*localeFunc)(i+newStart); |
1219 text = (this->*localeFunc)(i+newStart); |
1171 } |
1220 } |
1186 } |
1235 } |
1187 return; |
1236 return; |
1188 } |
1237 } |
1189 |
1238 |
1190 if(newStart < oldStart) { |
1239 if(newStart < oldStart) { |
1191 model->insertRows(0,oldStart-newStart); |
1240 int previous = newStart; |
|
1241 |
1192 for(int i=0;i<oldStart-newStart;++i) { |
1242 for(int i=0;i<oldStart-newStart;++i) { |
|
1243 QString text; |
|
1244 |
|
1245 if(interval > 1){ |
|
1246 |
|
1247 if(previous < oldStart){ |
|
1248 model->insertRow(i); |
|
1249 text = (this->*localeFunc)(previous); |
|
1250 } |
|
1251 else{ |
|
1252 break; |
|
1253 } |
|
1254 |
|
1255 previous += interval; |
|
1256 } |
|
1257 else{ |
|
1258 model->insertRow(i); |
|
1259 text = (this->*localeFunc)(i+newStart); |
|
1260 } |
|
1261 |
1193 QModelIndex index=model->index(i,0); |
1262 QModelIndex index=model->index(i,0); |
1194 if(index.isValid()) { |
1263 if(index.isValid()) { |
1195 model->setData(index,(this->*localeFunc)(i+newStart)); |
1264 model->setData(index,text); |
1196 } |
1265 } |
1197 } |
1266 } |
1198 } |
1267 } |
1199 if(newEnd > oldEnd) { |
1268 if(newEnd > oldEnd) { |
|
1269 |
1200 int rowCount = model->rowCount(); |
1270 int rowCount = model->rowCount(); |
1201 model->insertRows(rowCount,newEnd-oldEnd); |
1271 int previous = oldEnd+interval; |
1202 for(int i=0;i<newEnd-oldEnd;++i) { |
1272 for(int i=0;i<newEnd-oldEnd;++i) { |
|
1273 QString text; |
|
1274 |
|
1275 if(interval > 1){ |
|
1276 |
|
1277 if(previous <= newEnd){ |
|
1278 model->insertRows(rowCount+i,1); |
|
1279 text = (this->*localeFunc)(previous); |
|
1280 } |
|
1281 else{ |
|
1282 break; |
|
1283 } |
|
1284 |
|
1285 previous += interval; |
|
1286 } |
|
1287 else{ |
|
1288 model->insertRows(rowCount+i,1); |
|
1289 text = (this->*localeFunc)(oldEnd+i+1); |
|
1290 } |
|
1291 |
1203 QModelIndex index=model->index(rowCount+i,0); |
1292 QModelIndex index=model->index(rowCount+i,0); |
1204 if(index.isValid()) { |
1293 if(index.isValid()) { |
1205 model->setData(index,(this->*localeFunc)(oldEnd+i+1)); |
1294 model->setData(index,text); |
1206 } |
1295 } |
1207 } |
1296 } |
1208 } |
1297 } |
1209 |
1298 |
1210 if(newStart > oldStart) { |
1299 if(newStart > oldStart) { |
1211 model->removeRows(0,newStart-oldStart); |
1300 if(interval > 1){ |
|
1301 for(int i = oldStart; i < newStart; i += interval){ |
|
1302 model->removeRows(0, 1); |
|
1303 } |
|
1304 } |
|
1305 else{ |
|
1306 model->removeRows(0,newStart-oldStart); |
|
1307 } |
1212 } |
1308 } |
1213 |
1309 |
1214 if(oldEnd > newEnd) { |
1310 if(oldEnd > newEnd) { |
1215 model->removeRows((model->rowCount()-(oldEnd-newEnd)),oldEnd-newEnd); |
1311 if(interval > 1){ |
|
1312 for(int i = oldEnd; i > newEnd; i -= interval){ |
|
1313 model->removeRows(model->rowCount()-1, 1); |
|
1314 } |
|
1315 } |
|
1316 else{ |
|
1317 model->removeRows((model->rowCount()-(oldEnd-newEnd)),oldEnd-newEnd); |
|
1318 } |
|
1319 } |
|
1320 |
|
1321 if(interval > 1){ |
|
1322 //Check if there's any mismatch between actual rows in the model and the supposed rows. |
|
1323 int previous = newStart; |
|
1324 int actualRowCount = 0; |
|
1325 for(actualRowCount=0;actualRowCount<=newEnd-newStart;actualRowCount++) { |
|
1326 if(previous <= newEnd){ |
|
1327 } |
|
1328 else{ |
|
1329 break; |
|
1330 } |
|
1331 |
|
1332 previous += interval; |
|
1333 } |
|
1334 |
|
1335 if(actualRowCount > model->rowCount()){ |
|
1336 model->insertRows(model->rowCount(), actualRowCount - model->rowCount()); |
|
1337 } |
|
1338 else if( actualRowCount < model->rowCount()){ |
|
1339 model->removeRows(model->rowCount()-1, model->rowCount() - actualRowCount); |
|
1340 } |
|
1341 |
|
1342 //Populate the data in the model. |
|
1343 previous = newStart; |
|
1344 for(int i = 0; i < model->rowCount(); i++) |
|
1345 { |
|
1346 if(previous <= newEnd){ |
|
1347 model->setData(model->index(i), (this->*localeFunc)(previous)); |
|
1348 } |
|
1349 else{ |
|
1350 break; |
|
1351 } |
|
1352 previous += interval; |
|
1353 } |
1216 } |
1354 } |
1217 } |
1355 } |
1218 |
1356 |
1219 void HbDateTimePickerPrivate::createPrimitives() |
1357 void HbDateTimePickerPrivate::createPrimitives() |
1220 { |
1358 { |