[qet] [1453] Handled window closing and added File > Open in the title block template editor.

[ Thread Index | Date Index | More lists.tuxfamily.org/qet Archives ]


Revision: 1453
Author:   xavier
Date:     2012-01-10 19:53:48 +0100 (Tue, 10 Jan 2012)
Log Message:
-----------
Handled window closing and added File > Open in the title block template editor.

Modified Paths:
--------------
    branches/0.3/sources/titleblock/qettemplateeditor.cpp
    branches/0.3/sources/titleblock/qettemplateeditor.h

Modified: branches/0.3/sources/titleblock/qettemplateeditor.cpp
===================================================================
--- branches/0.3/sources/titleblock/qettemplateeditor.cpp	2012-01-10 12:28:30 UTC (rev 1452)
+++ branches/0.3/sources/titleblock/qettemplateeditor.cpp	2012-01-10 18:53:48 UTC (rev 1453)
@@ -16,6 +16,7 @@
 	along with QElectroTech.  If not, see <http://www.gnu.org/licenses/>.
 */
 #include "qettemplateeditor.h"
+#include "qetmessagebox.h"
 #include "qeticons.h"
 #include "qetapp.h"
 #include "qetproject.h"
@@ -57,6 +58,46 @@
 }
 
 /**
+	@return true if the currently edited template can be closed. A template can be
+	closed if it has not been modified. If the template has been modified, this
+	method asks the user what he wants to do.
+*/
+bool QETTitleBlockTemplateEditor::canClose() {
+	if (undo_stack_ -> isClean()) return(true);
+	// ask the user whether he wants to save the current template
+	QMessageBox::StandardButton answer = QET::MessageBox::question(
+		this,
+		tr("Enregistrer le mod\350le en cours ?", "dialog title"),
+		QString(
+			tr(
+				"Voulez-vous enregistrer le mod\350le %1 ?",
+				"dialog content - %1 is a title block template name"
+			)
+		).arg(location_.name()),
+		QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel,
+		QMessageBox::Cancel
+	);
+	bool result;
+	switch(answer) {
+		case QMessageBox::Cancel: result = false;  break; // the user hits Cancel or closes the dialog: abort the closing
+		case QMessageBox::Yes:    result = save(); break; // the user hits Yes: la reussite depend de l'enregistrement
+		default:                  result = true;          // the user hits no: the editor can be closed
+	}
+	return(result);
+}
+
+/**
+	Handle the closing of the main window
+	@param qce The QCloseEvent event
+*/
+void QETTitleBlockTemplateEditor::closeEvent(QCloseEvent *qce) {
+	if (canClose()) {
+		setAttribute(Qt::WA_DeleteOnClose);
+		qce -> accept();
+	} else qce -> ignore();
+}
+
+/**
 	@param location Location of the tile block template to be edited.
 */
 bool QETTitleBlockTemplateEditor::edit(const TitleBlockTemplateLocation &location) {
@@ -175,6 +216,7 @@
 	QETApp *qet_app = QETApp::instance();
 	
 	new_            = new QAction(QET::Icons::DocumentNew,          tr("&Nouveau",                     "menu entry"), this);
+	open_           = new QAction(QET::Icons::DocumentOpen,         tr("&Ouvrir",                      "menu entry"), this);
 	save_           = new QAction(QET::Icons::DocumentSave,         tr("&Enregistrer",                 "menu entry"), this);
 	save_as_        = new QAction(QET::Icons::DocumentSave,         tr("Enregistrer sous",             "menu entry"), this);
 	quit_           = new QAction(QET::Icons::ApplicationExit,      tr("&Quitter",                     "menu entry"), this);
@@ -189,6 +231,7 @@
 	split_cell_     = new QAction(                                  tr("&S\351parer les cellules",     "menu entry"), this);
 	
 	new_              -> setShortcut(QKeySequence::New);
+	open_             -> setShortcut(QKeySequence::Open);
 	save_             -> setShortcut(QKeySequence::Save);
 	quit_             -> setShortcut(QKeySequence(tr("Ctrl+Q", "shortcut to quit")));
 	merge_cells_      -> setShortcut(QKeySequence(tr("Ctrl+K", "shortcut to merge cells")));
@@ -203,6 +246,7 @@
 	about_qt_     -> setStatusTip(tr("Affiche des informations sur la biblioth\350que Qt",              "status bar tip"));
 	
 	connect(new_,             SIGNAL(triggered()), this,     SLOT(newTemplate()));
+	connect(open_,            SIGNAL(triggered()), this,     SLOT(open()));
 	connect(save_,            SIGNAL(triggered()), this,     SLOT(save()));
 	connect(save_as_,         SIGNAL(triggered()), this,     SLOT(saveAs()));
 	connect(quit_,            SIGNAL(triggered()), this,     SLOT(quit()));
@@ -234,6 +278,7 @@
 	help_menu_    -> setTearOffEnabled(true);
 	
 	file_menu_    -> addAction(new_);
+	file_menu_    -> addAction(open_);
 	file_menu_    -> addAction(save_);
 	file_menu_    -> addAction(save_as_);
 	file_menu_    -> addSeparator();
@@ -391,9 +436,9 @@
 	@see QETProject::setTemplateXmlDescription()
 	@param location Location where the title block template should be saved.
 */
-void QETTitleBlockTemplateEditor::saveAs(const TitleBlockTemplateLocation &location) {
+bool QETTitleBlockTemplateEditor::saveAs(const TitleBlockTemplateLocation &location) {
 	TitleBlockTemplatesCollection *collection = location.parentCollection();
-	if (!collection) return;
+	if (!collection) return(false);
 	
 	QDomDocument doc;
 	QDomElement elmt = doc.createElement("root");
@@ -404,51 +449,78 @@
 	collection -> setTemplateXmlDescription(location.name(), elmt);
 	
 	location_ = location;
+	undo_stack_ -> setClean();
+	return(true);
 }
 
 /**
+	
+*/
+void QETTitleBlockTemplateEditor::open() {
+	TitleBlockTemplateLocation location = getTitleBlockTemplateLocationFromUser(
+		tr("Ouvrir un mod\350le", "File > open dialog window title"),
+		true
+	);
+	if (location.isValid()) {
+		QETApp::instance() -> openTitleBlockTemplate(location);
+	}
+}
+
+/**
 	Save the currently edited title block template back to its parent project.
 */
-void QETTitleBlockTemplateEditor::save() {
+bool QETTitleBlockTemplateEditor::save() {
 	if (location_.isValid()) {
-		saveAs(location_);
+		return(saveAs(location_));
 	} else {
-		saveAs();
+		return(saveAs());
 	}
 }
 
 /**
 	Ask the user where he wishes to save the currently edited template.
 */
-void QETTitleBlockTemplateEditor::saveAs() {
-	TitleBlockTemplateLocation location = getTitleBlockTemplateLocationFromUser();
+bool QETTitleBlockTemplateEditor::saveAs() {
+	TitleBlockTemplateLocation location = getTitleBlockTemplateLocationFromUser(
+		tr("Enregistrer le mod\350le sous", "dialog window title"),
+		false
+	);
 	if (location.isValid()) {
-		saveAs(location);
+		return(saveAs(location));
 	}
+	return(false);
 }
 
 /**
-	Ask the user for a title block template location @return The location chosen
-	by the user, or an empty TitleBlockTemplateLocation if the user cancelled the
-	dialog
+	Ask the user for a title block template location
+	@param title Title displayed by the dialog window
+	@param existing_only True for the user to be forced to choose an existing
+	template, false if he may specify the template name
+	@return The location chosen by the user, or an empty
+	TitleBlockTemplateLocation if the user cancelled the dialog
 */
-TitleBlockTemplateLocation QETTitleBlockTemplateEditor::getTitleBlockTemplateLocationFromUser() {
-	TitleBlockTemplateLocationSaver *saver = new TitleBlockTemplateLocationSaver(location());
+TitleBlockTemplateLocation QETTitleBlockTemplateEditor::getTitleBlockTemplateLocationFromUser(const QString &title, bool existing_only) {
+	TitleBlockTemplateLocationChooser *widget;
+	if (existing_only) {
+		widget = new TitleBlockTemplateLocationChooser(location());
+	} else {
+		widget = new TitleBlockTemplateLocationSaver(location());
+	}
 	QDialogButtonBox *buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
 	
 	QVBoxLayout *dialog_layout = new QVBoxLayout();
-	dialog_layout -> addWidget(saver);
+	dialog_layout -> addWidget(widget);
 	dialog_layout -> addWidget(buttons);
 	
 	QDialog dialog;
-	dialog.setWindowTitle(tr("Enregistrer le mod\350le sous", "dialog window title"));
+	dialog.setWindowTitle(title);
 	dialog.setLayout(dialog_layout);
 	
 	connect(buttons, SIGNAL(accepted()), &dialog, SLOT(accept()));
 	connect(buttons, SIGNAL(rejected()), &dialog, SLOT(reject()));
 	
 	if (dialog.exec() == QDialog::Accepted) {
-		return(saver -> location());
+		return(widget -> location());
 	}
 	return TitleBlockTemplateLocation();
 }
@@ -457,6 +529,5 @@
 	Close the current editor.
 */
 void QETTitleBlockTemplateEditor::quit() {
-	/// TODO save if needed
 	close();
 }

Modified: branches/0.3/sources/titleblock/qettemplateeditor.h
===================================================================
--- branches/0.3/sources/titleblock/qettemplateeditor.h	2012-01-10 12:28:30 UTC (rev 1452)
+++ branches/0.3/sources/titleblock/qettemplateeditor.h	2012-01-10 18:53:48 UTC (rev 1453)
@@ -49,7 +49,7 @@
 	/// menus TODO
 	QMenu *file_menu_, *edit_menu_,/* *paste_from_menu_, */*display_menu_,/* *tools_menu_,*/ *config_menu_, *help_menu_;
 	/// actions
-	QAction *new_, *save_, *save_as_, *quit_, *configure_, *about_qt_, *about_qet_, *merge_cells_, *split_cell_;
+	QAction *new_, *open_, *save_, *save_as_, *quit_, *configure_, *about_qt_, *about_qet_, *merge_cells_, *split_cell_;
 	QAction *zoom_in_, *zoom_out_, *zoom_fit_, *zoom_reset_;
 	/// Location of the currently edited template
 	TitleBlockTemplateLocation location_;
@@ -73,6 +73,8 @@
 	TitleBlockTemplateLocation location() const;
 	
 	protected:
+	bool canClose();
+	void closeEvent(QCloseEvent *);
 	
 	private:
 	void initActions();
@@ -89,17 +91,18 @@
 	bool edit(TitleBlockTemplate *);
 	void editLogos();
 	void newTemplate();
-	void save();
-	void saveAs();
+	void open();
+	bool save();
+	bool saveAs();
 	void quit();
 	
 	private slots:
-	TitleBlockTemplateLocation getTitleBlockTemplateLocationFromUser();
+	TitleBlockTemplateLocation getTitleBlockTemplateLocationFromUser(const QString & = QString(), bool existing_only = true);
 	void pushCellUndoCommand(ModifyTitleBlockCellCommand *);
 	void pushGridUndoCommand(TitleBlockTemplateCommand *);
 	void pushUndoCommand(QUndoCommand *);
 	void updateEditorTitle();
-	void saveAs(const TitleBlockTemplateLocation &);
+	bool saveAs(const TitleBlockTemplateLocation &);
 };
 
 #endif


Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/