diff options
Diffstat (limited to 'src/newbasketdialog.cpp')
-rw-r--r-- | src/newbasketdialog.cpp | 333 |
1 files changed, 333 insertions, 0 deletions
diff --git a/src/newbasketdialog.cpp b/src/newbasketdialog.cpp new file mode 100644 index 0000000..0d5bc44 --- /dev/null +++ b/src/newbasketdialog.cpp @@ -0,0 +1,333 @@ +/*************************************************************************** + * Copyright (C) 2003 by S�astien Laot * + * slaout@linux62.org * + * * + * 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. * + * * + * This program 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 General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include <kicondialog.h> +#include <qlineedit.h> +#include <kiconview.h> +#include <qlayout.h> +#include <qlabel.h> +#include <klocale.h> +#include <kglobalsettings.h> +#include <kpushbutton.h> +#include <kguiitem.h> +#include <kmessagebox.h> +#include <qsize.h> +#include <qpainter.h> +#include <kapplication.h> +#include <kiconloader.h> +#include <kmainwindow.h> + +#include "newbasketdialog.h" +#include "basketfactory.h" +#include "basket.h" +#include "basketlistview.h" +#include "variouswidgets.h" +#include "kcolorcombo2.h" +#include "tools.h" +#include "global.h" +#include "bnpview.h" + +/** class SingleSelectionKIconView: */ + +SingleSelectionKIconView::SingleSelectionKIconView(QWidget *parent, const char *name, WFlags f) + : KIconView(parent, name, f), m_lastSelected(0) +{ + connect( this, SIGNAL(selectionChanged(QIconViewItem*)), this, SLOT(slotSelectionChanged(QIconViewItem*)) ); + connect( this, SIGNAL(selectionChanged()), this, SLOT(slotSelectionChanged()) ); +} + +QDragObject* SingleSelectionKIconView::dragObject() +{ + return 0; +} + +void SingleSelectionKIconView::slotSelectionChanged(QIconViewItem *item) +{ + if (item) + m_lastSelected = item; +} + +void SingleSelectionKIconView::slotSelectionChanged() +{ + if (m_lastSelected && !m_lastSelected->isSelected()) + m_lastSelected->setSelected(true); +} + +/** class NewBasketDefaultProperties: */ + +NewBasketDefaultProperties::NewBasketDefaultProperties() + : icon("") + , backgroundImage("") + , backgroundColor() + , textColor() + , freeLayout(false) + , columnCount(1) +{ +} + +/** class NewBasketDialog: */ + +NewBasketDialog::NewBasketDialog(Basket *parentBasket, const NewBasketDefaultProperties &defaultProperties, QWidget *parent) + : KDialogBase(KDialogBase::Swallow, i18n("New Basket"), KDialogBase::Ok | KDialogBase::Cancel, + KDialogBase::Ok, parent, /*name=*/"NewBasket", /*modal=*/true, /*separator=*/true) + , m_defaultProperties(defaultProperties) +{ + QWidget *page = new QWidget(this); + QVBoxLayout *topLayout = new QVBoxLayout(page, /*margin=*/0, spacingHint()); + + // Icon, Name and Background Color: + QHBoxLayout *nameLayout = new QHBoxLayout(0, marginHint()*2/3, spacingHint()); + m_icon = new KIconButton(page); + m_icon->setIconType(KIcon::NoGroup, KIcon::Action); + m_icon->setIconSize(16); + m_icon->setIcon(m_defaultProperties.icon.isEmpty() ? "basket" : m_defaultProperties.icon); + int size = QMAX(m_icon->sizeHint().width(), m_icon->sizeHint().height()); + m_icon->setFixedSize(size, size); // Make it square! + QToolTip::add(m_icon, i18n("Icon")); + m_name = new QLineEdit(/*i18n("Basket"), */page); + m_name->setMinimumWidth(m_name->fontMetrics().maxWidth()*20); + connect( m_name, SIGNAL(textChanged(const QString&)), this, SLOT(nameChanged(const QString&)) ); + enableButtonOK(false); + QToolTip::add(m_name, i18n("Name")); + m_backgroundColor = new KColorCombo2(QColor(), KGlobalSettings::baseColor(), page); + m_backgroundColor->setColor(QColor()); + m_backgroundColor->setFixedSize(m_backgroundColor->sizeHint()); + m_backgroundColor->setColor(m_defaultProperties.backgroundColor); + QToolTip::add(m_backgroundColor, i18n("Background color")); + nameLayout->addWidget(m_icon); + nameLayout->addWidget(m_name); + nameLayout->addWidget(m_backgroundColor); + topLayout->addLayout(nameLayout); + + QHBoxLayout *layout = new QHBoxLayout(/*parent=*/0, /*margin=*/0, spacingHint()); + KPushButton *button = new KPushButton( KGuiItem(i18n("&Manage Templates..."), "configure"), page ); + connect( button, SIGNAL(clicked()), this, SLOT(manageTemplates()) ); + button->hide(); + + // Compute the right template to use as the default: + QString defaultTemplate = "free"; + if (!m_defaultProperties.freeLayout) { + if (m_defaultProperties.columnCount == 1) + defaultTemplate = "1column"; + else if (m_defaultProperties.columnCount == 2) + defaultTemplate = "2columns"; + else + defaultTemplate = "3columns"; + } + + // Empty: + // * * * * * + // Personnal: + // *To Do + // Professionnal: + // *Meeting Summary + // Hobbies: + // * + m_templates = new SingleSelectionKIconView(page); + m_templates->setItemsMovable(false); + m_templates->setMode(KIconView::Select); + m_templates->setGridX(m_templates->maxItemWidth()); + KIconViewItem *lastTemplate = 0; + QPixmap icon(40, 53); + + QPainter painter(&icon); + painter.fillRect(0, 0, icon.width(), icon.height(), KGlobalSettings::baseColor()); + painter.setPen(KGlobalSettings::textColor()); + painter.drawRect(0, 0, icon.width(), icon.height()); + painter.end(); + lastTemplate = new KIconViewItem(m_templates, lastTemplate, i18n("One column"), icon); + + if (defaultTemplate == "1column") + m_templates->setSelected(lastTemplate, true); + + painter.begin(&icon); + painter.fillRect(0, 0, icon.width(), icon.height(), KGlobalSettings::baseColor()); + painter.setPen(KGlobalSettings::textColor()); + painter.drawRect(0, 0, icon.width(), icon.height()); + painter.drawLine(icon.width() / 2, 0, icon.width() / 2, icon.height()); + painter.end(); + lastTemplate = new KIconViewItem(m_templates, lastTemplate, i18n("Two columns"), icon); + + if (defaultTemplate == "2columns") + m_templates->setSelected(lastTemplate, true); + + painter.begin(&icon); + painter.fillRect(0, 0, icon.width(), icon.height(), KGlobalSettings::baseColor()); + painter.setPen(KGlobalSettings::textColor()); + painter.drawRect(0, 0, icon.width(), icon.height()); + painter.drawLine(icon.width() / 3, 0, icon.width() / 3, icon.height()); + painter.drawLine(icon.width() * 2 / 3, 0, icon.width() * 2 / 3, icon.height()); + painter.end(); + lastTemplate = new KIconViewItem(m_templates, lastTemplate, i18n("Three columns"), icon); + + if (defaultTemplate == "3columns") + m_templates->setSelected(lastTemplate, true); + + painter.begin(&icon); + painter.fillRect(0, 0, icon.width(), icon.height(), KGlobalSettings::baseColor()); + painter.setPen(KGlobalSettings::textColor()); + painter.drawRect(0, 0, icon.width(), icon.height()); + painter.drawRect(icon.width() / 5, icon.width() / 5, icon.width() / 4, icon.height() / 8); + painter.drawRect(icon.width() * 2 / 5, icon.width() * 2 / 5, icon.width() / 4, icon.height() / 8); + painter.end(); + lastTemplate = new KIconViewItem(m_templates, lastTemplate, i18n("Free"), icon); + + if (defaultTemplate == "free") + m_templates->setSelected(lastTemplate, true); + +/* painter.begin(&icon); + painter.fillRect(0, 0, icon.width(), icon.height(), KGlobalSettings::baseColor()); + painter.setPen(KGlobalSettings::textColor()); + painter.drawRect(0, 0, icon.width(), icon.height()); + painter.drawRect(icon.width() * 2 / 5, icon.height() * 3 / 7, icon.width() / 5, icon.height() / 7); + painter.end(); + lastTemplate = new KIconViewItem(m_templates, lastTemplate, i18n("Mind map"), icon);*/ + + m_templates->setMinimumHeight(topLayout->minimumSize().width() * 9 / 16); + + QLabel *label = new QLabel(m_templates, i18n("&Template:"), page); + layout->addWidget(label, /*stretch=*/0, Qt::AlignBottom); + layout->addStretch(); + layout->addWidget(button, /*stretch=*/0, Qt::AlignBottom); + topLayout->addLayout(layout); + topLayout->addWidget(m_templates); + + layout = new QHBoxLayout(/*parent=*/0, /*margin=*/0, spacingHint()); + m_createIn = new QComboBox(page); + m_createIn->insertItem(i18n("(Baskets)")); + label = new QLabel(m_createIn, i18n("C&reate in:"), page); + HelpLabel *helpLabel = new HelpLabel(i18n("How is it useful?"), i18n( + "<p>Creating baskets inside of other baskets to form a hierarchy allows you to be more organized by eg.:</p><ul>" + "<li>Grouping baskets by themes or topics;</li>" + "<li>Grouping baskets in folders for different projects;</li>" + "<li>Making sections with sub-baskets representing chapters or pages;</li>" + "<li>Making a group of baskets to export together (to eg. email them to people).</li></ul>"), page); + layout->addWidget(label); + layout->addWidget(m_createIn); + layout->addWidget(helpLabel); + layout->addStretch(); + topLayout->addLayout(layout); + + m_basketsMap.clear(); + m_basketsMap.insert(/*index=*/0, /*basket=*/0L); + populateBasketsList(Global::bnpView->firstListViewItem(), /*indent=*/1, /*index=*/1); + + connect( m_templates, SIGNAL(doubleClicked(QIconViewItem*)), this, SLOT(slotOk()) ); + connect( m_templates, SIGNAL(returnPressed(QIconViewItem*)), this, SLOT(returnPressed()) ); + + if (parentBasket) { + int index = 0; + + for (QMap<int, Basket*>::Iterator it = m_basketsMap.begin(); it != m_basketsMap.end(); ++it) + if (it.data() == parentBasket) { + index = it.key(); + break; + } + if (index <= 0) + return; + + if (m_createIn->currentItem() != index) + m_createIn->setCurrentItem(index); + } + + setMainWidget(page); +} + +void NewBasketDialog::returnPressed() +{ + actionButton(KDialogBase::Ok)->animateClick(); +} + +int NewBasketDialog::populateBasketsList(QListViewItem *item, int indent, int index) +{ + static const int ICON_SIZE = 16; + + while (item) { + // Get the basket data: + Basket *basket = ((BasketListViewItem*)item)->basket(); + QPixmap icon = kapp->iconLoader()->loadIcon(basket->icon(), KIcon::NoGroup, ICON_SIZE, KIcon::DefaultState, 0L, /*canReturnNull=*/false); + icon = Tools::indentPixmap(icon, indent, 2 * ICON_SIZE / 3); + + // Append item to the list: + m_createIn->insertItem(icon, basket->basketName()); + m_basketsMap.insert(index, basket); + ++index; + + // Append childs of item to the list: + index = populateBasketsList(item->firstChild(), indent + 1, index); + + // Add next sibling basket: + item = item->nextSibling(); + } + + return index; +} + +NewBasketDialog::~NewBasketDialog() +{ +} + +void NewBasketDialog::polish() +{ + KDialogBase::polish(); + m_name->setFocus(); +} + +void NewBasketDialog::nameChanged(const QString &newName) +{ + enableButtonOK(!newName.isEmpty()); +} + +void NewBasketDialog::slotOk() +{ + QIconViewItem *item = ((SingleSelectionKIconView*)m_templates)->selectedItem(); + QString templateName; + if (item->text() == i18n("One column")) + templateName = "1column"; + if (item->text() == i18n("Two columns")) + templateName = "2columns"; + if (item->text() == i18n("Three columns")) + templateName = "3columns"; + if (item->text() == i18n("Free-form")) + templateName = "free"; + if (item->text() == i18n("Mind map")) + templateName = "mindmap"; + + Global::bnpView->closeAllEditors(); + + QString backgroundImage; + QColor textColor; + if (m_backgroundColor->color() == m_defaultProperties.backgroundColor) { + backgroundImage = m_defaultProperties.backgroundImage; + textColor = m_defaultProperties.textColor; + } + + BasketFactory::newBasket(m_icon->icon(), m_name->text(), backgroundImage, m_backgroundColor->color(), textColor, templateName, m_basketsMap[m_createIn->currentItem()]); + if(Global::mainWindow()) Global::mainWindow()->show(); + + KDialogBase::slotOk(); +} + +void NewBasketDialog::manageTemplates() +{ + KMessageBox::information(this, "Wait a minute! There is no template for now: they will come with time... :-D"); +} + +#include "newbasketdialog.moc" |