diff --git a/sources/projectconfigpages.cpp b/sources/projectconfigpages.cpp new file mode 100644 index 000000000..07a93dfff --- /dev/null +++ b/sources/projectconfigpages.cpp @@ -0,0 +1,252 @@ +#include "projectconfigpages.h" +#include "qeticons.h" +#include "qetproject.h" +#include "borderpropertieswidget.h" +#include "conductorpropertieswidget.h" +#include "titleblockpropertieswidget.h" +#include + +/** + Constructor + @param project Project this page is editing. + @param parent Parent QWidget +*/ +ProjectConfigPage::ProjectConfigPage(QETProject *project, QWidget *parent) : + ConfigPage(parent), + project_(project) +{ +} + +/** + Destructor +*/ +ProjectConfigPage::~ProjectConfigPage() { +} + +/** + @return the project being edited by this page +*/ +QETProject *ProjectConfigPage::project() const { + return(project_); +} + +/** + Set \a new_project as the project being edited by this page. + @param read_values True to read values from the project into widgets before setting them read only accordingly, false otherwise. Defaults to true. + @return the former project +*/ +QETProject *ProjectConfigPage::setProject(QETProject *new_project, bool read_values) { + if (new_project == project_) return(project_); + + QETProject *former_project = project_; + project_ = new_project; + if (project_ && read_values) { + readValuesFromProject(); + adjustReadOnly(); + } + return(former_project); +} + +/** + Apply the configuration after user input +*/ +void ProjectConfigPage::applyConf() { + if (!project_ || project_ -> isReadOnly()) return; + applyProjectConf(); +} + +/** + Initialize the page by calling initWidgets() and initLayout(). Also call + readValuesFromProject() and adjustReadOnly() if a non-zero project has been + set. Typically, you should call this function in your subclass constructor. +*/ +void ProjectConfigPage::init() { + initWidgets(); + initLayout(); + if (project_) { + readValuesFromProject(); + adjustReadOnly(); + } +} + +/** + Constructor + @param project Project this page is editing. + @param parent Parent QWidget +*/ +ProjectMainConfigPage::ProjectMainConfigPage(QETProject *project, QWidget *parent) : + ProjectConfigPage(project, parent) +{ + init(); +} + +/** + Destructor +*/ +ProjectMainConfigPage::~ProjectMainConfigPage() { +} + +/** + @return the title for this page +*/ +QString ProjectMainConfigPage::title() const { + return(tr("G\351n\351ral", "configuration page title")); +} + +/** + @return the icon for this page +*/ +QIcon ProjectMainConfigPage::icon() const { + return(QET::Icons::Settings); +} + +/** + Apply the configuration after user input +*/ +void ProjectMainConfigPage::applyProjectConf() { + project_ -> setTitle(title_value_ -> text()); +} + +/** + @return the project title entered by the user +*/ +QString ProjectMainConfigPage::projectTitle() const { + return(title_value_ -> text()); +} + +/** + Initialize widgets displayed by the page. +*/ +void ProjectMainConfigPage::initWidgets() { + title_label_ = new QLabel(tr("Titre du projet\240:", "label when configuring")); + title_value_ = new QLineEdit(); +} + +/** + Initialize the layout of this page. +*/ +void ProjectMainConfigPage::initLayout() { + QVBoxLayout *main_layout0 = new QVBoxLayout(); + QHBoxLayout *title_layout0 = new QHBoxLayout(); + title_layout0 -> addWidget(title_label_); + title_layout0 -> addWidget(title_value_); + main_layout0 -> addLayout(title_layout0); + main_layout0 -> addStretch(); + setLayout(main_layout0); +} + +/** + Read properties from the edited project then fill widgets with them. +*/ +void ProjectMainConfigPage::readValuesFromProject() { + title_value_ -> setText(project_ -> title()); +} + +/** + Set the content of this page read only if the project is read only, + editable if the project is editable. + */ +void ProjectMainConfigPage::adjustReadOnly() { + bool is_read_only = project_ -> isReadOnly(); + title_value_ -> setReadOnly(is_read_only); +} + +/** + Constructor + @param project Project this page is editing. + @param parent Parent QWidget +*/ +ProjectNewDiagramConfigPage::ProjectNewDiagramConfigPage(QETProject *project, QWidget *parent) : + ProjectConfigPage(project, parent) +{ + init(); +} + +/** + Destructor +*/ +ProjectNewDiagramConfigPage::~ProjectNewDiagramConfigPage() { +} + +/** + @return the title for this page +*/ +QString ProjectNewDiagramConfigPage::title() const { + return(tr("Nouveau sch\351ma", "project configuration page title")); +} + +/** + @return the icon for this page +*/ +QIcon ProjectNewDiagramConfigPage::icon() const { + return(QET::Icons::NewDiagram); +} + +/** + Apply the configuration after user input +*/ +void ProjectNewDiagramConfigPage::applyProjectConf() { + project_ -> setDefaultBorderProperties(border_ -> borderProperties()); + project_ -> setDefaultTitleBlockProperties(titleblock_ -> titleBlockProperties()); + project_ -> setDefaultConductorProperties(conductor_ -> conductorProperties()); +} + +/** + Initialize widgets displayed by the page. +*/ +void ProjectNewDiagramConfigPage::initWidgets() { + informative_label_ = new QLabel( + tr( + "Propri\351t\351s \340 utiliser lors de l'ajout d'un nouveau sch\351ma au projet :", + "explicative label" + ) + ); + border_ = new BorderPropertiesWidget(BorderProperties()); + titleblock_ = new TitleBlockPropertiesWidget(TitleBlockProperties(), true); + conductor_ = new ConductorPropertiesWidget(); + conductor_ -> setContentsMargins(0, 0, 0, 0); +} + +/** + Initialize the layout of this page. +*/ +void ProjectNewDiagramConfigPage::initLayout() { + // put border properties above title block properties + QVBoxLayout *vlayout2 = new QVBoxLayout(); + vlayout2 -> addWidget(border_); + vlayout2 -> addWidget(titleblock_); + vlayout2 -> setSpacing(5); + + // add conductor properties on the right + QHBoxLayout *hlayout1 = new QHBoxLayout(); + hlayout1 -> addLayout(vlayout2); + hlayout1 -> addWidget(conductor_); + hlayout1 -> setAlignment(conductor_, Qt::AlignTop); + + // add the informative label above previous widgets + QVBoxLayout *vlayout1 = new QVBoxLayout(); + vlayout1 -> addWidget(informative_label_); + vlayout1 -> addLayout(hlayout1); + vlayout1 -> addStretch(); + setLayout(vlayout1); +} + +/** + Read properties from the edited project then fill widgets with them. +*/ +void ProjectNewDiagramConfigPage::readValuesFromProject() { + border_ -> setEditedBorder(project_ -> defaultBorderProperties()); + conductor_ -> setConductorProperties(project_ -> defaultConductorProperties()); + titleblock_ -> setTitleBlockProperties(project_ -> defaultTitleBlockProperties()); +} + +/** + Set the content of this page read only if the project is read only, + editable if the project is editable. + */ +void ProjectNewDiagramConfigPage::adjustReadOnly() { + bool is_read_only = project_ -> isReadOnly(); + border_ -> setReadOnly(is_read_only); + titleblock_ -> setReadOnly(is_read_only); + conductor_ -> setReadOnly(is_read_only); +} diff --git a/sources/projectconfigpages.h b/sources/projectconfigpages.h new file mode 100644 index 000000000..97a1f9448 --- /dev/null +++ b/sources/projectconfigpages.h @@ -0,0 +1,126 @@ +#ifndef PROJECTCONFIGPAGES_H +#define PROJECTCONFIGPAGES_H +#include "configpage.h" +class QLabel; +class QLineEdit; +class QETProject; +class BorderPropertiesWidget; +class TitleBlockPropertiesWidget; +class ConductorPropertiesWidget; + +/** + This class, derived from ConfigPage, aims at providing the basic skeleton + for a project configuration page. +*/ +class ProjectConfigPage : public ConfigPage { + Q_OBJECT + // Constructor, destructor + public: + ProjectConfigPage(QETProject *, QWidget * = 0); + virtual ~ProjectConfigPage(); + private: + ProjectConfigPage(const ProjectConfigPage &); + + // methods + public: + virtual QETProject *project() const; + virtual QETProject *setProject(QETProject *project, bool = true); + virtual void applyConf(); + /** + Apply configuration to the project after user input. This method is + automatically called when the ConfigDialog is validated, and only if the + project is both non-zero and not read-only. + */ + virtual void applyProjectConf() = 0; + + protected: + virtual void init(); + /** + Use this pure virtual method to initialize your page widgets. + */ + virtual void initWidgets() = 0; + /** + Use this pure virtual method to initialize your page layout. This method is + always called after initWidgets(). + */ + virtual void initLayout() = 0; + /** + Use this pure virtual method to fill widgets with project values. + */ + virtual void readValuesFromProject() = 0; + /** + Use this pure virtual method to adjust the "read only" state of your page + widgets according to the currently edited project. + */ + virtual void adjustReadOnly() = 0; + + // attributes + protected: + QETProject *project_; ///< Currently edited project +}; + +/** + This page enables users to configure the main properties of a project. +*/ +class ProjectMainConfigPage : public ProjectConfigPage { + Q_OBJECT + // Constructor, destructor + public: + ProjectMainConfigPage(QETProject *, QWidget * = 0); + virtual ~ProjectMainConfigPage(); + private: + ProjectMainConfigPage(const ProjectMainConfigPage &); + + // methods + public: + QString title() const; + QIcon icon() const; + void applyProjectConf(); + QString projectTitle() const; + + protected: + void initWidgets(); + void initLayout(); + void readValuesFromProject(); + void adjustReadOnly(); + + // attributes + protected: + QLabel *title_label_; + QLineEdit *title_value_; +}; + +/** + This page enables users to configure the default properties of diagrams + newly added to the edited project. +*/ +class ProjectNewDiagramConfigPage : public ProjectConfigPage { + Q_OBJECT + // Constructor, destructor + public: + ProjectNewDiagramConfigPage(QETProject *, QWidget * = 0); + virtual ~ProjectNewDiagramConfigPage(); + private: + ProjectNewDiagramConfigPage(const ProjectNewDiagramConfigPage &); + + // methods + public: + QString title() const; + QIcon icon() const; + void applyProjectConf(); + + protected: + void initWidgets(); + void initLayout(); + void readValuesFromProject(); + void adjustReadOnly(); + + // attributes + private: + QLabel *informative_label_; + BorderPropertiesWidget *border_; + TitleBlockPropertiesWidget *titleblock_; + ConductorPropertiesWidget *conductor_; +}; + +#endif diff --git a/sources/projectview.cpp b/sources/projectview.cpp index 84d1f7065..c47238018 100644 --- a/sources/projectview.cpp +++ b/sources/projectview.cpp @@ -17,6 +17,8 @@ */ #include "projectview.h" #include "qetproject.h" +#include "configdialog.h" +#include "projectconfigpages.h" #include "diagramview.h" #include "diagram.h" #include "diagramprintdialog.h" @@ -400,85 +402,18 @@ void ProjectView::showDiagram(Diagram *diagram) { } /** - Affiche un dialogue permettant a l'utilisateur d'editer les proprietes du - projet. + Enable the user to edit properties of the current project through a + configuration dialog. */ void ProjectView::editProjectProperties() { if (!project_) return; - bool project_is_read_only = project_ -> isReadOnly(); - - // dialogue d'edition des proprietes du projet - QDialog properties_dialog(parentWidget()); -#ifdef Q_WS_MAC - properties_dialog.setWindowFlags(Qt::Sheet); -#endif - - properties_dialog.setMinimumWidth(786); - properties_dialog.setMinimumHeight(585); + ConfigDialog properties_dialog(parentWidget()); + properties_dialog.setMinimumSize(786, 585); properties_dialog.setWindowTitle(tr("Propri\351t\351s du projet", "window title")); - - // titre du projet - QLabel *title_label = new QLabel(tr("Titre du projet :")); - QLineEdit *title_field = new QLineEdit(project_ -> title()); - title_field -> setReadOnly(project_is_read_only); - - // proprietes des nouveaux schemas - QLabel *new_diagrams_prop = new QLabel(tr("Propri\351t\351s \340 utiliser lors de l'ajout d'un nouveau sch\351ma au projet :")); - - // dimensions par defaut d'un schema - BorderPropertiesWidget *bpw = new BorderPropertiesWidget(project_ -> defaultBorderProperties()); - bpw -> setReadOnly(project_is_read_only); - - // proprietes par defaut d'un cartouche - TitleBlockPropertiesWidget *ipw = new TitleBlockPropertiesWidget(project_ -> defaultTitleBlockProperties(), true); - ipw -> setReadOnly(project_is_read_only); - - // proprietes par defaut des conducteurs - ConductorPropertiesWidget *cpw = new ConductorPropertiesWidget(project_ -> defaultConductorProperties()); - cpw -> setContentsMargins(0, 0, 0, 0); - cpw -> setReadOnly(project_is_read_only); - - // boutons pour valider le dialogue - QDialogButtonBox *buttons = new QDialogButtonBox(project_is_read_only ? QDialogButtonBox::Ok : QDialogButtonBox::Ok | QDialogButtonBox::Cancel); - - connect(buttons, SIGNAL(accepted()), &properties_dialog, SLOT(accept())); - connect(buttons, SIGNAL(rejected()), &properties_dialog, SLOT(reject())); - - // agencement avec deux layouts : un vertical, un horizontal - QHBoxLayout *horiz_layout = new QHBoxLayout(); - horiz_layout -> addWidget(title_label); - horiz_layout -> addWidget(title_field); - - QVBoxLayout *vlayout1 = new QVBoxLayout(); - - vlayout1 -> addWidget(new_diagrams_prop); - - QHBoxLayout *hlayout1 = new QHBoxLayout(); - QVBoxLayout *vlayout2 = new QVBoxLayout(); - - vlayout2 -> addWidget(bpw); - vlayout2 -> addWidget(ipw); - vlayout2 -> setSpacing(5); - hlayout1 -> addLayout(vlayout2); - hlayout1 -> addWidget(cpw); - vlayout1 -> addLayout(hlayout1); - vlayout1 -> addStretch(1); - hlayout1 -> setAlignment(cpw, Qt::AlignTop); - - QVBoxLayout *vert_layout = new QVBoxLayout(&properties_dialog); - vert_layout -> addLayout(horiz_layout); - vert_layout -> addLayout(vlayout1); - vert_layout -> addStretch(); - vert_layout -> addWidget(buttons); - - // si le dialogue est accepte - if (properties_dialog.exec() == QDialog::Accepted && !project_is_read_only) { - project_ -> setTitle(title_field -> text()); - project_ -> setDefaultBorderProperties(bpw -> borderProperties()); - project_ -> setDefaultTitleBlockProperties(ipw -> titleBlockProperties()); - project_ -> setDefaultConductorProperties(cpw -> conductorProperties()); - } + properties_dialog.addPage(new ProjectMainConfigPage(project_)); + properties_dialog.addPage(new ProjectNewDiagramConfigPage(project_)); + properties_dialog.exec(); } /**