/**
* \file commandstablemodel.cpp
* Context menu commands configuration table model.
*
* \b Project: Kid3
* \author Urs Fleisch
* \date 13 Mar 2011
*
* Copyright (C) 2005-2011 Urs Fleisch
*
* This file is part of Kid3.
*
* Kid3 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 2 of the License, or
* (at your option) any later version.
*
* Kid3 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 .
*/
#include "commandstablemodel.h"
#include "commandformatreplacer.h"
#include "qtcompatmac.h"
/** Column indices. */
enum ColumnIndex {
CI_Confirm,
CI_Output,
CI_Name,
CI_Command,
CI_NumColumns
};
/**
* Constructor.
* @param parent parent widget
*/
CommandsTableModel::CommandsTableModel(QObject* parent) :
QAbstractTableModel(parent)
{
setObjectName("CommandsTableModel");
}
/**
* Destructor.
*/
CommandsTableModel::~CommandsTableModel()
{
}
/**
* Get item flags for index.
* @param index model index
* @return item flags
*/
Qt::ItemFlags CommandsTableModel::flags(const QModelIndex& index) const
{
Qt::ItemFlags theFlags = QAbstractTableModel::flags(index);
if (index.isValid()) {
theFlags |= Qt::ItemIsSelectable | Qt::ItemIsEnabled;
if (index.column() == CI_Confirm || index.column() == CI_Output) {
theFlags |= Qt::ItemIsUserCheckable;
} else {
theFlags |= Qt::ItemIsEditable;
}
}
return theFlags;
}
/**
* Get data for a given role.
* @param index model index
* @param role item data role
* @return data for role
*/
QVariant CommandsTableModel::data(const QModelIndex& index, int role) const
{
if (!index.isValid() ||
index.row() < 0 || index.row() >= m_cmdList.size() ||
index.column() < 0 || index.column() >= CI_NumColumns)
return QVariant();
const MiscConfig::MenuCommand& item = m_cmdList.at(index.row());
if (role == Qt::DisplayRole || role == Qt::EditRole) {
switch (index.column()) {
case CI_Name:
return item.getName();
case CI_Command:
return item.getCommand();
default: ;
}
}
if (role == Qt::CheckStateRole) {
switch (index.column()) {
case CI_Confirm:
return item.mustBeConfirmed() ? Qt::Checked : Qt::Unchecked;
case CI_Output:
return item.outputShown() ? Qt::Checked : Qt::Unchecked;
default: ;
}
}
return QVariant();
}
/**
* Set data for a given role.
* @param index model index
* @param value data value
* @param role item data role
* @return true if successful
*/
bool CommandsTableModel::setData(const QModelIndex& index,
const QVariant& value, int role)
{
if (!index.isValid() ||
index.row() < 0 || index.row() >= m_cmdList.size() ||
index.column() < 0 || index.column() >= CI_NumColumns)
return false;
MiscConfig::MenuCommand& item = m_cmdList[index.row()];
if (role == Qt::EditRole) {
switch (index.column()) {
case CI_Name:
item.setName(value.toString());
break;
case CI_Command:
item.setCommand(value.toString());
break;
default:
return false;
}
} else if (role == Qt::CheckStateRole) {
switch (index.column()) {
case CI_Confirm:
item.setMustBeConfirmed(value.toInt() == Qt::Checked);
break;
case CI_Output:
item.setOutputShown(value.toInt() == Qt::Checked);
break;
default:
return false;
}
} else {
return false;
}
emit dataChanged(index, index);
return true;
}
/**
* Get data for header section.
* @param section column or row
* @param orientation horizontal or vertical
* @param role item data role
* @return header data for role
*/
QVariant CommandsTableModel::headerData(
int section, Qt::Orientation orientation, int role) const
{
if (role == Qt::ToolTipRole && orientation == Qt::Horizontal &&
section == CI_Command)
return CommandFormatReplacer::getToolTip();
if (role != Qt::DisplayRole)
return QVariant();
if (orientation == Qt::Horizontal) {
switch (section) {
case CI_Confirm:
return i18n("Confirm");
case CI_Output:
return i18n("Output");
case CI_Name:
return i18n("Name");
case CI_Command:
return i18n("Command");
default:
return section + 1;
}
}
return section + 1;
}
/**
* Get number of rows.
* @param parent parent model index, invalid for table models
* @return number of rows,
* if parent is valid number of children (0 for table models)
*/
int CommandsTableModel::rowCount(const QModelIndex& parent) const
{
return parent.isValid() ? 0 : m_cmdList.size();
}
/**
* Get number of columns.
* @param parent parent model index, invalid for table models
* @return number of columns,
* if parent is valid number of children (0 for table models)
*/
int CommandsTableModel::columnCount(const QModelIndex& parent) const
{
return parent.isValid() ? 0 : CI_NumColumns;
}
/**
* Insert rows.
* @param row rows are inserted before this row, if 0 at the begin,
* if rowCount() at the end
* @param count number of rows to insert
* @return true if successful
*/
bool CommandsTableModel::insertRows(int row, int count,
const QModelIndex&)
{
beginInsertRows(QModelIndex(), row, row + count - 1);
for (int i = 0; i < count; ++i)
m_cmdList.insert(row, MiscConfig::MenuCommand());
endInsertRows();
return true;
}
/**
* Remove rows.
* @param row rows are removed starting with this row
* @param count number of rows to remove
* @return true if successful
*/
bool CommandsTableModel::removeRows(int row, int count,
const QModelIndex&)
{
beginRemoveRows(QModelIndex(), row, row + count - 1);
for (int i = 0; i < count; ++i)
m_cmdList.removeAt(row);
endRemoveRows();
return true;
}
/**
* Get the resize modes to be used for the columns.
* @return list of resize modes for the columns
*/
QList
CommandsTableModel::getHorizontalResizeModes() const
{
QList resizeModes;
for (int i = 0; i < CI_NumColumns; ++i) {
QHeaderView::ResizeMode mode = QHeaderView::Interactive;
if (i == CI_Confirm || i == CI_Output)
mode = QHeaderView::ResizeToContents;
else if (i == CI_Command)
mode = QHeaderView::Stretch;
resizeModes.append(mode);
}
return resizeModes;
}
/**
* Set the model from the command list.
* @param cmdList command list
*/
void CommandsTableModel::setCommandList(
const QList& cmdList)
{
m_cmdList = cmdList;
reset();
}
/**
* Get the command list from the model.
* @return command list
*/
QList CommandsTableModel::getCommandList() const
{
QList cmdList;
for (QList::const_iterator it = m_cmdList.constBegin();
it != m_cmdList.constEnd();
++it) {
if (!it->getName().isEmpty()) {
cmdList.append(*it);
}
}
if (cmdList.isEmpty()) {
// Make sure that their is at least one entry, so that new entries can
// be added.
cmdList.append(MiscConfig::MenuCommand());
}
return cmdList;
}