okular/ui/propertiesdialog.cpp
Pino Toscano c6753bdd39 Convert the font list view in the property dialog to model/view.
svn path=/branches/work/kde4/playground/graphics/okular/; revision=524699
2006-03-30 23:15:30 +00:00

201 lines
6.3 KiB
C++

/***************************************************************************
* Copyright (C) 2004 by Albert Astals Cid <tsdgeos@terra.es> *
* *
* 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 2 of the License, or *
* (at your option) any later version. *
***************************************************************************/
// qt/kde includes
#include <qlayout.h>
#include <qlabel.h>
#include <qheaderview.h>
#include <qsortfilterproxymodel.h>
#include <qtreeview.h>
#include <klocale.h>
#include <ksqueezedtextlabel.h>
#include <kglobalsettings.h>
// local includes
#include "propertiesdialog.h"
#include "core/document.h"
PropertiesDialog::PropertiesDialog(QWidget *parent, KPDFDocument *doc)
: KDialogBase( Tabbed, i18n( "Unknown File" ), Ok, Ok, parent, 0, true, true )
{
// PROPERTIES
QFrame *page = addPage(i18n("Properties"));
QGridLayout *layout = new QGridLayout( page, 2, 2, marginHint(), spacingHint() );
// get document info, if not present display blank data and a warning
const DocumentInfo * info = doc->documentInfo();
if ( !info ) {
layout->addWidget( new QLabel( i18n( "No document opened." ), page ), 0, 0 );
return;
}
// mime name based on mimetype id
QString mimeName = info->get( "mimeType" ).section( '/', -1 ).toUpper();
setCaption( i18n("%1 Properties").arg( mimeName ) );
QDomElement docElement = info->documentElement();
int row = 0;
int valMaxWidth = 100;
for ( QDomNode node = docElement.firstChild(); !node.isNull(); node = node.nextSibling() ) {
QDomElement element = node.toElement();
QString titleString = element.attribute( "title" );
QString valueString = element.attribute( "value" );
if ( titleString.isEmpty() || valueString.isEmpty() )
continue;
// create labels and layout them
QLabel *key = new QLabel( i18n( "%1:" ).arg( titleString ), page );
QLabel *value = new KSqueezedTextLabel( valueString, page );
layout->addWidget( key, row, 0, Qt::AlignRight );
layout->addWidget( value, row, 1 );
row++;
// refine maximum width of 'value' labels
valMaxWidth = qMax( valMaxWidth, fontMetrics().width( valueString ) );
}
// add the number of pages if the generator hasn't done it already
QDomNodeList list = docElement.elementsByTagName( "pages" );
if ( list.count() == 0 ) {
QLabel *key = new QLabel( i18n( "Pages:" ), page );
QLabel *value = new QLabel( QString::number( doc->pages() ), page );
layout->addWidget( key, row, 0 );
layout->addWidget( value, row, 1 );
}
// FONTS
QVBoxLayout *page2Layout = 0;
const DocumentFonts * fonts = doc->documentFonts();
if ( fonts ) {
// create fonts tab and layout it
QFrame *page2 = addPage(i18n("Fonts"));
page2Layout = new QVBoxLayout(page2);
page2Layout->setMargin(0);
page2Layout->setSpacing(KDialog::spacingHint());
// add a tree view
QTreeView *view = new QTreeView(page2);
page2Layout->addWidget(view);
view->setRootIsDecorated(false);
view->setAlternatingRowColors(true);
view->header()->setClickable(true);
view->header()->setSortIndicatorShown(true);
// creating a proxy model so we can sort the data
QSortFilterProxyModel *proxymodel = new QSortFilterProxyModel(view);
FontsListModel *model = new FontsListModel(view);
proxymodel->setSourceModel(model);
view->setModel(proxymodel);
// populate the klistview
for ( QDomNode node = fonts->documentElement().firstChild(); !node.isNull(); node = node.nextSibling() ) {
QDomElement e = node.toElement();
model->addFont( e.attribute( "Name" ), e.attribute( "Type" ),
e.attribute( "Embedded" ), e.attribute( "File" ) );
}
}
// current width: left columnt + right column + dialog borders
int width = layout->minimumSize().width() + valMaxWidth + 2 * marginHint() + spacingHint() + 30;
if ( page2Layout )
width = qMax( width, page2Layout->sizeHint().width() + marginHint() + spacingHint() + 31 );
// stay inside the 2/3 of the screen width
QRect screenContainer = KGlobalSettings::desktopGeometry( this );
width = qMin( width, 2*screenContainer.width()/3 );
resize(width, 1);
}
class LocalFontInfoStruct
{
public:
QString name;
QString type;
QString embedded;
QString file;
};
FontsListModel::FontsListModel( QObject * parent )
: QAbstractTableModel( parent )
{
}
FontsListModel::~FontsListModel()
{
qDeleteAll(m_fonts);
}
void FontsListModel::addFont( const QString &name, const QString &type, const QString &embedded, const QString &file )
{
beginInsertRows( QModelIndex(), m_fonts.size() + 1, m_fonts.size() + 1 );
LocalFontInfoStruct *info = new LocalFontInfoStruct();
info->name = name;
info->type = type;
info->embedded = embedded;
info->file = file;
m_fonts << info;
endInsertRows();
}
int FontsListModel::columnCount( const QModelIndex & ) const
{
return 4;
}
QVariant FontsListModel::data( const QModelIndex &index, int role ) const
{
if ( !index.isValid() )
return QVariant();
if ( ( index.row() < 0 ) || ( index.row() >= m_fonts.size() ) )
return QVariant();
if ( role != Qt::DisplayRole )
return QVariant();
switch ( index.column() )
{
case 0: return m_fonts.at(index.row())->name; break;
case 1: return m_fonts.at(index.row())->type; break;
case 2: return m_fonts.at(index.row())->embedded; break;
case 3: return m_fonts.at(index.row())->file; break;
default:
return QVariant();
}
}
QVariant FontsListModel::headerData( int section, Qt::Orientation orientation, int role ) const
{
if ( orientation != Qt::Horizontal )
return QVariant();
if ( role == Qt::TextAlignmentRole )
return QVariant( Qt::AlignLeft );
if ( role != Qt::DisplayRole )
return QVariant();
switch ( section )
{
case 0: return i18n( "Name" ); break;
case 1: return i18n( "Type" ); break;
case 2: return i18n( "Embedded" ); break;
case 3: return i18n( "File" ); break;
default:
return QVariant();
}
}
int FontsListModel::rowCount( const QModelIndex & ) const
{
return m_fonts.size();
}
#include "propertiesdialog.moc"