You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
koffice/kivio/kiviopart/ui/kivioaddstencilsetpanel.cpp

227 lines
6.2 KiB

/* This file is part of the KDE project
Copyright (C) 2004-2005 Peter Simonsson <psn@linux.se>,
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include "kivioaddstencilsetpanel.h"
#include <qfile.h>
#include <qdir.h>
#include <qstringlist.h>
#include <qiconview.h>
#include <qgroupbox.h>
#include <qpushbutton.h>
#include <qtextbrowser.h>
#include <qsplitter.h>
#include <kstandarddirs.h>
#include <kglobal.h>
#include <klistview.h>
#include "kivio_stencil_spawner_set.h"
#include "kivio_stencil_spawner.h"
#include "kivio_stencil_spawner_info.h"
#include "kivio_stencil.h"
#include "kivioglobal.h"
namespace Kivio {
AddStencilSetPanel::AddStencilSetPanel(QWidget *parent, const char *name)
: KivioStencilSetWidget(parent, name)
{
int height = m_stencilsetGBox->height() / 2;
QValueList<int> sizes;
sizes << height << height;
m_stencilSetSplitter->setSizes(sizes);
updateList();
connect(m_stencilSetLView, SIGNAL(selectionChanged(QListViewItem*)), this, SLOT(changeStencilSet(QListViewItem*)));
connect(m_addToDocBtn, SIGNAL(clicked()), this, SLOT(addToDocument()));
QListViewItem* tmp = m_stencilSetLView->firstChild();
if(tmp) {
tmp = tmp->firstChild();
if(tmp) {
m_stencilSetLView->setSelected(tmp, true);
m_stencilSetLView->ensureItemVisible(tmp);
}
}
#if KDE_IS_VERSION(3,4,0)
m_stencilSetLView-> setShadeSortColumn(false);
#endif
}
AddStencilSetPanel::~AddStencilSetPanel()
{
}
void AddStencilSetPanel::updateList()
{
KStandardDirs *dirs = KGlobal::dirs();
QStringList dirList = dirs->findDirs("data", "kivio/stencils");
dirList.sort();
m_stencilSetLView->clear();
for(QStringList::Iterator it = dirList.begin(); it != dirList.end(); ++it)
{
QString dir = (*it);
loadCollections(dir);
}
}
void AddStencilSetPanel::loadCollections(const QString& dir)
{
QDir rootDir( dir );
rootDir.setFilter( QDir::Dirs );
rootDir.setSorting( QDir::Name );
const QFileInfoList *colList = rootDir.entryInfoList();
QFileInfoListIterator colIt( *colList );
QFileInfo *colFInfo;
QString cId;
while((colFInfo = colIt.current()))
{
if((colFInfo->fileName() != "..") && (colFInfo->fileName() != "."))
{
cId = KivioStencilSpawnerSet::readId(colFInfo->absFilePath());
QListViewItem* li = m_stencilSetLView->firstChild();
while(li) {
if(li->text(1) == cId) {
break;
}
li = li->nextSibling();
}
if(!li) {
li = new KListViewItem(m_stencilSetLView,
KivioStencilSpawnerSet::readTitle(colFInfo->absFilePath()),
KivioStencilSpawnerSet::readId(colFInfo->absFilePath()));
li->setPixmap(0, loadIcon("icon", colFInfo->absFilePath()));
}
loadStencilSet(li, dir + "/" + colFInfo->fileName());
}
++colIt;
}
}
void AddStencilSetPanel::loadStencilSet(QListViewItem* li, const QString& dir)
{
QDir rootDir( dir );
rootDir.setFilter( QDir::Dirs );
rootDir.setSorting( QDir::Name );
const QFileInfoList *setList = rootDir.entryInfoList();
QFileInfoListIterator setIt( *setList );
QFileInfo *setFInfo;
while( (setFInfo = setIt.current()) )
{
if( setFInfo->fileName() != ".." && setFInfo->fileName() != "." )
{
KListViewItem* tmp = new KListViewItem(li, KivioStencilSpawnerSet::readTitle(setFInfo->absFilePath()),
dir + "/" + setFInfo->fileName());
tmp->setPixmap(0, loadIcon("icon", setFInfo->absFilePath()));
if(m_currentDir == setFInfo->absFilePath()) {
tmp->setSelected(true);
m_stencilSetLView->ensureItemVisible(tmp);
}
}
++setIt;
}
}
QPixmap AddStencilSetPanel::loadIcon(const QString& name, const QString& dir)
{
QString fs;
if( QFile::exists(dir + "/" + name + ".xpm") ) {
fs = dir + "/" + name + ".xpm";
} else if( QFile::exists(dir + "/" + name + ".png") ) {
fs = dir + "/" + name + ".png";
} else {
return QPixmap();
}
return QPixmap( fs );
}
void AddStencilSetPanel::changeStencilSet(QListViewItem* li)
{
if(!li || !li->parent()) {
return;
}
m_stencilsetGBox->setTitle(li->text(0));
m_addToDocBtn->setEnabled(true);
KivioStencilSpawnerSet* spawnerSet = new KivioStencilSpawnerSet(li->text(0));
// Load the stencil icons
m_currentDir = li->text(1);
spawnerSet->loadDir(m_currentDir);
QStringList files = spawnerSet->files();
// Remove the old icons
m_stencilIView->clear();
KivioStencilSpawner* spawner = 0;
KivioStencil* stencil = 0;
int count = 0;
for(QStringList::Iterator it = files.begin(); it != files.end(); ++it)
{
spawner = spawnerSet->loadFile(m_currentDir + "/" + (*it));
if(spawner) {
stencil = spawner->newStencil();
if(stencil) {
(void) new QIconViewItem(m_stencilIView, spawner->info()->title(), Kivio::generatePixmapFromStencil(32, 32, stencil));
delete stencil;
count++;
}
}
if(count == 10) { // Limit to max 10 stencils
break;
}
}
m_descriptionBrowser->setText(KivioStencilSpawnerSet::readDescription(m_currentDir));
delete spawnerSet;
}
void AddStencilSetPanel::addToDocument()
{
if(m_currentDir.isEmpty()) {
return;
}
emit addStencilSet(m_currentDir);
}
}
#include "kivioaddstencilsetpanel.moc"