Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // classeur.h (a classeur is french word for "binder" this object represent a container for files models
- // inside the QTreeView of binders, when i will click on a binder, it will show me the files/directories contents
- // in an other QTreeView at right side on the widget
- #ifndef CLASSEUR_H
- #define CLASSEUR_H
- #include <QObject>
- #include <QSqlDatabase>
- #include <QStandardItem>
- #include <QStandardItemModel>
- #include "user_controler.h"
- #include "Files/files_model.h"
- struct classeur_infos {
- int id;
- int id_parent;
- QString name;
- QString comment;
- QStandardItem *files_root;
- Files_Model *files_model;
- };
- // je dois créer un lien entre les infos statics et les données de fichiers.
- class Classeur : public QObject
- {
- Q_OBJECT
- public:
- explicit Classeur(QObject *parent = 0,
- const int &id = 0,
- const int &id_parent = 0);
- ~Classeur();
- classeur_infos Classeur_Info;
- void setInfos(QString name, QString comment);
- void setComment(QString comment);
- void add_file(QList<int> tree_posit, QStandardItem row_items);
- void edit_file(QList<int> tree_posit, int column,
- QStandardItem *item, QString content = "");
- void del_files(QList<int> tree_posit);
- void read_file_item(QStandardItem *item);
- void read_file_posit(QList<int> tree_posit);
- void read_file_index(QModelIndex index);
- private:
- user_controler *user;
- signals:
- public slots:
- };
- #endif // CLASSEUR_H
- // here is the source file for this object:
- #include "classeur.h"
- #include <QDebug>
- #include <QSqlDatabase>
- #include <QSqlQuery>
- #include <QSqlError>
- #include <QMessageBox>
- Classeur::Classeur(QObject *parent, const int &id,
- const int &id_parent) : QObject(parent)
- {
- // user = user_controler::getInstance();
- user->initdb();
- this->Classeur_Info.id = id;
- this->Classeur_Info.id_parent = id_parent;
- Classeur_Info.files_model = new Files_Model();
- // QStringList headers_files;
- // headers_files << tr("Répertoire") << tr("Fichier")
- // << tr("Poids") << tr("Description") << tr("full");
- Classeur_Info.files_root = Classeur_Info.files_model->invisibleRootItem();
- // Classeur_Info.files_model->setColumnCount(4);
- // Classeur_Info.files_model->setHorizontalHeaderLabels(headers_files);
- }
- Classeur::~Classeur()
- {
- }
- void Classeur::setInfos(QString name, QString comment) {
- this->Classeur_Info.name = name;
- this->Classeur_Info.comment = comment;
- }
- void Classeur::setComment(QString comment) {
- this->Classeur_Info.comment = comment;
- }
- void Classeur::add_file(QList<int> tree_posit, QStandardItem row_items) {
- }
- void Classeur::edit_file(QList<int> tree_posit, int column,
- QStandardItem *item, QString content) {
- }
- void Classeur::del_files(QList<int> tree_posit) {
- }
- void Classeur::read_file_item(QStandardItem *item) {
- }
- void Classeur::read_file_posit(QList<int> tree_posit) {
- }
- void Classeur::read_file_index(QModelIndex index) {
- }
- // classeur_treeview.h is the header file for customize the view of my QTreeView for binders
- // consider that the content of the struct is totaly wrong, because use QModelIndex like this is bad
- // and not possible too... the idea was to memorize datas from database inisde variables contains inside a struct,
- // but this idea is bad... i have to change this.
- #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 {
- QMap<QModelIndex, int> id; // index at col0: id
- QHash<QModelIndex, int> id_parent; // index at col0: id_parent
- QHash<int, QModelIndex> index_from_id; // id: index
- QHash<int, QModelIndex> index_from_id_parent; // id_parent: index
- QStandardItem *root_classeur;
- // Classeurs_Model *classeurs_model;
- QStandardItemModel *classeurs_model;
- QHash<QModelIndex, Classeur*> my_classeurs; // index at col0: Classeur
- }; // structure static de log des classeurs à insérer dans "Structures"
- class Classeurs_treeView : public QTreeView
- {
- Q_OBJECT
- public:
- Classeurs_treeView(const QStringList &header, QWidget *parent);
- ~Classeurs_treeView();
- infos_generales_classeurs Classeurs;
- void add_classeur(const QString &name = "",
- const QString &comment = "",
- const QString &id_parent = "",
- QModelIndex const &parent = QModelIndex());
- void populate(const QList<int> &id_classeur,
- const QList<int> &id,
- const QList<int> &id_parent,
- const QStringList &name,
- const QStringList &comment);
- // Classeurs_Model *getModel();
- QStandardItemModel *getModel();
- protected:
- QMenu *menu_middle;
- QMenu *menu_right;
- QAction *supprimer;
- int next_id;
- void delete_row();
- protected slots:
- void mouseReleaseEvent ( QMouseEvent * event );
- signals:
- void clicked(QModelIndex);
- void delete_classeur(QModelIndexList list_indexs);
- };
- #endif // CLASSEURS_TREEVIEW_H
- // here is my source file of classeur_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;
- Classeurs.classeurs_model = new QStandardItemModel;
- QStringList headers_classeurs;
- headers_classeurs << tr("Classeurs") << tr("Description") << tr("id") <<tr("classeur_id");
- if (Classeurs.classeurs_model->rowCount() == 0)
- Classeurs.root_classeur = Classeurs.classeurs_model->invisibleRootItem();
- Classeurs.classeurs_model->setColumnCount(4);
- Classeurs.classeurs_model->setHorizontalHeaderLabels(headers_classeurs);
- // this->setModel(Classeurs.classeurs_model);
- this->setAcceptDrops(false);
- this->setSelectionMode(QAbstractItemView::ExtendedSelection);
- this->setColumnHidden(2, true);
- this->setColumnHidden(3, true);
- supprimer = new QAction(tr("Supprimer"), this);
- QObject::connect(supprimer, &QAction::triggered, this, &Classeurs_treeView::delete_row);
- }
- Classeurs_treeView::~Classeurs_treeView()
- {
- }
- //****** Methods "get" ***********************************************
- QStandardItemModel *Classeurs_treeView::getModel() {
- return Classeurs.classeurs_model;
- }
- //******* add classeurs methods ****************************************
- void Classeurs_treeView::add_classeur(const QString &name,
- const QString &comment,
- const QString &id_parent,
- QModelIndex const &parent) { // ajoute un classeur
- next_id = (!Classeurs.id.isEmpty()) ? Classeurs.id.last() + 1 : 1;
- QList<QStandardItem*> new_row;
- new_row.append(new QStandardItem(name));
- new_row.append(new QStandardItem(comment));
- new_row.append(new QStandardItem(QString("%1").arg(next_id)));
- if(id_parent == "") {
- new_row.append(new QStandardItem("0"));
- Classeurs.classeurs_model->appendRow(new_row); }
- else { // sinon, + au parent
- new_row.append(new QStandardItem(id_parent));
- QStandardItem *the_parent = Classeurs.classeurs_model->itemFromIndex(parent);
- the_parent->appendRow(new_row); }
- }
- void Classeurs_treeView::populate(const QList<int> &id_classeur,
- const QList<int> &id,
- const QList<int> &id_parent,
- const QStringList &name,
- const QStringList &comment) {
- for(int i = 0; i<id.count(); i++) {
- QList<QStandardItem*> new_row;
- new_row.append(new QStandardItem(name[i]));
- new_row.append(new QStandardItem(comment[i]));
- new_row.append(new QStandardItem(QString("%1").arg(id[i])));
- new_row.append(new QStandardItem(QString("%1").arg(id_classeur[i])));
- if (id_parent[i] == 0) // si 0 parent, + ligne à la base
- Classeurs.classeurs_model->appendRow(new_row);
- else { // sinon ajoute au parent
- QModelIndex index_parent = Classeurs.index_from_id_parent[id_parent[i]];
- QStandardItem *the_parent = Classeurs.classeurs_model->itemFromIndex(index_parent);
- the_parent->appendRow(new_row); } }
- }
- //****** 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()));
- }
- // next, classeurs_model.h is my customized model from QAbstactItemModel, it has to interface data from database
- // and send signals when something is added or delete... i think i NO need delegate for this use...
- // but also, i think i have to call data from database iniside this model... but where and how to do it well ?
- // also, i would like to be able (just for learn, because it is not so necessary here) to make
- // the database request call depend of the viewport area (for limit the datas memory) and maybe also just call
- // first leve parnets and first child only, and then, at time for unroll (by click the arrow inside the View on
- // column 0), call the next level childs to show the dependencies datas too... (in fact, i think that if the tree
- // levels are big, i no need to show all in one time, but, step by step... right ?)
- #ifndef CLASSEURS_MODEL_H
- #define CLASSEURS_MODEL_H
- #include <QObject>
- #include <QAbstractItemModel>
- #include "Classeurs/classeur.h"
- #include "Classeurs/classeurs_treeview.h"
- class Classeurs_Model : public QAbstractItemModel
- {
- Q_OBJECT
- public:
- explicit Classeurs_Model(Classeur *classeur = 0);
- ~Classeurs_Model();
- int columnCount(const QModelIndex &parent) const;
- int rowCount(const QModelIndex &parent) const;
- int totalRowCount(const QModelIndex &parent) const;
- QVariant data(const QModelIndex &index,
- int role) const;
- QModelIndex parent(const QModelIndex &child) const;
- QModelIndex index(int row,
- int column,
- const QModelIndex &parent) const;
- Classeur *getCurrentClasseur(QModelIndex &index);
- Files_Model *getCurrent_Files_model(QModelIndex &index);
- protected:
- Classeur *m_classeur;
- protected slots:
- void dataChanged (const QModelIndex &topLeft,
- const QModelIndex &bottomRight,
- const QVector<int> &roles = QVector<int> ());
- void rowsInserted(const QModelIndex &parent,
- int start, int end) ;
- void dataChanged (const QModelIndex &topLeft,
- const QModelIndex &bottomRight,
- const QVector<int> &roles = QVector<int> ());
- signals:
- void change_data(const QModelIndex &topLeft,
- const QModelIndex &bottomRight,
- const QVector<int> &roles);
- void add_classeur(const QModelIndex &parent,
- int start, int end);
- };
- #endif // CLASSEURS_MODEL_H
- // here is my classeurs_model.cpp source file:
- #include "Classeurs/classeurs_treeview.h"
- #include "Classeurs/classeur.h"
- Classeurs_Model::Classeurs_Model(Classeur *classeur):
- QAbstractItemModel(parent),
- m_classeur(classeur)
- {
- }
- Classeurs_Model::~Classeurs_Model()
- {
- }
- int Classeurs_Model::columnCount(const QModelIndex &parent) const {
- return 4;
- }
- int Classeurs_Model::rowCount(const QModelIndex &parent) const {
- if(!parent.isValid())
- return m_classeur->children().size();
- Classeur *classeur = reinterpret_cast<Classeur*>(parent.internalPointer());
- return classeur->children().size();
- }
- int Classeurs_Model::totalRowCount(const QModelIndex &parent) const {
- }
- QVariant Classeurs_Model::data(const QModelIndex &index,
- int role) const {
- Classeur *classeur;
- if(!index.isValid())
- classeur = m_classeur;
- else
- classeur = reinterpret_cast<Classeur*>(parent.internalPointer());
- if(role == Qt::DisplayRole) {
- switch (index.column()) {
- case 0: {
- return classeur->Classeur_Info.name; break; }
- case 1: {
- return classeur->Classeur_Info.comment; break; }
- case 2: {
- return classeur->Classeur_Info.id; break; }
- case 2: {
- return classeur->Classeur_Info.id_parent; break; } }
- }
- }
- QModelIndex Classeurs_Model::index(int row,
- int column,
- const QModelIndex &parent) const {
- Classeur *parentClasseur;
- if(!parent.isValid())
- return m_classeur;
- else
- parentClasseur = reinterpret_cast<Classeur*>(parent.internalPointer());
- Classeur *classeur = parentClasseur->children().at(row);
- return createIndex(row, column, classeur);
- }
- QModelIndex Classeurs_Model::parent(const QModelIndex &child) const {
- if(!child.isValid())
- return QModelIndex();
- Classeur *classeur = reinterpret_cast<Classeur*>(child.internalPointer());
- Classeur *parentClasseur = classeur->parent();
- if(parentClasseur == m_classeur)
- return QModelIndex();
- int row = parentClasseur->parent()->children().indexOf(parentClasseur);
- return createIndex(row, 0, parentClasseur);
- }
- Files_Model* Classeurs_Model::getCurrent_Files_model(QModelIndex &index) {
- if(!index.isValid())
- return Files_Model();
- Classeur *classeur = reinterpret_cast<Classeur*>(index.internalPointer());
- return classeur->Classeur_Info.files_model;
- }
- Classeur* Classeurs_Model::getCurrentClasseur(QModelIndex &index) {
- if(!index.isValid())
- return Files_Model();
- 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);
- }
- void Classeurs_Model::dataChanged(const QModelIndex &topLeft,
- const QModelIndex &bottomRight,
- const QVector<int> &roles) {
- emit change_data(topLeft, bottomRight, roles);
- }
Advertisement
Add Comment
Please, Sign In to add comment