#ifndef APPCOMMANDSMODEL_H
#define APPCOMMANDSMODEL_H

#include <QtCore/QAbstractListModel>
#include <QtCore/QMap>

#include <deque>
#include <list>

class AppCommandsModel : public QAbstractListModel
{
    Q_OBJECT
    
    typedef QMap<QString, uint64_t> ArgsMap;
public:
    AppCommandsModel(QObject* parent = 0);
    ~AppCommandsModel();
    
    void inserCommand(const QString& name, const ArgsMap& args);
    void removeCommand(const QString& name);
    ArgsMap getCommandArgs(const QString& name);
    void clear();
    
    QVariant data(const QModelIndex &i, int role = Qt::DisplayRole) const;
    int rowCount(const QModelIndex &parent = QModelIndex()) const;
    bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex());
    bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex());
    
private:
    typedef QMap<QString, ArgsMap*> Map;
    typedef std::deque<Map::iterator> Index;
    typedef std::pair<QString, ArgsMap*> Pair;
    typedef std::list<Pair> List;
    
    Index index;
    Map map;
    List toInsert;
};

#endif // APPCOMMANDSMODEL_H