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 | 4aed2c8219774f5d797760606b8489a92ddc5163 (patch) | |
tree | 3f8c130f7d269626bf6a9447407ef6c35954426a /kcontrol/konq/desktopbehavior_impl.cpp | |
download | tdebase-4aed2c8219774f5d797760606b8489a92ddc5163.tar.gz tdebase-4aed2c8219774f5d797760606b8489a92ddc5163.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/kdebase@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kcontrol/konq/desktopbehavior_impl.cpp')
-rw-r--r-- | kcontrol/konq/desktopbehavior_impl.cpp | 466 |
1 files changed, 466 insertions, 0 deletions
diff --git a/kcontrol/konq/desktopbehavior_impl.cpp b/kcontrol/konq/desktopbehavior_impl.cpp new file mode 100644 index 000000000..e8052bfb0 --- /dev/null +++ b/kcontrol/konq/desktopbehavior_impl.cpp @@ -0,0 +1,466 @@ +/** + * (c) Martin R. Jones 1996 + * (c) Bernd Wuebben 1998 + * (c) Christian Tibirna 1998 + * (c) David Faure 1998, 2000 + * (c) John Firebaugh 2003 + * + * 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 "desktopbehavior_impl.h" + +#include <qlayout.h> +#include <qcheckbox.h> +#include <qlabel.h> +#include <qcombobox.h> +#include <qpushbutton.h> +#include <qbuttongroup.h> +#include <qtabwidget.h> +#include <qwhatsthis.h> +#include <klistview.h> +#include <kservice.h> +#include <klocale.h> +#include <kglobalsettings.h> +#include <kmimetype.h> +#include <ktrader.h> +#include <kapplication.h> +#include <kcustommenueditor.h> +#include <dcopclient.h> +#include <konq_defaults.h> // include default values directly from libkonq +#include <kipc.h> +#include <kprotocolinfo.h> + +const int customMenu1ID = 5; +const int customMenu2ID = 6; + +DesktopBehaviorModule::DesktopBehaviorModule(KConfig *config, QWidget *parent, const char * ) + : KCModule( parent, "kcmkonq" ) +{ + QVBoxLayout* layout = new QVBoxLayout(this); + m_behavior = new DesktopBehavior(config, this); + layout->addWidget(m_behavior); + connect(m_behavior, SIGNAL(changed()), this, SLOT(changed())); +} + +void DesktopBehaviorModule::changed() +{ + emit KCModule::changed( true ); +} + +class DesktopBehaviorPreviewItem : public QCheckListItem +{ +public: + DesktopBehaviorPreviewItem(DesktopBehavior *rootOpts, QListView *parent, + const KService::Ptr &plugin, bool on) + : QCheckListItem(parent, plugin->name(), CheckBox), + m_rootOpts(rootOpts) + { + m_pluginName = plugin->desktopEntryName(); + setOn(on); + } + DesktopBehaviorPreviewItem(DesktopBehavior *rootOpts, QListView *parent, + bool on) + : QCheckListItem(parent, i18n("Sound Files"), CheckBox), + m_rootOpts(rootOpts) + { + m_pluginName = "audio/"; + setOn(on); + } + const QString &pluginName() const { return m_pluginName; } + +protected: + virtual void stateChange( bool ) { m_rootOpts->changed(); } + +private: + DesktopBehavior *m_rootOpts; + QString m_pluginName; +}; + + +class DesktopBehaviorMediaItem : public QCheckListItem +{ +public: + DesktopBehaviorMediaItem(DesktopBehavior *rootOpts, QListView *parent, + const QString name, const QString mimetype, bool on) + : QCheckListItem(parent, name, CheckBox), + m_rootOpts(rootOpts),m_mimeType(mimetype){setOn(on);} + + const QString &mimeType() const { return m_mimeType; } + +protected: + virtual void stateChange( bool ) { m_rootOpts->changed(); } + +private: + DesktopBehavior *m_rootOpts; + QString m_mimeType; +}; + + +static const int choiceCount=7; +static const char * s_choices[7] = { "", "WindowListMenu", "DesktopMenu", "AppMenu", "BookmarksMenu", "CustomMenu1", "CustomMenu2" }; + +DesktopBehavior::DesktopBehavior(KConfig *config, QWidget *parent, const char * ) + : DesktopBehaviorBase( parent, "kcmkonq" ), g_pConfig(config) +{ + QString strMouseButton1, strMouseButton3, strButtonTxt1, strButtonTxt3; + + /* + * The text on this form depends on the mouse setting, which can be right + * or left handed. The outer button functionality is actually swapped + * + */ + bool leftHandedMouse = ( KGlobalSettings::mouseSettings().handed == KGlobalSettings::KMouseSettings::LeftHanded); + + m_bHasMedia = KProtocolInfo::isKnownProtocol(QString::fromLatin1("media")); + + connect(desktopMenuGroup, SIGNAL(clicked(int)), this, SIGNAL(changed())); + connect(iconsEnabledBox, SIGNAL(clicked()), this, SLOT(enableChanged())); + connect(showHiddenBox, SIGNAL(clicked()), this, SIGNAL(changed())); + connect(vrootBox, SIGNAL(clicked()), this, SIGNAL(changed())); + connect(autoLineupIconsBox, SIGNAL(clicked()), this, SIGNAL(changed())); + connect(toolTipBox, SIGNAL(clicked()), this, SIGNAL(changed())); + + strMouseButton1 = i18n("&Left button:"); + strButtonTxt1 = i18n( "You can choose what happens when" + " you click the left button of your pointing device on the desktop:"); + + strMouseButton3 = i18n("Right b&utton:"); + strButtonTxt3 = i18n( "You can choose what happens when" + " you click the right button of your pointing device on the desktop:"); + + if ( leftHandedMouse ) + { + qSwap(strMouseButton1, strMouseButton3); + qSwap(strButtonTxt1, strButtonTxt3); + } + + leftLabel->setText( strMouseButton1 ); + leftLabel->setBuddy( leftComboBox ); + fillMenuCombo( leftComboBox ); + connect(leftEditButton, SIGNAL(clicked()), this, SLOT(editButtonPressed())); + connect(leftComboBox, SIGNAL(activated(int)), this, SIGNAL(changed())); + connect(leftComboBox, SIGNAL(activated(int)), this, SLOT(comboBoxChanged())); + QString wtstr = strButtonTxt1 + + i18n(" <ul><li><em>No action:</em> as you might guess, nothing happens!</li>" + " <li><em>Window list menu:</em> a menu showing all windows on all" + " virtual desktops pops up. You can click on the desktop name to switch" + " to that desktop, or on a window name to shift focus to that window," + " switching desktops if necessary, and restoring the window if it is" + " hidden. Hidden or minimized windows are represented with their names" + " in parentheses.</li>" + " <li><em>Desktop menu:</em> a context menu for the desktop pops up." + " Among other things, this menu has options for configuring the display," + " locking the screen, and logging out of KDE.</li>" + " <li><em>Application menu:</em> the \"K\" menu pops up. This might be" + " useful for quickly accessing applications if you like to keep the" + " panel (also known as \"Kicker\") hidden from view.</li></ul>"); + QWhatsThis::add( leftLabel, wtstr ); + QWhatsThis::add( leftComboBox, wtstr ); + + middleLabel->setBuddy( middleComboBox ); + fillMenuCombo( middleComboBox ); + connect(middleEditButton, SIGNAL(clicked()), this, SLOT(editButtonPressed())); + connect(middleComboBox, SIGNAL(activated(int)), this, SIGNAL(changed())); + connect(middleComboBox, SIGNAL(activated(int)), this, SLOT(comboBoxChanged())); + wtstr = i18n("You can choose what happens when" + " you click the middle button of your pointing device on the desktop:" + " <ul><li><em>No action:</em> as you might guess, nothing happens!</li>" + " <li><em>Window list menu:</em> a menu showing all windows on all" + " virtual desktops pops up. You can click on the desktop name to switch" + " to that desktop, or on a window name to shift focus to that window," + " switching desktops if necessary, and restoring the window if it is" + " hidden. Hidden or minimized windows are represented with their names" + " in parentheses.</li>" + " <li><em>Desktop menu:</em> a context menu for the desktop pops up." + " Among other things, this menu has options for configuring the display," + " locking the screen, and logging out of KDE.</li>" + " <li><em>Application menu:</em> the \"K\" menu pops up. This might be" + " useful for quickly accessing applications if you like to keep the" + " panel (also known as \"Kicker\") hidden from view.</li></ul>"); + QWhatsThis::add( middleLabel, wtstr ); + QWhatsThis::add( middleComboBox, wtstr ); + + rightLabel->setText( strMouseButton3 ); + rightLabel->setBuddy( rightComboBox ); + fillMenuCombo( rightComboBox ); + connect(rightEditButton, SIGNAL(clicked()), this, SLOT(editButtonPressed())); + connect(rightComboBox, SIGNAL(activated(int)), this, SIGNAL(changed())); + connect(rightComboBox, SIGNAL(activated(int)), this, SLOT(comboBoxChanged())); + wtstr = strButtonTxt3 + + i18n(" <ul><li><em>No action:</em> as you might guess, nothing happens!</li>" + " <li><em>Window list menu:</em> a menu showing all windows on all" + " virtual desktops pops up. You can click on the desktop name to switch" + " to that desktop, or on a window name to shift focus to that window," + " switching desktops if necessary, and restoring the window if it is" + " hidden. Hidden or minimized windows are represented with their names" + " in parentheses.</li>" + " <li><em>Desktop menu:</em> a context menu for the desktop pops up." + " Among other things, this menu has options for configuring the display," + " locking the screen, and logging out of KDE.</li>" + " <li><em>Application menu:</em> the \"K\" menu pops up. This might be" + " useful for quickly accessing applications if you like to keep the" + " panel (also known as \"Kicker\") hidden from view.</li></ul>"); + QWhatsThis::add( rightLabel, wtstr ); + QWhatsThis::add( rightComboBox, wtstr ); + + if (m_bHasMedia) + { + connect(enableMediaBox, SIGNAL(clicked()), this, SLOT(enableChanged())); + } + else + { + delete behaviorTab->page(2); + } + + load(); +} + +void DesktopBehavior::fillMediaListView() +{ + mediaListView->clear(); + mediaListView->setRootIsDecorated(false); + KMimeType::List mimetypes = KMimeType::allMimeTypes(); + QValueListIterator<KMimeType::Ptr> it2(mimetypes.begin()); + g_pConfig->setGroup( "Media" ); + enableMediaBox->setChecked(g_pConfig->readBoolEntry("enabled",false)); + QString excludedMedia=g_pConfig->readEntry("exclude","media/hdd_mounted,media/hdd_unmounted,media/floppy_unmounted,media/cdrom_unmounted,media/floppy5_unmounted"); + for (; it2 != mimetypes.end(); ++it2) { + if ( ((*it2)->name().startsWith("media/")) ) + { + bool ok=excludedMedia.contains((*it2)->name())==0; + new DesktopBehaviorMediaItem (this, mediaListView, (*it2)->comment(), (*it2)->name(),ok); + + } + } +} + +void DesktopBehavior::saveMediaListView() +{ + if (!m_bHasMedia) + return; + + g_pConfig->setGroup( "Media" ); + g_pConfig->writeEntry("enabled",enableMediaBox->isChecked()); + QStringList exclude; + for (DesktopBehaviorMediaItem *it=static_cast<DesktopBehaviorMediaItem *>(mediaListView->firstChild()); + it; it=static_cast<DesktopBehaviorMediaItem *>(it->nextSibling())) + { + if (!it->isOn()) exclude << it->mimeType(); + } + g_pConfig->writeEntry("exclude",exclude); +} + + +void DesktopBehavior::fillMenuCombo( QComboBox * combo ) +{ + combo->insertItem( i18n("No Action") ); + combo->insertItem( i18n("Window List Menu") ); + combo->insertItem( i18n("Desktop Menu") ); + combo->insertItem( i18n("Application Menu") ); + combo->insertItem( i18n("Bookmarks Menu") ); + combo->insertItem( i18n("Custom Menu 1") ); + combo->insertItem( i18n("Custom Menu 2") ); +} + +void DesktopBehavior::load() +{ + load( false ); +} + +void DesktopBehavior::load( bool useDefaults ) +{ + g_pConfig->setReadDefaults( useDefaults ); + g_pConfig->setGroup( "Desktop Icons" ); + bool bShowHidden = g_pConfig->readBoolEntry("ShowHidden", DEFAULT_SHOW_HIDDEN_ROOT_ICONS); + showHiddenBox->setChecked(bShowHidden); + //bool bVertAlign = g_pConfig->readBoolEntry("VertAlign", DEFAULT_VERT_ALIGN); + KTrader::OfferList plugins = KTrader::self()->query("ThumbCreator"); + previewListView->clear(); + QStringList previews = g_pConfig->readListEntry("Preview"); + for (KTrader::OfferList::ConstIterator it = plugins.begin(); it != plugins.end(); ++it) + new DesktopBehaviorPreviewItem(this, previewListView, *it, previews.contains((*it)->desktopEntryName())); + new DesktopBehaviorPreviewItem(this, previewListView, previews.contains("audio/")); + // + g_pConfig->setGroup( "FMSettings" ); + toolTipBox->setChecked(g_pConfig->readBoolEntry( "ShowFileTips", true ) ); + g_pConfig->setGroup( "Menubar" ); + KConfig config( "kdeglobals" ); + config.setGroup("KDE"); + bool globalMenuBar = config.readBoolEntry("macStyle", false); + bool desktopMenuBar = g_pConfig->readBoolEntry("ShowMenubar", false); + if ( globalMenuBar ) + desktopMenuGroup->setButton( 2 ); + else if ( desktopMenuBar ) + desktopMenuGroup->setButton( 1 ); + else + desktopMenuGroup->setButton( 0 ); + g_pConfig->setGroup( "General" ); + vrootBox->setChecked( g_pConfig->readBoolEntry( "SetVRoot", false ) ); + iconsEnabledBox->setChecked( g_pConfig->readBoolEntry( "Enabled", true ) ); + autoLineupIconsBox->setChecked( g_pConfig->readBoolEntry( "AutoLineUpIcons", false ) ); + + // + g_pConfig->setGroup( "Mouse Buttons" ); + QString s; + s = g_pConfig->readEntry( "Left", "" ); + for ( int c = 0 ; c < choiceCount ; c ++ ) + if (s == s_choices[c]) + { leftComboBox->setCurrentItem( c ); break; } + s = g_pConfig->readEntry( "Middle", "WindowListMenu" ); + for ( int c = 0 ; c < choiceCount ; c ++ ) + if (s == s_choices[c]) + { middleComboBox->setCurrentItem( c ); break; } + s = g_pConfig->readEntry( "Right", "DesktopMenu" ); + for ( int c = 0 ; c < choiceCount ; c ++ ) + if (s == s_choices[c]) + { rightComboBox->setCurrentItem( c ); break; } + + comboBoxChanged(); + if (m_bHasMedia) + fillMediaListView(); + enableChanged(); +} + +void DesktopBehavior::defaults() +{ + load( true ); +} + + +void DesktopBehavior::save() +{ + g_pConfig->setGroup( "Desktop Icons" ); + g_pConfig->writeEntry("ShowHidden", showHiddenBox->isChecked()); + QStringList previews; + for ( DesktopBehaviorPreviewItem *item = static_cast<DesktopBehaviorPreviewItem *>( previewListView->firstChild() ); + item; + item = static_cast<DesktopBehaviorPreviewItem *>( item->nextSibling() ) ) + if ( item->isOn() ) + previews.append( item->pluginName() ); + g_pConfig->writeEntry( "Preview", previews ); + g_pConfig->setGroup( "FMSettings" ); + g_pConfig->writeEntry( "ShowFileTips", toolTipBox->isChecked() ); + g_pConfig->setGroup( "Menubar" ); + g_pConfig->writeEntry("ShowMenubar", desktopMenuGroup->selectedId() == 1); + KConfig config( "kdeglobals" ); + config.setGroup("KDE"); + bool globalMenuBar = desktopMenuGroup->selectedId() == 2; + if ( globalMenuBar != config.readBoolEntry("macStyle", false) ) + { + config.writeEntry( "macStyle", globalMenuBar, true, true ); + config.sync(); + KIPC::sendMessageAll(KIPC::ToolbarStyleChanged); + } + g_pConfig->setGroup( "Mouse Buttons" ); + g_pConfig->writeEntry("Left", s_choices[ leftComboBox->currentItem() ] ); + g_pConfig->writeEntry("Middle", s_choices[ middleComboBox->currentItem() ]); + g_pConfig->writeEntry("Right", s_choices[ rightComboBox->currentItem() ]); + + g_pConfig->setGroup( "General" ); + g_pConfig->writeEntry( "SetVRoot", vrootBox->isChecked() ); + g_pConfig->writeEntry( "Enabled", iconsEnabledBox->isChecked() ); + g_pConfig->writeEntry( "AutoLineUpIcons", autoLineupIconsBox->isChecked() ); + + saveMediaListView(); + g_pConfig->sync(); + + // Tell kdesktop about the new config file + if ( !kapp->dcopClient()->isAttached() ) + kapp->dcopClient()->attach(); + QByteArray data; + + int konq_screen_number = KApplication::desktop()->primaryScreen(); + QCString appname; + if (konq_screen_number == 0) + appname = "kdesktop"; + else + appname.sprintf("kdesktop-screen-%d", konq_screen_number); + kapp->dcopClient()->send( appname, "KDesktopIface", "configure()", data ); + // for the standalone menubar setting + kapp->dcopClient()->send( "menuapplet*", "menuapplet", "configure()", data ); + kapp->dcopClient()->send( "kicker", "kicker", "configureMenubar()", data ); + kapp->dcopClient()->send( "kwin*", "", "reconfigure()", data ); +} + +void DesktopBehavior::enableChanged() +{ + bool enabled = iconsEnabledBox->isChecked(); + behaviorTab->setTabEnabled(behaviorTab->page(1), enabled); + vrootBox->setEnabled(enabled); + + if (m_bHasMedia) + { + behaviorTab->setTabEnabled(behaviorTab->page(2), enabled); + enableMediaBox->setEnabled(enabled); + mediaListView->setEnabled(enableMediaBox->isChecked()); + } + + changed(); +} + +void DesktopBehavior::comboBoxChanged() +{ + int i; + i = leftComboBox->currentItem(); + leftEditButton->setEnabled((i == customMenu1ID) || (i == customMenu2ID)); + i = middleComboBox->currentItem(); + middleEditButton->setEnabled((i == customMenu1ID) || (i == customMenu2ID)); + i = rightComboBox->currentItem(); + rightEditButton->setEnabled((i == customMenu1ID) || (i == customMenu2ID)); +} + +void DesktopBehavior::editButtonPressed() +{ + int i = 0; + if (sender() == leftEditButton) + i = leftComboBox->currentItem(); + if (sender() == middleEditButton) + i = middleComboBox->currentItem(); + if (sender() == rightEditButton) + i = rightComboBox->currentItem(); + + QString cfgFile; + if (i == customMenu1ID) + cfgFile = "kdesktop_custom_menu1"; + if (i == customMenu2ID) + cfgFile = "kdesktop_custom_menu2"; + + if (cfgFile.isEmpty()) + return; + + KCustomMenuEditor editor(this); + KConfig cfg(cfgFile, false, false); + + editor.load(&cfg); + if (editor.exec()) + { + editor.save(&cfg); + cfg.sync(); + emit changed(); + } +} + +QString DesktopBehavior::quickHelp() const +{ + return i18n("<h1>Behavior</h1>\n" + "This module allows you to choose various options\n" + "for your desktop, including the way in which icons are arranged and\n" + "the pop-up menus associated with clicks of the middle and right mouse\n" + "buttons on the desktop.\n" + "Use the \"What's This?\" (Shift+F1) to get help on specific options."); +} + +#include "desktopbehavior_impl.moc" |