diff options
author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
---|---|---|
committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
commit | e9ae80694875f869892f13f4fcaf1170a00dea41 (patch) | |
tree | aa2f8d8a217e2d376224c8d46b7397b68d35de2d /quanta/utility/toolbartabwidget.cpp | |
download | tdewebdev-e9ae80694875f869892f13f4fcaf1170a00dea41.tar.gz tdewebdev-e9ae80694875f869892f13f4fcaf1170a00dea41.zip |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdewebdev@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'quanta/utility/toolbartabwidget.cpp')
-rw-r--r-- | quanta/utility/toolbartabwidget.cpp | 351 |
1 files changed, 351 insertions, 0 deletions
diff --git a/quanta/utility/toolbartabwidget.cpp b/quanta/utility/toolbartabwidget.cpp new file mode 100644 index 00000000..03c6e86b --- /dev/null +++ b/quanta/utility/toolbartabwidget.cpp @@ -0,0 +1,351 @@ +/*************************************************************************** + toolbartabwidget.cpp + --------------------- + copyright : (C) 2003 by Andras Mantia <amantia@kde.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; version 2 of the License. * + * * + ***************************************************************************/ + +//qt includes +#include <qevent.h> +#include <qlayout.h> +#include <qobjectlist.h> +#include <qpoint.h> +#include <qtabbar.h> +#include <qwidgetstack.h> +#include <qtabwidget.h> +#include <qfontmetrics.h> + +//kde includes +#include <kaction.h> +#include <kaccelmanager.h> +#include <kdeversion.h> +#include <kiconloader.h> +#include <klocale.h> +#include <kmessagebox.h> +#include <kpopupmenu.h> +#include <ktoolbar.h> +#include <ktoolbarbutton.h> +#include <kdebug.h> +#include <kglobalsettings.h> + +//app includes +#include "toolbartabwidget.h" + +ToolbarTabWidget::ToolbarTabWidget(QWidget * parent, const char * name, WFlags f) +:QTabWidget(parent, name, f) +{ + m_popupMenu = new KPopupMenu(this); + m_popupMenu->insertTitle(i18n("Toolbar Menu"), 1); + m_popupMenu->insertItem(i18n("New Action..."), parent, SLOT(slotNewAction())); + m_popupMenu->insertSeparator(); + m_popupMenu->insertItem(i18n("New Toolbar..."), parent, SLOT(slotAddToolbar())); + m_popupMenu->insertItem(i18n("Remove Toolbar"), this, SLOT(slotRemoveToolbar())); + m_popupMenu->insertItem(i18n("Rename Toolbar..."), this, SLOT(slotRenameToolbar())); + m_popupMenu->insertItem(SmallIconSet("configure_toolbars"), i18n("Configure Toolbars..."), this, SLOT(slotEditToolbar())); + + connect(this, SIGNAL(removeToolbar(const QString&)), + parent, SLOT(slotRemoveToolbar(const QString&))); + connect(this, SIGNAL(renameToolbar(const QString&)), + parent, SLOT(slotRenameToolbar(const QString&))); + connect(this, SIGNAL(editToolbar(const QString&)), + parent, SLOT(slotConfigureToolbars(const QString&))); + connect(this, SIGNAL(newAction()), + parent, SLOT(slotNewAction())); + connect(this, SIGNAL(addToolbar()), + parent, SLOT(slotAddToolbar())); + KAcceleratorManager::setNoAccel(this); +} + +void ToolbarTabWidget::insertTab(QWidget *child, const QString &label, const QString &id) +{ + if (child->inherits("KToolBar") && child->parentWidget()) + { + QTabWidget::insertTab(child->parentWidget(), label); + toolbarList.insert(id, child); + } +} + +QWidget* ToolbarTabWidget::page(int index) +{ + QWidget *w = QTabWidget::page(index); + + for (QMap<QString, QWidget*>::Iterator it = toolbarList.begin(); it != toolbarList.end(); ++it) + { + if (it.data()->parentWidget() == w) + { + w = *it; + break; + } + } + return w; +} + +QString ToolbarTabWidget::id(QWidget *w) const +{ + QString idStr; + for (QMap<QString, QWidget*>::ConstIterator it = toolbarList.constBegin(); it != toolbarList.constEnd(); ++it) + { + if (it.data()->parentWidget() == w) + { + idStr = it.key(); + break; + } + } + return idStr; +} + +QString ToolbarTabWidget::id(int index) const +{ + QWidget *w = QTabWidget::page(index); + QString idStr; + for (QMap<QString, QWidget*>::ConstIterator it = toolbarList.constBegin(); it != toolbarList.constEnd(); ++it) + { + if (it.data()->parentWidget() == w) + { + idStr = it.key(); + break; + } + } + return idStr; +} + +QWidget* ToolbarTabWidget::page(const QString& id) +{ + QWidget *w = toolbarList.find(id).data(); + return w; +} + +void ToolbarTabWidget::removePage(QWidget * w) +{ + QWidget *parent = w->parentWidget(); + if (w->inherits("KToolBar") && parent) + { + QTabWidget::removePage(parent); + for (QMap<QString, QWidget*>::ConstIterator it = toolbarList.constBegin(); it != toolbarList.constEnd(); ++it) + { + if (it.data() == w) + { + toolbarList.remove(it.key()); + break; + } + } + delete parent; + } +} + +void ToolbarTabWidget::slotRemoveToolbar() +{ + emit removeToolbar(tabUnderMouse.lower()); +} + +void ToolbarTabWidget::slotRenameToolbar() +{ + emit renameToolbar(tabUnderMouse.lower()); +} + +void ToolbarTabWidget::slotEditToolbar() +{ + emit editToolbar(tabUnderMouseLabel + " <quanta>"); +} + +void ToolbarTabWidget::mousePressEvent ( QMouseEvent * e ) +{ + if (e->button() == Qt::RightButton) + { + QPoint p = e->globalPos(); + QTab *tab = 0L; + QWidget *pageW = 0L; + for (int i =0; i < tabBar()->count(); i++) + { + tab = tabBar()->tabAt(i); + pageW = page(i); + QRect r = tab->rect(); + QPoint p1 = mapToGlobal(r.topLeft()); + QPoint p2 = mapToGlobal(r.bottomRight()); + if (QRect(p1, p2).contains(p)) + break; + else + tab = 0L; + } + tabUnderMouseLabel = tab ? tab->text() : label(currentPageIndex()); + if (!pageW) + pageW = currentPage(); + for (QMap<QString, QWidget*>::Iterator it = toolbarList.begin(); it != toolbarList.end(); ++it) + { + if (it.data()->parentWidget() == pageW) + { + tabUnderMouse = it.key(); + break; + } + } + m_popupMenu->changeTitle(1, i18n("Toolbar Menu") + " - " + i18n(tabUnderMouseLabel.utf8())); + m_popupMenu->popup(p); + } +} + + +void ToolbarTabWidget::resizeEvent(QResizeEvent *e) +{ + QWidget::resizeEvent(e); + QWidget *tb; + for (QMap<QString, QWidget*>::Iterator it = toolbarList.begin(); it != toolbarList.end(); ++it) + { + tb = it.data(); + tb->resize(QSize(width(), tb->height())); + } + int i = currentPageIndex(); + if (i > 0) + { + setCurrentPage(i -1); + } else + if (i+1 < count()) + { + setCurrentPage(i + 1); + } + setCurrentPage(i); +} + +int ToolbarTabWidget::tabHeight() const +{ + int height = tabBar()->height(); + if (height < 2) + { + height = QFontMetrics(KGlobalSettings::generalFont()).height() + 12; + } + return height; +} + + +QuantaToolBar::QuantaToolBar(QWidget *parent, const char *name, bool honor_style, bool readConfig) +:KToolBar (parent, name=0, honor_style, readConfig) +{ + m_popupMenu = new KPopupMenu(this); + m_toolbarTab = dynamic_cast<ToolbarTabWidget*>(parent->parentWidget()); + currentActionName = ""; + m_iconTextMenu = new KPopupMenu(this); + m_iconTextMenu->setCheckable(true); + m_iconTextMenu->insertItem(i18n("Icons Only"), 0); + m_iconTextMenu->insertItem(i18n("Text Only"), 1); + m_iconTextMenu->insertItem(i18n("Text Alongside Icons"), 2); + m_iconTextMenu->insertItem(i18n("Text Under Icons"), 3); + connect(m_iconTextMenu, SIGNAL(activated(int)), SLOT(slotIconTextChanged(int))); + connect(m_iconTextMenu, SIGNAL(aboutToShow()), SLOT(slotIconTextMenuAboutToShow())); + setIconText(ToolbarTabWidget::ref()->iconText(), false); +} + +void QuantaToolBar::slotIconTextMenuAboutToShow() +{ + m_iconTextMenu->setItemChecked(0, false); + m_iconTextMenu->setItemChecked(1, false); + m_iconTextMenu->setItemChecked(2, false); + m_iconTextMenu->setItemChecked(3, false); + switch (ToolbarTabWidget::ref()->iconText()) + { + case IconOnly: m_iconTextMenu->setItemChecked(0, true); + break; + case TextOnly: m_iconTextMenu->setItemChecked(1, true); + break; + case IconTextRight: m_iconTextMenu->setItemChecked(2, true); + break; + case IconTextBottom: m_iconTextMenu->setItemChecked(3, true); + break; + } +} + +void QuantaToolBar::slotIconTextChanged(int id) +{ + ToolbarTabWidget *toolbarTab = ToolbarTabWidget::ref(); + int width = toolbarTab->width(); + int bigHeight = iconSize() + QFontMetrics(KGlobalSettings::toolBarFont()).height() + 10; + int normalHeight = iconSize() + 10; + for (int i = 0; i < toolbarTab->count(); i++) + { + QuantaToolBar *tb = static_cast<QuantaToolBar*>(toolbarTab->page(i)); + switch (id) + { + case 0: tb->setIconText(IconOnly); + tb->setGeometry(0,0, width, normalHeight); + break; + case 1: tb->setIconText(TextOnly); + tb->setGeometry(0,0, width, normalHeight); + break; + case 2: tb->setIconText(IconTextRight); + tb->setGeometry(0,0, width, normalHeight); + break; + case 3: tb->setIconText(IconTextBottom); + tb->setGeometry(0,0, width, bigHeight); + break; + } + } + toolbarTab->setIconText(iconText()); + if (id == 3) + { + toolbarTab->setFixedHeight(toolbarTab->tabHeight() + height() + 3); + } else + { + toolbarTab->setFixedHeight(toolbarTab->tabHeight() + height() + 3); + } +} + +void QuantaToolBar::mousePressEvent(QMouseEvent *e) +{ + if (e->button() == Qt::RightButton) + { + m_popupMenu->clear(); + QPoint p = e->globalPos(); + if (m_toolbarTab) + { + m_toolbarTab->tabUnderMouse = m_toolbarTab->id(m_toolbarTab->currentPageIndex()); + m_toolbarTab->tabUnderMouseLabel = m_toolbarTab->label(m_toolbarTab->currentPageIndex()); + m_popupMenu->insertTitle(i18n("Toolbar Menu") + " - " + + i18n(m_toolbarTab->tabUnderMouseLabel.utf8())); + m_popupMenu->insertItem(i18n("New Action..."), m_toolbarTab, SIGNAL(newAction())); + QObjectList* childrenList = queryList("KToolBarButton"); + for (uint i = 0; i < childrenList->count(); i++) + { + KToolBarButton *w = static_cast<KToolBarButton*>(childrenList->at(i)); + QPoint p1 = w->parentWidget()->mapToGlobal(w->pos()); + QPoint p2 = QPoint(p1.x() + w->width(), p1.y()+w->height()); + if (QRect(p1, p2).contains(p)) + { + currentActionName = w->textLabel(); + QString actionName = currentActionName; + m_popupMenu->insertItem(i18n("Remove Action - %1").arg(actionName.replace('&',"&&")), this, SLOT(slotRemoveAction())); + m_popupMenu->insertItem(i18n("Edit Action - %1").arg(actionName), this, SLOT(slotEditAction())); + break; + } + } + m_popupMenu->insertSeparator(); + m_popupMenu->insertItem(i18n("New Toolbar..."), m_toolbarTab, SIGNAL(addToolbar())); + m_popupMenu->insertItem(i18n("Remove Toolbar"), m_toolbarTab, SLOT(slotRemoveToolbar())); + m_popupMenu->insertItem(i18n("Rename Toolbar..."), m_toolbarTab, SLOT(slotRenameToolbar())); + m_popupMenu->insertSeparator(); + m_popupMenu->insertItem( i18n("Text Position"), m_iconTextMenu); + m_popupMenu->insertItem(SmallIconSet("configure_toolbars"), i18n("Configure Toolbars..."), m_toolbarTab, SLOT(slotEditToolbar())); + } + m_popupMenu->popup(p); + } +} + +void QuantaToolBar::slotEditAction() +{ + emit editAction(currentActionName); +} + +void QuantaToolBar::slotRemoveAction() +{ + if ( KMessageBox::warningContinueCancel(this, i18n("<qt>Are you sure you want to remove the <b>%1</b> action?</qt>").arg(currentActionName),QString::null,KStdGuiItem::del()) == KMessageBox::Continue ) + { + emit removeAction(m_toolbarTab->tabUnderMouse, currentActionName); + } +} + + +#include "toolbartabwidget.moc" |