coriolis/crlcore/src/LibraryManager/ViewsModel.cpp

256 lines
7.4 KiB
C++

// -*- C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC 2015-2016, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
// | Alliance / Hurricane Interface |
// | |
// | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@lip6.fr |
// | =============================================================== |
// | C++ Module : "./ViewsModel.cpp" |
// +-----------------------------------------------------------------+
#include <iostream>
#include <sstream>
#include <QFont>
#include <QApplication>
#include "hurricane/Library.h"
#include "hurricane/viewer/Graphics.h"
#include "crlcore/AllianceFramework.h"
#include "crlcore/ViewsModel.h"
#include "crlcore/CellDatas.h"
#include "crlcore/LibraryManager.h"
namespace CRL {
using namespace std;
using Hurricane::Graphics;
ViewsModel::ViewsModel ( QObject* parent )
: QAbstractTableModel(parent)
, _cellDatas (NULL)
, _viewLoaders ()
, _viewSizes ()
{ }
ViewsModel::~ViewsModel ()
{ }
Qt::ItemFlags ViewsModel::flags ( const QModelIndex& index ) const
{
if (index.isValid() and _cellDatas->isLoaded() )
return Qt::NoItemFlags;
Qt::ItemFlags result = QAbstractTableModel::flags(index);
if (index.column() == 0) result |= Qt::ItemIsUserCheckable;
return result;
}
QVariant ViewsModel::data ( const QModelIndex& index, int role ) const
{
static QFont nameFont = Graphics::getFixedFont( QFont::Bold );
static QFont valueFont = Graphics::getFixedFont( QFont::Normal, true );
if (role == Qt::FontRole) {
// if (index.row() == 0) return QVariant();
// switch (index.column()) {
// case 0: return nameFont;
// default: return valueFont;
// }
return QVariant();
}
if (not index.isValid()) return QVariant();
if (role == Qt::TextAlignmentRole) {
int column = index.column();
if (column == 1) return Qt::AlignRight;
}
if (role == Qt::DisplayRole) {
int column = index.column();
if (column == 0) {
const CellLoader* loader = _viewLoaders[ index.row() ];
string label = loader->getFormat() + " [";
size_t count = 0;
if (loader->getViewFlags() & Catalog::State::Logical ) { label += "Lo"; ++count; }
if (loader->getViewFlags() & Catalog::State::Physical) { label += ((count++)?"+":""); label += "Ph"; }
label += "]";
return label.c_str();
}
if (column == 1) {
double value = (double)_viewSizes[index.row()] / 1024.0;
char unit = 'K';
if (value >= 1024.0) { value /= 1024.0; unit = 'M'; }
if (value >= 1024.0) { value /= 1024.0; unit = 'G'; }
ostringstream os;
os << setprecision(2) << value << " " << unit << "iB";
return os.str().c_str();
}
}
if (role == Qt::CheckStateRole) {
if (index.column() == 0) {
return (_cellDatas->getActiveFlags() & _viewLoaders[index.row()]->getFlags())
? Qt::Checked : Qt::Unchecked;
}
}
return QVariant();
}
bool ViewsModel::setData ( const QModelIndex& index, const QVariant& value, int role )
{
if (index.isValid()) {
if ( (index.column() == 0) and (role == Qt::CheckStateRole) ) {
if (_cellDatas->getActiveFlags() & _viewLoaders[index.row()]->getFlags()) {
_cellDatas->resetActiveFlags( _viewLoaders[index.row()]->getFlags() & CellLoaders::lmask() );
} else {
_cellDatas->setActiveFlags( _viewLoaders[index.row()]->getFlags() & CellLoaders::lmask() );
}
emit dataChanged( index, index );
}
}
return false;
}
QVariant ViewsModel::headerData ( int section
, Qt::Orientation orientation
, int role ) const
{
if (orientation == Qt::Vertical) return QVariant();
static QFont headerFont = Graphics::getFixedFont( QFont::Bold, false, false, +0 );
if (role == Qt::FontRole ) return headerFont;
if (role != Qt::DisplayRole) return QVariant();
switch ( section ) {
case 0: return QVariant("View [type]");
case 1: return QVariant("Size");
}
return QVariant();
}
int ViewsModel::rowCount ( const QModelIndex& parent ) const
{ return _viewLoaders.size(); }
int ViewsModel::columnCount ( const QModelIndex& parent ) const
{ return 2; }
void ViewsModel::setCellDatas ( CellDatas* cellDatas )
{
_cellDatas = cellDatas;
emit layoutAboutToBeChanged();
_viewLoaders.clear();
_viewSizes .clear();
if (_cellDatas != NULL) {
unsigned int flags = _cellDatas->getFlags() & CellLoaders::lmask();
CellLoaders* loaders = CellLoaders::get();
for ( size_t bit=16 ; bit<32 ; ++bit ) {
unsigned int bitmask = 1 << bit;
if (not (flags & bitmask)) continue;
const CellLoader* loader = loaders->getLoader( bitmask );
if (loader) {
_viewLoaders.push_back( loader );
string file = _cellDatas->getName() + "." + loader->getFormat();
Utilities::Path path = CellDatas::getLibraryPath() / file;
Utilities::Path::Stat stat = path.stat();
_viewSizes.push_back( stat.size() );
}
}
}
emit layoutChanged();
}
void ViewsModel::setNewViewer ( int state )
{
if (state == Qt::Checked ) _cellDatas->setActiveFlags ( CellLoader::NewViewer );
if (state == Qt::Unchecked) _cellDatas->resetActiveFlags( CellLoader::NewViewer );
}
void ViewsModel::loadCell ()
{
if (not _cellDatas) return;
emit layoutAboutToBeChanged();
Cell* cell = NULL;
const CellLoader* activeLoader = NULL;
cell = _cellDatas->getCell();
if ( cell or _cellDatas->isLoaded() ) {
emit selectedCell( cell, _cellDatas->getActiveFlags() );
} else {
unsigned int loadFlags = 0;
unsigned int viewFlags = 0;
CellLoaders* loaders = CellLoaders::get();
for ( size_t bit=16 ; bit<32 ; ++bit ) {
unsigned int bitmask = 1 << bit;
if (not (_cellDatas->getActiveFlags() & bitmask)) continue;
const CellLoader* loader = loaders->getLoader( bitmask );
if (loader) {
if (not activeLoader) activeLoader = loader;
loadFlags |= loader->getFlags();
viewFlags |= loader->getViewFlags();
}
if (not loadFlags or not viewFlags) return;
if ( (loadFlags & CellLoader::Native) and (loadFlags & CellLoader::Importer) )
return;
}
if (loadFlags & CellLoader::Native) {
cell = AllianceFramework::get()->getCell( _cellDatas->getName(), viewFlags );
}
if (loadFlags & CellLoader::Importer) {
cell = activeLoader->getCallback()( _cellDatas->getName() );
}
if (cell) {
_cellDatas->setActiveFlags( CellLoader::Loaded );
_cellDatas->setCell ( cell );
emit selectedCell( cell, _cellDatas->getActiveFlags() );
emit loadedCell();
if (loadFlags & CellLoader::MultiCell)
emit updatedLibrary();
}
}
emit layoutChanged();
}
} // CRL namespace.