diff --git a/sources/titleblock/qettemplateeditor.cpp b/sources/titleblock/qettemplateeditor.cpp index 9daebae47..09a2e1b63 100644 --- a/sources/titleblock/qettemplateeditor.cpp +++ b/sources/titleblock/qettemplateeditor.cpp @@ -300,6 +300,7 @@ void QETTitleBlockTemplateEditor::initActions() { quit_ = new QAction(QET::Icons::ApplicationExit, tr("&Quitter", "menu entry"), this); undo_ = undo_stack_ -> createUndoAction(this); redo_ = undo_stack_ -> createRedoAction(this); + edit_info_ = new QAction(QET::Icons::UserInformations, tr("\311diter les informations compl\351mentaires", "menu entry"), this); zoom_in_ = new QAction(QET::Icons::ZoomIn, tr("Zoom avant", "menu entry"), this); zoom_out_ = new QAction(QET::Icons::ZoomOut, tr("Zoom arri\350re", "menu entry"), this); zoom_fit_ = new QAction(QET::Icons::ZoomFitBest, tr("Zoom adapt\351", "menu entry"), this); @@ -318,6 +319,7 @@ void QETTitleBlockTemplateEditor::initActions() { quit_ -> setShortcut(QKeySequence(tr("Ctrl+Q", "shortcut to quit"))); undo_ -> setShortcut(QKeySequence::Undo); redo_ -> setShortcut(QKeySequence::Redo); + edit_info_ -> setShortcut(QKeySequence(tr("Ctrl+Y", "shortcut to edit extra information"))); merge_cells_ -> setShortcut(QKeySequence(tr("Ctrl+K", "shortcut to merge cells"))); split_cell_ -> setShortcut(QKeySequence(tr("Ctrl+J", "shortcut to split merged cell"))); zoom_in_ -> setShortcut(QKeySequence::ZoomIn); @@ -336,6 +338,7 @@ void QETTitleBlockTemplateEditor::initActions() { connect(zoom_out_, SIGNAL(triggered()), template_edition_area_view_, SLOT(zoomOut())); connect(zoom_fit_, SIGNAL(triggered()), template_edition_area_view_, SLOT(zoomFit())); connect(zoom_reset_, SIGNAL(triggered()), template_edition_area_view_, SLOT(zoomReset())); + connect(edit_info_, SIGNAL(triggered()), this, SLOT(editTemplateInformation())); connect(merge_cells_, SIGNAL(triggered()), template_edition_area_view_, SLOT(mergeSelectedCells())); connect(split_cell_, SIGNAL(triggered()), template_edition_area_view_, SLOT(splitSelectedCell())); } @@ -360,9 +363,10 @@ void QETTitleBlockTemplateEditor::initMenus() { edit_menu_ -> addAction(undo_); edit_menu_ -> addAction(redo_); edit_menu_ -> addSeparator(); + edit_menu_ -> addAction(merge_cells_); edit_menu_ -> addAction(split_cell_); - + edit_menu_ -> addAction(edit_info_); display_menu_ -> addAction(zoom_in_); display_menu_ -> addAction(zoom_out_); display_menu_ -> addAction(zoom_fit_); @@ -776,3 +780,46 @@ void QETTitleBlockTemplateEditor::savePreviewWidthToApplicationSettings(int form Q_UNUSED(former_preview_width) QETApp::settings().setValue("titleblocktemplateeditor/preview_width", new_preview_width); } + +/** + Edit extra information attached to the template. +*/ +void QETTitleBlockTemplateEditor::editTemplateInformation() { + if (!tb_template_) return; + + QDialog dialog_author(this); + dialog_author.setModal(true); +#ifdef Q_WS_MAC + dialog_author.setWindowFlags(Qt::Sheet); +#endif + dialog_author.setMinimumSize(400, 260); + dialog_author.setWindowTitle(tr("\311diter les informations compl\351mentaires", "window title")); + QVBoxLayout *dialog_layout = new QVBoxLayout(&dialog_author); + + // explanation label + QLabel *information_label = new QLabel(tr("Vous pouvez utiliser ce champ libre pour mentionner les auteurs du cartouche, sa licence, ou tout autre renseignement que vous jugerez utile.")); + information_label -> setAlignment(Qt::AlignJustify | Qt::AlignVCenter); + information_label -> setWordWrap(true); + dialog_layout -> addWidget(information_label); + + // add a QTextEdit to the dialog + QTextEdit *text_field = new QTextEdit(); + text_field -> setAcceptRichText(false); + text_field -> setPlainText(tb_template_ -> information()); + text_field -> setReadOnly(read_only_); + dialog_layout -> addWidget(text_field); + + // add two buttons to the dialog + QDialogButtonBox *dialog_buttons = new QDialogButtonBox(read_only_ ? QDialogButtonBox::Ok : QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + dialog_layout -> addWidget(dialog_buttons); + connect(dialog_buttons, SIGNAL(accepted()), &dialog_author, SLOT(accept())); + connect(dialog_buttons, SIGNAL(rejected()), &dialog_author, SLOT(reject())); + + // run the dialog + if (dialog_author.exec() == QDialog::Accepted && !read_only_) { + QString new_info = text_field -> toPlainText(); + if (new_info != tb_template_ -> information()) { + pushUndoCommand(new ChangeTemplateInformationsCommand(tb_template_, tb_template_ -> information(), new_info)); + } + } +} diff --git a/sources/titleblock/qettemplateeditor.h b/sources/titleblock/qettemplateeditor.h index 6d20d550f..9ca10404c 100644 --- a/sources/titleblock/qettemplateeditor.h +++ b/sources/titleblock/qettemplateeditor.h @@ -49,7 +49,7 @@ class QETTitleBlockTemplateEditor : public QETMainWindow { QMenu *file_menu_, *edit_menu_,/* *paste_from_menu_, */*display_menu_,/* *tools_menu_*/; /// actions QAction *new_, *open_, *open_from_file_, *save_, *save_as_, *save_as_file_, *quit_; - QAction *undo_, *redo_, *merge_cells_, *split_cell_; + QAction *undo_, *redo_, *edit_info_, *merge_cells_, *split_cell_; QAction *zoom_in_, *zoom_out_, *zoom_fit_, *zoom_reset_; /// Location of the currently edited template TitleBlockTemplateLocation location_; @@ -117,6 +117,7 @@ class QETTitleBlockTemplateEditor : public QETMainWindow { void setReadOnly(bool); void quit(); void savePreviewWidthToApplicationSettings(int, int); + void editTemplateInformation(); private slots: TitleBlockTemplateLocation getTitleBlockTemplateLocationFromUser(const QString & = QString(), bool existing_only = true); diff --git a/sources/titleblock/templatecommands.cpp b/sources/titleblock/templatecommands.cpp index a0e7cd55a..df91b299b 100644 --- a/sources/titleblock/templatecommands.cpp +++ b/sources/titleblock/templatecommands.cpp @@ -777,3 +777,40 @@ void SplitCellsCommand::redo() { if (view_) view_ -> updateLayout(); } + + +/** + Constructor + @param tbt Changed title block template + @param old_info Former information + @param new_info New information + @param parent Parent QUndoCommand +*/ +ChangeTemplateInformationsCommand::ChangeTemplateInformationsCommand(TitleBlockTemplate *tbt, const QString &old_info, const QString &new_info, QUndoCommand *parent) : + QUndoCommand(QObject::tr("modification des informations compl\351mentaires", "undo caption"), parent), + tbtemplate_(tbt), + old_information_(old_info), + new_information_(new_info) +{ +} + +/** + Destructor +*/ +ChangeTemplateInformationsCommand::~ChangeTemplateInformationsCommand() { +} + +/** + Undo the information change +*/ +void ChangeTemplateInformationsCommand::undo() { + if (!tbtemplate_) return; + tbtemplate_ -> setInformation(old_information_); +} + +/** + Redo the information change +*/ +void ChangeTemplateInformationsCommand::redo() { + tbtemplate_ -> setInformation(new_information_); +} diff --git a/sources/titleblock/templatecommands.h b/sources/titleblock/templatecommands.h index 97014d3a0..10dbcb650 100644 --- a/sources/titleblock/templatecommands.h +++ b/sources/titleblock/templatecommands.h @@ -222,4 +222,30 @@ class SplitCellsCommand : public TitleBlockTemplateCommand { int col_span_before_; ///< the col_span attribute of the spanning cell after the merge }; +/** + This class represents the action of changing extra information of a title + block template. +*/ +class ChangeTemplateInformationsCommand : public QUndoCommand { + // constructors, destructor + public: + ChangeTemplateInformationsCommand(TitleBlockTemplate *, const QString &, const QString &, QUndoCommand * = 0); + virtual ~ChangeTemplateInformationsCommand(); + private: + ChangeTemplateInformationsCommand(const ChangeTemplateInformationsCommand &); + + // methods + public: + virtual void undo(); + virtual void redo(); + + // attributes + private: + /// chnged title block template + TitleBlockTemplate *tbtemplate_; + /// Informations before they are modified + QString old_information_; + /// Informations after they were modified + QString new_information_; +}; #endif diff --git a/sources/titleblocktemplate.cpp b/sources/titleblocktemplate.cpp index 69efaf67c..6dd0a63a2 100644 --- a/sources/titleblocktemplate.cpp +++ b/sources/titleblocktemplate.cpp @@ -111,6 +111,7 @@ bool TitleBlockTemplate::loadFromXmlElement(const QDomElement &xml_element) { } name_ = xml_element.attribute("name"); + loadInformation(xml_element); loadLogos(xml_element, true); loadGrid(xml_element); @@ -158,6 +159,7 @@ bool TitleBlockTemplate::saveToXmlElement(QDomElement &xml_element) const { xml_element.setTagName("titleblocktemplate"); xml_element.setAttribute("name", name_); + saveInformation(xml_element); saveLogos(xml_element); saveGrid(xml_element); return(true); @@ -170,6 +172,7 @@ bool TitleBlockTemplate::saveToXmlElement(QDomElement &xml_element) const { TitleBlockTemplate *TitleBlockTemplate::clone() const { TitleBlockTemplate *copy = new TitleBlockTemplate(); copy -> name_ = name_; + copy -> information_ = information_; // this does not really duplicates pixmaps, only the objects that hold a key to the implicitly shared pixmaps foreach (QString logo_key, bitmap_logos_.keys()) { @@ -214,6 +217,17 @@ TitleBlockTemplate *TitleBlockTemplate::clone() const { return(copy); } +/** + Import text informations from a given XML title block template. +*/ +void TitleBlockTemplate::loadInformation(const QDomElement &xml_element) { + for (QDomNode n = xml_element.firstChild() ; !n.isNull() ; n = n.nextSibling()) { + if (n.isElement() && n.toElement().tagName() == "information") { + setInformation(n.toElement().text()); + } + } +} + /** Import the logos from a given XML titleblock template. @param xml_element An XML element representing an titleblock template. @@ -453,6 +467,18 @@ void TitleBlockTemplate::loadCell(const QDomElement &cell_element) { } } +/** + Export this template's extra information. + @param xml_element XML element under which extra informations will be attached +*/ +void TitleBlockTemplate::saveInformation(QDomElement &xml_element) const { + QDomNode information_text_node = xml_element.ownerDocument().createTextNode(information()); + + QDomElement information_element = xml_element.ownerDocument().createElement("information"); + information_element.appendChild(information_text_node); + xml_element.appendChild(information_element); +} + /** Export this template's logos as XML @param xml_element XML Element under which the \ element will be attached @@ -689,6 +715,20 @@ QString TitleBlockTemplate::name() const { return(name_); } +/** + @return the information field attached to this template +*/ +QString TitleBlockTemplate::information() const { + return(information_); +} + +/** + @param info information to be attached to this template +*/ +void TitleBlockTemplate::setInformation(const QString &info) { + information_ = info; +} + /** @param i row index @return the height of the row at index i diff --git a/sources/titleblocktemplate.h b/sources/titleblocktemplate.h index ba0bf52e1..f1a577ddd 100644 --- a/sources/titleblocktemplate.h +++ b/sources/titleblocktemplate.h @@ -51,6 +51,8 @@ class TitleBlockTemplate : public QObject { bool saveToXmlElement(QDomElement &) const; TitleBlockTemplate *clone() const; QString name() const; + QString information() const; + void setInformation(const QString &); int rowDimension(int); void setRowDimension(int, const TitleBlockDimension &); TitleBlockDimension columnDimension(int); @@ -95,11 +97,13 @@ class TitleBlockTemplate : public QObject { QString toString() const; protected: + void loadInformation(const QDomElement &); bool loadLogos(const QDomElement &, bool = false); bool loadLogo(const QDomElement &); bool loadGrid(const QDomElement &); bool loadCells(const QDomElement &); void loadCell(const QDomElement &); + void saveInformation(QDomElement &) const; void saveLogos(QDomElement &) const; void saveLogo(const QString &, QDomElement &) const; void saveGrid(QDomElement &) const; @@ -125,7 +129,8 @@ class TitleBlockTemplate : public QObject { // attributes private: - QString name_; ///< name identifying the Title Block Template within its parent project + QString name_; ///< name identifying the Title Block Template within its parent collection + QString information_; QHash data_logos_; ///< Logos raw data QHash storage_logos_; ///< Logos applied storage type (e.g. "xml" or "base64") @@ -134,7 +139,7 @@ class TitleBlockTemplate : public QObject { QHash bitmap_logos_; ///< Pixmaps for bitmap logos QList rows_heights_; ///< rows heights -- simple integers - QList columns_width_; ///< columns widths -- @see TitleBlockColDimension + QList columns_width_; ///< columns widths -- @see TitleBlockColDimension QList registered_cells_; ///< Cells objects created rattached to this template, but not mandatorily used QList< QList > cells_; ///< Cells grid };