1
/* This file is part of the KDE project
2
Copyright (c) 2002 Patrick Julien <freak@codepimps.org>
3
Copyright (c) 2007 Jan Hambrecht <jaham@gmx.net>
4
Copyright (c) 2007 Sven Langkamp <sven.langkamp@gmail.com>
6
This library is free software; you can redistribute it and/or
7
modify it under the terms of the GNU Library General Public
8
License as published by the Free Software Foundation; either
9
version 2 of the License, or (at your option) any later version.
11
This library is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
Library General Public License for more details.
16
You should have received a copy of the GNU Library General Public License
17
along with this library; see the file COPYING.LIB. If not, write to
18
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19
* Boston, MA 02110-1301, USA.
21
#include "KoResourceItemChooser.h"
23
#include <QGridLayout>
24
#include <QButtonGroup>
25
#include <QPushButton>
26
#include <QHeaderView>
27
#include <QAbstractProxyModel>
29
#include <kfiledialog.h>
30
#include <kiconloader.h>
34
#include "KoResourceServerAdapter.h"
35
#include "KoResourceItemView.h"
36
#include "KoResourceItemDelegate.h"
37
#include "KoResourceModel.h"
38
#include "KoResource.h"
40
class KoResourceItemChooser::Private
43
Private() : model(0), view(0), buttonGroup(0) {}
44
KoResourceModel* model;
45
KoResourceItemView* view;
46
QButtonGroup* buttonGroup;
49
KoResourceItemChooser::KoResourceItemChooser( KoAbstractResourceServerAdapter * resourceAdapter, QWidget *parent )
50
: QWidget( parent ), d( new Private() )
52
Q_ASSERT(resourceAdapter);
53
d->model = new KoResourceModel(resourceAdapter, this);
54
d->view = new KoResourceItemView(this);
55
d->view->setModel(d->model);
56
d->view->setItemDelegate( new KoResourceItemDelegate( this ) );
57
d->view->setSelectionMode( QAbstractItemView::SingleSelection );
58
connect( d->view, SIGNAL(activated( const QModelIndex & ) ),
59
this, SLOT(activated ( const QModelIndex & ) ) );
61
d->buttonGroup = new QButtonGroup( this );
62
d->buttonGroup->setExclusive( false );
64
QGridLayout* layout = new QGridLayout( this );
65
layout->addWidget( d->view, 0, 0, 1, 3 );
67
QPushButton *button = new QPushButton( this );
68
button->setIcon( SmallIcon( "list-add" ) );
69
button->setToolTip( i18n("Import") );
70
button->setEnabled( true );
71
d->buttonGroup->addButton( button, Button_Import );
72
layout->addWidget( button, 1, 0 );
74
button = new QPushButton( this );
75
button->setIcon( SmallIcon( "list-remove" ) );
76
button->setToolTip( i18n("Delete") );
77
button->setEnabled( false );
78
d->buttonGroup->addButton( button, Button_Remove );
79
layout->addWidget( button, 1, 1 );
81
connect( d->buttonGroup, SIGNAL( buttonClicked( int ) ), this, SLOT( slotButtonClicked( int ) ));
83
layout->setColumnStretch( 0, 1 );
84
layout->setColumnStretch( 1, 1 );
85
layout->setColumnStretch( 2, 2 );
86
layout->setSpacing( 0 );
87
layout->setMargin( 3 );
89
updateRemoveButtonState();
92
KoResourceItemChooser::~KoResourceItemChooser()
97
void KoResourceItemChooser::slotButtonClicked( int button )
99
if( button == Button_Import ) {
100
QString extensions = d->model->resourceServerAdapter()->extensions();
101
QString filter = extensions.replace(QString(":"), QString(" "));
102
QString filename = KFileDialog::getOpenFileName( KUrl(), filter, 0, i18n( "Choose File to Add" ) );
104
d->model->resourceServerAdapter()->importResourceFile(filename);
106
else if( button == Button_Remove ) {
107
QModelIndex index = d->view->currentIndex();
108
if( index.isValid() ) {
110
KoResource * resource = resourceFromModelIndex(index);
112
d->model->resourceServerAdapter()->removeResource(resource);
116
updateRemoveButtonState();
119
void KoResourceItemChooser::showButtons( bool show )
121
foreach( QAbstractButton * button, d->buttonGroup->buttons() )
122
show ? button->show() : button->hide();
125
void KoResourceItemChooser::setColumnCount( int columnCount )
127
d->model->setColumnCount( columnCount );
130
void KoResourceItemChooser::setRowHeight( int rowHeight )
132
d->view->verticalHeader()->setDefaultSectionSize( rowHeight );
135
void KoResourceItemChooser::setItemDelegate( QAbstractItemDelegate * delegate )
137
d->view->setItemDelegate(delegate);
140
KoResource * KoResourceItemChooser::currentResource()
142
QModelIndex index = d->view->currentIndex();
143
if( index.isValid() )
144
return resourceFromModelIndex(index);
149
void KoResourceItemChooser::setCurrentItem(int row, int column)
151
QModelIndex index = d->model->index(row, column);
152
if( !index.isValid() )
155
d->view->setCurrentIndex(index);
158
void KoResourceItemChooser::setProxyModel( QAbstractProxyModel* proxyModel )
160
proxyModel->setSourceModel(d->model);
161
d->view->setModel(proxyModel);
164
void KoResourceItemChooser::activated( const QModelIndex & index )
166
if( ! index.isValid() )
169
KoResource * resource = resourceFromModelIndex(index);
172
emit resourceSelected( resource );
174
updateRemoveButtonState();
177
void KoResourceItemChooser::updateRemoveButtonState()
179
QAbstractButton * removeButton = d->buttonGroup->button( Button_Remove );
183
KoResource * resource = currentResource();
185
removeButton->setEnabled( resource->removable() );
189
removeButton->setEnabled( false );
192
KoResource* KoResourceItemChooser::resourceFromModelIndex(const QModelIndex& index)
197
const QAbstractProxyModel* proxyModel = dynamic_cast<const QAbstractProxyModel*>(index.model());
199
//Get original model index, because proxy models destroy the internalPointer
200
QModelIndex originalIndex = proxyModel->mapToSource(index);
201
return static_cast<KoResource*>( originalIndex.internalPointer() );
204
return static_cast<KoResource*>( index.internalPointer() );
208
#include <KoResourceItemChooser.moc>