--- a
+++ b/GUI/playlist/model/PlaylistItemModel.cpp
@@ -0,0 +1,164 @@
+/* PlaylistItemModel.cpp */
+
+/* Copyright (C) 2011  Lucio Carreras
+ *
+ * This file is part of sayonara player
+ *
+ * This program 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.
+
+ * This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+/*
+* PlaylistItemModel.cpp
+ *
+ *  Created on: Apr 8, 2011
+ *      Author: luke
+ */
+
+#include "GUI/playlist/model/PlaylistItemModel.h"
+#include "HelperStructs/MetaData.h"
+
+#include <QList>
+#include <QDebug>
+
+
+using namespace std;
+
+PlaylistItemModel::PlaylistItemModel(QObject* parent) : QAbstractListModel(parent) {
+}
+
+PlaylistItemModel::~PlaylistItemModel() {
+	// TODO Auto-generated destructor stub
+}
+
+
+
+int PlaylistItemModel::rowCount(const QModelIndex &parent) const{
+	Q_UNUSED(parent);
+    return (int) (_v_meta_data.size());
+}
+
+QVariant PlaylistItemModel::data(const QModelIndex &index, int role) const{
+
+	if (!index.isValid())
+		 return QVariant();
+
+    if (index.row() >= (int) _v_meta_data.size() || index.row() < 0)
+		 return QVariant();
+
+	 if (role == Qt::DisplayRole){
+		return QVariant();
+	 }
+
+	 if (role == Qt::WhatsThisRole){
+         return _v_meta_data[index.row()].toVariant();
+	 }
+
+	 else
+		 return QVariant();
+}
+
+
+
+
+Qt::ItemFlags PlaylistItemModel::flags(const QModelIndex &index = QModelIndex()) const{
+
+	if (!index.isValid())
+		return Qt::ItemIsEnabled;
+
+	return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
+}
+
+bool PlaylistItemModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole){
+
+	 if (index.isValid() && role == Qt::EditRole) {
+
+         MetaData md;
+         if(MetaData::fromVariant(value, md)){
+            _v_meta_data[index.row()] = md;
+            emit dataChanged(index, index);
+         }
+	     return true;
+	 }
+
+	 return false;
+}
+
+
+bool PlaylistItemModel::insertRows(int position, int rows, const QModelIndex &index){
+
+	Q_UNUSED(index);
+
+
+	beginInsertRows(QModelIndex(), position, position+rows-1);
+
+        MetaDataList v_md_new;
+
+        // copy old
+        for(int i=0; i<position; i++){
+            v_md_new.push_back(_v_meta_data[i]);
+        }
+
+        // create new space
+        for(int i=0; i<rows; i++){
+            MetaData md;
+            v_md_new.push_back(md);
+        }
+
+        // copy old
+        for(uint i= (uint) position; i<_v_meta_data.size(); i++){
+            v_md_new.push_back(_v_meta_data[i]);
+        }
+
+        _v_meta_data = v_md_new;
+
+	 endInsertRows();
+	 return true;
+}
+
+bool PlaylistItemModel::removeRows(int position, int rows, const QModelIndex &index){
+
+	Q_UNUSED(index);
+
+	 beginRemoveRows(QModelIndex(), position, position+rows-1);
+
+     MetaDataList v_md_new;
+
+     for (uint i=0; i<_v_meta_data.size(); i++) {
+
+         if(i >= (uint) position && i<=(uint)(position+rows-1)) continue;
+
+         v_md_new.push_back(_v_meta_data[i]);
+	 }
+
+
+     _v_meta_data = v_md_new;
+
+	 endRemoveRows();
+	 return true;
+
+}
+
+
+
+void PlaylistItemModel::set_selected(QList<int>& rows){
+    _selected_rows = rows;
+    for(uint i=0; i<_v_meta_data.size(); i++){
+        _v_meta_data[i].pl_selected = rows.contains(i);
+    }
+}
+
+bool PlaylistItemModel::is_selected(int row) const {
+    return _selected_rows.contains(row);
+}