diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index e317a6c..c566010 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -35,14 +35,7 @@ #include #include #include - -/*#include -#include -#include -#include -#include */ - -//#include +#include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), @@ -115,6 +108,68 @@ MainWindow::~MainWindow() lscribe->wait( 1000 ); } +bool MainWindow::saveSceneAs( QCDScene *scene ) +{ + QString fileName = + QFileDialog::getSaveFileName( this, + scene->name() + tr( ": save as" ), + QString(), + tr("qlscribe document (*.qlx)") ); + if( fileName.isNull() ) + return false; + + if( !fileName.contains( '.' ) ) + fileName += ".qlx"; + + return scene->saveAs( fileName ); +} + +bool MainWindow::saveScene( QCDScene *scene ) +{ + return scene->isUnnamed() ? saveSceneAs( scene ) : scene->save(); +} + + + void MainWindow::closeEvent(QCloseEvent *event) + { + bool saveAll = false; + QList< QMdiSubWindow * > subs = m_mdiArea->subWindowList(); + foreach( QMdiSubWindow *sub, subs ) { + QCDView *cdview = dynamic_cast< QCDView * >( sub->widget() ); + if( !cdview ) + continue; + + QCDScene *scene = cdview->scene(); + if( !scene || scene->isSaved() ) + continue; + + bool save = saveAll; + if( !save ) { + QMessageBox::StandardButton button = + QMessageBox::question( this, + tr( "Confirmation" ), + scene->name() + tr( " is unsaved, do you want to save?" ), + QMessageBox::Save | QMessageBox::SaveAll | QMessageBox::Discard | QMessageBox::Cancel ); + if( button == QMessageBox::Cancel ) { + event->ignore(); + return; + } + if( button == QMessageBox::SaveAll ) { + saveAll = true; + save = true; + } + if( button == QMessageBox::Save ) + save = true; + } + if( save ) + if( !saveScene( scene ) ) { + event->ignore(); + return; + } + } + event->accept(); + } + void MainWindow::onMenuNew() { QCDView *newView = new QCDView; @@ -190,15 +245,16 @@ void MainWindow::onMenuOpen() void MainWindow::onMenuSave() { - QCDScene *cdscene = getScene( m_mdiArea ); - if( !cdscene ) - return; + QCDScene *scene = getScene( m_mdiArea ); + if( scene ) + saveScene( scene ); +} - if( cdscene->isUnnamed() ) { - onMenuSaveAs(); - return; - } - cdscene->save(); +void MainWindow::onMenuSaveAs() +{ + QCDScene *scene = getScene( m_mdiArea ); + if( scene ) + saveSceneAs( scene ); } void MainWindow::onMenuPrintPreview() @@ -218,6 +274,7 @@ void MainWindow::onMenuPrintPreview() QLabel *label = new QLabel; label->setPixmap( pixmap ); QMdiSubWindow *subWindow = m_mdiArea->addSubWindow( label ); + subWindow->setWindowTitle( "Preview: " + cdscene->name() ); subWindow->show(); } catch( const QString &err ) { @@ -234,33 +291,12 @@ void MainWindow::onMenuPrint() QDialogProgress::exec( this, cdscene ); } -void MainWindow::onMenuSaveAs() -{ - QCDScene *cdscene = getScene( m_mdiArea ); - if( !cdscene ) - return; - - QString fileName = - QFileDialog::getSaveFileName( this, - tr( "Save as:" ), - QString(), - tr("qlscribe document (*.qlx)") ); - if( fileName.isNull() ) - return; - - if( !fileName.contains( '.' ) ) - fileName += ".qlx"; - - cdscene->saveAs( fileName ); -} - - void MainWindow::onMenuAbout() { QMessageBox::about( this, tr( "About" ), tr( "

qlscribe - Qt lisghtScribe

" - "

release 0.2 $Revision$

" + "

release 0.3 $Revision$

" "

visit project at home page " "qlscribe.sourceforge.net

" ) ); } diff --git a/src/mainwindow.h b/src/mainwindow.h index f27fad8..05eae52 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -25,6 +25,7 @@ class QMdiArea; class QSignalMapper; +class QCDScene; class MainWindow : public QMainWindow { Q_OBJECT @@ -33,6 +34,10 @@ public: explicit MainWindow(QWidget *parent = 0); virtual ~MainWindow(); + bool saveScene( QCDScene *scene ); +protected: + virtual void closeEvent( QCloseEvent *event ); + private slots: void onMenuNew(); void onMenuOpen(); @@ -45,6 +50,8 @@ private slots: void onMenuQtAbout(); private: + bool saveSceneAs( QCDScene *scene ); + QMdiArea *m_mdiArea; QMenu *m_menuFile; diff --git a/src/qcdscene.cpp b/src/qcdscene.cpp index 173cb1f..23edf98 100644 --- a/src/qcdscene.cpp +++ b/src/qcdscene.cpp @@ -35,7 +35,7 @@ QCDScene::QCDScene( QObject * parent ) : QGraphicsScene( parent ), m_index( 0 ), - m_saved( false ) + m_saved( true ) { setSceneRect( -60.0, -60.0, 60.0 * 2, 60.0 * 2 ); } @@ -67,18 +67,19 @@ bool QCDScene::load( const QString &fileName ) return true; } -void QCDScene::save() +bool QCDScene::save() { QFile file( m_fileName ); if( !file.open( QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text ) ) { QMessageBox::warning( 0, tr( "Warning" ), tr( "Cannot open file for writing: " ) + m_fileName ); - return; + return false; } QXmlStreamWriter writer( &file ); writer.setAutoFormatting( true ); write( writer ); m_saved = true; setName(); + return true; } void QCDScene::setName() @@ -116,12 +117,12 @@ void QCDScene::updateTitles() const } } -void QCDScene::saveAs( const QString &fileName ) +bool QCDScene::saveAs( const QString &fileName ) { QFile file( fileName ); if( !file.open( QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text ) ) { QMessageBox::warning( 0, tr( "Warning" ), tr( "Cannot open file for writing: " ) + fileName ); - return; + return false; } QXmlStreamWriter writer( &file ); writer.setAutoFormatting( true ); @@ -129,6 +130,7 @@ void QCDScene::saveAs( const QString &fileName ) m_saved = true; m_fileName = fileName; setName(); + return true; } void QCDScene::write( QXmlStreamWriter &writer ) diff --git a/src/qcdscene.h b/src/qcdscene.h index bb75a56..1c16f2d 100644 --- a/src/qcdscene.h +++ b/src/qcdscene.h @@ -38,8 +38,8 @@ public: void setChanged(); void setName(); bool load( const QString &fileName ); - void save(); - void saveAs( const QString &fileName ); + bool save(); + bool saveAs( const QString &fileName ); void updateTitles() const; QString name() const { return m_name; } diff --git a/src/qcdview.cpp b/src/qcdview.cpp index da10cc6..afe25a5 100644 --- a/src/qcdview.cpp +++ b/src/qcdview.cpp @@ -16,10 +16,14 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - $Id:$ */ + $Id$ */ #include "qcdview.h" #include "qcdscene.h" +#include "mainwindow.h" + +#include +#include QCDView::QCDView( QWidget *parent ) : QGraphicsView( parent ), @@ -49,6 +53,33 @@ QCDScene *QCDView::scene() const return static_cast< QCDScene * >( QGraphicsView::scene() ); } +void QCDView::closeEvent( QCloseEvent *event ) +{ + QCDScene *cdscene = scene(); + if( cdscene && !cdscene->isSaved() ) { + QMessageBox::StandardButton button = + QMessageBox::question( this, + tr( "Confitmation" ), + cdscene->name() + tr( " is changed, do you want to save it?" ), + QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel ); + + if( button == QMessageBox::Cancel ) { + event->ignore(); + return; + } + if( button == QMessageBox::Yes ) { + QWidget *parent = parentWidget(); + for( ; parent->parentWidget(); parent = parent->parentWidget() ); + if( !static_cast< MainWindow * >( parent )->saveScene( cdscene ) ) { + event->ignore(); + return; + } + } + + } + event->accept(); +} + inline void drawCircle( QPainter *painter, double radi ) { diff --git a/src/qcdview.h b/src/qcdview.h index 68aba33..5c1eb44 100644 --- a/src/qcdview.h +++ b/src/qcdview.h @@ -16,7 +16,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - $Id:$ */ + $Id$ */ #ifndef QCDVIEW_H #define QCDVIEW_H @@ -39,6 +39,7 @@ public: virtual QSize sizeHint () const; protected: + virtual void closeEvent( QCloseEvent *event ); void drawForeground ( QPainter * painter, const QRectF & rect ); void drawBackground ( QPainter * painter, const QRectF & rect ); diff --git a/src/qdialogprogress.cpp b/src/qdialogprogress.cpp index e141a6b..51800ad 100644 --- a/src/qdialogprogress.cpp +++ b/src/qdialogprogress.cpp @@ -22,6 +22,7 @@ #include "ui_qdialogprogress.h" #include "qlightscribe.h" #include "qdialogprint.h" +#include "qcdscene.h" #include #include @@ -67,6 +68,7 @@ bool QDialogProgress::exec( QWidget *parent, QCDScene *scene ) QLightScribe *scribe = QLightScribe::instance(); QDialogProgress dialog( parent ); + dialog.setWindowTitle( tr( "Printing: " ) + scene->name() ); connect( dialog.m_ui->buttonBox, SIGNAL(clicked(QAbstractButton*)), &dialog, SLOT(onButtonClicked(QAbstractButton*)) ); connect( scribe, SIGNAL(prepareProgress(long,long)), &dialog, SLOT(onPrepareProgress(long,long)) );