summaryrefslogtreecommitdiffstats
path: root/kexi/widget/pixmapcollection.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kexi/widget/pixmapcollection.cpp')
-rw-r--r--kexi/widget/pixmapcollection.cpp440
1 files changed, 440 insertions, 0 deletions
diff --git a/kexi/widget/pixmapcollection.cpp b/kexi/widget/pixmapcollection.cpp
new file mode 100644
index 00000000..7f9718d6
--- /dev/null
+++ b/kexi/widget/pixmapcollection.cpp
@@ -0,0 +1,440 @@
+/* This file is part of the KDE project
+ Copyright (C) 2004 Cedric Pasteur <[email protected]>
+
+ 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 <qpixmap.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qstringlist.h>
+#include <qtoolbutton.h>
+#include <qdom.h>
+
+#include <kapplication.h>
+#include <kiconloader.h>
+#include <kfiledialog.h>
+#include <kcombobox.h>
+#include <kicondialog.h>
+#include <klineedit.h>
+#include <kicontheme.h>
+#include <kpixmapio.h>
+#include <kpopupmenu.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+
+#include "pixmapcollection.h"
+
+/// Pixmap Collection
+PixmapCollection::PixmapCollection(const QString &collectionName, QObject *parent, const char *name)
+ : QObject(parent, name)
+{
+ m_name = collectionName;
+}
+
+QString
+PixmapCollection::addPixmapPath(const KURL &url)
+{
+ QString name = url.filename();
+ while(m_pixmaps.contains(name))
+ {
+ bool ok;
+ int num = name.right(1).toInt(&ok, 10);
+ if(ok)
+ name = name.left(name.length()-1) + QString::number(num+1);
+ else
+ name += "2";
+ }
+
+ m_pixmaps.insert(name, qMakePair(url.path(), 0));
+ return name;
+}
+
+QString
+PixmapCollection::addPixmapName(const QString &icon, int size)
+{
+ QString name = icon;
+ while(m_pixmaps.contains(name))
+ {
+ bool ok;
+ int num = name.right(1).toInt(&ok, 10);
+ if(ok)
+ name = name.left(name.length()-1) + QString::number(num+1);
+ else
+ name += "2";
+ }
+
+ m_pixmaps.insert(name, qMakePair(icon, size));
+ return name;
+}
+
+void
+PixmapCollection::removePixmap(const QString &name)
+{
+ m_pixmaps.remove(name);
+}
+
+QPixmap
+PixmapCollection::getPixmap(const QString &name)
+{
+ if(!m_pixmaps.contains(name))
+ {
+ kdDebug() << " The icon " << name << " you requested is not in the collection" << endl;
+ return QPixmap();
+ }
+
+ if(m_pixmaps[name].second != 0)
+ {
+ return kapp->iconLoader()->loadIcon(m_pixmaps[name].first, KIcon::NoGroup, m_pixmaps[name].second);
+ }
+ else
+ return QPixmap(m_pixmaps[name].first);
+}
+
+bool
+PixmapCollection::contains(const QString &name)
+{
+ return m_pixmaps.contains(name);
+}
+
+void
+PixmapCollection::save(QDomNode parentNode)
+{
+ if(m_pixmaps.isEmpty())
+ return;
+
+ QDomDocument domDoc = parentNode.ownerDocument();
+ QDomElement collection = domDoc.createElement("collection");
+ parentNode.appendChild(collection);
+
+ PixmapMap::ConstIterator it;
+ PixmapMap::ConstIterator endIt = m_pixmaps.constEnd();
+ for(it = m_pixmaps.constBegin(); it != endIt; ++it)
+ {
+ QDomElement item = domDoc.createElement("pixmap");
+ collection.appendChild(item);
+ item.setAttribute("name", it.key());
+ if(it.data().second != 0)
+ item.setAttribute("size", QString::number(it.data().second));
+
+ QString text = it.data().first;
+ QDomText textNode = domDoc.createTextNode(text);
+ item.appendChild(textNode);
+ }
+}
+
+void
+PixmapCollection::load(QDomNode node)
+{
+ QDomDocument domDoc = node.ownerDocument();
+ for(QDomNode n = node.firstChild(); !n.isNull(); n = n.nextSibling())
+ {
+ QDomElement el = n.toElement();
+ QPair<QString, int> pair = qMakePair(el.text(), el.attribute("size").toInt());
+ m_pixmaps[el.attribute("name")] = pair;
+ }
+}
+
+//// A dialog to load a KDE icon by its name
+LoadIconDialog::LoadIconDialog(QWidget *parent)
+: KDialogBase(parent, "loadicon_dialog", true, i18n("Load KDE Icon by Name"), Ok|Cancel, Ok, false)
+{
+ QFrame *frame = makeMainWidget();
+ QGridLayout *l = new QGridLayout(frame, 2, 3, 0, 6);
+
+ // Name input
+ QLabel *name = new QLabel(i18n("&Name:"), frame);
+ l->addWidget(name, 0, 0);
+ name->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
+ m_nameInput = new KLineEdit("kexi", frame);
+ l->addWidget(m_nameInput, 0, 1);
+ name->setBuddy(m_nameInput);
+
+ // Choose size
+ QLabel *size = new QLabel(i18n("&Size:"), frame);
+ l->addWidget(size, 1, 0);
+ size->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
+
+ KComboBox *combo = new KComboBox(frame);
+ l->addWidget(combo, 1, 1);
+ size->setBuddy(combo);
+ QStringList list;
+ list << i18n("Small") << i18n("Medium") << i18n("Large") << i18n("Huge");
+ combo->insertStringList(list);
+ combo->setCurrentItem(2);
+ connect(combo, SIGNAL(activated(int)), this, SLOT(changeIconSize(int)));
+
+
+ // Icon chooser button
+ m_button = new KIconButton(frame);
+ m_button->setIcon("kexi");
+ m_button->setIconSize(KIcon::SizeMedium);
+ l->addMultiCellWidget(m_button, 0, 1, 2, 2);
+ connect(m_button, SIGNAL(iconChanged(QString)), this, SLOT(updateIconName(QString)));
+ connect(m_nameInput, SIGNAL(textChanged(const QString &)), this, SLOT(setIcon(const QString &)));
+}
+
+void
+LoadIconDialog::updateIconName(QString icon)
+{
+ m_nameInput->setText(icon);
+}
+
+void
+LoadIconDialog::setIcon(const QString &icon)
+{
+ m_button->setIcon(icon);
+}
+
+void
+LoadIconDialog::changeIconSize(int index)
+{
+ int size = KIcon::SizeMedium;
+ switch(index)
+ {
+ case 0: size = KIcon::SizeSmall; break;
+ //case 1: size = KIcon::SizeSmallMedium; break;
+ case 1: size = KIcon::SizeMedium; break;
+ case 2: size = KIcon::SizeLarge; break;
+#if !defined(Q_WS_WIN) && KDE_IS_VERSION(3,1,9)
+ case 3: size = KIcon::SizeHuge; break;
+#endif
+ default:;
+ }
+
+ m_button->setIconSize(size);
+}
+
+int LoadIconDialog::iconSize()
+{
+ return m_button->iconSize();
+}
+
+QString LoadIconDialog::iconName()
+{
+ return m_button->icon();
+}
+
+/// Pixmap Collection Editor Dialog
+PixmapCollectionEditor::PixmapCollectionEditor(PixmapCollection *collection, QWidget *parent)
+: KDialogBase(parent, "pixcollection_dialog", true,
+ i18n("Edit Pixmap Collection: %1").arg(collection->collectionName()), Close, Close, false)
+{
+ m_collection = collection;
+ QFrame *frame = makeMainWidget();
+ QHBoxLayout *l = new QHBoxLayout(frame, 0, 6);
+ setInitialSize(QSize(400, 200), true);
+
+ //// Setup the icon toolbar /////////////////
+ QVBoxLayout *vlayout = new QVBoxLayout(l, 3);
+ QToolButton *newItemPath = new QToolButton(frame);
+ newItemPath->setIconSet(BarIconSet("fileopen"));
+ newItemPath->setTextLabel(i18n("&Add File"), true);
+ vlayout->addWidget(newItemPath);
+ m_buttons.insert(BNewItemPath, newItemPath);
+ connect(newItemPath, SIGNAL(clicked()), this, SLOT(newItemByPath()));
+
+ QToolButton *newItemName = new QToolButton(frame);
+ newItemName->setIconSet(BarIconSet("icons"));
+ newItemName->setTextLabel(i18n("&Add an Icon"), true);
+ vlayout->addWidget(newItemName);
+ m_buttons.insert(BNewItemName, newItemName);
+ connect(newItemName, SIGNAL(clicked()), this, SLOT(newItemByName()));
+
+ QToolButton *delItem = new QToolButton(frame);
+ delItem->setIconSet(BarIconSet("edit_remove"));
+ delItem->setTextLabel(i18n("&Remove Selected Item"), true);
+ vlayout->addWidget(delItem);
+ m_buttons.insert(BDelItem, delItem);
+ connect(delItem, SIGNAL(clicked()), this, SLOT(removeItem()));
+ vlayout->addStretch();
+
+ // Setup the iconView
+ m_iconView = new KIconView(frame, "pixcollection_iconView");
+ m_iconView->resize(100,100);
+ m_iconView->setArrangement(QIconView::LeftToRight);
+ m_iconView->setAutoArrange(true);
+ m_iconView->setMode(KIconView::Select);
+ l->addWidget(m_iconView);
+ connect(m_iconView, SIGNAL(contextMenuRequested(QIconViewItem*, const QPoint&)), this, SLOT(displayMenu(QIconViewItem*, const QPoint&)));
+ connect(m_iconView, SIGNAL(itemRenamed(QIconViewItem*, const QString &)), this, SLOT(renameCollectionItem(QIconViewItem*, const QString&)));
+
+ PixmapMap::ConstIterator it;
+ PixmapMap::ConstIterator endIt = collection->m_pixmaps.end();
+ for(it = collection->m_pixmaps.constBegin(); it != endIt; ++it)
+ createIconViewItem(it.key());
+}
+
+void
+PixmapCollectionEditor::newItemByName()
+{
+ LoadIconDialog d(parentWidget());
+ if(d.exec()== QDialog::Accepted)
+ {
+ if(d.iconName().isEmpty())
+ return;
+
+ QString name = m_collection->addPixmapName(d.iconName(), d.iconSize());
+ createIconViewItem(name);
+ }
+}
+
+void
+PixmapCollectionEditor::newItemByPath()
+{
+ KURL url = KFileDialog::getImageOpenURL("::kexi", parentWidget());
+ if(url.isEmpty())
+ return;
+ QString name = m_collection->addPixmapPath(url);
+ createIconViewItem(name);
+}
+
+void
+PixmapCollectionEditor::removeItem()
+{
+ QIconViewItem *item = m_iconView->currentItem();
+ if( !item )
+ return;
+
+ int confirm = KMessageBox::questionYesNo(parentWidget(), QString("<qt>")+
+ i18n("Do you want to remove item \"%1\" from collection \"%2\"?")
+ .arg(item->text()).arg(m_collection->collectionName()) + "</qt>");
+ if(confirm == KMessageBox::No)
+ return;
+
+ m_collection->removePixmap(item->text());
+ delete item;
+}
+
+void
+PixmapCollectionEditor::renameItem()
+{
+ if(m_iconView->currentItem())
+ m_iconView->currentItem()->rename();
+}
+
+void
+PixmapCollectionEditor::createIconViewItem(const QString &name)
+{
+ PixmapIconViewItem *item = new PixmapIconViewItem(m_iconView, name, getPixmap(name));
+ item->setRenameEnabled(true);
+}
+
+QPixmap
+PixmapCollectionEditor::getPixmap(const QString &name)
+{
+ QPixmap pixmap = m_collection->getPixmap(name);
+ if((pixmap.width() <= 48) && (pixmap.height() <= 48))
+ return pixmap;
+
+ KPixmapIO io;
+ QImage image = io.convertToImage(pixmap);
+ pixmap = io.convertToPixmap(image.scale(48, 48, QImage::ScaleMin));
+ return pixmap;
+}
+
+void
+PixmapCollectionEditor::renameCollectionItem(QIconViewItem *it, const QString &name)
+{
+ PixmapIconViewItem *item = static_cast<PixmapIconViewItem*>(it);
+ if(!m_collection->m_pixmaps.contains(item->name()))
+ return;
+
+ // We just rename the collection item
+ QPair<QString, int> pair = m_collection->m_pixmaps[item->name()];
+ m_collection->m_pixmaps.remove(item->name());
+ m_collection->m_pixmaps[name] = pair;
+ item->setName(name);
+}
+
+void
+PixmapCollectionEditor::displayMenu(QIconViewItem *it, const QPoint &p)
+{
+ if(!it) return;
+ KPopupMenu *menu = new KPopupMenu();
+ menu->insertItem(SmallIconSet("edit"), i18n("Rename Item"), this, SLOT(renameItem()));
+ menu->insertItem(SmallIconSet("remove"), i18n("Remove Item"), this, SLOT(removeItem()));
+ menu->exec(p);
+}
+
+//// A Dialog to choose a pixmap from the PixmapCollection
+PixmapCollectionChooser::PixmapCollectionChooser(PixmapCollection *collection, const QString &selectedItem, QWidget *parent)
+: KDialogBase(parent, "pixchoose_dialog", true, i18n("Select Pixmap From %1").arg(collection->collectionName()),
+ User1|Ok|Cancel, Ok, false, KGuiItem(i18n("Edit Collection...")))
+{
+ m_collection = collection;
+ setInitialSize(QSize(400, 200), true);
+
+ m_iconView = new KIconView(this, "pixchooser_iconView");
+ setMainWidget(m_iconView);
+ m_iconView->setArrangement(QIconView::LeftToRight);
+ m_iconView->setAutoArrange(true);
+ m_iconView->setMode(KIconView::Select);
+
+ PixmapMap::ConstIterator it;
+ PixmapMap::ConstIterator endIt = collection->m_pixmaps.constEnd();
+ for(it = collection->m_pixmaps.constBegin(); it != endIt; ++it)
+ new PixmapIconViewItem(m_iconView, it.key(), getPixmap(it.key()));
+
+ QIconViewItem *item = m_iconView->findItem(selectedItem, Qt::ExactMatch);
+ if(item && !selectedItem.isEmpty())
+ m_iconView->setCurrentItem(item);
+}
+
+QPixmap
+PixmapCollectionChooser::pixmap()
+{
+ if(! m_iconView->currentItem())
+ return QPixmap();
+ QString name = m_iconView->currentItem()->text();
+ return m_collection->getPixmap(name);
+}
+
+QString
+PixmapCollectionChooser::pixmapName()
+{
+ return m_iconView->currentItem() ? m_iconView->currentItem()->text() : QString("");
+}
+
+QPixmap
+PixmapCollectionChooser::getPixmap(const QString &name)
+{
+ QPixmap pixmap = m_collection->getPixmap(name);
+ if((pixmap.width() <= 48) && (pixmap.height() <= 48))
+ return pixmap;
+
+ // We scale the pixmap down to 48x48 to fit in the iconView
+ KPixmapIO io;
+ QImage image = io.convertToImage(pixmap);
+ pixmap = io.convertToPixmap(image.scale(48, 48, QImage::ScaleMin));
+ return pixmap;
+}
+
+void
+PixmapCollectionChooser::slotUser1()
+{
+ PixmapCollectionEditor dialog(m_collection, parentWidget());
+ dialog.exec();
+
+ m_iconView->clear();
+ PixmapMap::ConstIterator it;
+ PixmapMap::ConstIterator endIt = m_collection->m_pixmaps.constEnd();
+ for(it = m_collection->m_pixmaps.constBegin(); it != endIt; ++it)
+ new PixmapIconViewItem(m_iconView, it.key(), getPixmap(it.key()));
+}
+
+#include "pixmapcollection.moc"