Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // classeurs_model.cpp (qabstractitemmodel for binder files container from SQL database: ont able for binder,
- // one table for link foreign keys to other tables... each object on the app could have a binder or more...
- // each binder has files/directries content)
- // but... with the debugger, i can see all is construct,
- // Classeur is ok , childs and parents ok, root is ok... headers ok... view is set by the model...
- // but never see the result inside the treeview. Same if i add a binder (classeur is french world for binder)
- // WHY ? i think i forget something but... what ?
- #include "Classeurs/classeurs_model.h"
- #include "Classeurs/classeurs_treeview.h"
- #include "Classeurs/classeur.h"
- #include "user_controler.h"
- #include <QSqlQuery>
- #include <QSqlRecord>
- Classeurs_Model::Classeurs_Model(QObject *parent):
- QAbstractItemModel(parent) {
- db_coordonates.col_FK = "";
- db_coordonates.fields << "nom" << "comment"
- << "tree_id" << "tree_id_parent"
- << "id";
- db_coordonates.id_FK = 0;
- db_coordonates.table = "Classeurs";
- db_coordonates.linker_table = "ClasseurRef";
- datas_valid = false;
- QList<QVariant> headers;
- headers << tr("Nom") << tr("Description") << tr("id") << tr("id parent") << "ID";
- root_classeur = new Classeur(headers);
- for(int i(0); i < headers.count(); i++)
- setHeaderData(i, Qt::Horizontal, headers[i]);
- }
- Classeurs_Model::~Classeurs_Model() {
- }
- QModelIndex Classeurs_Model::parent(const QModelIndex &index) const {
- if(!index.isValid())
- return QModelIndex();
- Classeur *childClasseur = getClasseur(index);
- Classeur *parentClasseur = childClasseur->parent();
- if(parentClasseur == root_classeur)
- return QModelIndex();
- return createIndex(parentClasseur->childNumber(), 0, parentClasseur);
- }
- QModelIndex Classeurs_Model::index(int row,
- int column,
- const QModelIndex &parent) const {
- if(parent.isValid()) {
- Classeur *parentClasseur = reinterpret_cast<Classeur*>
- (parent.internalPointer());
- Classeur *classeur = parentClasseur->child(row);
- return createIndex(row, column, classeur); }
- return QModelIndex();
- }
- Qt::ItemFlags Classeurs_Model::flags(const QModelIndex &index) const {
- if(!index.isValid())
- return 0;
- return Qt::ItemIsEditable |
- Qt::ItemIsEnabled |
- Qt::ItemIsSelectable |
- QAbstractItemModel::flags(index);
- }
- QVariant Classeurs_Model::data(const QModelIndex &index,
- int role) const {
- if(index.isValid() && role == Qt::DisplayRole) {
- Classeur *classeur;
- classeur = getClasseur(index);
- return classeur->data(index.column()); }
- return QVariant();
- }
- bool Classeurs_Model::setData(const QModelIndex &index,
- const QVariant &value,
- int role) {
- if (role != Qt::EditRole || !index.isValid())
- return false;
- Classeur *classeur = getClasseur(index);
- bool result = classeur->setData(index.column(), value);
- if (result)
- emit dataChanged(index, index);
- return result;
- }
- int Classeurs_Model::columnCount(const QModelIndex &parent) const {
- return 4;
- }
- int Classeurs_Model::rowCount(const QModelIndex &parent) const {
- Classeur *parentClasseur = getClasseur(parent);
- return parentClasseur->childCount();
- }
- QVariant Classeurs_Model::headerData(int section,
- Qt::Orientation orientation,
- int role) const {
- if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
- return root_classeur->data(section);
- return QVariant();
- }
- bool Classeurs_Model::setHeaderData(int section,
- Qt::Orientation orientation,
- const QVariant &value,
- int role) {
- if (role != Qt::EditRole || orientation != Qt::Horizontal)
- return false;
- bool result = root_classeur->setData(section, value);
- if (result)
- emit headerDataChanged(orientation, section, section);
- return result;
- }
- bool Classeurs_Model::insertRows(int position,
- int rows,
- const QModelIndex &parent) {
- Classeur *parentClasseur = getClasseur(parent);
- bool success;
- beginInsertRows(parent, position, position + rows - 1);
- success = parentClasseur->insertChildren(position, rows, 5);
- endInsertRows();
- return success;
- }
- bool Classeurs_Model::insertClasseur(const QModelIndex &parent,
- int position,
- Classeur *new_classeur) {
- Classeur *parentClasseur = getClasseur(parent);
- beginInsertRows(parent, position, position);
- parentClasseur->insertClasseur(position, new_classeur);
- endInsertRows();
- return true;
- }
- bool Classeurs_Model::removeRows(int position,
- int rows,
- const QModelIndex &parent) {
- Classeur *parentClasseur = getClasseur(parent);
- bool success = true;
- beginRemoveRows(parent, position, position + rows - 1);
- success = parentClasseur->removeChildren(position, rows);
- endRemoveRows();
- return success;
- }
- //int Classeurs_Model::totalRowCount(const QModelIndex &parent) const {
- //}
- void Classeurs_Model::setModel(const QString &colFK,
- const int &idFK,
- const QStringList &fields,
- const QString &table,
- const QString &fTable) {
- QString field_list;
- QStringList fields_default = fields;
- if(fields_default.isEmpty())
- fields_default << "nom" << "comment"
- << "tree_id" << "tree_id_parent" << "id";
- db_coordonates.col_FK = colFK;
- db_coordonates.id_FK = idFK;
- db_coordonates.fields = fields;
- db_coordonates.table = table;
- db_coordonates.linker_table = fTable;
- foreach(QString field, fields_default)
- field_list += (!field_list.isEmpty()) ?
- QString(", c.%1").arg(field) :
- QString(" c.%1").arg(field);
- query_str = QString("SELECT %1 FROM \"%2\" c, \"%3\" r "
- "WHERE c.id = r.id_classeur "
- "AND r.%4 = %5 ;")
- .arg(field_list).arg(table)
- .arg(fTable).arg(colFK).arg(idFK);
- }
- void Classeurs_Model::setQueryOrder(const QStringList &order_list,
- const order &type) {
- QString list_order;
- foreach(QVariant field, order_list)
- list_order += (!list_order.isEmpty()) ?
- QString("ORDER BY (%1").arg(field.toString()) :
- QString(", %2").arg(field.toString());
- list_order += ") ";
- switch (type) {
- case ASC: list_order += "ASC "; break;
- case DESC: list_order += "DESC"; break; }
- query_str.insert(-1, list_order);
- }
- bool Classeurs_Model::extractDatas() {
- QSqlQuery query;
- if (!query_str.isEmpty() &&
- datas_valid == false) {
- query.prepare(query_str);
- query.exec();
- int c_name = query.record().indexOf(db_coordonates.fields[0]);
- int c_comment = query.record().indexOf(db_coordonates.fields[1]);
- int c_id = query.record().indexOf(db_coordonates.fields[2]);
- int c_id_parent = query.record().indexOf(db_coordonates.fields[3]);
- int c_id_DB = query.record().indexOf(db_coordonates.fields[4]);
- db_Classeurs.clear();
- while(query.next()) {
- QList<QVariant> values;
- values << query.value(c_name)
- << query.value(c_comment)
- << query.value(c_id_DB);
- db_Classeurs[query.value(c_id_parent).toInt()]
- .insert(query.value(c_id).toInt(),
- values); }
- datas_valid = true;
- find_Childs(0, root_classeur); }
- }
- void Classeurs_Model::find_Childs(int id_parent,
- Classeur *parent) {
- QHash<int, QList<QVariant> > col_id = db_Classeurs[id_parent];
- foreach(int id, col_id.keys()) {
- QList<QVariant> row;
- row.clear();
- row << col_id.value(id)[0] << col_id.value(id)[1]
- << QVariant(id) << QVariant(id_parent)
- << col_id.value(id)[2];
- Classeur *classeur_to_add = new Classeur(row, parent);
- if(!db_Classeurs[id].isEmpty())
- find_Childs(id, classeur_to_add); }
- }
- void Classeurs_Model::addClasseur(const QList<QVariant> &datas,
- const QModelIndex &parent) {
- QList<QVariant> new_datas = datas;
- Classeur *classeurParent;
- if(!parent.isValid())
- classeurParent = root_classeur;
- else
- classeurParent = reinterpret_cast<Classeur*>(parent.internalPointer());
- //** find the next id_tree from static id_tree_MAX of root_classeur
- int last_id_tree = root_classeur->get_id_MAX();
- new_datas[2] = last_id_tree + 1;
- int id_DB(0);
- id_DB = insertIntoDB(new_datas); // return the Id of new DB entry
- if(new_datas.count() < 5)
- new_datas << QVariant(id_DB);
- Classeur *new_classeur = new Classeur(new_datas);
- int new_row = this->rowCount(parent);
- this->insertClasseur(parent, new_row, new_classeur);
- }
- int Classeurs_Model::insertIntoDB(const QList<QVariant> &fields) {
- QSqlQuery query;
- query.prepare(QString("INSERT INTO \"%1\" "
- " ( %2, %3, %4, %5) "
- "VALUES ( :name, :comment, :tree_id, :tree_id_p) "
- "RETURNING id ;").arg(db_coordonates.table)
- .arg(db_coordonates.fields[0])
- .arg(db_coordonates.fields[1])
- .arg(db_coordonates.fields[2])
- .arg(db_coordonates.fields[3]));
- query.bindValue(":name", fields[0].toString());
- query.bindValue(":comment", fields[1].toString());
- query.bindValue(":tree_id", fields[2].toInt());
- query.bindValue(":tree_id_p", fields[3].toInt());
- query.exec();
- int new_ID;
- while(query.next())
- new_ID = query.value(0).toInt();
- return new_ID;
- }
- Files_Model* Classeurs_Model::getCurrent_Files_model(QModelIndex &index) const {
- if(!index.isValid())
- return NULL;
- Classeur *classeur = reinterpret_cast<Classeur*>(index.internalPointer());
- return classeur->getFiles_model();
- }
- Classeur* Classeurs_Model::getClasseur(const QModelIndex &index) const {
- if(!index.isValid())
- return root_classeur;
- Classeur *classeur = reinterpret_cast<Classeur*>(index.internalPointer());
- return classeur;
- }
- void Classeurs_Model::rowsInserted(const QModelIndex &parent,
- int start, int end) {
- emit add_classeur(parent, start, end);
- }
- // classeurs_model.h
- CLASSEURS_MODEL_H
- #define CLASSEURS_MODEL_H
- #include <QObject>
- #include <QAbstractItemModel>
- #include <QFlags>
- #include "Classeurs/classeur.h"
- enum order {
- ASC, DESC
- };
- struct database_classeurs_fields {
- QString col_FK;
- int id_FK;
- QStringList fields;
- QString table;
- QString linker_table;
- };
- class Classeurs_Model : public QAbstractItemModel
- {
- Q_OBJECT
- public:
- explicit Classeurs_Model(QObject *parent = 0);
- ~Classeurs_Model();
- QModelIndex parent(const QModelIndex &child) const;
- QModelIndex index(int row,
- int column,
- const QModelIndex &parent) const;
- Qt::ItemFlags flags(const QModelIndex &index) const;
- QVariant data(const QModelIndex &index,
- int role = Qt::DisplayRole) const;
- bool setData(const QModelIndex &index,
- const QVariant &value,
- int role = Qt::EditRole);
- int columnCount(const QModelIndex &parent) const;
- int rowCount(const QModelIndex &parent) const;
- QVariant headerData(int section,
- Qt::Orientation orientation,
- int role) const;
- bool setHeaderData(int section,
- Qt::Orientation orientation,
- const QVariant & value,
- int role = Qt::EditRole);
- bool insertRows(int position,
- int rows,
- const QModelIndex &parent);
- bool insertClasseur(const QModelIndex &parent,
- int position,
- Classeur *new_classeur);
- bool removeRows(int position,
- int rows,
- const QModelIndex &parent);
- // int totalRowCount(const QModelIndex &parent) const;
- void setModel(const QString &colFK,
- const int &idFK,
- const QStringList &fields = QStringList(),
- const QString &table = "Classeurs",
- const QString &fTable = "ClasseurRef");
- void setQueryOrder(const QStringList &order_list,
- const order &type = ASC);
- Classeur *getClasseur(const QModelIndex &index) const;
- Files_Model *getCurrent_Files_model(QModelIndex &index) const;
- void addClasseur(const QList<QVariant> &datas,
- const QModelIndex &parent);
- bool extractDatas();
- protected:
- Classeur *root_classeur;
- QHash <int, // id_parent =>
- QHash <int, // id =>
- QList<QVariant> > > db_Classeurs; // [name, comment]
- QString query_str;
- bool datas_valid;
- database_classeurs_fields db_coordonates;
- void find_Childs(int id_parent,
- Classeur *parent);
- int insertIntoDB(const QList<QVariant> &fields);
- protected slots:
- void rowsInserted(const QModelIndex &parent,
- int start, int end) ;
- signals:
- void add_classeur(const QModelIndex &parent,
- int start, int end);
- // void dataChanged(const QModelIndex &start,
- // const QModelIndex &end);
- };
- #endif // CLASSEURS_MODEL_H
- //classeur.cpp
- #include "classeur.h"
- #include <QDebug>
- #include <QSqlDatabase>
- #include <QSqlQuery>
- #include <QSqlError>
- #include <QMessageBox>
- Classeur::Classeur(const QList<QVariant> &data,
- Classeur *parent)
- {
- parentClasseur = parent;
- classeurData = data;
- childsClasseur = QList<Classeur*>();
- if(parent != 0)
- parent->childsClasseur.append(this);
- if(data.count() == 5) {
- if(classeurData[2] == 0)
- classeurData[2] = id_tree_MAX + 1;
- if(classeurData[2].toInt() > id_tree_MAX)
- id_tree_MAX = classeurData[2].toInt();
- files_model = new Files_Model();
- files_root = files_model->invisibleRootItem();
- files_model->setColumnCount(4); }
- }
- Classeur::~Classeur()
- {
- qDeleteAll(childsClasseur);
- // qDeleteAll(Classeur_Info.files_model);
- // qDeleteAll(Classeur_Info.files_root);
- }
- int Classeur::id_tree_MAX = 0;
- void Classeur::appendChild(Classeur *classeur) {
- childsClasseur.append(classeur);
- classeur->parentClasseur = this;
- }
- void Classeur::insertClasseur(int position,
- Classeur *new_classeur) {
- childsClasseur.insert(position, new_classeur);
- new_classeur->parentClasseur = this;
- }
- Classeur *Classeur::child(int number) {
- return childsClasseur.value(number);
- }
- int Classeur::childNumber() const {
- if(parentClasseur)
- return parentClasseur->childsClasseur.indexOf(
- const_cast<Classeur*>(this));
- return 0;
- }
- bool Classeur::hasChildren() {
- if(childsClasseur.isEmpty())
- return false;
- return true;
- }
- bool Classeur::insertChildren(int position,
- int count,
- int columns) {
- if(position < 0 ||
- columns != 5)
- return false;
- if(position > childsClasseur.size())
- position = childsClasseur.size();
- for(int row = 0; row < count; ++row) {
- QList<QVariant> datas;
- for(int i(0); i < columns; ++i)
- datas << QVariant();
- Classeur *classeur = new Classeur(datas, this);
- childsClasseur.insert(position, classeur);
- }
- return true;
- }
- bool Classeur::removeChildren(int position,
- int count) {
- if (position < 0 ||
- position + count > childsClasseur.size())
- return false;
- for(int row(0); row < count; ++row)
- delete childsClasseur.takeAt(position);
- return true;
- }
- int Classeur::childCount() const {
- return childsClasseur.count();
- }
- int Classeur::row() const {
- if (parentClasseur)
- return parentClasseur->childsClasseur.indexOf(const_cast<Classeur*>(this));
- return 0;
- }
- int Classeur::columnCount() const {
- return classeurData.count();
- }
- QVariant Classeur::data(int column) const {
- return classeurData.value(column);
- }
- bool Classeur::setData(int column,
- const QVariant &value) {
- if(column < 0 ||
- column > classeurData.size() - 1)
- return false;
- classeurData[column] = value;
- return true;
- }
- Classeur* Classeur::parent() {
- return parentClasseur;
- }
- Files_Model* Classeur::getFiles_model() {
- return files_model;
- }
- QStandardItem* Classeur::getFiles_root() {
- return files_root;
- }
- int Classeur::getID_tree() {
- return classeurData[2].toInt();
- }
- int Classeur::getID_tree_parent() {
- return classeurData[3].toInt();
- }
- int Classeur::get_id_MAX() {
- return id_tree_MAX;
- }
- // classeur.h
- #ifndef CLASSEUR_H
- #define CLASSEUR_H
- #include <QObject>
- #include <QSqlDatabase>
- #include <QStandardItem>
- #include <QStandardItemModel>
- #include "user_controler.h"
- #include "Files/files_model.h"
- class Classeur
- {
- public:
- explicit Classeur(const QList<QVariant> &data = QList<QVariant>(),
- Classeur *parent = 0);
- ~Classeur();
- Classeur *parent();
- void appendChild(Classeur *child);
- void insertClasseur(int position,
- Classeur *new_classeur);
- Classeur *child(int number);
- int childCount() const;
- int columnCount() const;
- QVariant data(int column) const;
- int row() const;
- void setInfos(QString name, QString comment);
- void setComment(QString comment);
- bool insertChildren(int position,
- int count,
- int columns);
- bool removeChildren(int position,
- int count);
- int childNumber() const;
- bool setData(int column,
- const QVariant &value);
- bool hasChildren();
- int get_id_MAX();
- Files_Model *getFiles_model();
- QStandardItem *getFiles_root();
- int getID_tree();
- int getID_tree_parent();
- private:
- QList<Classeur*> childsClasseur;
- QList<QVariant> classeurData;
- Classeur *parentClasseur;
- QStandardItem *files_root;
- Files_Model *files_model;
- static int id_tree_MAX;
- signals:
- public slots:
- };
- #endif // CLASSEUR_H
- // classeurs_treeview.cpp
- #include "classeurs_treeview.h"
- #include "classeur.h"
- #include <QMessageBox>
- //infos_generales_classeurs Classeurs_treeView::Classeurs;
- Classeurs_treeView::Classeurs_treeView(QWidget *parent) {
- Classeurs.classeurs_model = new Classeurs_Model;
- this->setModel(Classeurs.classeurs_model);
- this->setAcceptDrops(false);
- this->setSelectionMode(QAbstractItemView::ExtendedSelection);
- this->setColumnHidden(2, true);
- this->setColumnHidden(3, true);
- this->setColumnHidden(4, true);
- supprimer = new QAction(tr("Supprimer"), this);
- QObject::connect(supprimer, &QAction::triggered, this, &Classeurs_treeView::delete_row);
- }
- Classeurs_treeView::~Classeurs_treeView()
- {
- }
- //****** Methods "get" ***********************************************
- Classeurs_Model *Classeurs_treeView::getModel() {
- return Classeurs.classeurs_model;
- // return this->model();
- }
- //******* add classeurs methods ****************************************
- void Classeurs_treeView::add_classeur(const QVariant &name,
- const QVariant &comment,
- const QVariant &id_parent,
- const QModelIndex &parent) { // ajoute un classeur
- qSort(Classeurs.id.begin(), Classeurs.id.end());
- next_id = (!Classeurs.id.isEmpty()) ? Classeurs.id.last() + 1 : 1;
- QList<QVariant> new_row;
- new_row << name << comment << QVariant(next_id) << id_parent;
- Classeurs.classeurs_model->addClasseur(new_row, parent);
- }
- //****** Delete classeurs **************************************************
- void Classeurs_treeView::delete_row() { // peut supprimer une ou plusieurs sélections et leurs fils
- int answer = QMessageBox::question(this,"SUPPRIMER",
- tr("Voulez vous supprimer le(s) classeur(s) ?"),
- tr("Oui"), tr("Non"));
- if (answer == 0) { // si la réponse est "oui" j'efface le fichier ou le dossier sélectionné...
- emit delete_classeur(this->selectionModel()->selectedIndexes());
- }
- }
- //****** Event mouse click **************************************************
- void Classeurs_treeView::mouseReleaseEvent ( QMouseEvent * event ) {
- if(event->button() == Qt::RightButton) {
- menu_middle = new QMenu(this);
- if (this->indexAt(event->pos()).isValid()) {
- menu_middle->addAction(supprimer);
- menu_middle->popup(this->viewport()->mapToGlobal(event->pos())); } }
- if(event->button() == Qt::LeftButton)
- emit clicked(this->indexAt(event->pos()));
- }
- void Classeurs_treeView::dataChanged(const QModelIndex &topLeft,
- const QModelIndex &bottomRight,
- const QVector<int> &roles) {
- emit change_data(topLeft, bottomRight, roles);
- }
- //classeurs_treeview.h
- #ifndef CLASSEURS_TREEVIEW_H
- #define CLASSEURS_TREEVIEW_H
- #include "Classeurs/classeur.h"
- #include "Classeurs/classeurs_model.h"
- #include <QtGui>
- #include <QObject>
- #include <QTreeView>
- #include <QStandardItem>
- #include <QMenu>
- struct infos_generales_classeurs {
- QList<int> id;
- Classeur *root_classeur;
- Classeurs_Model *classeurs_model;
- }; // structure de log des classeurs à insérer dans "Structures"
- class Classeurs_treeView : public QTreeView
- {
- Q_OBJECT
- public:
- explicit Classeurs_treeView(QWidget *parent);
- ~Classeurs_treeView();
- infos_generales_classeurs Classeurs;
- void add_classeur(const QVariant &name = QVariant(""),
- const QVariant &comment = QVariant(""),
- const QVariant &id_parent = QVariant(0),
- const QModelIndex &parent = QModelIndex());
- Classeurs_Model *getModel();
- protected:
- QMenu *menu_middle;
- QMenu *menu_right;
- QAction *supprimer;
- int next_id;
- void delete_row();
- protected slots:
- void dataChanged (const QModelIndex &topLeft,
- const QModelIndex &bottomRight,
- const QVector<int> &roles = QVector<int> ());
- void mouseReleaseEvent ( QMouseEvent * event );
- signals:
- void clicked(QModelIndex);
- void delete_classeur(QModelIndexList list_indexs);
- void change_data(const QModelIndex &topLeft,
- const QModelIndex &bottomRight,
- const QVector<int> &roles);
- };
- #endif // CLASSEURS_TREEVIEW_H
- // part of call for add a classeur: a button call a dialogbox, this dialogbox record some datas,
- // this datas are read back at result time from accept button of this dialogbox and calal with datas
- // the treeview concerned (the datas are ok... the debugger show them well)... but nothing is show in the tree
- // part of new_projet.cpp
- void new_project::on_pushButton_add_classeur_clicked() { // définir le classeur à ajouter
- classeurs_model = ui_new_project->treeView_classeur->getModel();
- add_classeur_files *dialog_add_classeur = new add_classeur_files(this,
- ui_new_project->
- lineEdit_project_name->text(),
- classeurs_model);
- dialog_add_classeur->open();
- QObject::connect(dialog_add_classeur,
- &QDialog::finished,
- [dialog_add_classeur, this](int result){
- if(result) { // ajoute un classeur à la liste et on créé un id
- ui_new_project->treeView_classeur->
- add_classeur(dialog_add_classeur->New_classeur.name,
- dialog_add_classeur->New_classeur.comment,
- dialog_add_classeur->New_classeur.id_parent,
- dialog_add_classeur->New_classeur.parent_selected); }
- dialog_add_classeur->deleteLater(); });
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement