📄 mmscomposer.cpp
字号:
/******************************************************************************** Copyright (C) 2000-2006 TROLLTECH ASA. All rights reserved.**** This file is part of the Phone Edition of the Qtopia Toolkit.**** Licensees holding a valid license agreement from Trolltech or any of its** authorized distributors may use this file in accordance with** the License Agreement provided with the Licensed Software.**** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for** information about Trolltech's Commercial License Agreements.**** Contact info@trolltech.com if any conditions of this licensing are** not clear to you.********** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "mmscomposer.h"#include "../addressbook/imagesourcedialog.h"#include "audiosource.h"#include <qtopia/qsoftmenubar.h>#include <qtopia/qtopiaapplication.h>#include <qtopia/qcolorselector.h>#include <qtopia/mail/mailmessage.h>#include <qtopia/qmimetype.h>#include <QAction>#include <QPainter>#include <QLayout>#include <QStackedWidget>#include <QDialog>#include <QImage>#include <QSpinBox>#include <QFile>#include <QStringList>#include <QDir>#include <QTextStream>#include <QDataStream>//#include <qgfx_qws.h>#include <QBitArray>#include <QXmlDefaultHandler>#include <QMouseEvent>#include <QDesktopWidget>#include <QMenu>#include <QDebug>MMSSlideImage::MMSSlideImage(QWidget *parent) : QLabel(parent){ setAlignment( Qt::AlignCenter ); connect( this, SIGNAL(clicked()), this, SLOT(select()) ); setImage( QPixmap() ); setFocusPolicy( Qt::StrongFocus ); setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) ); // would like to specify a value relative to parent here but Qt makes it hard.. setMinimumSize( 0, 30 );}void MMSSlideImage::mousePressEvent( QMouseEvent *event ){ if( rect().contains( event->pos() ) ) m_pressed = true;}void MMSSlideImage::mouseReleaseEvent( QMouseEvent *event ){ if( m_pressed && rect().contains( event->pos() ) ) emit clicked(); m_pressed = false;}void MMSSlideImage::keyPressEvent( QKeyEvent *event ){ if( event->type() == QEvent::KeyPress ) { QKeyEvent *keyEvent = (QKeyEvent *)event; switch( keyEvent->key() ) { case Qt::Key_Left: emit leftPressed(); break; case Qt::Key_Right: emit rightPressed(); break; case Qt::Key_Select: emit clicked(); break; default: QLabel::keyPressEvent( event ); break; } }}void MMSSlideImage::paintEvent( QPaintEvent *event ){ QLabel::paintEvent( event ); if( hasFocus() ) { QPainter p( this ); QPen pen(palette().highlight().color()); p.setPen( pen ); p.drawRect( 0, 0, width(), height() ); p.drawRect( 1, 1, width()-2, height()-2 ); }}QRect MMSSlideImage::contentsRect() const{ QPixmap img = image(); if( img.isNull() ) return QRect(); QPoint pnt( rect().x() + (width() - img.width()) / 2 + 2, rect().y() + (height() - img.height()) / 2 + 2 ); pnt = mapToParent( pnt ); return QRect( pnt.x(), pnt.y(), img.width(), img.height() );}extern QRect qt_maxWindowRect;QSize MMSSlideImage::sizeHint() const{ QWidget *par = 0; if( parent() && parent()->isWidgetType() ) par = (QWidget *)parent();#if QT_VERSION < 0x030000 QRect mwr = qt_screen->mapToDevice(qt_maxWindowRect, QSize(qt_screen->width(),qt_screen->height()) );#else QRect mwr = qt_maxWindowRect;#endif int w = par ? par->width() : mwr.width(), h = par ? par->height() : mwr.height(); return QSize(w/3*2, h/3*2);}void MMSSlideImage::select(){#ifndef QTOPIA_DESKTOP ImageSourceDialog *selector = new ImageSourceDialog( m_image, this, "slideImageSelector" ); selector->setWindowTitle( tr("Slide Photo") ); selector->setMaximumImageSize(qApp->desktop()->size()); int result = QtopiaApplication::execDialog( selector ); if( result == QDialog::Accepted ) { setImage(selector->pixmap()); } delete selector;#else qDebug("Image selection on qtopia desktop not implemented for MMS Composer");#endif}void MMSSlideImage::resizeEvent( QResizeEvent *event ){ QLabel::resizeEvent( event ); setImage( m_image );}QPixmap MMSSlideImage::scale( const QPixmap &src ) const{ QPixmap pix = src; if( !src.isNull() && (src.width() >= width() || src.height() >= height()) ) pix = pix.scaled(width(), height(), Qt::KeepAspectRatio); return pix;}void MMSSlideImage::setImage( const QPixmap &image ){ m_image = image; setPixmap( scale( m_image ) ); if( image.isNull() ) setText( tr("Slide Image") ); emit changed();}QPixmap MMSSlideImage::image() const{ QPixmap img; const QPixmap *p = pixmap(); if( p ) img = *p; return img;}const QString MMSSlideText::defaultText = QObject::tr("Your text here..");MMSSlideText::MMSSlideText(QWidget *parent) : QTextEdit(parent), m_hasFocus( false ){ setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::MinimumExpanding ) ); setWordWrapMode(QTextOption::WordWrap); setText( QString() );}bool MMSSlideText::event( QEvent *e ){#ifdef QTOPIA_PHONE bool a = QTextEdit::event( e ); if( e->type() == QEvent::EnterEditFocus && text().isNull() ) clear(); else if( e->type() == QEvent::LeaveEditFocus && text().isEmpty() ) setText( QString() ); else if( e->type() == QEvent::MouseButtonPress && !m_hasFocus ) { selectAll(); m_hasFocus = true; } else if( e->type() == QEvent::FocusOut ) m_hasFocus = false; return a;#else return QTextEdit::event( e );#endif}void MMSSlideText::keyPressEvent( QKeyEvent *e ){#ifdef QTOPIA_PHONE if (!Qtopia::mousePreferred()) { if (!hasEditFocus()) { if (e->key() == Qt::Key_Left) { emit leftPressed(); e->accept(); return; } else if (e->key() == Qt::Key_Right) { emit rightPressed(); e->accept(); return; } //else fall through } }#endif QTextEdit::keyPressEvent( e ); updateGeometry();}QRect MMSSlideText::contentsRect() const{ if( text().isNull() ) return QRect(); QPoint pnt = rect().topLeft(); pnt = mapToParent( pnt ); return QRect( pnt.x(), pnt.y(), rect().width()-2, rect().height() - 2 );}void MMSSlideText::setText( const QString &txt ){ QString t = txt; if( t.simplified().isEmpty() ) { t = MMSSlideText::defaultText; selectAll(); } QTextEdit::setPlainText( t ); updateGeometry();}QString MMSSlideText::text() const{ QString t = QTextEdit::toPlainText().simplified(); if( t == MMSSlideText::defaultText ) t = QString(); return t;}QSize MMSSlideText::sizeHint() const{ QFontMetrics fm( font() ); return QSize( QTextEdit::sizeHint().width(), qMax( fm.boundingRect( 0, 0, width()-2, 32768, Qt::TextWordWrap | Qt::AlignHCenter, text() ).height()+2, QApplication::globalStrut().height() ) );}//---------------------------------------------------------------------------MMSSlideAudio::MMSSlideAudio(QWidget *parent) : QPushButton(parent){ setIcon(QIcon(":icon/sound")); connect(this, SIGNAL(clicked()), this, SLOT(select()));}void MMSSlideAudio::setAudio( const QContent &doc ){ QFile f(doc.file()); if (f.open(QIODevice::ReadOnly)) { setText(doc.name()); audioData = f.readAll(); audioName = doc.name(); } else { setText(""); audioData.resize(0); audioName = QString(); } emit changed();}void MMSSlideAudio::setAudio( const QByteArray &d, const QString &loc ){ qDebug("setting audio data"); audioData = d; audioName = loc; setText(loc.toLatin1());}QByteArray MMSSlideAudio::audio() const{ return audioData;}void MMSSlideAudio::select(){#ifndef QTOPIA_DESKTOP AudioSourceDialog *selector = new AudioSourceDialog(this, "slideAudioSelector", false); selector->setAudio(QContent(audioName)); selector->setDefaultAudio("audio/amr", "amr", 8000, 1); int result = QtopiaApplication::execDialog( selector ); if ( result == QDialog::Accepted ) { setAudio(selector->audio()); } delete selector;#else qDebug("Audio selection on qtopia desktop not implemented for MMS Composer");#endif}void MMSSlideAudio::keyPressEvent( QKeyEvent *e ){ switch (e->key()) { case Qt::Key_Left: emit leftPressed(); break; case Qt::Key_Right: emit rightPressed(); break; default: QPushButton::keyPressEvent(e); }}//===========================================================================MMSSlide::MMSSlide(QWidget *parent) : QWidget(parent), m_firstShow( true ), m_duration( 5000 ){ setFocusPolicy( Qt::NoFocus ); setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) ); QVBoxLayout *l = new QVBoxLayout( this ); l->setMargin(0); l->setSpacing(0); m_imageContent = new MMSSlideImage( this ); l->addWidget( m_imageContent, 6 ); connect( m_imageContent, SIGNAL(leftPressed()), this, SIGNAL(leftPressed()) ); connect( m_imageContent, SIGNAL(rightPressed()), this, SIGNAL(rightPressed()) ); m_textContent = new MMSSlideText( this ); l->addWidget( m_textContent, 3 ); connect( m_textContent, SIGNAL(leftPressed()), this, SIGNAL(leftPressed()) ); connect( m_textContent, SIGNAL(rightPressed()), this, SIGNAL(rightPressed()) ); m_audioContent = new MMSSlideAudio( this ); l->addWidget( m_audioContent, 1 ); connect( m_audioContent, SIGNAL(leftPressed()), this, SIGNAL(leftPressed()) ); connect( m_audioContent, SIGNAL(rightPressed()), this, SIGNAL(rightPressed()) );}void MMSSlide::setDuration( int t ){ if( t != m_duration ) { m_duration = t; emit durationChanged( m_duration ); }}int MMSSlide::duration() const{ return m_duration;}MMSSlideImage *MMSSlide::imageContent() const{ return m_imageContent;}MMSSlideText *MMSSlide::textContent() const{ return m_textContent;}MMSSlideAudio *MMSSlide::audioContent() const{ return m_audioContent;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -