// qitemselectionmodel.sip generated by MetaSIP on Fri Apr 16 11:32:08 2010
//
// This file is part of the QtGui Python extension module.
//
// Copyright (c) 2010 Riverbank Computing Limited <info@riverbankcomputing.com>
// 
// This file is part of PyQt.
// 
// This file may be used under the terms of the GNU General Public
// License versions 2.0 or 3.0 as published by the Free Software
// Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3
// included in the packaging of this file.  Alternatively you may (at
// your option) use any later version of the GNU General Public
// License if such license has been publicly approved by Riverbank
// Computing Limited (or its successors, if any) and the KDE Free Qt
// Foundation. In addition, as a special exception, Riverbank gives you
// certain additional rights. These rights are described in the Riverbank
// GPL Exception version 1.1, which can be found in the file
// GPL_EXCEPTION.txt in this package.
// 
// Please review the following information to ensure GNU General
// Public Licensing requirements will be met:
// http://trolltech.com/products/qt/licenses/licensing/opensource/. If
// you are unsure which license is appropriate for your use, please
// review the following information:
// http://trolltech.com/products/qt/licenses/licensing/licensingoverview
// or contact the sales department at sales@riverbankcomputing.com.
// 
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.


%ModuleCode
#include <qitemselectionmodel.h>
%End

class QItemSelectionRange
{

%TypeHeaderCode
#include <qitemselectionmodel.h>
%End

public:
    QItemSelectionRange();
    QItemSelectionRange(const QItemSelectionRange &);
    QItemSelectionRange(const QModelIndex &, const QModelIndex &);
    explicit QItemSelectionRange(const QModelIndex &);
    int top() const;
    int left() const;
    int bottom() const;
    int right() const;
    int width() const;
    int height() const;
    QModelIndex topLeft() const;
    QModelIndex bottomRight() const;
    QModelIndex parent() const;
    const QAbstractItemModel *model() const;
    bool contains(const QModelIndex &) const;
%If (Qt_4_2_0 -)
    bool contains(int, int, const QModelIndex &) const;
%End
    bool intersects(const QItemSelectionRange &) const;
    QItemSelectionRange intersect(const QItemSelectionRange &) const;
    bool operator==(const QItemSelectionRange &) const;
    bool operator!=(const QItemSelectionRange &) const;
    bool isValid() const;
    QModelIndexList indexes() const;
%If (Qt_4_2_0 -)
    QItemSelectionRange intersected(const QItemSelectionRange &) const;
%End
    long __hash__() const;
%MethodCode
        sipRes = qHash(*sipCpp);
%End
};

class QItemSelectionModel : QObject
{

%TypeHeaderCode
#include <qitemselectionmodel.h>
%End

public:
    enum SelectionFlag
    {
        NoUpdate,
        Clear,
        Select,
        Deselect,
        Toggle,
        Current,
        Rows,
        Columns,
        SelectCurrent,
        ToggleCurrent,
        ClearAndSelect,
    };

    typedef QFlags<QItemSelectionModel::SelectionFlag> SelectionFlags;
    explicit QItemSelectionModel(QAbstractItemModel *);
    QItemSelectionModel(QAbstractItemModel *, QObject * /TransferThis/);
    virtual ~QItemSelectionModel();
    QModelIndex currentIndex() const;
    bool isSelected(const QModelIndex &) const;
    bool isRowSelected(int, const QModelIndex &) const;
    bool isColumnSelected(int, const QModelIndex &) const;
    bool rowIntersectsSelection(int, const QModelIndex &) const;
    bool columnIntersectsSelection(int, const QModelIndex &) const;
    QModelIndexList selectedIndexes() const;
    const QItemSelection selection() const;
    const QAbstractItemModel *model() const;

public slots:
    virtual void clear();
%If (Qt_4_2_0 -)
    void clearSelection();
%End
    virtual void reset();
    virtual void select(const QModelIndex &, QFlags<QItemSelectionModel::SelectionFlag>);
    virtual void select(const QItemSelection &, QFlags<QItemSelectionModel::SelectionFlag>);
    void setCurrentIndex(const QModelIndex &, QFlags<QItemSelectionModel::SelectionFlag>);

signals:
    void selectionChanged(const QItemSelection &, const QItemSelection &);
    void currentChanged(const QModelIndex &, const QModelIndex &);
    void currentRowChanged(const QModelIndex &, const QModelIndex &);
    void currentColumnChanged(const QModelIndex &, const QModelIndex &);

protected:
    void emitSelectionChanged(const QItemSelection &, const QItemSelection &);

public:
%If (Qt_4_2_0 -)
    bool hasSelection() const;
%End
%If (Qt_4_2_0 -)
    QModelIndexList selectedRows(int column = 0) const;
%End
%If (Qt_4_2_0 -)
    QModelIndexList selectedColumns(int row = 0) const;
%End

private:
    QItemSelectionModel(const QItemSelectionModel &);
};

QFlags<QItemSelectionModel::SelectionFlag> operator|(QItemSelectionModel::SelectionFlag, QFlags<QItemSelectionModel::SelectionFlag>);

class QItemSelection
{

%TypeHeaderCode
#include <qitemselectionmodel.h>
%End

public:
    QItemSelection();
    QItemSelection(const QModelIndex &, const QModelIndex &);
    void select(const QModelIndex &, const QModelIndex &);
    bool contains(const QModelIndex &) const;
    int __contains__(const QModelIndex &index);
%MethodCode
        // It looks like you can't assign QBool to int.
        sipRes = bool(sipCpp->contains(*a0));
%End

    QModelIndexList indexes() const;
    void merge(const QItemSelection &, QFlags<QItemSelectionModel::SelectionFlag>);
    static void split(const QItemSelectionRange &, const QItemSelectionRange &, QItemSelection *);
    int __len__() const;
%MethodCode
        sipRes = sipCpp->count();
%End

    void __setitem__(int i, const QItemSelectionRange &range);
%MethodCode
        int len;
        
        len = sipCpp->count();
        
        if ((a0 = (int)sipConvertFromSequenceIndex(a0, len)) < 0)
            sipIsErr = 1;
        else
            (*sipCpp)[a0] = *a1;
%End

    void __setitem__(SIP_PYSLICE slice, const QItemSelection &list);
%MethodCode
        SIP_SSIZE_T len, start, stop, step, slicelength, i;
        
        len = sipCpp->count();
        
        if (PySlice_GetIndicesEx((PySliceObject *)a0, len, &start, &stop, &step, &slicelength) < 0)
            sipIsErr = 1;
        else
        {
            int vlen = a1->count();
        
            if (vlen != slicelength)
            {
                sipBadLengthForSlice(vlen, slicelength);
                sipIsErr = 1;
            }
            else
            {
                QItemSelection::const_iterator it = a1->begin();
        
                for (i = 0; i < slicelength; ++i)
                {
                    (*sipCpp)[start] = *it;
                    start += step;
                    ++it;
                }
            }
        }
%End

    void __delitem__(int i);
%MethodCode
        int len;
        
        len = sipCpp->count();
        
        if ((a0 = (int)sipConvertFromSequenceIndex(a0, len)) < 0)
            sipIsErr = 1;
        else
            sipCpp->removeAt(a0);
%End

    void __delitem__(SIP_PYSLICE slice);
%MethodCode
        SIP_SSIZE_T len, start, stop, step, slicelength, i;
        
        len = sipCpp->count();
        
        if (PySlice_GetIndicesEx((PySliceObject *)a0, len, &start, &stop, &step, &slicelength) < 0)
            sipIsErr = 1;
        else
            for (i = 0; i < slicelength; ++i)
            {
                sipCpp->removeAt(start);
                start += step - 1;
            }
%End

    QItemSelectionRange operator[](int i);
%MethodCode
        SIP_SSIZE_T idx = sipConvertFromSequenceIndex(a0, sipCpp->count());
        
        if (idx < 0)
            sipIsErr = 1;
        else
            sipRes = new QItemSelectionRange(sipCpp->operator[]((int)idx));
%End

    QItemSelection operator[](SIP_PYSLICE slice);
%MethodCode
        SIP_SSIZE_T len, start, stop, step, slicelength, i;
        
        len = sipCpp->count();
        
        if (PySlice_GetIndicesEx((PySliceObject *)a0, len, &start, &stop, &step, &slicelength) < 0)
            sipIsErr = 1;
        else
        {
            sipRes = new QItemSelection();
        
            for (i = 0; i < slicelength; ++i)
            {
                (*sipRes) += (*sipCpp)[start];
                start += step;
            }
        }
%End

// Methods inherited from QList<QItemSelectionRange>.
// Keep this in sync with QStringList (except for mid()).
void clear();
bool isEmpty() const;
void append(const QItemSelectionRange &range);
void prepend(const QItemSelectionRange &range);
void insert(int i, const QItemSelectionRange &range);
void replace(int i, const QItemSelectionRange &range);
void removeAt(int i);
int removeAll(const QItemSelectionRange &range);
QItemSelectionRange takeAt(int i);
QItemSelectionRange takeFirst();
QItemSelectionRange takeLast();
void move(int from, int to);
void swap(int i, int j);
int count(const QItemSelectionRange &range) const;
int count() const;
QItemSelectionRange &first();
QItemSelectionRange &last();
int indexOf(const QItemSelectionRange &value, int from = 0) const;
int lastIndexOf(const QItemSelectionRange &value, int from = -1) const;
QItemSelection &operator+=(const QItemSelection &other);
QItemSelection &operator+=(const QItemSelectionRange &value);
};
