diff options
Diffstat (limited to 'src/configdialogimpl.cpp')
-rw-r--r-- | src/configdialogimpl.cpp | 502 |
1 files changed, 502 insertions, 0 deletions
diff --git a/src/configdialogimpl.cpp b/src/configdialogimpl.cpp new file mode 100644 index 0000000..adea895 --- /dev/null +++ b/src/configdialogimpl.cpp @@ -0,0 +1,502 @@ +/*************************************************************************** + * Copyright (C) 2005 by Daniel Stöckel * + * [email protected] * + * * + * 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include "configdialogimpl.h" + +#include <klocale.h> +#include <kicondialog.h> +#include <kiconloader.h> +#include <kkeybutton.h> +#include <kcolorbutton.h> +#include <kkeydialog.h> +#include <kservicegroup.h> +#include <kapplication.h> +#include <dcopclient.h> + +#include <qslider.h> +#include <qcombobox.h> +#include <qregexp.h> +#include <qspinbox.h> +#include <qlineedit.h> +#include <qmessagebox.h> +#include <qcheckbox.h> +#include <qwidgetstack.h> + +#include "menulistviewitem.h" +#include "servicemenu.h" +#include "configuration.h" + +#include <X11/Xmu/WinUtil.h> +#include <X11/Xlib.h> +#include <fixx11h.h> + +ConfigDialogImpl::ConfigDialogImpl(QWidget* parent, const char* name, WFlags fl) + : ConfigDialog(parent,name,fl), + configChanged(false), + grabbing(0), + curListView(0), + mMenus(true) +{ + new QListBoxPixmap(listBox,MainBarIcon("kommando",KIcon::SizeLarge),"Menu"); + new QListBoxPixmap(listBox,MainBarIcon("configure_shortcuts",KIcon::SizeLarge),"Shortcuts"); + new QListBoxPixmap(listBox,MainBarIcon("colors",KIcon::SizeLarge),"Appearance"); + listBox->setSelected(listBox->topItem(),true); + + connect(kKeyButton1,SIGNAL(capturedShortcut(const KShortcut&)),this,SLOT(slotShortcutChanged(const KShortcut&)) ); + + addService->setPopup(new ServiceMenu(this, SLOT(slotAddService(KService*)), + SLOT(slotAddServiceGroup(KServiceGroup*)), addService)); +} + +void ConfigDialogImpl::readConfig() +{ + Config& config = Config::getSingleton(); + + navButtonSize->setCurrentText(QString::number(config.navButtonSize())); + menuButtonSize->setCurrentText(QString::number(config.menuButtonSize())); + menuRadiusSpinbox->setValue(config.menuRadius()); + + if(config.scheme()=="none"){ + customCheckbox->setChecked(true); + } else { + customCheckbox->setChecked(false); + schemeCombobox->setCurrentText(config.scheme()); + } + + menuViewComboBox->clear(); + initView(); + iconButton->resetIcon(); + iconButton->setEnabled(false); + commandoEdit->clear(); + commandoEdit->setEnabled(false); + remove->setEnabled(false); + + kColorButton1->setColor(config.tintColor()); + opacitySlider->setValue(static_cast<int>(config.opacity()*100)); + + kKeyButton1->setText(config.Shortcut()); +} + +void ConfigDialogImpl::setChanged(bool state) +{ + configChanged=state; + emit changed(state); +} + +/*$SPECIALIZATION$*/ +void ConfigDialogImpl::slotRemoveListViewClicked() +{ + if(curListView->appName() != "default"){ + if (curListView->childCount() > 0) + setChanged(true); + lists->removeWidget(curListView); + mMenus.remove(curListView); + curListView = 0; + menuViewComboBox->removeItem(menuViewComboBox->currentItem()); + menuViewComboBox->setCurrentText("default"); + slotChangeListView("default"); + } +} + +void ConfigDialogImpl::slotNewListViewClicked() +{ + newListView->setEnabled(false); + grabbing = true; + setCursor(Qt::CrossCursor); + grabMouse(); +} + +void ConfigDialogImpl::slotChangeListView(const QString& appname) +{ + KommandoView* temp = mMenus.getViewOrDefault(appname); + if(temp == curListView){ + return; + } + if(temp && curListView){ + curListView->disconnect(); + } + if(temp){ + curListView = temp; + lists->raiseWidget(curListView); + connect(curListView, SIGNAL(clicked(QListViewItem*)), this, SLOT(slotMenuViewClicked(QListViewItem*))); + slotMenuViewClicked(curListView->selectedItem()); + } +} + +void ConfigDialogImpl::slotButtonDownPressed() +{ + QListViewItem* item = curListView->selectedItem(); + if(item!=NULL){ + QListViewItem* below = item->itemBelow(); + while((below!=NULL)&&(item->parent()!=below->parent())){ + below=below->itemBelow(); + } + if(below!=NULL){ + item->moveItem(below); + } + } + setChanged(true); +} + +void ConfigDialogImpl::slotButtonUpPressed() +{ + QListViewItem* item = curListView->selectedItem(); + if(item!=NULL){ + QListViewItem* above = item->itemAbove(); + while((above!=NULL)&&(item->parent()!=above->parent())){ + above=above->itemAbove(); + } + if(above!=NULL){ + above->moveItem(item); + } + } + setChanged(true); +} + +void ConfigDialogImpl::slotCustomSizeCheckboxToggled(bool mode) +{ + schemeCombobox->setEnabled(!mode); + menuRadiusSpinbox->setEnabled(mode); + menuButtonSize->setEnabled(mode); + navButtonSize->setEnabled(mode); + if(!mode){ + slotSchemeComboboxChanged(schemeCombobox->currentText()); + } else { + Config::getSingleton().setScheme("none"); + } + setChanged(true); +} + +void ConfigDialogImpl::slotSchemeComboboxChanged(const QString& scheme) +{ + Config& config=Config::getSingleton(); + if(scheme=="Tiny"){ + config.setMenuRadius(72); + config.setNavButtonSize(22); + config.setMenuButtonSize(16); + } else if(scheme=="Small"){ + config.setMenuRadius(100); + config.setNavButtonSize(32); + config.setMenuButtonSize(22); + } if(scheme=="Normal"){ + config.setMenuRadius(132); + config.setNavButtonSize(32); + config.setMenuButtonSize(32); + } if(scheme=="Big"){ + config.setMenuRadius(200); + config.setNavButtonSize(48); + config.setMenuButtonSize(48); + } + + config.setScheme(scheme); + + navButtonSize->setCurrentText(QString::number(config.navButtonSize())); + menuButtonSize->setCurrentText(QString::number(config.menuButtonSize())); + menuRadiusSpinbox->setValue(config.menuRadius()); + setChanged(true); +} + +void ConfigDialogImpl::slotMenuRadiusSpinboxChanged(int size) +{ + Config::getSingleton().setMenuRadius(size); + setChanged(true); +} + +void ConfigDialogImpl::slotNavButtonSizeChanged(const QString& size) +{ + Config::getSingleton().setNavButtonSize(size.toShort()); + setChanged(true); +} + +void ConfigDialogImpl::slotMenuButtonSizeChanged(const QString& size) +{ + Config::getSingleton().setMenuButtonSize(size.toShort()); + setChanged(true); +} + +void ConfigDialogImpl::slotCommandoTyped(const QString& commando) +{ + if (curListView->selectedItem() && curListView->selectedItem()->text(1) != commando) { + curListView->selectedItem()->setText(1,commando); + setChanged(true); + } +} + +void ConfigDialogImpl::slotMenuViewClicked(QListViewItem* item) +{ + MenuListViewItem* temp = static_cast<MenuListViewItem*>(item); + if(item == 0){ + iconButton->resetIcon(); + iconButton->setEnabled(false); + commandoEdit->clear(); + commandoEdit->setEnabled(false); + remove->setEnabled(false); + } else { + if(temp->iconPath()!=NULL){ + iconButton->setIcon(temp->iconPath()); + } else { + iconButton->resetIcon(); + } + if(temp->type()==MenuListViewItem::Button){ + commandoEdit->setEnabled(true); + commandoEdit->setText(temp->text(1)); + } else { + commandoEdit->setEnabled(false); + } + iconButton->setEnabled(true); + remove->setEnabled(true); + } +} + +void ConfigDialogImpl::slotNewIcon() +{ + MenuListViewItem* temp = static_cast<MenuListViewItem*>(curListView->selectedItem()); + temp->setIconPath(iconButton->icon()); + setChanged(true); +} + +void ConfigDialogImpl::slotRemoveClicked() +{ + QListViewItem* temp = curListView->selectedItem()->nextSibling(); + delete curListView->selectedItem(); + curListView->setSelected(temp,true); + if(temp==NULL){ + remove->setEnabled(false); + } + setChanged(true); +} + +void ConfigDialogImpl::slotAddButtonClicked() +{ + createEntry("Button"); + commandoEdit->setEnabled(true); +} + +void ConfigDialogImpl::slotAddMenuClicked() +{ + createEntry("Menu"); + commandoEdit->setEnabled(false); +} + +void ConfigDialogImpl::createEntry(const QString& kind) +{ + QListViewItem* parent=NULL; + QListViewItem* newItem; + MenuListViewItem* selected =static_cast<MenuListViewItem*>(curListView->selectedItem()); + MenuListViewItem::ItemType type; + if(selected!=NULL){ + if(selected->type()==MenuListViewItem::Menu){ + parent=selected; + selected=selected->lastChild(); + } else if(selected->parent()!=NULL){ + parent=selected->parent(); + } + } else { + selected=static_cast<MenuListViewItem*>(curListView->lastItem()); + } + + if(kind=="Menu"){ + type=MenuListViewItem::Menu; + } else { + type=MenuListViewItem::Button; + } + + if(parent!=NULL){ + newItem=new MenuListViewItem(parent,selected,kind,type); + } else { + newItem=new MenuListViewItem(curListView,selected,kind,type); + } + + newItem->setOpen(true); + curListView->setSelected(newItem,true); + iconButton->resetIcon(); + iconButton->setEnabled(true); + remove->setEnabled(true); + commandoEdit->clear(); + setChanged(true); +} + +void ConfigDialogImpl::slotListBoxClicked(QListBoxItem* item) +{ + if(item!=NULL){ + if(item->text()=="Menu"){ + pages->raiseWidget(0); + } else if(item->text()=="Shortcuts"){ + pages->raiseWidget(1); + } else if(item->text()=="Appearance"){ + pages->raiseWidget(2); + } + } +} + +void ConfigDialogImpl::slotDefaultsClicked() +{ + Config::getSingleton().setDefaultValues(); + readConfig(); + setChanged(true); +} + +void ConfigDialogImpl::slotApplyClicked() +{ + Config& config = Config::getSingleton(); + config.fromConfigDlg(mMenus); + config.writeConfigFile(); + kapp->dcopClient()->send("kded", "kommandod", "reparseConfiguration()", QString::null); + setChanged(false); +} + +void ConfigDialogImpl::slotShortcutChanged(const KShortcut & cut ) +{ + if(!KKeyChooser::checkGlobalShortcutsConflict(cut,true,this)){ + kKeyButton1->setText(cut.toString()); + Config::getSingleton().setShortcut(cut.toString()); + setChanged(true); + } +} + +void ConfigDialogImpl::slotColorButtonClicked(const QColor& color) +{ + Config::getSingleton().setTintColor(color); + setChanged(true); +} + +void ConfigDialogImpl::slotOpacitySliderChanged( int value ) +{ + Config::getSingleton().setOpacity(static_cast<float>(value)/100.0f); + setChanged(true); +} + +void ConfigDialogImpl::slotAddService(KService* service) +{ + slotAddButtonClicked(); + + QString commando = service->exec(); + commando.remove(QRegExp(" %.\\b")); + commando.remove(" -caption \"%c\""); + commandoEdit->setText(commando); + curListView->selectedItem()->setText(1, commando); + iconButton->setIcon(service->icon()); + slotNewIcon(); +} + +void ConfigDialogImpl::slotAddServiceGroup(KServiceGroup* group) +{ + slotAddMenuClicked(); + + iconButton->setIcon(group->icon()); + slotNewIcon(); + + KServiceGroup::List list = group->entries(true, true, false, false); + KServiceGroup::List::ConstIterator it = list.begin(); + for (; it != list.end(); ++it) { + KSycocaEntry *e = *it; + if (e->isType(KST_KServiceGroup)) { + KServiceGroup::Ptr g(static_cast<KServiceGroup *>(e)); + if (g->childCount() > 0) { + slotAddServiceGroup(g); + } + } else if (e->isType(KST_KService)) { + slotAddService(static_cast<KService *>(e)); + } + } +} + +bool ConfigDialogImpl::event( QEvent * evt ) +{ + if(grabbing){ + switch(evt->type()){ + case QEvent::MouseButtonPress: + switch(static_cast<QMouseEvent*>(evt)->button()){ + case Qt::LeftButton: + releaseMouse(); + listViewFromClick(); + grabbing = false; + break; + default: + releaseMouse(); + grabbing = false; + } + break; + case QEvent::KeyPress: + if(static_cast<QKeyEvent*>(evt)->key() == Qt::Key_Escape){ + releaseMouse(); + grabbing = false; + } + break; + default: + return ConfigDialog::event(evt); + } + if(!grabbing){ + newListView->setEnabled(true); + unsetCursor(); + } + } + return ConfigDialog::event(evt); +} + +void ConfigDialogImpl::initView( ) +{ + mMenus.clear(); + curListView = 0; + Config::getSingleton().toListView(mMenus, lists); + for(KommandoView* it = mMenus.first(); it != 0; it = mMenus.next()){ + menuViewComboBox->insertItem(it->appName()); + } + menuViewComboBox->setCurrentText("default"); + slotChangeListView("default"); +} + +void ConfigDialogImpl::listViewFromClick( ) +{ + Window rep_root, rep_child; + int rep_rootx, rep_rooty; + unsigned int rep_mask; + int mousex, mousey; + Display* dpy = qt_xdisplay(); + Window win = qt_xrootwin(); + XClassHint hint; + + hint.res_class = 0; + hint.res_name = 0; + + //Get mouse coursor position and the application name of the window under the coursor + XQueryPointer (dpy, win, &rep_root, &rep_child, &rep_rootx, &rep_rooty, &mousex, &mousey, &rep_mask); + + rep_child = XmuClientWindow(dpy,rep_child); + if(XGetClassHint(dpy,rep_child,&hint) != 0){ + if(!mMenus.contains(hint.res_class)){ + KommandoView* view = new KommandoView(lists, hint.res_class); + lists->addWidget(view); + mMenus.append(view); + menuViewComboBox->insertItem(hint.res_class,0); + menuViewComboBox->setCurrentItem(0); + slotChangeListView(hint.res_class); + } + } + if(hint.res_class){ + XFree(hint.res_class); + } + if(hint.res_name){ + XFree(hint.res_name); + } +} + +#include "configdialogimpl.moc" + |