📄 mainwindow.cpp
字号:
settings->photo_size->setCurrentItem(psize); settings->video_size->setCurrentItem(vsize); settings->photo_quality->setValue(pquality); settings->video_quality->setValue(vquality); settings->video_framerate->setValue(vframerate); settings->video_quality_n->setFixedWidth(fontMetrics().width("100")); settings->photo_quality_n->setFixedWidth(fontMetrics().width("100")); if ( QPEApplication::execDialog(settings) ) { confirmSettings(); } else { settings->location->setLocation(storagepath); }}void CameraMainWindow::confirmSettings(){ storagepath = settings->location->documentPath(); psize = settings->photo_size->currentItem(); vsize = settings->video_size->currentItem(); pquality = settings->photo_quality->value(); vquality = settings->video_quality->value(); vframerate = settings->video_framerate->value(); // save settings Config cfg("Camera"); cfg.setGroup("General"); cfg.writeEntry("location",storagepath); cfg.setGroup("Photo"); cfg.writeEntry("width",photo_size[psize].width()); cfg.writeEntry("quality",pquality); cfg.setGroup("Video"); cfg.writeEntry("width",video_size[vsize].width()); cfg.writeEntry("quality",vquality); cfg.writeEntry("framerate",vframerate); loadThumbs(); preview();}static int cmpDocLnk(const void *a, const void *b){ const DocLnk *la = *(const DocLnk**)a; const DocLnk *lb = *(const DocLnk**)b; QFileInfo fa(la->linkFileKnown() ? la->linkFile() : la->file()); QFileInfo fb(lb->linkFileKnown() ? lb->linkFile() : lb->file()); return fa.lastModified().secsTo(fb.lastModified());}void CameraMainWindow::loadThumbs(){ if ( storagepath.isEmpty() ) { updateActions(); return; } DocLnkSet set( storagepath, "image/jpeg" ); const QList<DocLnk> & l = set.children(); DocLnk* lnk; DocLnk** array = new DocLnk*[l.count()]; int n=0; for (QListIterator<DocLnk> it(l); (lnk=it.current()); ++it) { if (lnk->categories().contains(camcat)) array[n++] = lnk; } qsort(array,n,sizeof(array[0]),cmpDocLnk); for (int i=0; i<nthumb; i++) { QPixmap pm; if ( i<n ) { picturefile[i] = *array[i]; QImage img = Image::loadScaled(picturefile[i].file(),thumbw,thumbh); pm.convertFromImage(img); } if ( pm.isNull() ) { thumb[i]->setText(""); } else { thumb[i]->setPixmap(pm); } thumb[i]->setEnabled(!pm.isNull()); } if ( cur_thumb >= 0 ) selectThumb(cur_thumb); if ( !camera->videocaptureview->available() ) { camera->photo->setEnabled(FALSE); camera->video->setEnabled(FALSE); if (!n) { thumb[0]->setEnabled(FALSE); } else { thumb[0]->setFocus(); thumb[0]->setEnabled(TRUE); } } updateActions();}void CameraMainWindow::delThumb(int th){ switch(QMessageBox::warning(0, tr("Confirmation"), tr("<qt>Delete '%1'?</qt>", "%1 = file name").arg(picturefile[th].name()), QMessageBox::Yes, QMessageBox::No)) { case QMessageBox::Yes: picturefile[th].removeFiles(); // Rhys Hack - if we have just deleted the last image and there // is no camera connected, then exit the application. This // avoids a focus problem where it is impossible to exit with // the back button due to the focus being in a stupid place. loadThumbs(); if ( !camera->videocaptureview->available() && !(thumb[0]->isEnabled()) ) { close(); } break; default: //nothing break; }}void CameraMainWindow::pushThumb(const DocLnk& f, const QImage& img){ for (int i=nthumb; --i; ) { bool en = thumb[i-1]->isEnabled(); thumb[i]->setEnabled(en); picturefile[i] = picturefile[i-1]; const QPixmap *pm = thumb[i-1]->pixmap(); if ( en && pm ) { thumb[i]->setPixmap(*pm); } else { thumb[i]->setText(""); } } QPixmap pm; QSize sz = Image::aspectScaleSize(img.width(),img.height(),thumbw,thumbh); QImage simg = img.smoothScale(sz.width(),sz.height()); pm.convertFromImage(simg); thumb[0]->setPixmap(pm); thumb[0]->setEnabled(TRUE); picturefile[0]=f;}void CameraMainWindow::takePhoto(){ if (camera->photo != focusWidget()) { camera->photo->setFocus(); return; } QSize size = photo_size[psize]; if ( size == camera->videocaptureview->captureSize() || camera->videocaptureview->refocusDelay() == 0 ) { // We can grab the current image immediately. takePhotoNow(); } else { // Change the camera size and then wait for the camera to refocus. camera->videocaptureview->setCaptureSize( size ); refocusTimer->start( camera->videocaptureview->refocusDelay(), TRUE ); }}void CameraMainWindow::takePhotoNow(){ QImage img = camera->videocaptureview->image(); if ( inSnapMode() ) { QCopEnvelope e(snap_ch,"valueSupplied(QString,QImage)"); QSize s = Image::aspectScaleSize(img.width(),img.height(),snap_maxw,snap_maxh); e << snap_id << img.smoothScale(s.width(),s.height()); setSnapMode(FALSE); close(); } else { DocLnk f; //f.setLocation(storagepath); f.setType("image/jpeg"); f.setName(tr("Photo, %1","date") .arg(TimeString::localYMD(QDate::currentDate(),TimeString::Short))); QArray<int> c(1); c[0] = camcat; f.setCategories(c); img.save(f.file(),"JPEG",pquality); // Save the image in its original size. f.writeLink(); pushThumb(f,img); } preview();}bool CameraMainWindow::inSnapMode() const{ return !snap_ch.isEmpty();}void CameraMainWindow::setSnapMode(bool y){ if ( y ) { camera->thumbs->hide(); camera->video->hide(); } else { camera->thumbs->show(); if ( video_supported ) camera->video->show(); else camera->video->hide(); snap_ch = QString::null; }}void CameraMainWindow::toggleVideo(){ if ( recording ) stopVideo(); else startVideo(); recording = !recording; camera->video->setText(recording ? tr("Stop") : tr("Video")); camera->photo->setEnabled(!recording); for (int i=0; i<nthumb; i++) thumb[i]->setEnabled(!recording && thumb[i]->pixmap());}void CameraMainWindow::startVideo(){ // XXX eg. MJPG}void CameraMainWindow::stopVideo(){}void CameraMainWindow::thumbClicked(int i){ selectThumb(i);}void CameraMainWindow::editThumb(){ picturefile[cur_thumb].execute();}void CameraMainWindow::selectThumb(int i){ cur_thumb = i; if ( i >= 0 ) { QImage img( picturefile[i].file() ); camera->videocaptureview->setStill(img); thumb[i]->setFocus(); } else { camera->videocaptureview->setLive(); } a_th_edit->setEnabled(i>=0); a_th_del->setEnabled(i>=0); a_th_add->setEnabled(i>=0); a_send->setEnabled(i>=0);}void CameraMainWindow::moveToContact(){ if ( cur_thumb >= 0 ) { QCopEnvelope e(Service::channel("Contacts"),"setContactImage(QImage)"); QImage img; img.load(picturefile[cur_thumb].file()); e << img; }}void CameraMainWindow::delThumb(){ if ( cur_thumb >= 0 ) { int d = cur_thumb; if ( cur_thumb > 0 ) selectThumb(cur_thumb-1); delThumb(d); }}void CameraMainWindow::linkChanged(const QString&){ loadThumbs();}void CameraMainWindow::appMessage(const QCString& msg, const QByteArray& data){ if ( msg == "getImage(QCString,QString,int,int,QImage)" ) { QDataStream ds(data,IO_ReadOnly); ds >> snap_ch >> snap_id >> snap_maxw >> snap_maxh; setSnapMode(TRUE); QPEApplication::setKeepRunning(); }}void CameraMainWindow::preview(){ if ( camera->videocaptureview->refocusDelay() > 200 ) { camera->videocaptureview->setCaptureSize( photo_size[psize] ); } else { camera->videocaptureview->setCaptureSize( camera->videocaptureview->recommendedPreviewSize() ); }}void CameraMainWindow::sendFile(){ if ( cur_thumb >= 0) { //copy file QFile input(picturefile[cur_thumb].file()); if(!input.open(IO_ReadOnly)){ return; //error } QFile output(picfile); if(!output.open(IO_WriteOnly)){ return; } const int BUFFER_SIZE = 1024; Q_INT8 buffer[BUFFER_SIZE]; QDataStream srcStr(&input); QDataStream destStr(&output); while(!srcStr.atEnd()) { int i = 0; while(!srcStr.atEnd() && i < BUFFER_SIZE){ srcStr >> buffer[i]; i++; } for(int k = 0; k < i; k++) { destStr << buffer[k]; } } QCopEnvelope e(Service::channel("Email"),"writeMessage(QString,QString,QStringList,QStringList)"); e << QString() << QString() << QStringList() << QStringList( QString( picfile ) ); }}void ThumbButton::drawButtonLabel( QPainter *p ){ const QPixmap *pm = pixmap(); if ( pm ) { QSize s = (size()-pm->size())/2; p->drawPixmap(s.width(),s.height(),*pm); }}ThumbButton::ThumbButton( QWidget *parent, const char* name ) : QToolButton(parent,name){}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -