diff --git a/adtool.pro b/adtool.pro index ec9f1ad5..66a559bc 100644 --- a/adtool.pro +++ b/adtool.pro @@ -1,5 +1,5 @@ QT += core gui widgets -CONFIG += c++11 +CONFIG += c++14 DEFINES += QT_DEPRECATED_WARNINGS LIBS += -lldap -llber -lresolv -lgsasl diff --git a/src/ad_interface.cpp b/src/ad_interface.cpp index 726ec7cf..c669b050 100644 --- a/src/ad_interface.cpp +++ b/src/ad_interface.cpp @@ -12,6 +12,8 @@ extern "C" { // FAKE STUFF // ----------------------------------------------------------------- +AdInterface ad_interface; + bool FAKE_AD = false; QMap> fake_children; @@ -307,6 +309,8 @@ bool set_attribute(const QString &dn, const QString &attribute, const QString &v int result = ad_mod_replace(dn_cstr, attribute_cstr, value_cstr); if (result == AD_SUCCESS) { + emit ad_interface.entry_changed(dn); + return true; } else { return false; @@ -371,25 +375,25 @@ bool create_entry(const QString &name, const QString &dn, const QString &parent_ } } -bool delete_entry(const QString &dn) { +void delete_entry(const QString &dn) { + int result = AD_INVALID_DN; + if (FAKE_AD) { fake_object_delete(dn); - return true; + result = AD_SUCCESS; + } else { + const char *dn_cstr = qstring_to_cstr(dn); + + // TODO: handle all possible side-effects? + // probably a lot of stuff, like group membership and stuff + + // TODO: handle errors + + result = ad_object_delete(dn_cstr); } - const char *dn_cstr = qstring_to_cstr(dn); - - // TODO: handle all possible side-effects? - // probably a lot of stuff, like group membership and stuff - - // TODO: handle errors - - int result = ad_object_delete(dn_cstr); - if (result == AD_SUCCESS) { - return true; - } else { - return false; + emit ad_interface.entry_deleted(dn); } } diff --git a/src/ad_interface.h b/src/ad_interface.h index b51422aa..8ddcf6db 100644 --- a/src/ad_interface.h +++ b/src/ad_interface.h @@ -16,13 +16,31 @@ enum NewEntryType { Group }; -extern bool FAKE_AD; +// Class solely for emitting signals +class AdInterface: public QObject { +Q_OBJECT + +public: + +public slots: + +signals: + void entry_deleted(const QString &dn); + void entry_changed(const QString &dn); + +private: + +}; + +extern AdInterface ad_interface; +extern bool FAKE_AD; bool ad_interface_login(); QList load_children(const QString &dn); QMap> load_attributes(const QString &dn); bool set_attribute(const QString &dn, const QString &attribute, const QString &value); bool create_entry(const QString &name, const QString &dn, const QString &parent_dn, NewEntryType type); -bool delete_entry(const QString &dn); +void delete_entry(const QString &dn); +bool set_attribute(const QString &dn, const QString &attribute, const QString &value); #endif /* AD_INTERFACE_H */ diff --git a/src/attributes_model.cpp b/src/attributes_model.cpp index c610f603..b4338f13 100644 --- a/src/attributes_model.cpp +++ b/src/attributes_model.cpp @@ -23,8 +23,6 @@ bool AttributesModel::setData(const QModelIndex &index, const QVariant &value, i if (success) { QStandardItemModel::setData(index, value, role); - emit entry_changed(dn); - return true; } else { return false; diff --git a/src/entry_context_menu.cpp b/src/entry_context_menu.cpp index ea199e79..2d5d1d62 100644 --- a/src/entry_context_menu.cpp +++ b/src/entry_context_menu.cpp @@ -12,15 +12,12 @@ EntryContextMenu::EntryContextMenu(QWidget *parent) : QMenu(parent) { connect(attributes_action, &QAction::triggered, [this]() { emit attributes_clicked(this->target_dn); }); + this->addAction(attributes_action); QAction *delete_action = new QAction("Delete", this); connect(delete_action, &QAction::triggered, [this]() { - delete_entry(this->target_dn); - emit delete_clicked(this->target_dn); }); - - this->addAction(attributes_action); this->addAction(delete_action); } @@ -34,6 +31,8 @@ void EntryContextMenu::connect_view(const QTreeView &view) { // Get DN of clicked entry QModelIndex index = view.indexAt(pos); + QModelIndex dn_index = index.siblingAtColumn(AdModel::Column::DN); + QString dn = dn_index.data().toString(); if (index.isValid()) { QModelIndex dn_index = index.siblingAtColumn(AdModel::Column::DN); diff --git a/src/main.cpp b/src/main.cpp index 517fc663..5d8bcc7f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -82,15 +82,23 @@ int main(int argc, char **argv) { entry_context_menu, &EntryContextMenu::attributes_clicked, ui.attributes_view, &AttributesView::set_target_dn); - // Delete action signals + // Delete entry when delete button is pressed QObject::connect( entry_context_menu, &EntryContextMenu::delete_clicked, - &ad_model, &AdModel::on_entry_deleted); - QObject::connect( - entry_context_menu, &EntryContextMenu::delete_clicked, - &attributes_model, &AttributesModel::on_entry_deleted); + delete_entry); } + // Update models on entry changes + QObject::connect( + &ad_interface, &AdInterface::entry_deleted, + &ad_model, &AdModel::on_entry_deleted); + QObject::connect( + &ad_interface, &AdInterface::entry_deleted, + &attributes_model, &AttributesModel::on_entry_deleted); + QObject::connect( + &ad_interface, &AdInterface::entry_changed, + &ad_model, &AdModel::on_entry_changed); + // Set root index of contents view to selection of containers view QObject::connect( ui.containers_view->selectionModel(), &QItemSelectionModel::selectionChanged,