view libgui/src/workspace-model.h @ 16069:0486a29d780f

gui: fix updating history and workspace widget for mxe-octave * history-dock-widget.h: new flag _update_event_enabled for disabling and enabling the update event * histroy-dock-widget.cc(construct): change update timer to periodic and to an interval of 500 ms, enable update * history-dock-widget.cc(request_history_model_update): if update is enabled post update event and disable update in order to prevent further events * history-dock-widget.cc(update_history_callback): reenalbe update when update is complete * workspace-model.h: new flag _update_event_enabled for disabling and enabling the update event * workspace-model.cc(workspace_model): change update timer to periodic, enable update * workspace-model.cc(request_update_workspace): if update is enabled post update event and disable update in order to prevent further events * workspace-model.cc(update_workspace_callback): reenalbe update when update is complete
author Torsten <ttl@justmail.de>
date Sun, 17 Feb 2013 21:17:46 +0100
parents 7f423c6111c6
children d4b6ad43bc87
line wrap: on
line source

/*

Copyright (C) 2011-2012 Jacob Dawid

This file is part of Octave.

Octave is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 3 of the License, or (at your
option) any later version.

Octave is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with Octave; see the file COPYING.  If not, see
<http://www.gnu.org/licenses/>.

*/

#ifndef WORKSPACEMODEL_H
#define WORKSPACEMODEL_H

// Qt includes
#include <QAbstractItemModel>
#include <QVector>
#include <QSemaphore>
#include <QTimer>

#include "symbol-information.h"

class tree_item
{
public:
  tree_item (const QList<QVariant> &d, tree_item *p = 0) {
    _parent_item = p;
    _item_data = d;
  }

  tree_item (QVariant d = QVariant(), tree_item *p = 0) {
    QList<QVariant> variantList;
    variantList << d << QVariant () << QVariant () << QVariant ();
    _parent_item = p;
    _item_data = variantList;
  }

  ~tree_item () {
    qDeleteAll (_child_items);
  }

  void insert_child_item (int at, tree_item *item) {
    item->_parent_item = this;
    _child_items.insert (at, item);
  }

  void add_child (tree_item *item) {
    item->_parent_item = this;
    _child_items.append (item);
  }

  void delete_child_items () {
    qDeleteAll (_child_items);
    _child_items.clear ();
  }

  void remove_child (tree_item *item) {
    _child_items.removeAll (item);
  }

  QVariant data (int column) const
  {
    return _item_data[column];
  }

  void set_data (int column, QVariant d)
  {
    _item_data[column] = d;
  }

  tree_item *child (int r) {
    return _child_items[r];
  }

  int child_count () const {
    return _child_items.count();
  }

  int column_count () const
  {
    return _item_data.count();
  }

  int row () const {
    if (_parent_item)
      return _parent_item->_child_items.indexOf (const_cast<tree_item*>(this));

    return 0;
  }

  tree_item *parent ()
  {
    return _parent_item;
  }

private:
  QList<tree_item*> _child_items;
  QList<QVariant> _item_data;
  tree_item *_parent_item;
};

class workspace_model
  : public QAbstractItemModel
{
  Q_OBJECT

  public:
  workspace_model (QObject *parent = 0);
  ~workspace_model ();

  QVariant data (const QModelIndex &index, int role) const;
  Qt::ItemFlags flags (const QModelIndex &index) const;
  QVariant headerData (int section, Qt::Orientation orientation,
                       int role = Qt::DisplayRole) const;
  QModelIndex index (int row, int column,
                     const QModelIndex &parent = QModelIndex ()) const;
  QModelIndex parent (const QModelIndex &index) const;
  int rowCount (const QModelIndex &parent = QModelIndex ()) const;
  int columnCount (const QModelIndex &parent = QModelIndex ()) const;

  void insert_top_level_item (int at, tree_item *treeItem);
  tree_item *top_level_item (int at);

public slots:
  void request_update_workspace ();

signals:
  void model_changed ();

private:

  bool _update_event_enabled;

  void update_workspace_callback (void);

  /** Timer for periodically updating the workspace model from the current
   * symbol information. */
  QTimer _update_workspace_model_timer;

  /** Stores the current symbol information. */
  QList <symbol_information> _symbol_information;
  tree_item *_rootItem;
};

#endif // WORKSPACEMODEL_H