src/hbwidgets/widgets/hbdatetimepicker_p.cpp
changeset 3 11d3954df52a
parent 2 06ff229162e9
child 6 c3690ec91ef8
equal deleted inserted replaced
2:06ff229162e9 3:11d3954df52a
   475         switch(mParser.mSectionNodes[i].type) {
   475         switch(mParser.mSectionNodes[i].type) {
   476             case HbDateTimeParser::AmPmSection:
   476             case HbDateTimeParser::AmPmSection:
   477                 mAmPmPicker = new HbTumbleView(q);
   477                 mAmPmPicker = new HbTumbleView(q);
   478                 mAmPmModel = new QStringListModel(q);
   478                 mAmPmModel = new QStringListModel(q);
   479                 mAmPmPicker->setModel(mAmPmModel);
   479                 mAmPmPicker->setModel(mAmPmModel);
   480                 //mAmPmPicker->setLoopingEnabled(true);
   480                 mAmPmPicker->setLoopingEnabled(true);
   481                 mLayout->addItem(mAmPmPicker);
   481                 mLayout->addItem(mAmPmPicker);
   482                 mAmPmPicker->primitive("highlight")->hide();
   482                 mAmPmPicker->primitive("highlight")->hide();
   483                 mAmPmPicker->primitive("separator")->show();
   483                 mAmPmPicker->primitive("separator")->show();
   484                 lastAdded = mAmPmPicker;
   484                 lastAdded = mAmPmPicker;
   485                 break;
   485                 break;
   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();
   816             mDayPicker->setSelected(newDateTime.date().day()-mDayOffset);
   816             mDayPicker->setSelected(newDateTime.date().day()-mDayOffset);
   817         }
   817         }
   818         if(mHourPicker) {
   818         if(mHourPicker) {
   819             mHourPicker->setSelected(newDateTime.time().hour()-mHourOffset);
   819             mHourPicker->setSelected(newDateTime.time().hour()-mHourOffset);
   820         }
   820         }
       
   821 
   821         if(mMinutePicker) {
   822         if(mMinutePicker) {
   822             mMinutePicker->setSelected(newDateTime.time().minute()-mMinuteOffset);
   823             int index = newDateTime.time().minute()-mMinuteOffset;
   823         }
   824             if(mIntervals[QDateTimeEdit::MinuteSection] > 1){
       
   825                 for(int i = 0; i < mMinuteModel->rowCount(); i++){
       
   826 
       
   827                     if(mMinuteModel->index(i,0).data().toInt() <= newDateTime.time().minute()){
       
   828                         index = i;
       
   829                     }
       
   830                     else{
       
   831                         break;
       
   832                     }
       
   833 
       
   834                     //TODO: if minute is not in the model data then nearest value should be selected.
       
   835                 }
       
   836             }
       
   837             else{
       
   838                 index = newDateTime.time().minute()-mMinuteOffset;
       
   839             }
       
   840             mMinutePicker->setSelected(index);
       
   841         }
       
   842 
   824         if(mSecondPicker) {
   843         if(mSecondPicker) {
   825 #ifdef HBDATETIMEPICKER_DEBUG
   844 #ifdef HBDATETIMEPICKER_DEBUG
   826             qDebug() << "setDateTime before: secondOffset=" << mSecondOffset << " time=" << newDateTime.time();
   845             qDebug() << "setDateTime before: secondOffset=" << mSecondOffset << " time=" << newDateTime.time();
   827 #endif
   846 #endif
   828             mSecondPicker->setSelected(newDateTime.time().second()-mSecondOffset);
   847             mSecondPicker->setSelected(newDateTime.time().second()-mSecondOffset);
  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 {
  1480     emitTimeChange();
  1618     emitTimeChange();
  1481 }
  1619 }
  1482 
  1620 
  1483 void HbDateTimePickerPrivate::_q_minutesChanged(int index)
  1621 void HbDateTimePickerPrivate::_q_minutesChanged(int index)
  1484 {
  1622 {
       
  1623     bool *bOk = false;
  1485 #ifdef HBDATETIMEPICKER_DEBUG
  1624 #ifdef HBDATETIMEPICKER_DEBUG
  1486     qDebug() << "_q_minutesChanged:" << index;
  1625     qDebug() << "_q_minutesChanged:" << index;
  1487 #endif
  1626     qDebug() << mLocale.toInt(mMinuteModel->index(mMinuteOffset+index,0).data().toString(),bOk, 10);
  1488 	QTime newTime(mDateTime.time().hour(),mLocale.toInt(mMinuteModel->index(mMinuteOffset+index,0).data().toString()),mDateTime.time().second());
  1627 #endif
       
  1628 	QTime newTime(mDateTime.time().hour(),mLocale.toInt(mMinuteModel->index(index,0).data().toString(),bOk, 10),mDateTime.time().second());
  1489     if(newTime.isValid()) {
  1629     if(newTime.isValid()) {
  1490         mDateTime.setTime(newTime);
  1630         mDateTime.setTime(newTime);
  1491     }
  1631     }
  1492     else {
  1632     else {
  1493 #ifdef HBDATETIMEPICKER_DEBUG
  1633 #ifdef HBDATETIMEPICKER_DEBUG