summaryrefslogtreecommitdiffstats
path: root/systemsettings
diff options
context:
space:
mode:
Diffstat (limited to 'systemsettings')
-rw-r--r--systemsettings/HACKING31
-rw-r--r--systemsettings/LAYOUT.html125
-rw-r--r--systemsettings/Makefile.am45
-rw-r--r--systemsettings/cr128-app-systemsettings.pngbin0 -> 12148 bytes
-rw-r--r--systemsettings/cr16-app-systemsettings.pngbin0 -> 886 bytes
-rw-r--r--systemsettings/cr22-app-systemsettings.pngbin0 -> 1459 bytes
-rw-r--r--systemsettings/cr32-app-systemsettings.pngbin0 -> 2374 bytes
-rw-r--r--systemsettings/cr48-app-systemsettings.pngbin0 -> 4133 bytes
-rw-r--r--systemsettings/cr64-app-systemsettings.pngbin0 -> 5940 bytes
-rw-r--r--systemsettings/kcmodulemenu.cpp188
-rw-r--r--systemsettings/kcmodulemenu.h158
-rw-r--r--systemsettings/kcmsearch.cpp101
-rw-r--r--systemsettings/kcmsearch.h67
-rw-r--r--systemsettings/kcmultiwidget.cpp431
-rw-r--r--systemsettings/kcmultiwidget.h255
-rw-r--r--systemsettings/kcscrollview.cpp38
-rw-r--r--systemsettings/kcscrollview.h35
-rw-r--r--systemsettings/main.cpp62
-rw-r--r--systemsettings/mainwindow.cpp362
-rw-r--r--systemsettings/mainwindow.h111
-rw-r--r--systemsettings/menu/Makefile.am36
-rw-r--r--systemsettings/menu/audioencoding.desktop56
-rw-r--r--systemsettings/menu/defaultapplication.desktop97
-rw-r--r--systemsettings/menu/kcm_knetworkconfmodule_ss.desktop62
-rw-r--r--systemsettings/menu/kcmfontinst.desktop112
-rw-r--r--systemsettings/menu/kde-settings-accessibility_ss.directory20
-rw-r--r--systemsettings/menu/kde-settings-advanced.directory19
-rw-r--r--systemsettings/menu/kde-settings-advancedusersettings.directory20
-rw-r--r--systemsettings/menu/kde-settings-appearance.directory36
-rw-r--r--systemsettings/menu/kde-settings-computeradministration.directory19
-rw-r--r--systemsettings/menu/kde-settings-defaultapplications.directory67
-rw-r--r--systemsettings/menu/kde-settings-general.directory18
-rw-r--r--systemsettings/menu/kde-settings-keyboardmouse.directory21
-rw-r--r--systemsettings/menu/kde-settings-laptops.directory21
-rw-r--r--systemsettings/menu/kde-settings-looknfeel2.directory17
-rw-r--r--systemsettings/menu/kde-settings-networkconnections.directory35
-rw-r--r--systemsettings/menu/kde-settings-networkconnectivity.directory19
-rw-r--r--systemsettings/menu/kde-settings-networksettings.directory19
-rw-r--r--systemsettings/menu/kde-settings-notifications.directory19
-rw-r--r--systemsettings/menu/kde-settings-panel.directory26
-rw-r--r--systemsettings/menu/kde-settings-personal.directory18
-rw-r--r--systemsettings/menu/kde-settings-power.directory32
-rw-r--r--systemsettings/menu/kde-settings-regional.directory19
-rw-r--r--systemsettings/menu/kde-settings-sharing.directory35
-rw-r--r--systemsettings/menu/kde-settings-splashscreen.directory19
-rw-r--r--systemsettings/menu/kde-settings-system.directory32
-rw-r--r--systemsettings/menu/kde-settings-useraccount.directory19
-rw-r--r--systemsettings/menu/kde-settings-windowbehavior.directory19
-rw-r--r--systemsettings/menu/laptoppowermanagement.desktop43
-rw-r--r--systemsettings/menu/medianotifications.desktop57
-rw-r--r--systemsettings/menu/system-settings-merge.menu11
-rw-r--r--systemsettings/menu/system-settings.directory34
-rw-r--r--systemsettings/menu/system-settings.menu385
-rw-r--r--systemsettings/moduleiconitem.cpp52
-rw-r--r--systemsettings/moduleiconitem.h57
-rw-r--r--systemsettings/modulesview.cpp173
-rw-r--r--systemsettings/modulesview.h100
-rw-r--r--systemsettings/systemsettings.desktop40
-rw-r--r--systemsettings/systemsettingsrc3
-rw-r--r--systemsettings/systemsettingsui.rc32
-rw-r--r--systemsettings/version.h27
61 files changed, 3955 insertions, 0 deletions
diff --git a/systemsettings/HACKING b/systemsettings/HACKING
new file mode 100644
index 0000000..daabb88
--- /dev/null
+++ b/systemsettings/HACKING
@@ -0,0 +1,31 @@
+This is an overview of how the code is situated and a very brief overview of what the classes do. See the header files for a more indepth overview of what the classes do.
+
+-- System Settings classes --
+
+mainwindow - The KMainWindow contains KActions, the stack of the iconlist and the current module(s) view.
+
+modulesview - The widget that is the icon view that users see when the first enter the app.
+kcmsearch - Search widget that can search ModulesView and enable/disable items.
+
+modulesiconitem - The individual modules items. Used for loading enabled/disabled images and storing the list of modules acosiated with the item.
+
+kcmodulemenu - Class that reads in a freedesktop.org .menu file into a QValueList.
+
+kcmultiwidget - A basterdized kcmultidialog from kdelibs/kutil that provides info about the current shown dialog so the about dialog and caption can be updated and prompts for unsaved changes.
+
+-- INSTALL --
+
+To install a new menu you have to install three files.
+
+(if you have debian, if you have another system use locate to determine where kde-system.* is installed and install in the same place.
+
+-/etc/xdg/menus/system-settings.menu
+-/etc/xdg/menus/applications-merged/system-settings-merge.menu
+-/usr/share/desktop-directories/system-settings.directory
+
+Also don't forget to install the ui file.
+-/share/apps/systemsettings/systempreferencesui.rc
+And the desktop file.
+-share/applications/kde/systemsettings.desktop
+
+When you change (or install) any of the first three files make sure to run kbuildsycoca to re-generate the cache files or log out and back in.
diff --git a/systemsettings/LAYOUT.html b/systemsettings/LAYOUT.html
new file mode 100644
index 0000000..51903b9
--- /dev/null
+++ b/systemsettings/LAYOUT.html
@@ -0,0 +1,125 @@
+
+<h1>KDE System Settings</h1>
+
+<p>
+This document describes how the System Settings is layed out.
+
+<p>
+This document was inspired partially by the TODO file located at kdebase/kcontrol/TODO. Most of the changed are the exact same and were planned to be done for KDE4. This document is simply a little bit more fleshed out version. I recomend checking out that document if you havn't already.
+
+<p>
+The reason for this document is:
+<p>
+1) To categorize the settings together in a user friendly manor.<br>
+2) To explain why a setting is where it is and to determine where new settings should go.<br>
+3) Because of #2 stop the constant reorganization of KControl at every release confusing users and developers because there isn't a documented location for where thing go with explanations of why.
+<p>
+The System Settings Center is divided into four sections.
+<ul>
+<li><a href="#personal">Personal</a></li>
+<li><a href="#hardware">Hardware</a></li>
+<li><a href="#system">System</a></li>
+<li><a href="#other">Other</a></li>
+</ul>
+
+Within KDE there are over 50 kcm modules designed for the Control Center and many more for konquror and other applications. With so many modules there is no way for a users to find what they are looking for by scanning. To solve this there are three levels, the last one isn't normally visable to the user and groups very similar items.
+<p>
+Modules in the System Settings should configure things not do things. Some examples include the theme manager. It sets/saves themes. Although it configures settings it is a seperate application because it does actions rather then just setting/getting values. Items that
+<p>
+Modules that exists within multiple applications configuration menu such as spell check and cddb should not be in the menu.
+
+<hr>
+<a name="personal"><h1>Personal</h1></a>
+Personal is made up of two parts. The simplest differece between the two are theme settings will be shared amung friends while users settings wont be.
+<ul>
+<li><a href="#personal_theme">Theme Goodies</a></li>
+<li><a href="#personal_user">User Settings</a></li>
+</ul>
+
+<h3><a name="personal_theme">Theme Goodies</a></h3> which can be changed without affecting productivity and often doesn't directly apply to a specific user, but to a user base (Theme of the month crowd).
+
+These deal with how applications are presented to users and how users interact with them. These don't deal with anything that isn't directly seen/heard or interacted with.
+<p>
+Every setting in this category must be able to be locked for example in an government enviornment where they determine exactly how a desktop is to look for every user. It may look ugly, but users should still be able to acomplish tasks no matter what these settings are set to.
+<p>
+A separate application (Theme Manager) can set the items in this category on mass to give an overall theme for the user. This application can also save the current settings.
+
+<h3><a name="personal_user">User Settings</a></h3>
+Such as that apply to this computer such as language and personal choice for default web browser. These settings determine how a user interacts with a computer, but is personal to that user and typically isn't shared like a theme or icons set is.
+
+<h2>Appearance</h2>
+The Appearance deals with the look of the applications and desktop. These settings typically will be settings that can be replaced by alternatives created outside of KDE. These settings will most likely be also set/used by other Unix desktop enviornments so that all the applications can integration together (and look consistant to the user). It contains the following items:<br>
+Colors, Fonts, Icons, Style, Window Decorations
+
+<h2>Desktop</h2>
+These items discus how the desktop behaves. How the windows interact with each other, the very bottom of the screen (desktop), the very top (screensaver), and loading of the desktop. These are all separate setting from KDE (or Gnome) applications and the applications shouldn't need to access them or know about them.
+It contains the following items:<br>
+Background, Screensaver, Behavior, Window Behavior, Window-Specific Settings, Login Screen
+<p>
+Panel.
+These settings all deal with when users perform actions dealing with or originating from the panel. It contains the following items:<br>
+Panels, Taskbar, Launch Feedback, Multiple Desktops
+
+<h2>KDE Components</h2>
+Specific actuall KDE components which users will probably never actually touch.
+
+<h2>Accessibility</h2>
+ - International
+ - KHotKeys etc
+
+<h2>Security</h2>
+-kdewallet
+
+<h2>Sound</h2>
+Sounds, flashes, logs or other events that happen when KDE applications.
+System Bell
+System Notifications
+
+<h2>User Account</h2>
+- Password changer, paths, Default Applications, Session Manager
+
+<hr>
+<a name="hardware"><h1>Hardware</h1></a>
+Hardware deals with physical hardware configuration. Configuration is not only for the hardware, but the required supporting systems that use the hardware.
+
+<h2>Network</h2>
+File Sharing
+Local Network Browsing
+Preferences / Proxy
+Wireless
+Firewall
+<h2>Display</h2>
+It contains the following items:<br>
+Size & Orientation, Gamma
+<h2>Power</h2>
+Display power control
+laptop battery, cpu temp etc
+<h2>Keyboard & Mouse</h2>
+Keyboard, Keyboard Layout, Keyboard Shortcuts, Mouse, KHotKeys
+<h2>Printer</h2>
+<h2>Joystick</h2>
+<h2>Audio</h2>
+Mixer, SoundSystem (arts)
+
+<hr>
+<a name="system"><h1>System</h1></a>
+System deals with settings relating to this computer.
+
+<h2>Date & Time</h2>
+Date, Time, Time zone
+
+<h2>Fonts</h2>
+
+<h2>Book Disk</h2>
+Lilo, Grub
+
+<h2>Packages</h2>
+System update / rpm manager etc
+
+<h2>Login Manager</h2>
+Login Manger
+
+<hr>
+<a name="other"><h1>Other</h1></a>
+A default KDE install should contain nothing here. If there is something here than this document has failed and needs to be revised. Until that can happen its temporary home is here. A user should never see this catagory.
+
diff --git a/systemsettings/Makefile.am b/systemsettings/Makefile.am
new file mode 100644
index 0000000..afe2ec3
--- /dev/null
+++ b/systemsettings/Makefile.am
@@ -0,0 +1,45 @@
+#
+# Copyright (c) 2005 Benjamin Meyer <ben+systempreferences@meyerhome.net>
+#
+# 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 Steet, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+
+AM_CPPFLAGS= $(all_includes)
+METASOURCES = AUTO
+
+SUBDIRS = . menu
+
+bin_PROGRAMS = systemsettings
+
+systemsettings_SOURCES = kcmodulemenu.cpp kcmsearch.cpp kcmultiwidget.cpp main.cpp mainwindow.cpp moduleiconitem.cpp modulesview.cpp kcscrollview.cpp
+
+EXTRA_DIST = kcmodulemenu.h kcmultiwidget.h moduleiconitem.h version.h kcmsearch.h mainwindow.h modulesview.h kcscrollview.h
+
+systemsettings_LDADD = $(LIB_KDEUI) $(LIB_KUTILS)
+systemsettings_LDFLAGS = $(all_libraries) -module -avoid-version
+
+appdata_DATA = systemsettingsui.rc
+appdatadir = $(kde_datadir)/systemsettings
+
+xdg_apps_DATA = systemsettings.desktop
+
+KDE_ICON=AUTO
+
+# KDE4 will have this by default
+conf_DATA = systemsettingsrc
+confdir = $(kde_confdir)
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/systemsettings.pot
diff --git a/systemsettings/cr128-app-systemsettings.png b/systemsettings/cr128-app-systemsettings.png
new file mode 100644
index 0000000..2bcd4c4
--- /dev/null
+++ b/systemsettings/cr128-app-systemsettings.png
Binary files differ
diff --git a/systemsettings/cr16-app-systemsettings.png b/systemsettings/cr16-app-systemsettings.png
new file mode 100644
index 0000000..da77e17
--- /dev/null
+++ b/systemsettings/cr16-app-systemsettings.png
Binary files differ
diff --git a/systemsettings/cr22-app-systemsettings.png b/systemsettings/cr22-app-systemsettings.png
new file mode 100644
index 0000000..fade155
--- /dev/null
+++ b/systemsettings/cr22-app-systemsettings.png
Binary files differ
diff --git a/systemsettings/cr32-app-systemsettings.png b/systemsettings/cr32-app-systemsettings.png
new file mode 100644
index 0000000..57eb697
--- /dev/null
+++ b/systemsettings/cr32-app-systemsettings.png
Binary files differ
diff --git a/systemsettings/cr48-app-systemsettings.png b/systemsettings/cr48-app-systemsettings.png
new file mode 100644
index 0000000..8aced08
--- /dev/null
+++ b/systemsettings/cr48-app-systemsettings.png
Binary files differ
diff --git a/systemsettings/cr64-app-systemsettings.png b/systemsettings/cr64-app-systemsettings.png
new file mode 100644
index 0000000..2f87ff7
--- /dev/null
+++ b/systemsettings/cr64-app-systemsettings.png
Binary files differ
diff --git a/systemsettings/kcmodulemenu.cpp b/systemsettings/kcmodulemenu.cpp
new file mode 100644
index 0000000..8208ec0
--- /dev/null
+++ b/systemsettings/kcmodulemenu.cpp
@@ -0,0 +1,188 @@
+/**
+ * Copyright (C) 2005 Benjamin C Meyer (ben+kcmodulemenu at meyerhome dot net)
+ *
+ * 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 Steet, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "kcmodulemenu.h"
+
+#include <kapplication.h>
+#include <kservicegroup.h>
+#include <kdebug.h>
+#include <qdict.h>
+
+class KCModuleMenuPrivate {
+public:
+ KCModuleMenuPrivate(){
+ }
+
+ QMap<QString, QValueList<MenuItem> > menus;
+ QString basePath;
+};
+
+KCModuleMenu::KCModuleMenu( const QString &menuName ) :
+ d( new KCModuleMenuPrivate )
+{
+ kdDebug() << "MenuName: \"" << menuName << "\"." << endl;
+ // Make sure we can find the menu
+ KServiceGroup::Ptr serviceGroup = KServiceGroup::baseGroup( menuName );
+ if( !serviceGroup ){
+ kdDebug() << "Unable to load menu \"" << menuName <<
+ "\" from KServiceGroup." << endl;
+ return;
+ }
+ d->basePath = serviceGroup->relPath();
+ readMenu( d->basePath );
+}
+
+KCModuleMenu::~KCModuleMenu()
+{
+ delete d;
+}
+
+void KCModuleMenu::readMenu( const QString &pathName )
+{
+ KServiceGroup::Ptr group = KServiceGroup::group( pathName );
+ if ( !group || !group->isValid() )
+ return;
+
+ KServiceGroup::List list = group->entries( true, true );
+ if( list.isEmpty() )
+ return;
+
+ caption = group->caption();
+ QValueList<MenuItem> currentMenu;
+
+ for( KServiceGroup::List::ConstIterator it = list.begin();
+ it != list.end(); it++)
+ {
+ KSycocaEntry *entry = (*it);
+ if( addEntry(entry) ) {
+ KCModuleInfo module((KService*)entry);
+ append(module);
+ MenuItem infoItem(false);
+ infoItem.caption = this->deriveCaptionFromPath(entry->name());
+ infoItem.item = module;
+ currentMenu.append( infoItem );
+ }
+
+ if ( entry->isType(KST_KServiceGroup) ){
+ MenuItem menuItem(true);
+ menuItem.caption = this->deriveCaptionFromPath(entry->name());
+ menuItem.subMenu = entry->entryPath();
+ currentMenu.append( menuItem );
+
+ readMenu( entry->entryPath() );
+ }
+ }
+
+ d->menus.insert( pathName, currentMenu );
+}
+
+bool KCModuleMenu::addEntry( KSycocaEntry *entry ){
+ if( !entry->isType(KST_KService) )
+ return false;
+
+ KService *service = static_cast<KService*>( entry );
+ if ( !kapp->authorizeControlModule( service->menuId()) )
+ return false;
+
+ KCModuleInfo module( service );
+ if ( module.library().isEmpty() )
+ return false;
+
+ return true;
+}
+
+
+QValueList<KCModuleInfo> KCModuleMenu::modules( const QString &menuPath )
+{
+ QValueList<KCModuleInfo> list;
+
+ QValueList<MenuItem> subMenu = menuList(menuPath);
+ QValueList<MenuItem>::iterator it;
+ for ( it = subMenu.begin(); it != subMenu.end(); ++it ){
+ if ( !(*it).menu )
+ list.append( (*it).item );
+ }
+
+ return list;
+}
+
+QStringList KCModuleMenu::submenus( const QString &menuPath )
+{
+ QStringList list;
+
+ QValueList<MenuItem> subMenu = menuList(menuPath);
+ QValueList<MenuItem>::iterator it;
+ for ( it = subMenu.begin(); it != subMenu.end(); ++it ){
+ if ( (*it).menu )
+ list.append( (*it).subMenu );
+ }
+
+ return list;
+}
+
+QValueList<MenuItem> KCModuleMenu::menuList( const QString &menuPath )
+{
+ if( menuPath.isEmpty() ) {
+ if( d->basePath.isEmpty())
+ return QValueList<MenuItem>();
+ else
+ return menuList( d->basePath );
+ }
+ return d->menus[menuPath];
+}
+
+/*
+ * Okay, I think there could be a much more elegant way of doing
+ * this... but I'm having a hell fo a time figuring it out.
+ *
+ * The purpose of this function is to take a menu path and turn it
+ * into a caption that we can put in a tab. Why do it this way? I
+ * don't know, you tell me. Before I started hacking this we used a
+ * radio control with two buttons (or so it seemed, I could be wrong)
+ * with General and Advanced in a ui.rc file.
+ *
+ * Now that we're using tabs, we no longer have that UI file giving us
+ * the names for the tabs, and since I didn't want to hard-code
+ * anything, and since KSycocaEntry stuff doesn't give you a nice way
+ * (that I noticed anyway) to figure out what your caption should be,
+ * I decided that cleverness is lost on this problem. So screw it,
+ * I'll just parse the stupid path and be done with it.
+ *
+ * This function is certainly nothing short of dull and boring and
+ * routine, but I figured that this might require a bit of explanation
+ * since it just seems kinda silly to do it this way to me. I guess I
+ * never know... I could be doing it the best way.
+ *
+ * "Michael D. Stemle, Jr." <manchicken@notsosoft.net>
+ */
+QString KCModuleMenu::deriveCaptionFromPath( const QString &menuPath )
+{
+ QStringList parts(QStringList::split("/",menuPath));
+ QString result("");
+
+ QStringList::Iterator it = parts.end(); // Start at the end
+
+ // Find the last non-empty string in the split.
+ for (; it != parts.begin(); --it) {
+ if (!((*it).isNull()) && !((*it).isEmpty())) {
+ result += *it;
+ return result;
+ }
+ }
+}
diff --git a/systemsettings/kcmodulemenu.h b/systemsettings/kcmodulemenu.h
new file mode 100644
index 0000000..2cfce7b
--- /dev/null
+++ b/systemsettings/kcmodulemenu.h
@@ -0,0 +1,158 @@
+/**
+ * Copyright (C) 2005 Benjamin C Meyer (ben+kcmodulemenu at meyerhome dot net)
+ *
+ * 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 Steet, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef KCMMODULEMENU_H
+#define KCMMODULEMENU_H
+
+#include <kcmoduleinfo.h>
+
+class KCModuleMenuPrivate;
+
+/**
+ * List of all KCM modules inside a FreeDesktop.org menu
+ * The menu spec is located at: http://www.freedesktop.org/Standards/menu-spec
+ *
+ * For a menu to show up in KDE three files need to be installed in the system.
+ *
+ * example-merge.menu
+ * example.directory
+ * example.menu
+ *
+ * example-merge.menu should be installed in xdg/menus/applications-merged/
+ * so that ksyscoco will find it.
+ *
+ * \code
+ * <!DOCTYPE Menu PUBLIC "-//freedesktop//DTD Menu 1.0//EN"
+ * "http://www.freedesktop.org/standards/menu-spec/1.0/menu.dtd">
+ *
+ * <Menu>
+ * <!-- The following menus are hidden by default -->
+ * <Menu>
+ * <Name>Example Menu</Name>
+ * <Directory>example.directory</Directory>
+ * <MergeFile>../example.menu</MergeFile>
+ * </Menu>
+ * </Menu>
+ * \endcode
+ *
+ * example.directory should be installed in share/desktop-directories/ where files
+ * such as kde-system.directory reside. It is important that it have X-KDE-BaseGroup
+ * as this value is the class constructor argument.
+ *
+ * \code
+ * [Desktop Entry]
+ * Encoding=UTF-8
+ * Name=Example Menu
+ * NoDisplay=true
+ * Icon=package_settings
+ * X-KDE-BaseGroup=examplemenu
+ * \endcode
+ *
+ * example.menu should be installed in xdg/menus/ so that ksyscoco will find
+ * it. See the above url for example menus. After changing the menu you need
+ * to run "kbuildsycoca" to regenerate the cache as ksyscoco will cache the
+ * menu and is a file that doesn't change on users.
+ */
+
+/**
+ * A menu consists of menu items. An item is either another menu or a module.
+ */
+class MenuItem {
+public:
+ MenuItem( bool isMenu=false ){ menu = isMenu; };
+ bool menu;
+ QString subMenu;
+ QString caption;
+ KCModuleInfo item;
+};
+
+
+class KCModuleMenu : public QValueList<KCModuleInfo>
+{
+
+public:
+ QString caption;
+
+ /**
+ * @param the X-KDE-BaseGroup item from the directory file
+ * that should be loaded.
+ *
+ * Example:
+ * In example.directory
+ * X-KDE-BaseGroup=examplemenu
+ * so menuName should be "systemsettings"
+ */
+ KCModuleMenu( const QString &menuName );
+
+ /**
+ * Deconstructor
+ */
+ virtual ~KCModuleMenu();
+
+ /**
+ * Returns item of a menu path. An empty string is the top level.
+ * Item order is maintained from the menu file.
+ * @param path to return submenus from.
+ * @return all items in menuPath.
+ */
+ QValueList<MenuItem> menuList( const QString &menuPath=QString::null );
+
+ /**
+ * Returns the modules in a menu path. An empty string is the top level.
+ * @param menu to return modules from.
+ * @returns only the top level modules of menuPath
+ */
+ QValueList<KCModuleInfo> modules( const QString &menuPath=QString::null );
+
+ /**
+ * Returns the sub menus of a menu path. An empty string is the top level.
+ * @param path to return submenus from.
+ * @return only the submenus of menuPath.
+ */
+ QStringList submenus( const QString &menuPath=QString::null );
+
+
+protected:
+ /**
+ * Reads all the desktop files from the pathName and saves/loads
+ * all of the kcm's into the list.
+ * This is the <Name> from the merge.menu file
+ * @param pathName the base path name of the menu.
+ */
+ virtual void readMenu( const QString &pathName );
+
+ /**
+ * Function that determines if the entry from readMenu
+ * should be added to the list or not. It checks
+ * to see if it is an authorized kcm module that has a library.
+ *
+ * Overload to filter out kcm modules
+ *
+ * @entry to test
+ * @return true if it should be included
+ */
+ virtual bool addEntry( KSycocaEntry *entry );
+
+private:
+ KCModuleMenuPrivate *d;
+ QString deriveCaptionFromPath( const QString &menuPath );
+};
+
+#endif // KCMMODULEMENU_H
+
diff --git a/systemsettings/kcmsearch.cpp b/systemsettings/kcmsearch.cpp
new file mode 100644
index 0000000..3dd41ce
--- /dev/null
+++ b/systemsettings/kcmsearch.cpp
@@ -0,0 +1,101 @@
+/**
+ * This file is part of the System Settings package
+ * Copyright (C) 2005 Benjamin C Meyer
+ * <ben+systempreferences at meyerhome dot net>
+ *
+ * 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 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 Steet, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "kcmsearch.h"
+
+#include <qregexp.h>
+#include <kdebug.h>
+
+#include "modulesview.h"
+#include "moduleiconitem.h"
+
+KcmSearch::KcmSearch( QPtrList<ModulesView> *moduleViewList, QWidget *parent, const char *name )
+ : KIconViewSearchLine(parent, moduleViewList->at(0)->groups[0], name){
+ this->moduleViewList = moduleViewList;
+}
+
+void KcmSearch::updateSearch( const QString &search ) {
+ QValueList<RowIconView*>::iterator it;
+ QPtrListIterator<ModulesView> moduleViewListIt(*moduleViewList);
+
+ ModulesView *mainView;
+ int page = 0;
+ int *hitArray = new int[moduleViewList->count()];
+
+ for ( ; moduleViewListIt.current(); ++moduleViewListIt) {
+ mainView = moduleViewListIt.current();
+
+ int count = 0;
+ for ( it = mainView->groups.begin(); it != mainView->groups.end(); ++it ){
+ QIconViewItem *item = (*it)->firstItem();
+ while( item ) {
+ bool hit = itemMatches(item, search);
+ ((ModuleIconItem*)item)->loadIcon(hit);
+ count += hit ? 1 : 0;
+ item = item->nextItem();
+ }
+
+ }
+ hitArray[page] = count;
+ page++;
+ }
+
+ emit searchHits(search, hitArray, moduleViewList->count());
+ delete[] hitArray;
+}
+
+bool KcmSearch::itemMatches( const KCModuleInfo &module, const QString &search ) const
+{
+ // Look in keywords
+ QStringList kw = module.keywords();
+ for(QStringList::ConstIterator it = kw.begin(); it != kw.end(); ++it) {
+ QString name = (*it).lower();
+ if ( QRegExp(search+"*", false, true).search(name) >= 0){
+ //kdDebug() << "MATCH:" << module.moduleName().latin1()
+ // << "keyword:" << name.latin1() << endl;
+ return true;
+ }
+ }
+
+ // Don't forget to check the name :)
+ if ( QRegExp(search+"*", false, true).search(module.moduleName()) >= 0)
+ return true;
+
+ //kdDebug() << "No MATCH:" << module.moduleName().latin1() << endl;
+ return false;
+}
+
+bool KcmSearch::itemMatches( const QIconViewItem *item, const QString & search ) const
+{
+ if( !item )
+ return false;
+
+ ModuleIconItem *mItem = (ModuleIconItem*)item;
+ QValueList<KCModuleInfo>::iterator it;
+ for ( it = mItem->modules.begin(); it != mItem->modules.end(); ++it ){
+ if( itemMatches( (*it), search ) )
+ return true;
+ }
+ return false;
+}
+
+
+#include "kcmsearch.moc"
diff --git a/systemsettings/kcmsearch.h b/systemsettings/kcmsearch.h
new file mode 100644
index 0000000..b20aec7
--- /dev/null
+++ b/systemsettings/kcmsearch.h
@@ -0,0 +1,67 @@
+/**
+ * This file is part of the System Settings package
+ * Copyright (C) 2005 Benjamin C Meyer
+ * <ben+systempreferences at meyerhome dot net>
+ *
+ * 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 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 Steet, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef KCMSEARCH_H
+#define KCMSEARCH_H
+
+#include <kiconviewsearchline.h>
+#include "kcmodulemenu.h"
+
+class ModulesView;
+
+/**
+ * Searches all the ModuleIconItem's in MainWindow and "disables" the ones
+ * whos keywords don't match the current search.
+ */
+class KcmSearch : public KIconViewSearchLine
+{
+ Q_OBJECT
+
+public:
+ KcmSearch( QPtrList<ModulesView> *moduleViewList, QWidget *parent = 0, const char *name = 0 );
+
+public slots:
+ /**
+ * Go through all of the iconView groups in mainView and update
+ */
+ virtual void updateSearch( const QString &search = QString::null );
+ /**
+ * Check module associated with item or if a group check all modules of that group.
+ * @return true if search is in the module(s) keywords
+ */
+ virtual bool itemMatches ( const QIconViewItem *item, const QString &search ) const;
+
+signals:
+ void searchHits(const QString &query, int *hitList, int length);
+
+private:
+ /**
+ * Determine if module matches the search
+ * @return true if search is in module's keywords
+ */
+ bool itemMatches ( const KCModuleInfo &module, const QString &search ) const;
+
+ // Friend class whos groups parsed,
+ QPtrList<ModulesView> *moduleViewList;
+};
+
+#endif // KCMSEARCH_H
+
diff --git a/systemsettings/kcmultiwidget.cpp b/systemsettings/kcmultiwidget.cpp
new file mode 100644
index 0000000..5f4ce09
--- /dev/null
+++ b/systemsettings/kcmultiwidget.cpp
@@ -0,0 +1,431 @@
+/*
+ Copyright (c) 2000 Matthias Elter <elter@kde.org>
+ Copyright (c) 2003 Daniel Molkentin <molkentin@kde.org>
+ Copyright (c) 2003 Matthias Kretz <kretz@kde.org>
+ Copyright (c) 2004 Frans Englich <frans.erglich.com>
+
+ 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 Steet, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+*/
+
+#include <qcursor.h>
+#include <qhbox.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kiconloader.h>
+#include <klibloader.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kprocess.h>
+#include <krun.h>
+#include <kstdguiitem.h>
+#include <kuser.h>
+
+#include "kcmoduleloader.h"
+#include "kcmoduleproxy.h"
+#include "kcmultiwidget.h"
+
+/*
+Button usage:
+
+ User1 => Reset
+ User2 => Close
+ User3 => Admin
+*/
+
+class KCMultiWidget::KCMultiWidgetPrivate
+{
+ public:
+ KCMultiWidgetPrivate()
+ : hasRootKCM( false ), currentModule( 0 )
+ {}
+
+ bool hasRootKCM;
+ KCModuleProxy* currentModule;
+};
+
+
+KCMultiWidget::KCMultiWidget(QWidget *parent, const char *name, bool modal)
+ : KDialogBase(IconList, i18n("Configure"), Help | Default |Cancel | Apply |
+ Ok | User1 | User2 | User3, Ok, parent, name, modal, true,
+ KStdGuiItem::reset(), KStdGuiItem::close(), KStdGuiItem::adminMode())
+ , dialogface( IconList ), d( new KCMultiWidgetPrivate )
+{
+ init();
+}
+
+KCMultiWidget::KCMultiWidget( int dialogFace, QWidget * parent, const char * name, bool modal )
+ : KDialogBase( dialogFace, "Caption", Help | Default | Cancel | Apply | Ok |
+ User1 | User2 | User3, Ok, parent, name, modal, true,
+ KStdGuiItem::reset(), KStdGuiItem::close(), KStdGuiItem::adminMode())
+ , dialogface( dialogFace ), d( new KCMultiWidgetPrivate )
+{
+ init();
+}
+
+inline void KCMultiWidget::init()
+{
+ connect( this, SIGNAL( finished()), SLOT( dialogClosed()));
+ showButton( Ok, false );
+ showButton( Cancel, false );
+ showButton( User1, true ); // Reset button
+ showButton( User2, true ); // Close button.
+ showButton( User3, true); // Admin button.
+
+ enableButton(Apply, false);
+ enableButton(User1, false);
+
+ connect(this, SIGNAL(aboutToShowPage(QWidget *)), this, SLOT(slotAboutToShow(QWidget *)));
+ setInitialSize(QSize(640,480));
+ moduleParentComponents.setAutoDelete( true );
+}
+#include <kmessagebox.h>
+
+KCMultiWidget::~KCMultiWidget()
+{
+ OrphanMap::Iterator end2 = m_orphanModules.end();
+ for( OrphanMap::Iterator it = m_orphanModules.begin(); it != end2; ++it )
+ delete ( *it );
+}
+
+void KCMultiWidget::slotDefault()
+{
+ int curPageIndex = activePageIndex();
+
+ ModuleList::Iterator end = m_modules.end();
+ for( ModuleList::Iterator it = m_modules.begin(); it != end; ++it )
+ if( pageIndex( ( QWidget * )( *it ).kcm->parent() ) == curPageIndex )
+ {
+ ( *it ).kcm->defaults();
+ clientChanged( true );
+ return;
+ }
+}
+
+// Reset button.
+void KCMultiWidget::slotUser1()
+{
+ int curPageIndex = activePageIndex();
+
+ ModuleList::Iterator end = m_modules.end();
+ for( ModuleList::Iterator it = m_modules.begin(); it != end; ++it )
+ if( pageIndex( ( QWidget * )( *it ).kcm->parent() ) == curPageIndex )
+ {
+ ( *it ).kcm->load();
+ clientChanged( false );
+ return;
+ }
+}
+
+void KCMultiWidget::apply()
+{
+ QStringList updatedModules;
+ ModuleList::Iterator end = m_modules.end();
+ for( ModuleList::Iterator it = m_modules.begin(); it != end; ++it )
+ {
+ KCModuleProxy * m = ( *it ).kcm;
+ if( m && m->changed() )
+ {
+ m->save();
+ QStringList * names = moduleParentComponents[ m ];
+ kdDebug() << k_funcinfo << *names << " saved and added to the list" << endl;
+ for( QStringList::ConstIterator it = names->begin(); it != names->end(); ++it )
+ if( updatedModules.find( *it ) == updatedModules.end() )
+ updatedModules.append( *it );
+ }
+ }
+ for( QStringList::const_iterator it = updatedModules.begin(); it != updatedModules.end(); ++it )
+ {
+ kdDebug() << k_funcinfo << *it << " " << ( *it ).latin1() << endl;
+ emit configCommitted( ( *it ).latin1() );
+ }
+ emit configCommitted();
+}
+
+void KCMultiWidget::slotApply()
+{
+ QPushButton *button = actionButton(Apply);
+ if (button)
+ button->setFocus();
+ emit applyClicked();
+ apply();
+}
+
+
+void KCMultiWidget::slotOk()
+{
+ QPushButton *button = actionButton(Ok);
+ if (button)
+ button->setFocus();
+ emit okClicked();
+ apply();
+ accept();
+}
+
+void KCMultiWidget::slotHelp()
+{
+ QString docPath;
+
+ int curPageIndex = activePageIndex();
+ ModuleList::Iterator end = m_modules.end();
+ for( ModuleList::Iterator it = m_modules.begin(); it != end; ++it )
+ if( pageIndex( ( QWidget * )( *it ).kcm->parent() ) == curPageIndex )
+ {
+ docPath = ( *it ).kcm->moduleInfo().docPath();
+ break;
+ }
+
+ KURL url( KURL("help:/"), docPath );
+
+ if (url.protocol() == "help" || url.protocol() == "man" || url.protocol() == "info") {
+ KProcess process;
+ process << "khelpcenter"
+ << url.url();
+ process.start(KProcess::DontCare);
+ process.detach();
+ } else {
+ new KRun(url);
+ }
+}
+
+// Close button
+void KCMultiWidget::slotUser2() {
+ emit close();
+}
+
+void KCMultiWidget::clientChanged(bool state)
+{
+ kdDebug( 710 ) << k_funcinfo << state << endl;
+ ModuleList::Iterator end = m_modules.end();
+ for( ModuleList::Iterator it = m_modules.begin(); it != end; ++it )
+ if( ( *it ).kcm->changed() ) {
+ enableButton( Apply, true );
+ enableButton( User1, true);
+ return;
+ }
+ enableButton( Apply, false );
+ enableButton( User1, false);
+}
+
+void KCMultiWidget::addModule(const QString& path, bool withfallback)
+{
+ QString complete = path;
+
+ if( !path.endsWith( ".desktop" ))
+ complete += ".desktop";
+
+ KService::Ptr service = KService::serviceByStorageId( complete );
+
+ addModule( KCModuleInfo( service ), QStringList(), withfallback);
+}
+
+void KCMultiWidget::addModule(const KCModuleInfo& moduleinfo,
+ QStringList parentmodulenames, bool withfallback)
+{
+ if( !moduleinfo.service() )
+ return;
+
+ if ( !kapp->authorizeControlModule( moduleinfo.service()->menuId() ))
+ return;
+
+ if( !KCModuleLoader::testModule( moduleinfo ))
+ return;
+
+ QFrame* page = 0;
+ if (!moduleinfo.service()->noDisplay())
+ switch( dialogface )
+ {
+ case TreeList:
+ parentmodulenames += moduleinfo.moduleName();
+ page = addHBoxPage( parentmodulenames, moduleinfo.comment(),
+ SmallIcon( moduleinfo.icon(),
+ IconSize( KIcon::Small ) ) );
+ break;
+ case Tabbed:
+ case IconList:
+ page = addHBoxPage( moduleinfo.moduleName(),
+ moduleinfo.comment(), DesktopIcon( moduleinfo.icon(),
+ KIcon::SizeMedium ) );
+ break;
+ case Plain:
+ page = plainPage();
+ ( new QHBoxLayout( page ) )->setAutoAdd( true );
+ break;
+ default:
+ kdError( 710 ) << "unsupported dialog face for KCMultiWidget"
+ << endl;
+ break;
+ }
+ if(!page) {
+ KCModuleLoader::unloadModule(moduleinfo);
+ return;
+ }
+ KCModuleProxy * module;
+ if( m_orphanModules.contains( moduleinfo.service() ) )
+ {
+ // the KCModule already exists - it was removed from the dialog in
+ // removeAllModules
+ module = m_orphanModules[ moduleinfo.service() ];
+ m_orphanModules.remove( moduleinfo.service() );
+ kdDebug( 710 ) << "Use KCModule from the list of orphans for " <<
+ moduleinfo.moduleName() << ": " << module << endl;
+
+ module->reparent( page, 0, QPoint( 0, 0 ), true );
+
+ if( module->changed() )
+ clientChanged( true );
+
+ if( activePageIndex() == -1 ) {
+ showPage( pageIndex( page ) );
+ }
+ }
+ else
+ {
+ module = new KCModuleProxy( moduleinfo, withfallback, page );
+
+ QStringList parentComponents = moduleinfo.service()->property(
+ "X-KDE-ParentComponents" ).toStringList();
+ moduleParentComponents.insert( module,
+ new QStringList( parentComponents ) );
+
+ connect(module, SIGNAL(changed(bool)), this, SLOT(clientChanged(bool)));
+
+ }
+
+ CreatedModule cm;
+ cm.kcm = module;
+ cm.service = moduleinfo.service();
+ cm.adminmode = false;
+ cm.buttons = module->buttons();
+ if ( moduleinfo.needsRootPrivileges() &&
+ !KUser().isSuperUser() ) {/* If we're embedded, it's true */
+ d->hasRootKCM = true;
+ cm.adminmode = true;
+ m_modules.append( cm );
+ if( dialogface==Plain ) {
+ slotAboutToShow( page ); // Won't be called otherwise, necessary for adminMode button
+ }
+ } else {
+ m_modules.append( cm );
+ }
+
+ if( m_modules.count() == 1 ) {
+ slotAboutToShow( page );
+ }
+}
+
+KCModuleProxy * KCMultiWidget::currentModule() {
+ if(d) {
+ return d->currentModule;
+ }
+ return NULL;
+}
+
+void KCMultiWidget::applyOrRevert(KCModuleProxy * module){
+ if( !module || !module->changed() )
+ return;
+
+ int res = KMessageBox::warningYesNo(this,
+ i18n("There are unsaved changes in the active module.\n"
+ "Do you want to apply the changes or discard them?"),
+ i18n("Unsaved Changes"),
+ KStdGuiItem::apply(),
+ KStdGuiItem::discard());
+ if (res == KMessageBox::Yes) {
+ slotApply();
+ } else {
+ module->load();
+ clientChanged( false );
+ }
+}
+
+
+void KCMultiWidget::slotAboutToShow(QWidget *page)
+{
+ QObject * obj = page->child( 0, "KCModuleProxy" );
+ if( ! obj )
+ return;
+
+ KCModuleProxy *module = ( KCModuleProxy* )obj->qt_cast( "KCModuleProxy" );
+ if( ! module )
+ return;
+
+ if( d && d->currentModule )
+ applyOrRevert( d->currentModule );
+
+ d->currentModule = module;
+ emit ( aboutToShow( d->currentModule ) );
+
+ ModuleList::Iterator end = m_modules.end();
+ int buttons = 0;
+ for( ModuleList::Iterator it = m_modules.begin(); it != end; ++it ) {
+ if( ( *it ).kcm==d->currentModule) {
+ showButton(User3, ( *it ).adminmode);
+ buttons = ( *it ).buttons;
+ }
+ }
+
+ showButton(Apply, buttons & KCModule::Apply);
+ showButton(User1, buttons & KCModule::Apply); // Reset button.
+
+ // Close button. No Apply button implies a Close button.
+ showButton(User2, (buttons & KCModule::Apply)==0);
+
+ enableButton( KDialogBase::Help, buttons & KCModule::Help );
+ enableButton( KDialogBase::Default, buttons & KCModule::Default );
+
+ disconnect( this, SIGNAL(user3Clicked()), 0, 0 );
+
+ if (d->currentModule->moduleInfo().needsRootPrivileges() &&
+ !d->currentModule->rootMode() )
+ { /* Enable the Admin Mode button */
+ enableButton( User3, true );
+ connect( this, SIGNAL(user3Clicked()), d->currentModule, SLOT( runAsRoot() ));
+ connect( this, SIGNAL(user3Clicked()), SLOT( disableRModeButton() ));
+ } else {
+ enableButton( User3, false );
+ }
+}
+
+void KCMultiWidget::rootExit()
+{
+ enableButton( User3, true);
+}
+
+void KCMultiWidget::disableRModeButton()
+{
+ enableButton( User3, false );
+ connect ( d->currentModule, SIGNAL( childClosed() ), SLOT( rootExit() ) );
+}
+
+void KCMultiWidget::slotCancel() {
+ dialogClosed();
+ KDialogBase::slotCancel();
+}
+
+void KCMultiWidget::dialogClosed()
+{
+ if(d)
+ {
+ applyOrRevert(d->currentModule);
+ }
+}
+
+#include "kcmultiwidget.moc"
diff --git a/systemsettings/kcmultiwidget.h b/systemsettings/kcmultiwidget.h
new file mode 100644
index 0000000..b0dc718
--- /dev/null
+++ b/systemsettings/kcmultiwidget.h
@@ -0,0 +1,255 @@
+/*
+ Copyright (c) 2000 Matthias Elter <elter@kde.org>
+ Copyright (c) 2003 Daniel Molkentin <molkentin@kde.org>
+ Copyright (c) 2003 Matthias Kretz <kretz@kde.org>
+
+ 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 Steet, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+*/
+
+#ifndef KCMULTIDIALOG_H
+#define KCMULTIDIALOG_H
+
+#include <qptrdict.h>
+
+#include <kdialogbase.h>
+#include <klocale.h>
+#include <kservice.h>
+
+class KCModuleProxy;
+class KCModuleInfo;
+class KCModule;
+
+/**
+ * @short A method that offers a KDialogBase containing arbitrary
+ * Control Modules.
+ */
+class KUTILS_EXPORT KCMultiWidget : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ /**
+ * Constructs a new KCMultiWidget
+ *
+ * @param parent The parent widget
+ * @param name The widget name
+ * @param modal If you pass true here, the dialog will be modal
+ **/
+ KCMultiWidget( QWidget *parent=0, const char *name=0, bool modal=false );
+
+ /**
+ * Construct a personalized KCMultiWidget.
+ *
+ * @param dialogFace You can use TreeList, Tabbed, Plain, Swallow or
+ * IconList.
+ * @param parent Parent of the dialog.
+ * @param name Dialog name (for internal use only).
+ * @param modal Controls dialog modality. If @p false, the rest of the
+ * program interface (example: other dialogs) is accessible while
+ * the dialog is open.
+ */
+ KCMultiWidget( int dialogFace, QWidget * parent = 0,
+ const char * name = 0, bool modal = false );
+
+
+ /**
+ * Destructor
+ **/
+ virtual ~KCMultiWidget();
+
+ /**
+ * Add a module.
+ *
+ * @param module Specify the name of the module that is to be added
+ * to the list of modules the dialog will show.
+ *
+ * @param withfallback Try harder to load the module. Might result
+ * in the module appearing outside the dialog.
+ **/
+ void addModule(const QString& module, bool withfallback=true);
+
+ /**
+ * Add a module.
+ *
+ * @param moduleinfo Pass a KCModuleInfo object which will be
+ * used for creating the module. It will be added
+ * to the list of modules the dialog will show.
+ *
+ * @param parentmodulenames The names of the modules that should appear as
+ * parents in the TreeList. Look at the
+ * KDialogBase::addPage documentation for more info
+ * on this.
+ *
+ * @param withfallback Try harder to load the module. Might result
+ * in the module appearing outside the dialog.
+ **/
+ void addModule(const KCModuleInfo& moduleinfo, QStringList
+ parentmodulenames = QStringList(), bool withfallback=false);
+
+ /**
+ * @return the current module that is being shown.
+ */
+ KCModuleProxy * currentModule();
+
+signals:
+ /**
+ * Emitted after all KCModules have been told to save their configuration.
+ *
+ * The applyClicked and okClicked signals are emitted before the
+ * configuration is saved.
+ */
+ void configCommitted();
+
+ /**
+ * Emitted after the KCModules have been told to save their configuration.
+ * It is emitted once for every instance the KCMs that were changed belong
+ * to.
+ *
+ * You can make use of this if you have more than one component in your
+ * application. instanceName tells you the instance that has to reload its
+ * configuration.
+ *
+ * The applyClicked and okClicked signals are emitted before the
+ * configuration is saved.
+ *
+ * @param instanceName The name of the instance that needs to reload its
+ * configuration.
+ */
+ void configCommitted( const QCString & instanceName );
+
+ /**
+ * Emitted right before a module is shown.
+ * Usefull for updating caption, help, etc
+ *
+ * @param moduleinfo The module that is about to be shown.
+ * @sense 3.4
+ */
+ void aboutToShow( KCModuleProxy *moduleProxy );
+
+ void close();
+
+protected slots:
+ /**
+ * This slot is called when the user presses the "Default" Button.
+ * You can reimplement it if needed.
+ *
+ * @note Make sure you call the original implementation.
+ **/
+ virtual void slotDefault();
+
+ /**
+ * This slot is called when the user presses the "Reset" Button.
+ * You can reimplement it if needed.
+ *
+ * @note Make sure you call the original implementation.
+ */
+ virtual void slotUser1();
+ virtual void slotUser2();
+
+ /**
+ * This slot is called when the user presses the "Apply" Button.
+ * You can reimplement it if needed.
+ *
+ * @note Make sure you call the original implementation.
+ **/
+ virtual void slotApply();
+
+ /**
+ * This slot is called when the user presses the "OK" Button.
+ * You can reimplement it if needed.
+ *
+ * @note Make sure you call the original implementation.
+ **/
+ virtual void slotOk();
+
+ /**
+ * This slot is called when the user presses the "Help" Button.
+ * It reads the DocPath field of the currently selected KControl
+ * module's .desktop file to find the path to the documentation,
+ * which it then attempts to load.
+ *
+ * You can reimplement this slot if needed.
+ *
+ * @note Make sure you call the original implementation.
+ **/
+ virtual void slotHelp();
+
+ virtual void slotCancel();
+
+private slots:
+
+ void slotAboutToShow(QWidget *);
+
+ void clientChanged(bool state);
+
+ /**
+ * Called when entering root mode, and disables
+ * the Admin Mode button such that the user doesn't do it
+ * twice.
+ *
+ * @since 3.4
+ */
+ void disableRModeButton();
+
+ /**
+ * Called when the current module exits from root
+ * mode. Enables the Administrator Mode button, again.
+ *
+ * @since 3.4
+ */
+ void rootExit();
+
+ /**
+ *
+ * Called when the dialog is hidden. It unregisters the modules,
+ * such that they don't hinder the same modules to be opened in
+ * another application.
+ *
+ * @since 3.4
+ */
+ void dialogClosed();
+
+private:
+
+ void applyOrRevert(KCModuleProxy * module);
+
+ void init();
+ void apply();
+
+ struct CreatedModule
+ {
+ KCModuleProxy * kcm;
+ KService::Ptr service;
+ bool adminmode;
+ int buttons;
+ };
+ typedef QValueList<CreatedModule> ModuleList;
+ ModuleList m_modules;
+
+ typedef QMap<KService::Ptr, KCModuleProxy*> OrphanMap;
+ OrphanMap m_orphanModules;
+
+ QPtrDict<QStringList> moduleParentComponents;
+ QString _docPath;
+ int dialogface;
+
+ class KCMultiWidgetPrivate;
+ KCMultiWidgetPrivate *d;
+};
+
+#endif //KCMULTIDIALOG_H
+
diff --git a/systemsettings/kcscrollview.cpp b/systemsettings/kcscrollview.cpp
new file mode 100644
index 0000000..df34f50
--- /dev/null
+++ b/systemsettings/kcscrollview.cpp
@@ -0,0 +1,38 @@
+/*
+ Copyright (c) 2006 Simon Edwards <simon@simonzone.com>
+
+ 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 Steet, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+*/
+
+#include "kcscrollview.h"
+
+KCScrollView::KCScrollView( QWidget * parent, const char * name, WFlags f) : QScrollView(parent,name,f) {
+ setResizePolicy(AutoOneFit);
+ mainChild = 0;
+}
+
+QSize KCScrollView::sizeHint() const {
+ QSize vphint = mainChild->sizeHint();
+ vphint.setWidth(vphint.width()+2*frameWidth());
+ vphint.setHeight(vphint.height()+2*frameWidth());
+ return vphint;
+}
+
+void KCScrollView::addChild(QWidget *child, int x, int y) {
+ mainChild = child;
+ QScrollView::addChild(child,x,y);
+}
diff --git a/systemsettings/kcscrollview.h b/systemsettings/kcscrollview.h
new file mode 100644
index 0000000..630ebc2
--- /dev/null
+++ b/systemsettings/kcscrollview.h
@@ -0,0 +1,35 @@
+/*
+ Copyright (c) 2006 Simon Edwards <simon@simonzone.com>
+
+ 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 Steet, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+*/
+
+#ifndef KCSCROLLVIEW_H
+#define KCSCROLLVIEW_H
+#include <qscrollview.h>
+
+class KCScrollView : public QScrollView {
+public:
+ KCScrollView ( QWidget * parent = 0, const char * name = 0, WFlags f = 0 );
+
+ virtual QSize sizeHint() const;
+ virtual void addChild(QWidget *child, int x=0, int y=0);
+private:
+ QWidget *mainChild;
+};
+
+#endif
diff --git a/systemsettings/main.cpp b/systemsettings/main.cpp
new file mode 100644
index 0000000..0b8e010
--- /dev/null
+++ b/systemsettings/main.cpp
@@ -0,0 +1,62 @@
+/**
+ * This file is part of the System Settings package
+ * Copyright (C) 2005 Benjamin C Meyer
+ * <ben+systempreferences at meyerhome dot net>
+ *
+ * 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 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 Steet, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <kapplication.h>
+#include <kcmdlineargs.h>
+#include <kaboutdata.h>
+
+#include "mainwindow.h"
+#include "version.h"
+
+static KCmdLineOptions options[] =
+{
+ { "menu <argument>", I18N_NOOP("Menu file"), "systemsettings" },
+ { "e", 0, 0 },
+ { "noembed", I18N_NOOP("Embed windows"), 0 },
+ KCmdLineLastOption
+};
+
+int main( int argc, char *argv[] )
+{
+ KLocale::setMainCatalogue("systemsettings");
+ // About data
+ KAboutData aboutData("systemsettings", I18N_NOOP("System Settings"),
+ SYSTEM_SETTINGS_VERSION, I18N_NOOP("System Settings"),
+ KAboutData::License_LGPL, "(c) 2005, Benjamin C. Meyer", 0, 0);
+ aboutData.addAuthor("Benjamin C. Meyer", I18N_NOOP("Author & Maintainer"),
+ "ben+systempreferences@meyerhome.net");
+ KCmdLineArgs::init(argc, argv, &aboutData);
+
+ // Tell which options are supported
+ KCmdLineArgs::addCmdLineOptions( options );
+
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ // Launch
+ KApplication application(argc, argv);
+
+ MainWindow *mainWindow = new MainWindow(args->isSet("embed"), args->getOption("menu"));
+ application.setMainWidget( mainWindow );
+ mainWindow->show();
+
+ return application.exec();
+}
+
diff --git a/systemsettings/mainwindow.cpp b/systemsettings/mainwindow.cpp
new file mode 100644
index 0000000..544c015
--- /dev/null
+++ b/systemsettings/mainwindow.cpp
@@ -0,0 +1,362 @@
+/**
+ * This file is part of the System Settings package
+ * Copyright (C) 2005 Benjamin C Meyer (ben+systempreferences at meyerhome dot net)
+ *
+ * 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 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 Steet, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "mainwindow.h"
+
+#include <kstdaction.h>
+#include <qwhatsthis.h>
+#include <qlabel.h>
+#include <qvbox.h>
+#include <kaction.h>
+#include <qtoolbutton.h>
+#include <klocale.h>
+#include <kservicegroup.h>
+#include <qlayout.h>
+#include <qwidgetstack.h>
+#include <qtimer.h>
+#include <kiconloader.h>
+#include <kcmoduleloader.h>
+#include <kdialogbase.h>
+#include <kiconviewsearchline.h>
+#include <kapplication.h>
+#include <kaboutapplication.h>
+#include <kdebug.h>
+#include <kcmoduleproxy.h>
+#include <kbugreport.h>
+#include <kmenubar.h>
+#include <kactionclasses.h>
+#include <ktoolbarbutton.h>
+#include <qtabbar.h>
+
+#include "kcmsearch.h"
+#include "modulesview.h"
+#include "moduleiconitem.h"
+#include "kcmodulemenu.h"
+#include "kcmultiwidget.h"
+
+MainWindow::MainWindow(bool embed, const QString & menuFile,
+ QWidget *parent, const char *name) :
+ KMainWindow(parent,name), menu(NULL), embeddedWindows(embed),
+ groupWidget(NULL), selectedPage(0), dummyAbout(NULL) {
+
+ // Load the menu structure in from disk.
+ menu = new KCModuleMenu( menuFile );
+
+ moduleTabs = new KTabWidget(this, "moduletabs",
+ QTabWidget::Top|QTabWidget::Rounded);
+ buildMainWidget();
+ buildActions();
+ setupGUI(ToolBar|Save|Create,QString::null);
+ widgetChange();
+}
+
+MainWindow::~MainWindow()
+{
+ delete moduleTabs;
+ delete windowStack;
+ delete menu;
+ delete dummyAbout;
+}
+
+void MainWindow::buildMainWidget()
+{
+ windowStack = new QWidgetStack( this, "widgetstack" );
+
+ // Top level pages.
+ QValueList<MenuItem> subMenus = menu->menuList();
+ QValueList<MenuItem>::iterator it;
+ KCScrollView *modulesScroller;
+ moduleTabs->show();
+ for ( it = subMenus.begin(); it != subMenus.end(); ++it ) {
+ if( (*it).menu ) {
+ modulesScroller = new KCScrollView(moduleTabs);
+ ModulesView *modulesView = new ModulesView( menu, (*it).subMenu, modulesScroller->viewport(), "modulesView" );
+ modulesViewList.append(modulesView);
+ connect(modulesView, SIGNAL(itemSelected(QIconViewItem* )), this, SLOT(slotItemSelected(QIconViewItem*)));
+ modulesScroller->addChild(modulesView);
+ moduleTabs->addTab(modulesScroller, (*it).caption);
+ overviewPages.append(modulesScroller);
+ }
+ }
+
+ windowStack->addWidget(moduleTabs);
+ windowStack->raiseWidget(moduleTabs);
+ setCentralWidget(windowStack);
+}
+
+void MainWindow::buildActions()
+{
+ KStdAction::quit(this, SLOT( close() ), actionCollection());
+
+ resetModule = new KAction(i18n("Undo Changes"), 0, this,
+ SLOT(showAllModules()), actionCollection(), "resetModule" );
+ resetModule->setEnabled(false);
+
+ defaultModule = new KAction(i18n("Reset to Defaults"), 0, this,
+ SLOT(showAllModules()), actionCollection(), "defaultModule" );
+ defaultModule->setEnabled(false);
+
+ if( embeddedWindows ) {
+ showAllAction = new KAction(i18n("Overview"), QApplication::reverseLayout() ? "forward" : "back", 0, this,
+ SLOT(showAllModules()), actionCollection(), "showAll" );
+ showAllAction->setEnabled(false);
+ }
+
+ aboutModuleAction = new KAction(i18n("About Current Module"), 0, this, SLOT(aboutCurrentModule()), actionCollection(), "help_about_module");
+ resetModuleHelp();
+
+ // Search
+ QHBox *hbox = new QHBox(0);
+ hbox->setMaximumWidth( 400 );
+
+ KcmSearch* search = new KcmSearch(&modulesViewList, hbox, "search");
+ hbox->setStretchFactor(search,1);
+ connect(search, SIGNAL(searchHits(const QString &, int *, int)), this, SLOT(slotSearchHits(const QString &, int *, int)));
+
+ QVBox *vbox = new QVBox(hbox);
+ generalHitLabel = new QLabel(vbox);
+ vbox->setStretchFactor(generalHitLabel,1);
+ advancedHitLabel = new QLabel(vbox);
+ vbox->setStretchFactor(advancedHitLabel,1);
+
+ hbox->setStretchFactor(vbox,1);
+
+ // "Search:" label
+ QLabel *searchLabel = new QLabel( this, "SearchLabel");
+ searchLabel->setText( i18n("&Search:") );
+ searchLabel->setFont(KGlobalSettings::toolBarFont());
+ searchLabel->setMargin(2);
+ searchText = new KWidgetAction( searchLabel, i18n("&Search:"), Key_F6, 0, 0, actionCollection(), "searchText" );
+ searchLabel->setBuddy( search );
+
+ // The search box.
+ searchAction = new KWidgetAction( hbox, i18n( "Search System Settings" ), 0,
+ 0, 0, actionCollection(), "search" );
+ searchAction->setShortcutConfigurable( false );
+ searchAction->setAutoSized( true );
+ QWhatsThis::add( search, i18n( "Search Bar<p>Enter a search term." ) );
+
+ // The Clear search box button.
+ KToolBarButton *clearWidget = new KToolBarButton(QApplication::reverseLayout() ? "clear_left" : "locationbar_erase",
+ 0, this);
+ searchClear = new KWidgetAction( clearWidget, QString(""), CTRL+Key_L, search, SLOT(clear()),
+ actionCollection(), "searchReset");
+ connect(clearWidget, SIGNAL(clicked()), searchClear, SLOT(activate()));
+ searchClear->setWhatsThis( i18n( "Reset Search\n"
+ "Resets the search so that "
+ "all items are shown again." ) );
+
+ // Top level pages.
+ QValueList<MenuItem> subMenus = menu->menuList();
+ QValueList<MenuItem>::iterator it;
+ for ( it = subMenus.begin(); it != subMenus.end(); ++it ) {
+ if( (*it).menu ) {
+ KServiceGroup::Ptr group = KServiceGroup::group( (*it).subMenu );
+ if ( !group ){
+ kdDebug() << "Invalid Group \"" << (*it).subMenu << "\". Check your installation."<< endl;
+ continue;
+ }
+
+ KRadioAction *newAction = new KRadioAction( group->caption(), group->icon(), KShortcut(), this,
+ SLOT(slotTopPage()), actionCollection(), group->relPath() );
+ pageActions.append(newAction);
+kdDebug() << "relpath is :" << group->relPath() << endl;
+ }
+ }
+ pageActions.at(0)->setChecked(true);
+}
+
+void MainWindow::aboutCurrentModule()
+{
+ if(!groupWidget)
+ return;
+
+ KCModuleProxy* module = groupWidget->currentModule();
+ if( module && module->aboutData() ){
+ KAboutApplication dlg( module->aboutData() );
+ dlg.exec();
+ }
+}
+
+void MainWindow::groupModulesFinished()
+{
+ showAllModules();
+}
+
+void MainWindow::showAllModules()
+{
+ windowStack->raiseWidget(moduleTabs);
+
+ // Reset the widget for normal all widget viewing
+ groupWidget = 0;
+ widgetChange();
+
+ if( embeddedWindows ) {
+ showAllAction->setEnabled(false);
+ }
+ aboutModuleAction->setEnabled(false);
+
+ searchText->setEnabled(true);
+ searchClear->setEnabled(true);
+ searchAction->setEnabled(true);
+
+ KRadioAction *currentRadioAction;
+ for ( currentRadioAction = pageActions.first(); currentRadioAction; currentRadioAction = pageActions.next()) {
+ currentRadioAction->setEnabled(true);
+ }
+
+ resetModuleHelp();
+}
+
+void MainWindow::slotItemSelected( QIconViewItem *item ){
+ ModuleIconItem *mItem = (ModuleIconItem *)item;
+
+ if( !mItem )
+ return;
+
+ groupWidget = moduleItemToWidgetDict.find(mItem);
+ scrollView = moduleItemToScrollerDict.find(mItem);
+
+ if(groupWidget==0) {
+ QValueList<KCModuleInfo> list = mItem->modules;
+ KDialogBase::DialogType type = KDialogBase::IconList;
+ if(list.count() == 1) {
+ type=KDialogBase::Plain;
+ }
+
+ scrollView = new KCScrollView(windowStack);
+ groupWidget = new KCMultiWidget(type, scrollView->viewport(), "moduleswidget");
+ scrollView->addChild(groupWidget);
+ windowStack->addWidget(scrollView);
+ moduleItemToScrollerDict.insert(mItem,scrollView);
+ moduleItemToWidgetDict.insert(mItem,groupWidget);
+
+ connect(groupWidget, SIGNAL(aboutToShow( KCModuleProxy * )), this, SLOT(updateModuleHelp( KCModuleProxy * )));
+ connect(groupWidget, SIGNAL(aboutToShowPage( QWidget* )), this, SLOT(widgetChange()));
+ connect(groupWidget, SIGNAL(finished()), this, SLOT(groupModulesFinished()));
+ connect(groupWidget, SIGNAL(close()), this, SLOT(showAllModules()));
+
+ QValueList<KCModuleInfo>::iterator it;
+ for ( it = list.begin(); it != list.end(); ++it ){
+ qDebug("adding %s %s", (*it).moduleName().latin1(), (*it).fileName().latin1());
+ groupWidget->addModule( *it );
+ }
+ groupWidget->reparent(scrollView->viewport(), 0, QPoint());
+ scrollView->reparent(windowStack, 0, QPoint());
+ }
+
+ if( embeddedWindows ) {
+ windowStack->raiseWidget( scrollView );
+
+ setCaption( mItem->text() );
+ showAllAction->setEnabled(true);
+ searchText->setEnabled(false);
+ searchClear->setEnabled(false);
+ searchAction->setEnabled(false);
+
+ KRadioAction *currentRadioAction;
+ for ( currentRadioAction = pageActions.first(); currentRadioAction; currentRadioAction = pageActions.next()) {
+ currentRadioAction->setEnabled(false);
+ }
+
+ } else {
+ scrollView->show();
+ }
+ groupWidget->show();
+
+ // We resize and expand the window if neccessary, but only once the window has been updated.
+ // Some modules seem to dynamically change thier size. The new size is only available
+ // once the dialog is updated. :-/ -SBE
+ QTimer::singleShot(0,this,SLOT(timerResize()));
+}
+
+void MainWindow::timerResize() {
+ QSize currentSize = size();
+ QSize newSize = currentSize.expandedTo(sizeHint());
+ // Avoid resizing if possible.
+ if(newSize!=currentSize) {
+ resize(newSize);
+ }
+}
+
+void MainWindow::updateModuleHelp( KCModuleProxy *currentModule ) {
+ if ( currentModule->aboutData() ) {
+ aboutModuleAction->setText(i18n("Help menu->about <modulename>", "About %1").arg(
+ currentModule->moduleInfo().moduleName().replace("&","&&")));
+ aboutModuleAction->setIcon(currentModule->moduleInfo().icon());
+ aboutModuleAction->setEnabled(true);
+ }
+ else {
+ resetModuleHelp();
+ }
+}
+
+void MainWindow::resetModuleHelp() {
+ aboutModuleAction->setText(i18n("About Current Module"));
+ aboutModuleAction->setIconSet(QIconSet());
+ aboutModuleAction->setEnabled(false);
+}
+
+void MainWindow::widgetChange() {
+ QString name;
+ if( groupWidget && groupWidget->currentModule()) {
+ name = groupWidget->currentModule()->moduleInfo().moduleName();
+ }
+
+ if( !groupWidget ) {
+ setCaption( "" );
+
+ ModulesView *modulesView;
+ for( modulesView = modulesViewList.first(); modulesView; modulesView = modulesViewList.next()) {
+ modulesView->clearSelection();
+ }
+ }
+}
+
+void MainWindow::slotTopPage() {
+ KRadioAction *clickedRadioAction = (KRadioAction *)sender();
+ selectedPage = pageActions.find(clickedRadioAction);
+
+ KRadioAction *currentRadioAction;
+ for ( currentRadioAction = pageActions.first(); currentRadioAction; currentRadioAction = pageActions.next()) {
+ currentRadioAction->setChecked(currentRadioAction==clickedRadioAction);
+ }
+
+ windowStack->raiseWidget(overviewPages.at(selectedPage));
+}
+
+void MainWindow::slotSearchHits(const QString &query, int *hitList, int length) {
+ if(query=="") {
+ generalHitLabel->setText("");
+ advancedHitLabel->setText("");
+ } else {
+
+ if(length>=1) {
+ generalHitLabel->setText(i18n("%1 hit in General","%1 hits in General",hitList[0]).arg(hitList[0]));
+ }
+
+ if(length>=2) {
+ advancedHitLabel->setText(i18n("%1 hit in Advanced","%1 hits in Advanced",hitList[1]).arg(hitList[1]));
+ }
+
+ }
+}
+
+#include "mainwindow.moc"
diff --git a/systemsettings/mainwindow.h b/systemsettings/mainwindow.h
new file mode 100644
index 0000000..da60f1d
--- /dev/null
+++ b/systemsettings/mainwindow.h
@@ -0,0 +1,111 @@
+/**
+ * This file is part of the System Settings package
+ * Copyright (C) 2005 Benjamin C Meyer (ben+systempreferences at meyerhome dot net)
+ *
+ * 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 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 Steet, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include <kmainwindow.h>
+#include <kcmoduleinfo.h>
+#include <ktabwidget.h>
+#include <qptrdict.h>
+#include <qlabel.h>
+#include <kactionclasses.h>
+#include <kiconviewsearchline.h>
+
+#include "kcscrollview.h"
+#include "kcmodulemenu.h"
+
+class QWidgetStack;
+class QIconViewItem;
+class KCMultiWidget;
+class ModulesView;
+class KAction;
+class KWidgetAction;
+class KCModule;
+class KCModuleProxy;
+
+class MainWindow : public KMainWindow
+{
+ Q_OBJECT
+
+public:
+ MainWindow(bool embed=true, const QString &menufile="systemsettings",
+ QWidget *parent=0, const char *name=0);
+ ~MainWindow();
+
+private slots:
+ void slotItemSelected( QIconViewItem* item );
+ void showAllModules();
+ void aboutCurrentModule();
+ void updateModuleHelp( KCModuleProxy * );
+
+ void resetModuleHelp();
+ void groupModulesFinished();
+
+ void widgetChange();
+ void timerResize();
+ void slotTopPage();
+ void slotSearchHits(const QString &query, int *hitList, int length);
+
+private:
+ KCModuleMenu *menu;
+ bool embeddedWindows;
+ QWidgetStack *windowStack;
+ KTabWidget *moduleTabs;
+
+ QPtrList<ModulesView> modulesViewList;
+ QPtrList<QIconView> viewList;
+
+ KCMultiWidget *groupWidget;
+ KCScrollView *scrollView;
+
+ QPtrDict<KCMultiWidget> moduleItemToWidgetDict;
+ QPtrDict<KCScrollView> moduleItemToScrollerDict;
+
+ QPtrList<KRadioAction> pageActions;
+ QPtrList<KCScrollView> overviewPages;
+ int selectedPage;
+
+ KAction *resetModule;
+ KAction *defaultModule;
+
+ KAction *showAllAction;
+ KWidgetAction *searchText;
+ KAction *searchClear;
+ KWidgetAction *searchAction;
+
+ KAction *aboutModuleAction;
+
+ void buildMainWidget();
+ void buildActions();
+
+ QLabel *generalHitLabel;
+ QLabel *advancedHitLabel;
+
+ /**
+ * If someone wants to report a bug
+ * against a module with no about data
+ * we construct one for him
+ **/
+ KAboutData *dummyAbout;
+};
+
+#endif
+
diff --git a/systemsettings/menu/Makefile.am b/systemsettings/menu/Makefile.am
new file mode 100644
index 0000000..926a135
--- /dev/null
+++ b/systemsettings/menu/Makefile.am
@@ -0,0 +1,36 @@
+#temporary till KDE4 and it can be renamed
+xdg_apps_DATA = audioencoding.desktop defaultapplication.desktop kcmfontinst.desktop kcm_knetworkconfmodule_ss.desktop laptoppowermanagement.desktop medianotifications.desktop
+
+xdg_menu_DATA = system-settings.menu
+
+xdg_mergedmenu_DATA = system-settings-merge.menu
+xdg_mergedmenudir = $(xdg_menudir)/applications-merged
+
+xdg_directory_DATA = \
+kde-settings-accessibility_ss.directory \
+kde-settings-advanced.directory \
+kde-settings-advancedusersettings.directory \
+kde-settings-appearance.directory \
+kde-settings-computeradministration.directory \
+kde-settings-defaultapplications.directory \
+kde-settings-general.directory \
+kde-settings-keyboardmouse.directory \
+kde-settings-laptops.directory \
+kde-settings-looknfeel2.directory \
+kde-settings-networkconnections.directory \
+kde-settings-networkconnectivity.directory \
+kde-settings-networksettings.directory \
+kde-settings-notifications.directory \
+kde-settings-panel.directory \
+kde-settings-personal.directory \
+kde-settings-power.directory \
+kde-settings-regional.directory \
+kde-settings-sharing.directory \
+kde-settings-splashscreen.directory \
+kde-settings-system.directory \
+kde-settings-useraccount.directory \
+kde-settings-windowbehavior.directory \
+system-settings.directory
+
+#install-data-local:
+# kbuildsycoca
diff --git a/systemsettings/menu/audioencoding.desktop b/systemsettings/menu/audioencoding.desktop
new file mode 100644
index 0000000..2e56ee9
--- /dev/null
+++ b/systemsettings/menu/audioencoding.desktop
@@ -0,0 +1,56 @@
+[Desktop Entry]
+Encoding=UTF-8
+Exec=kcmshell audiocd
+Icon=cdaudio_unmount
+Type=Application
+
+X-KDE-ModuleType=Library
+X-KDE-Library=audiocd
+
+Name=Audio Encoding
+Name[ar]=ترميز صوت
+Name[bg]=Аудио кодиране
+Name[br]=Enkodiñ klevet
+Name[da]=Lydkodning
+Name[de]=Audio-Kodierung
+Name[el]=Κωδικοποίηση ήχου
+Name[es]=Codificación de audio
+Name[et]=Audio kodeerimine
+Name[ga]=Ionchódú Fuaime
+Name[gl]=Codificazón de Áudio
+Name[ja]=オーディオエンコーディング
+Name[nl]=Audiocodering
+Name[pt]=Codificação de Áudio
+Name[pt_BR]=Codificação de Áudio
+Name[sv]=Ljudkodning
+Comment=Audiocd IO Slave Configuration
+Comment[bg]=Настройка на Audiocd IO Slave
+Comment[br]=Kefluniadur Sklav IO Audiocd
+Comment[da]=Indstil I/O-slave for lyd-cd
+Comment[de]=Konfiguration des Audio-CD Ein-/Ausgabemoduls
+Comment[el]=Ρύθμιση io slave για CD ήχου
+Comment[es]=Configuración del esclavo ES Audiocd
+Comment[et]=Audiocd KIO-mooduli seadistused
+Comment[gl]=Configurazón do IO Slave de Audiocd
+Comment[ja]=オーディオ CD IO スレーブの設定
+Comment[nl]=Audiocd IO-slave instellen
+Comment[pt]=Configuração do IO Slave de CDs-Áudio
+Comment[pt_BR]=Configuração do Protocolo audiocd
+Comment[sv]=Anpassa I/O-slav för ljud-cd
+Keywords=Audio CD,CD,Ogg,Vorbis,Encoding,CDDA,Bitrate
+Keywords[ar]=قرص مدمج صوتي ، قرص مدمج ، Ogg ، Vorbis,ترميز,CDDA,Bitrate
+Keywords[br]=CD klevet,CD,Ogg,Vorbis,Kodadur,CDDA,Feur
+Keywords[da]=lyd-cd,cd,Ogg,Vorbis,kodning,CDDA,bitrate
+Keywords[de]=Audio CD,CD,Ogg,Vorbis,Kodierung,CDDA,Bitrate
+Keywords[es]=CD de Audio,CD,Ogg,Vorbis,Codificar,CDDA,Tasa de bit
+Keywords[et]=Audio CD,CD,Ogg,Vorbis,kodeering,CDDA,bitikiirus
+Keywords[ga]=CD Fuaime,CD,Ogg,Vorbis,Ionchódú,CDDA,Ráta Giotán
+Keywords[gl]=Audio CD,CD,Ogg,Vorbis,Codificar,CDDA,Bitrate
+Keywords[ja]=オーディオ CD,CD,Ogg,Vorbis,エンコーディング,CDDA,ビットレート
+Keywords[nl]=Audio-cd,cd,Ogg,Vorbis,Encoding,CDDA,Bitrate,codering,rippen,bitsnelheid
+Keywords[pt]=CD Áudio,CD,Ogg,Vorbis,Codificação,CDDA,Taxa
+Keywords[pt_BR]=CD de áudio,CD,Ogg,Vorbis,codificação, CDDA, taxa de bits
+Keywords[sv]=ljud-cd,cd,Ogg,Vorbis,kodning,CDDA,bithastighet
+
+## keep this out of kcontrol
+#Categories=Qt;KDE;X-KDE-settings-sound;
diff --git a/systemsettings/menu/defaultapplication.desktop b/systemsettings/menu/defaultapplication.desktop
new file mode 100644
index 0000000..6c11a13
--- /dev/null
+++ b/systemsettings/menu/defaultapplication.desktop
@@ -0,0 +1,97 @@
+[Desktop Entry]
+Encoding=UTF-8
+Exec=kcmshell defaultapplication
+Icon=blockdevice
+Type=Application
+
+X-KDE-Library=componentchooser
+
+X-KDE-ParentApp=kcontrol
+
+Name=Default Applications
+Name[ar]=التطبيقات الإفتراضية
+Name[bg]=Програма по подразбиране
+Name[br]=Arloadoù dre ziouer
+Name[cs]=Výchozí aplikace
+Name[da]=Standardprogrammer
+Name[de]=Standardprogramme
+Name[el]=Προκαθορισμένες εφαρμογές
+Name[es]=Aplicaciones predeterminadas
+Name[et]=Vaikimisi rakendused
+Name[fr]=Applications par défaut
+Name[ga]=Feidhmchláir Réamhshocraithe
+Name[gl]=Aplicazóns Predefinidas
+Name[it]=Applicazioni predefinite
+Name[ja]=デフォルトアプリケーション
+Name[ka]=ნაგულისხმევი პროგრამები
+Name[lt]=Numatytosios programos
+Name[mt]=Programmi Standard
+Name[nl]=Standaardtoepassingen
+Name[pa]=ਮੂਲ ਕਾਰਜ
+Name[pl]=Programy domyślne
+Name[pt]=Aplicações Predefinidas
+Name[pt_BR]=Aplicativos Padrão
+Name[ru]=Приложения по умолчанию
+Name[sk]=Štandardné aplikácie
+Name[sr]=Подразумевани програми
+Name[sr@Latn]=Podrazumevani programi
+Name[sv]=Förvalda program
+Name[tr]=Öntanımlı Uygulamalar
+Name[xx]=xxDefault Applicationsxx
+Name[zh_CN]=默认应用程序
+Comment=Choose the default application for various services
+Comment[ar]=إختر التطبيق الإفتراضي للخدمات المختلفة
+Comment[bg]=Изберете програма по подразбиране за различните услуги
+Comment[cs]=Volba hlavních aplikací pro různé služby
+Comment[da]=Vælg standardprogram for diverse tjenester
+Comment[de]=Wählen Sie die Standardprogramme für verschiedene Dienste
+Comment[el]=Επιλέξτε την προκαθορισμένη εφαρμογή για διάφορες υπηρεσίες
+Comment[es]=Seleccionar la aplicación predeterminada para determinados servicios
+Comment[et]=Mitmesuguste teenuste vaikimisi rakenduste valimine
+Comment[fr]=Choisir l'application par défaut pour divers services
+Comment[ga]=Roghnaigh an feidhmchlár réamhshocraithe le haghaidh seirbhísí éagsúla
+Comment[gl]=Escolla a aplicazón por omisión para vários servizos
+Comment[it]=Scegli l'applicazione predefinita per i diversi servizi
+Comment[ja]=様々なサービスのためのデフォルトアプリケーションを選択
+Comment[ka]=სხვადასხვა სერვისებისთვის ნაგულისხმევი პროგრამების არჩევა
+Comment[lt]=Pasirinkite numatytąsias programas įvairioms tarnyboms
+Comment[mt]=Agħżel il-programmi standard għas-servizzi
+Comment[nl]=Kies de standaardtoepassingen voor diverse diensten
+Comment[pa]=ਕਈ ਸੇਵਾਵਾਂ ਲਈ ਮੂਲ ਕਾਰਜ ਚੁਣੋ
+Comment[pl]=Wybierz domyślne programy dla różnych usług
+Comment[pt]=Escolha a aplicação por omissão para vários serviços
+Comment[pt_BR]=Escolha o aplicativo padrão para vários serviços
+Comment[ru]=Выберите приложения по умолчанию для различных задач
+Comment[sk]=Zvolte štandardnú aplikáciu pre rôzne služby
+Comment[sr]=Изаберите подразумевани програм за разне сервисе
+Comment[sr@Latn]=Izaberite podrazumevani program za razne servise
+Comment[sv]=Välj förvalt program för diverse tjänster
+Comment[tr]=Çeşitli servisler için öntanımlı uygulamayı seç
+Comment[xx]=xxChoose the default application for various servicesxx
+Comment[zh_CN]=选择各种服务的默认应用程序
+Keywords=components,component chooser,resources, email client, terminal emulator, default, browser
+Keywords[bg]=компоненти, избиране на компоненти, ресурси, клиент за електронна поща, терминален емулатор, по подразбиране, браузър
+Keywords[cs]=komponenty, zdroje, výběr komponent, poštovní klient, emulátor terminálu,výchozí,default,prohlížeč
+Keywords[da]=komponenter,komponentvælgere,ressourcer,e-mail-klient,terminalemulator,standard,browser
+Keywords[de]=Komponenten, Komponentenauswahl, Ressource, E-Mail-Programm, Terminalemulator, Standard, Browser
+Keywords[el]=Στοιχεία, επιλογέας στοιχείων,πόροι, πελάτης email, εξομοιωτής τερματικού, προκαθορισμένα, περιηγητής
+Keywords[es]=componentes, selector de componente, recursos, cliente de correo electrónico, emulador de terminal, predeterminado, navegador
+Keywords[et]=komponendid,komponentide valija,ressursid,e-posti klient,terminaliemulaator,vaikimisi brauser
+Keywords[fr]=composants,sélecteur de composants,ressources,client de messagerie,émulateur de terminal,défaut,navigateur
+Keywords[gl]=componentes,selector de componentes,recursos, cliente de email, emulador de terminal, predefinido, omisión, navegador
+Keywords[it]=componenti,selettore componente,risorse, client posta elettronica, emulatore terminale, predefinito, browser
+Keywords[ja]=コンポーネント,選択,リソース,Eメール,クライアント,ターミナルエミュレータ,デフォルト,ブラウザ
+Keywords[lt]=components,component chooser,resources, email client, terminal emulator, default, browser,komponentai,pašto klientas,komponentų parinkiklis, terminalo emuliatorius,numatytosios, numatytasis,naršyklė
+Keywords[nl]=componenten,componentkiezer,hulpbronnen,resources,e-mailprogramma,terminalemulatie,xterminal,console,standaard,default,webbrowser,browser,bladerprogramma
+Keywords[pa]=components,component chooser,resources, email client, terminal emulator, ਮੂਲ, ਝਲਕਾਰਾ
+Keywords[pl]=komponenty,komponent,wybór, zasoby, klient poczty, emulator konsoli, domyślny, przeglądarka
+Keywords[pt]=componentes,selector de componentes,recursos, cliente de e-mail, emulador de terminal, predefinido, omissão, navegador
+Keywords[pt_BR]=componentes,escolha de componente,recursos,cliente de e-mail,emulador de terminal, padrão, navegador
+Keywords[ru]=компоненты,выбор компонентов,ресурсы,почтовый клиент,эмулятор терминала,браузер
+Keywords[sr]=components,component chooser,resources, email client, terminal emulator, default, browser, компоненте, прегледач, ресурси, клијент е-поште, емулација терминала, подразумевано
+Keywords[sr@Latn]=components,component chooser,resources, email client, terminal emulator, default, browser, komponente, pregledač, resursi, klijent e-pošte, emulacija terminala, podrazumevano
+Keywords[sv]=komponenter,komponentväljare,resurser,epost-klient,terminalemulator,förval,webbläsare
+Keywords[tr]=bileşenler,bileşen seçici,kaynaklar,e-posta istemci,uçbirim emülatörü,öntanımlı,tarayıcı
+Keywords[xx]=xxcomponents,component chooser,resources, email client, terminal emulator, default, browserxx
+Keywords[zh_CN]=components,component chooser,resources,email client,terminal emulator,default,browser,组件,组件选择器,资源,电子邮件客户端,终端模拟器,默认,浏览器
+Categories=Qt;KDE;X-KDE-settings-components;
diff --git a/systemsettings/menu/kcm_knetworkconfmodule_ss.desktop b/systemsettings/menu/kcm_knetworkconfmodule_ss.desktop
new file mode 100644
index 0000000..4556c32
--- /dev/null
+++ b/systemsettings/menu/kcm_knetworkconfmodule_ss.desktop
@@ -0,0 +1,62 @@
+# KDE Config File
+[Desktop Entry]
+Encoding=UTF-8
+X-KDE-RootOnly=true
+
+## Keep this out of kcontrol
+#Categories=QT;KDE;X-KDE-settings-network;Configuration-KDE-Network-mdk;
+X-KDE-ModuleType=Library
+X-KDE-Library=knetworkconfmodule
+X-KDE-FactoryName=knetworkconfmodule
+Type=Application
+Exec=kcmshell kcm_knetworkconfmodule
+Icon=knetworkconf
+DocPath=knetworkconf/index.docbook
+
+Comment=Configure Network Connections
+Comment[ar]=إعداد إتصالات الشبكة
+Comment[bg]=Настройка на системните връзки
+Comment[br]=Kefluniañ ar c'hevreadennoù rouedad
+Comment[da]=Indstil netværksforbindelser
+Comment[de]=Netzwerkverbindungen konfigurieren
+Comment[el]=Ρύθμιση συνδέσεων δικτύου
+Comment[es]=Configurar conexiones de red
+Comment[et]=Võrguühenduste seadistamine
+Comment[ga]=Cumraigh Naisc Líonra
+Comment[gl]=Configurazón das Conexóns de Rede
+Comment[ja]=ネットワーク接続の設定
+Comment[nl]=Netwerkverbindingen instellen
+Comment[pt]=Configurar as Ligações de Rede
+Comment[pt_BR]=Configuração das Conexões da Rede
+Comment[sv]=Anpassa nätverksanslutningar
+Terminal=false
+Name=Network Connections
+Name[ar]=الإتصالات الشبكية
+Name[bg]=Системни връзки
+Name[br]=Kevreadurioù rouedad
+Name[da]=Netværksforbindelser
+Name[de]=Netzwerkverbindungen
+Name[el]=Συνδέσεις δικτύου
+Name[es]=Conexiones de red
+Name[et]=Võrguühendused
+Name[ga]=Naisc Líonra
+Name[gl]=Conexóns de Rede
+Name[ja]=ネットワーク接続
+Name[nl]=Netwerkverbindingen
+Name[pt]=Ligações de Rede
+Name[pt_BR]=Conexões de Rede
+Name[sv]=Nätverksanslutningar
+Keywords=Network,DNS,routes,interfaces
+Keywords[br]=Rouedad,DNS,hentoù,etrefasoù
+Keywords[da]=Netværk,DNS,route,grænseflade
+Keywords[de]=Netzwerk,DNS,Routen,Schnittstellen
+Keywords[el]=δίκτυο,DNS,routes,διασύνδεση
+Keywords[es]=Red,DNS,rutas,interfaces
+Keywords[et]=Võrk,DNS,marsruudid,liidesed
+Keywords[ga]=Líonra,DNS,róid,comhéadain
+Keywords[gl]=Rede,DNS,rotas,interfaces
+Keywords[ja]=ネットワーク,DNS,ルート,インターフェース
+Keywords[nl]=netwerk,DNS,routes,interfaces,netwerkkaart
+Keywords[pt]=rede,DNS,rotas,interfaces
+Keywords[pt_BR]=Rede,DNS,rotas,interfaces
+Keywords[sv]=Nätverk,DNS,route,gränssnitt
diff --git a/systemsettings/menu/kcmfontinst.desktop b/systemsettings/menu/kcmfontinst.desktop
new file mode 100644
index 0000000..40b4627
--- /dev/null
+++ b/systemsettings/menu/kcmfontinst.desktop
@@ -0,0 +1,112 @@
+[Desktop Entry]
+Encoding=UTF-8
+Exec=kcmshell kcmfontinst
+Icon=fonts
+Type=Application
+DocPath=kcontrol/kcmfontinst/index.html
+
+
+X-KDE-Library=fontinst
+X-KDE-FactoryName=fontinst
+X-KDE-RootOnly=true
+
+X-KDE-ParentApp=kcontrol
+
+Name=Fonts
+Name[ar]=المحارف
+Name[bg]=Шрифтове
+Name[br]=Fontoù
+Name[cs]=Písma
+Name[cy]=Ffontiau
+Name[da]=Skrifttyper
+Name[de]=Schriftarten
+Name[el]=Γραμματοσειρές
+Name[es]=Fuentes
+Name[et]=Fondid
+Name[fr]=Polices
+Name[ga]=Clónna
+Name[gl]=Tipos de Letra
+Name[it]=Caratteri
+Name[ja]=フォント
+Name[ka]=შრიფტები
+Name[lt]=Šriftai
+Name[nl]=Lettertypen
+Name[pa]=ਫੋਂਟ
+Name[pl]=Czcionki
+Name[pt]=Tipos de Letra
+Name[pt_BR]=Fontes
+Name[ru]=Шрифты
+Name[rw]=Imyandikire
+Name[sk]=Písma
+Name[sr]=Фонтови
+Name[sr@Latn]=Fontovi
+Name[sv]=Teckensnitt
+Name[tr]=Yazıtipleri
+Name[xx]=xxFontsxx
+Name[zh_CN]=字体
+
+Comment=Install & preview fonts
+Comment[ar]=ثبت و أعرض محارف
+Comment[bg]=Инсталиране и преглеждане на шрифтове
+Comment[br]=Staliañ ha rakgwel an nodrezhoù
+Comment[cs]=Instalace a náhled písem
+Comment[cy]=Gosod a rhagolygu ffontiau
+Comment[da]=Installér og forhåndsvis skrifttyper
+Comment[de]=Schriftarten installieren und Voransicht
+Comment[el]=Εγκατάσταση & προεπισκόπηση γραμματοσειρών
+Comment[es]=Instalar y previsualizar fuentes
+Comment[et]=Fontide paigaldamine ja eelvaatlus
+Comment[fr]=Installer et prévisualiser des polices
+Comment[ga]=Suiteáil & Réamhamharc na gClónna
+Comment[gl]=Instalar e antever tipos de letra
+Comment[it]=Installa e fornisce l'anteprima dei caratteri
+Comment[ja]=フォントのインストールとプレビュー
+Comment[ka]=შრიფტების დაყენება და წინასწარ ნახვა
+Comment[lt]=Instaliuoja ir peržiūri šriftus
+Comment[mt]=Installazzjoni u previżjoni ta' fonts
+Comment[nl]=Lettertypen installeren en bekijken
+Comment[pa]=ਫੋਂਟ ਇੰਸਟਾਲ ਕਰੋ ਅਤੇ ਝਲਕ ਵੇਖੋ
+Comment[pl]=Instaluj i &przeglądaj czcionki
+Comment[pt]=Instalar e antever tipos de letra
+Comment[pt_BR]=Instalação & pré-visualização de fontes
+Comment[ru]=Установка и управление шрифтами
+Comment[rw]=Kwinjiza & kugaragazambere imyandikire
+Comment[sk]=Inštalácia a náhľad na písma
+Comment[sr]=Инсталација и преглед фонтова
+Comment[sr@Latn]=Instalacija i pregled fontova
+Comment[sv]=Installera och förhandsgranska teckensnitt
+Comment[tr]=Yazıtiplerini kur ve önizle
+Comment[xx]=xxInstall & preview fontsxx
+Comment[zh_CN]=安装并预览字体
+
+Keywords=font,fonts,installer,truetype,type1,speedo,bitmap
+Keywords[bg]=шрифт,шрифтове,инсталатор,truetype,type1,speedo,bitmap
+Keywords[br]=nodrezh,nodrezhoù,stalier,truetype,type1,speedo,bitmap
+Keywords[cs]=písmo,písma,instalátor,truetype,type1,speedo,bitmap
+Keywords[cy]=ffont,ffontiau,wynebfath, wynebfathau,arsefydlydd,truetype,type1,math 1,speedo,didfap
+Keywords[da]=skrifttype,skrifttyper,installatør,truetype,type1,speedo,bitmap
+Keywords[de]=Schriftart, Schriftarten, Installer, True Type, Type1, Speedo, Bitmap
+Keywords[el]=γραμματοσειρά,γραμματοσειρές,εγκαταστάτης,truetype,type1,speedo,bitmap
+Keywords[es]=fuente,fuentes,instalador,truetype,type1,speedo,bitmap
+Keywords[et]=font,fondid,paigaldamine,truetype,type1,speedo,bitmap
+Keywords[fr]=police,installeur de polices,installer,truetype,type1,speedo,bitmap
+Keywords[ga]=cló,clónna,clófhoirne,suiteálaí,truetype,type1,speedo,mapa giotán,giotánmhapach
+Keywords[gl]=tipo de letra,tipos de letra,instalador,truetype,type1,speedo,bitmap
+Keywords[it]=carattere,caratteri,installazione,truetype,type1,speedo,bitmap
+Keywords[ja]=フォント,インストーラ,truetype,type1,speedo,bitmap,ビットマップ
+Keywords[lt]=šriftas,šriftai,įdiegimas,truetype,type1,speedo,bitmap
+Keywords[nl]=letters,lettertypen,fonts,installatie,truetype,type1,speedo,bitmap
+Keywords[pa]=ਫੋਂਟ, ਇੰਸਟਾਲਰ,fonts,installer,truetype,type1,speedo,bitmap
+Keywords[pl]=czcionka,czcionki,instalator,truetype,type1,speedo,mapa bitowa
+Keywords[pt]=tipo de letra,tipos de letra,instalador,truetype,type1,speedo,bitmap
+Keywords[pt_BR]=fonte,fontes,instalador,truetype,type1,speedo,bitmap
+Keywords[ru]=шрифт,шрифты,установка,TTF,truetype,type1,speedo,bitmap
+Keywords[rw]=Imyandikire,imyandikire,mwinjiza,ubwokonyabwo,ubwoko1,umuvuduko,bitimapu
+Keywords[sr]=font,fonts,installer,truetype,type1,speedo,bitmap, фонт,фонтови,инсталатор
+Keywords[sr@Latn]=font,fonts,installer,truetype,type1,speedo,bitmap, font,fontovi,instalator
+Keywords[sv]=teckensnitt,installation,truetype,type1,speedo,bitmap
+Keywords[tr]=yazıtipi,yazıtipleri,kurulum programı,trutype,type1,speedo,bit eşlem
+Keywords[xx]=xxfont,fonts,installer,truetype,type1,speedo,bitmapxx
+Keywords[zh_CN]=font,fonts,installer,truetype,type1,speedo,bitmap,字体,安装器,位图
+
+Categories=Qt;KDE;X-KDE-settings-system;
diff --git a/systemsettings/menu/kde-settings-accessibility_ss.directory b/systemsettings/menu/kde-settings-accessibility_ss.directory
new file mode 100644
index 0000000..f782e4a
--- /dev/null
+++ b/systemsettings/menu/kde-settings-accessibility_ss.directory
@@ -0,0 +1,20 @@
+[Desktop Entry]
+Encoding=UTF-8
+
+Name=Accessibility
+Name[ar]=تسهيل الوصول
+Name[bg]=Достъпност
+Name[br]=Haezadusted
+Name[da]=Tilgængelighed
+Name[de]=Barrierefreiheit
+Name[el]=Προσβασιμότητα
+Name[es]=Accesibilidad
+Name[et]=Hõlbustus
+Name[ga]=Inrochtaineacht
+Name[gl]=Acesibilidade
+Name[ja]=アクセシビリティ
+Name[nl]=Toegankelijkheid
+Name[pt]=Acessibilidade
+Name[pt_BR]=Acessibilidade
+Name[sv]=Handikappstöd
+Icon=access
diff --git a/systemsettings/menu/kde-settings-advanced.directory b/systemsettings/menu/kde-settings-advanced.directory
new file mode 100644
index 0000000..3da800f
--- /dev/null
+++ b/systemsettings/menu/kde-settings-advanced.directory
@@ -0,0 +1,19 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=Advanced
+Name[ar]=متقدّم
+Name[bg]=Разширени
+Name[br]=Barek
+Name[da]=Avanceret
+Name[de]=Fortgeschritten
+Name[el]=Προχωρημένα
+Name[es]=Avanzada
+Name[et]=Muud
+Name[ga]=Casta
+Name[gl]=Avanzado
+Name[ja]=詳細
+Name[nl]=Geavanceerd
+Name[pt]=Avançado
+Name[pt_BR]=Avançado
+Name[sv]=Avancerat
+Icon=kcmsystem
diff --git a/systemsettings/menu/kde-settings-advancedusersettings.directory b/systemsettings/menu/kde-settings-advancedusersettings.directory
new file mode 100644
index 0000000..b8815b4
--- /dev/null
+++ b/systemsettings/menu/kde-settings-advancedusersettings.directory
@@ -0,0 +1,20 @@
+[Desktop Entry]
+Encoding=UTF-8
+
+Name=Advanced User Settings
+Name[ar]=تعيينات المستخدم المتقدمة
+Name[bg]=Разширени потребителски настройки
+Name[br]=Dibarzhoù arveriad barek
+Name[da]=Advancerede brugerindstillinger
+Name[de]=Benutzereinstellungen für Fortgeschrittene
+Name[el]=Ρυθμίσεις προχωρημένου χρήστη
+Name[es]=Preferencias avanzadas de usuario
+Name[et]=Muud kasutaja seadistused
+Name[ga]=Ardsocruithe Úsáideora
+Name[gl]=Configurazón Avanzada dos Usuários
+Name[ja]=詳細なユーザ設定
+Name[nl]=Geavanceerde gebruikersinstellingen
+Name[pt]=Configuração Avançada do Utilizador
+Name[pt_BR]=Configurações Avançadas para Usuário
+Name[sv]=Advancerade användarinställningar
+Icon=userconfig.png
diff --git a/systemsettings/menu/kde-settings-appearance.directory b/systemsettings/menu/kde-settings-appearance.directory
new file mode 100644
index 0000000..4986cd1
--- /dev/null
+++ b/systemsettings/menu/kde-settings-appearance.directory
@@ -0,0 +1,36 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=Appearance
+Name[ar]=المظهر
+Name[bg]=Изглед
+Name[br]=Neuziadur
+Name[cs]=Vzhled
+Name[cy]=Golwg
+Name[da]=Udseende
+Name[de]=Erscheinungsbild
+Name[el]=Εμφάνιση
+Name[es]=Apariencia
+Name[et]=Välimus
+Name[fr]=Apparence
+Name[ga]=Cuma
+Name[gl]=Aparéncia
+Name[it]=Aspetto
+Name[ja]=外観
+Name[ka]=იერსახე
+Name[lt]=Išvaizda
+Name[mt]=Apparenza
+Name[nl]=Uiterlijk
+Name[pa]=ਝਲਕ
+Name[pl]=Wygląd
+Name[pt]=Aparência
+Name[pt_BR]=Aparência
+Name[ru]=Внешний вид
+Name[rw]=Imigaragarire
+Name[sk]=Vzhľad
+Name[sr]=Изглед
+Name[sr@Latn]=Izgled
+Name[sv]=Utseende
+Name[tr]=Görünüm
+Name[xx]=xxAppearancexx
+Name[zh_CN]=外观
+Icon=looknfeel
diff --git a/systemsettings/menu/kde-settings-computeradministration.directory b/systemsettings/menu/kde-settings-computeradministration.directory
new file mode 100644
index 0000000..04c5857
--- /dev/null
+++ b/systemsettings/menu/kde-settings-computeradministration.directory
@@ -0,0 +1,19 @@
+[Desktop Entry]
+Encoding=UTF-8
+Type=Directory
+Name=Computer Administration
+Name[ar]=إدارة الحاسوب
+Name[bg]=Администриране на компютъра
+Name[br]=Melestradur an urzhiater
+Name[da]=Computeradministration
+Name[de]=Rechneradministration
+Name[el]=Διαχείριση υπολογιστή
+Name[es]=Administrador del ordenador
+Name[et]=Arvuti haldamine
+Name[gl]=Administrazón do Ordenador
+Name[ja]=コンピュータの管理
+Name[nl]=Computerbeheer
+Name[pt]=Administração do Computador
+Name[pt_BR]=Administração do computador
+Name[sv]=Datoradministration
+Icon=systemtray
diff --git a/systemsettings/menu/kde-settings-defaultapplications.directory b/systemsettings/menu/kde-settings-defaultapplications.directory
new file mode 100644
index 0000000..a37d8af
--- /dev/null
+++ b/systemsettings/menu/kde-settings-defaultapplications.directory
@@ -0,0 +1,67 @@
+[Desktop Entry]
+Encoding=UTF-8
+
+Name=Default Applications
+Name[ar]=التطبيقات الإفتراضية
+Name[bg]=Програма по подразбиране
+Name[br]=Arloadoù dre ziouer
+Name[cs]=Výchozí aplikace
+Name[da]=Standardprogrammer
+Name[de]=Standardprogramme
+Name[el]=Προκαθορισμένες εφαρμογές
+Name[es]=Aplicaciones predeterminadas
+Name[et]=Vaikimisi rakendused
+Name[fr]=Applications par défaut
+Name[ga]=Feidhmchláir Réamhshocraithe
+Name[gl]=Aplicazóns Predefinidas
+Name[it]=Applicazioni predefinite
+Name[ja]=デフォルトアプリケーション
+Name[ka]=ნაგულისხმევი პროგრამები
+Name[lt]=Numatytosios programos
+Name[mt]=Programmi Standard
+Name[nl]=Standaardtoepassingen
+Name[pa]=ਮੂਲ ਕਾਰਜ
+Name[pl]=Programy domyślne
+Name[pt]=Aplicações Predefinidas
+Name[pt_BR]=Aplicativos Padrão
+Name[ru]=Приложения по умолчанию
+Name[sk]=Štandardné aplikácie
+Name[sr]=Подразумевани програми
+Name[sr@Latn]=Podrazumevani programi
+Name[sv]=Förvalda program
+Name[tr]=Öntanımlı Uygulamalar
+Name[xx]=xxDefault Applicationsxx
+Name[zh_CN]=默认应用程序
+Icon=blockdevice
+
+Name=Default Applications
+Name[ar]=التطبيقات الإفتراضية
+Name[bg]=Програма по подразбиране
+Name[br]=Arloadoù dre ziouer
+Name[cs]=Výchozí aplikace
+Name[da]=Standardprogrammer
+Name[de]=Standardprogramme
+Name[el]=Προκαθορισμένες εφαρμογές
+Name[es]=Aplicaciones predeterminadas
+Name[et]=Vaikimisi rakendused
+Name[fr]=Applications par défaut
+Name[ga]=Feidhmchláir Réamhshocraithe
+Name[gl]=Aplicazóns Predefinidas
+Name[it]=Applicazioni predefinite
+Name[ja]=デフォルトアプリケーション
+Name[ka]=ნაგულისხმევი პროგრამები
+Name[lt]=Numatytosios programos
+Name[mt]=Programmi Standard
+Name[nl]=Standaardtoepassingen
+Name[pa]=ਮੂਲ ਕਾਰਜ
+Name[pl]=Programy domyślne
+Name[pt]=Aplicações Predefinidas
+Name[pt_BR]=Aplicativos Padrão
+Name[ru]=Приложения по умолчанию
+Name[sk]=Štandardné aplikácie
+Name[sr]=Подразумевани програми
+Name[sr@Latn]=Podrazumevani programi
+Name[sv]=Förvalda program
+Name[tr]=Öntanımlı Uygulamalar
+Name[xx]=xxDefault Applicationsxx
+Name[zh_CN]=默认应用程序
diff --git a/systemsettings/menu/kde-settings-general.directory b/systemsettings/menu/kde-settings-general.directory
new file mode 100644
index 0000000..05b47ca
--- /dev/null
+++ b/systemsettings/menu/kde-settings-general.directory
@@ -0,0 +1,18 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=General
+Name[ar]=عام
+Name[bg]=Общи
+Name[br]=Pennañ
+Name[da]=Generelt
+Name[de]=Allgemein
+Name[el]=Γενικά
+Name[et]=Üldine
+Name[ga]=Ginearálta
+Name[gl]=Xeral
+Name[ja]=全般
+Name[nl]=Algemeen
+Name[pt]=Geral
+Name[pt_BR]=Geral
+Name[sv]=Allmänt
+Icon=kcontrol
diff --git a/systemsettings/menu/kde-settings-keyboardmouse.directory b/systemsettings/menu/kde-settings-keyboardmouse.directory
new file mode 100644
index 0000000..1c44173
--- /dev/null
+++ b/systemsettings/menu/kde-settings-keyboardmouse.directory
@@ -0,0 +1,21 @@
+[Desktop Entry]
+Encoding=UTF-8
+
+Name=Keyboard & Mouse
+Name[ar]=لوحة المفاتيح و الفأرة
+Name[bg]=Клавиатура и мишка
+Name[br]=Stokellaoueg ha logodenn
+Name[cs]=Uživatelé a skupiny
+Name[da]=Tastatur og mus
+Name[de]=Tastatur & Maus
+Name[el]=Πληκτρολόγιο & ποντίκι
+Name[es]=Teclado y ratón
+Name[et]=Klaviatuur ja hiir
+Name[ga]=Méarchlár & Luch
+Name[gl]=Teclado e Rato
+Name[ja]=キーボードとマウス
+Name[nl]=Toetsenbord en muis
+Name[pt]=Teclado e Rato
+Name[pt_BR]=Teclado & Mouse
+Name[sv]=Tangentbord och mus
+Icon=keyboard
diff --git a/systemsettings/menu/kde-settings-laptops.directory b/systemsettings/menu/kde-settings-laptops.directory
new file mode 100644
index 0000000..19e528a
--- /dev/null
+++ b/systemsettings/menu/kde-settings-laptops.directory
@@ -0,0 +1,21 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=Laptops & Power
+Name[ar]=الحاواسب المحمولة و الطاقة
+Name[bg]=Лаптопи и захранване
+Name[br]=Hezougioù ha gremm
+Name[cs]=Napájení notebooku
+Name[da]=Bærbare & Strøm
+Name[de]=Notebooks & Leistung
+Name[el]=Φορητοί & ενέργεια
+Name[es]=Portátiles y energía
+Name[et]=Sülearvutid ja voolutarve
+Name[ga]=Ríomhairí Glúine & Cumhacht
+Name[gl]=Portáteis e Enerxia
+Name[ja]=ラップトップと電源
+Name[nl]=Laptops en energie
+Name[pt]=Portáteis e Energia
+Name[pt_BR]=Laptops & Energia
+Name[sv]=Bärbara datorer och strömförsörjning
+Name[zh_CN]=笔记本和电源
+Icon=energy
diff --git a/systemsettings/menu/kde-settings-looknfeel2.directory b/systemsettings/menu/kde-settings-looknfeel2.directory
new file mode 100644
index 0000000..9e08a68
--- /dev/null
+++ b/systemsettings/menu/kde-settings-looknfeel2.directory
@@ -0,0 +1,17 @@
+[Desktop Entry]
+Encoding=UTF-8
+Type=Directory
+Name=Look & Feel
+Name[br]=Neuz ha feson
+Name[da]=Udseende og fornemmelse
+Name[de]=Erscheinungsbild
+Name[el]=Όψη & αίσθηση
+Name[es]=Aspecto
+Name[et]=Välimus
+Name[gl]=Aparéncia e Comportamento
+Name[ja]=外観
+Name[nl]=Uiterlijk en gedrag
+Name[pt]=Aparência e Comportamento
+Name[pt_BR]=Aparência
+Name[sv]=Utseende och känsla
+Icon=looknfeel
diff --git a/systemsettings/menu/kde-settings-networkconnections.directory b/systemsettings/menu/kde-settings-networkconnections.directory
new file mode 100644
index 0000000..d8ab424
--- /dev/null
+++ b/systemsettings/menu/kde-settings-networkconnections.directory
@@ -0,0 +1,35 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=Connections
+Name[ar]=الإتصالات
+Name[bg]=Връзки
+Name[br]=Kevreadurioù
+Name[cs]=Spojení
+Name[cy]=Cysylltiadau
+Name[da]=Forbindelser
+Name[de]=Verbindungen
+Name[el]=Συνδέσεις
+Name[es]=Conexiones
+Name[et]=Ühendused
+Name[fr]=Connexions
+Name[ga]=Ceangail
+Name[gl]=Conexóns
+Name[it]=Connessioni
+Name[ja]=接続
+Name[ka]=კავშირები
+Name[lt]=Prisijungimai
+Name[mt]=Konnessjonijiet
+Name[nl]=Verbindingen
+Name[pa]=ਕੁਨੈਕਸ਼ਨ
+Name[pl]=Połączenia
+Name[pt]=Ligações
+Name[pt_BR]=Conexões
+Name[ru]=Соединения
+Name[sk]=Spojenia
+Name[sr]=Везе
+Name[sr@Latn]=Veze
+Name[sv]=Anslutningar
+Name[tr]=Bağlantılar
+Name[xx]=xxConnectionsxx
+Name[zh_CN]=连接
+Icon=network_local
diff --git a/systemsettings/menu/kde-settings-networkconnectivity.directory b/systemsettings/menu/kde-settings-networkconnectivity.directory
new file mode 100644
index 0000000..b9ff8ba
--- /dev/null
+++ b/systemsettings/menu/kde-settings-networkconnectivity.directory
@@ -0,0 +1,19 @@
+[Desktop Entry]
+Encoding=UTF-8
+Type=Directory
+Name=Network & Connectivity
+Name[ar]=الشبكة و الإتصالية
+Name[bg]=Връзки и свързаност
+Name[da]=Netværk og forbindelser
+Name[de]=Netzwerk & Verbindungen
+Name[el]=Δίκτυο & συνδεσιμότητα
+Name[es]=Red y conectividad
+Name[et]=Võrk
+Name[ga]=Líonra & Nascacht
+Name[gl]=Rede e Conexóns
+Name[ja]=ネットワークと接続
+Name[nl]=Netwerkverbindingen
+Name[pt]=Rede e Conectividade
+Name[pt_BR]=Rede & Conectividade
+Name[sv]=Nätverk och anslutningar
+Icon=network
diff --git a/systemsettings/menu/kde-settings-networksettings.directory b/systemsettings/menu/kde-settings-networksettings.directory
new file mode 100644
index 0000000..aeb8b98
--- /dev/null
+++ b/systemsettings/menu/kde-settings-networksettings.directory
@@ -0,0 +1,19 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=Network Settings
+Name[ar]=تعيينات الشبكة
+Name[bg]=Мрежови настройки
+Name[br]=Kefluniadur ar Rouedad
+Name[da]=Netværksindstillinger
+Name[de]=Netzwerkeinstellungen
+Name[el]=Ρυθμίσεις δικτύου
+Name[es]=Preferencias de red
+Name[et]=Võrguseadistused
+Name[ga]=Socruithe Líonra
+Name[gl]=Configurazón da Rede
+Name[ja]=ネットワークの設定
+Name[nl]=Netwerkinstellingen
+Name[pt]=Configuração da Rede
+Name[pt_BR]=Configurações de Rede
+Name[sv]=Nätverksinställningar
+Icon=network_local
diff --git a/systemsettings/menu/kde-settings-notifications.directory b/systemsettings/menu/kde-settings-notifications.directory
new file mode 100644
index 0000000..6c76a92
--- /dev/null
+++ b/systemsettings/menu/kde-settings-notifications.directory
@@ -0,0 +1,19 @@
+[Desktop Entry]
+Encoding=UTF-8
+
+Name=Notifications
+Name[ar]=التبليغات
+Name[bg]=Уведомяване
+Name[br]=Kemennadoù
+Name[da]=Underretninger
+Name[de]=Benachrichtigungen
+Name[el]=Ειδοποιήσεις
+Name[es]=Notificaciones
+Name[et]=Märguanded
+Name[gl]=Notificazóns
+Name[ja]=通知
+Name[nl]=Meldingen
+Name[pt]=Notificações
+Name[pt_BR]=Notificações
+Name[sv]=Underrättelser
+Icon=knotify
diff --git a/systemsettings/menu/kde-settings-panel.directory b/systemsettings/menu/kde-settings-panel.directory
new file mode 100644
index 0000000..f96ca50
--- /dev/null
+++ b/systemsettings/menu/kde-settings-panel.directory
@@ -0,0 +1,26 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=Panel
+Name[bg]=Панел
+Name[br]=Panell
+Name[de]=Kontrollleiste
+Name[el]=Πίνακας
+Name[et]=Paneel
+Name[fr]=Tableau de bord
+Name[ga]=Painéal
+Name[gl]=Painel
+Name[it]=Pannello
+Name[ja]=パネル
+Name[ka]=პანელი
+Name[lt]=Pultas
+Name[mt]=Pannell
+Name[nl]=Paneel
+Name[pa]=ਪੈਨਲ
+Name[pt]=Painel
+Name[pt_BR]=Painel
+Name[ru]=Панель
+Name[rw]=Umwanya
+Name[sr]=Панел
+Name[xx]=xxPanelxx
+Name[zh_CN]=面板
+Icon=background
diff --git a/systemsettings/menu/kde-settings-personal.directory b/systemsettings/menu/kde-settings-personal.directory
new file mode 100644
index 0000000..e154385
--- /dev/null
+++ b/systemsettings/menu/kde-settings-personal.directory
@@ -0,0 +1,18 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=Personal
+Name[ar]=الشخصي
+Name[bg]=Личен
+Name[br]=Diouzhoc'h
+Name[da]=Personlig indstilling
+Name[de]=Persönlich
+Name[el]=Προσωπικά
+Name[et]=Isiklik
+Name[ga]=Pearsanta
+Name[gl]=Persoal
+Name[nl]=Persoonlijk
+Name[pt]=Pessoal
+Name[pt_BR]=Pessoal
+Name[sv]=Personlig inställning
+Icon=personal
+
diff --git a/systemsettings/menu/kde-settings-power.directory b/systemsettings/menu/kde-settings-power.directory
new file mode 100644
index 0000000..4805e7a
--- /dev/null
+++ b/systemsettings/menu/kde-settings-power.directory
@@ -0,0 +1,32 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=Power
+Name[ar]=الطاقة
+Name[bg]=Захранване
+Name[br]=Gremm
+Name[cs]=Napájení
+Name[cy]=Pŵer
+Name[da]=Strøm
+Name[de]=Leistung
+Name[el]=Ενέργεια
+Name[es]=Energía
+Name[et]=Voolutarve
+Name[fr]=Alimentation
+Name[ga]=Cumhacht
+Name[gl]=Enerxia
+Name[it]=Energia
+Name[ja]=電源
+Name[lt]=Maitinimas
+Name[mt]=Elettriku
+Name[nl]=Energie
+Name[pa]=ਊਰਜਾ(power)
+Name[pl]=Zasilanie
+Name[pt]=Energia
+Name[pt_BR]=Energia
+Name[ru]=Управление питанием
+Name[sk]=Napájanie
+Name[sv]=Strömförsörjning
+Name[tr]=Güç
+Name[xx]=xxPowerxx
+Name[zh_CN]=电源
+Icon=ktip
diff --git a/systemsettings/menu/kde-settings-regional.directory b/systemsettings/menu/kde-settings-regional.directory
new file mode 100644
index 0000000..47d9e36
--- /dev/null
+++ b/systemsettings/menu/kde-settings-regional.directory
@@ -0,0 +1,19 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=Regional & Language
+Name[ar]=أقليمي و اللغة
+Name[bg]=Регион и език
+Name[br]=Rannvro ha yezh
+Name[da]=Region og sprog
+Name[de]=Regionaleinstellungen & Sprache
+Name[el]=Τοπικές ρυθμίσεις & γλώσσα
+Name[es]=Local e idioma
+Name[et]=Regioon ja keel
+Name[ga]=Réigiúnach & Teanga
+Name[gl]=Rexión e Língua
+Name[ja]=国と言語
+Name[nl]=Regio en toegankelijkheid
+Name[pt]=Região e Língua
+Name[pt_BR]=Configurações Regionais & Idioma
+Name[sv]=Region och språk
+Icon=locale
diff --git a/systemsettings/menu/kde-settings-sharing.directory b/systemsettings/menu/kde-settings-sharing.directory
new file mode 100644
index 0000000..ff92dd2
--- /dev/null
+++ b/systemsettings/menu/kde-settings-sharing.directory
@@ -0,0 +1,35 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=Sharing
+Name[ar]=المشاركة
+Name[bg]=Споделяне
+Name[br]=Rannañ
+Name[cs]=Sdílení
+Name[cy]=Rhannu
+Name[da]=Dele
+Name[de]=Freigabe
+Name[el]=Κοινή χρήση
+Name[es]=Compartir
+Name[et]=Jagamine
+Name[fr]=Partages
+Name[ga]=Comhroinnt
+Name[gl]=Compartizóns
+Name[it]=Condivisione
+Name[ja]=共有
+Name[ka]=გაზიარება
+Name[lt]=Dalinimasis
+Name[mt]=Tqassim
+Name[nl]=Delen
+Name[pa]=ਸਾਂਝ
+Name[pl]=Udostępnianie
+Name[pt]=Partilha
+Name[pt_BR]=Compartilhamento
+Name[ru]=Совместный доступ
+Name[sk]=Zdielanie
+Name[sr]=Дељење
+Name[sr@Latn]=Deljenje
+Name[sv]=Dela
+Name[tr]=Paylaşım
+Name[xx]=xxSharingxx
+Name[zh_CN]=共享
+Icon=folder_html
diff --git a/systemsettings/menu/kde-settings-splashscreen.directory b/systemsettings/menu/kde-settings-splashscreen.directory
new file mode 100644
index 0000000..de1677a
--- /dev/null
+++ b/systemsettings/menu/kde-settings-splashscreen.directory
@@ -0,0 +1,19 @@
+[Desktop Entry]
+Encoding=UTF-8
+Icon=ksplash
+
+Name=Splash Screen
+Name[bg]=Начален екран
+Name[br]=Skramm-degemer
+Name[da]=Startskærm
+Name[de]=Begrüßungsbildschirm
+Name[el]=Εισαγωγική οθόνη
+Name[es]=Pantalla de bienvenida
+Name[et]=Käivitusekraan
+Name[ga]=Splancscáileán
+Name[gl]=Pantalla de Início
+Name[ja]=スプラッシュスクリーン
+Name[nl]=Opstartscherm
+Name[pt]=Ecrã Inicial
+Name[pt_BR]=Tela de Apresentação
+Name[sv]=Startskärm
diff --git a/systemsettings/menu/kde-settings-system.directory b/systemsettings/menu/kde-settings-system.directory
new file mode 100644
index 0000000..18002fe
--- /dev/null
+++ b/systemsettings/menu/kde-settings-system.directory
@@ -0,0 +1,32 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=System
+Name[ar]=النظام
+Name[bg]=Система
+Name[br]=Reizhiad
+Name[cs]=Systém
+Name[cy]=Cysawd
+Name[el]=Σύστημα
+Name[es]=Sistema
+Name[et]=Süsteem
+Name[fr]=Système
+Name[ga]=Córas
+Name[gl]=Sistema
+Name[it]=Sistema
+Name[ja]=システム
+Name[ka]=სისტემა
+Name[lt]=Sistema
+Name[mt]=Sistema
+Name[nl]=Systeem
+Name[pa]=ਸਿਸਟਮ
+Name[pt]=Sistema
+Name[pt_BR]=Sistema
+Name[ru]=Система
+Name[rw]=Sisitemu
+Name[sk]=Systém
+Name[sr]=Систем
+Name[sr@Latn]=Sistem
+Name[tr]=Sistem
+Name[xx]=xxSystemxx
+Name[zh_CN]=系统
+Icon=package_system
diff --git a/systemsettings/menu/kde-settings-useraccount.directory b/systemsettings/menu/kde-settings-useraccount.directory
new file mode 100644
index 0000000..e22990b
--- /dev/null
+++ b/systemsettings/menu/kde-settings-useraccount.directory
@@ -0,0 +1,19 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=About Me
+Name[ar]=نبخة عنّي
+Name[bg]=За мен
+Name[br]=Diwar ma fenn
+Name[da]=Om mig
+Name[de]=Über Mich
+Name[el]=Σχετικά με μένα
+Name[es]=Sobre mí
+Name[et]=Minu kohta
+Name[ga]=Maidir Liomsa
+Name[gl]=Acerca de min
+Name[ja]=個人情報
+Name[nl]=Over mij
+Name[pt]=Acerca de Mim
+Name[pt_BR]=Sobre minhas informações
+Name[sv]=Om mig
+Icon=identity
diff --git a/systemsettings/menu/kde-settings-windowbehavior.directory b/systemsettings/menu/kde-settings-windowbehavior.directory
new file mode 100644
index 0000000..54242ed
--- /dev/null
+++ b/systemsettings/menu/kde-settings-windowbehavior.directory
@@ -0,0 +1,19 @@
+[Desktop Entry]
+Encoding=UTF-8
+Icon=kcmkwm
+
+Name=Window Behavior
+Name[ar]=سوك النوافذ
+Name[bg]=Поведение на прозорците
+Name[br]=Emzalc'h ar prenester
+Name[da]=Vinduesopførsel
+Name[de]=Fensterverhalten
+Name[el]=Συμπεριφορά παραθύρων
+Name[es]=Comportamiento de la ventana
+Name[et]=Akende käitumine
+Name[gl]=Comportamento das Fiestras
+Name[ja]=ウィンドウの挙動
+Name[nl]=Venstergedrag
+Name[pt]=Comportamento das Janelas
+Name[pt_BR]=Comportamento da Janela
+Name[sv]=Fönsterbeteende
diff --git a/systemsettings/menu/laptoppowermanagement.desktop b/systemsettings/menu/laptoppowermanagement.desktop
new file mode 100644
index 0000000..aacb3af
--- /dev/null
+++ b/systemsettings/menu/laptoppowermanagement.desktop
@@ -0,0 +1,43 @@
+[Desktop Entry]
+Encoding=UTF-8
+X-KDE-Library=laptop
+X-KDE-FactoryName=laptop
+X-KDE-Init=laptop
+Exec=kcmshell laptop
+Icon=laptop_battery
+Type=Application
+DocPath=kcontrol/laptop/index.html
+
+## Keep this out of kcontrol
+#Categories=Qt;KDE;X-KDE-settings-power;
+
+Comment=Laptop Power Management
+Comment[ar]=تدبير الطاقة للحاسوب النقال
+Comment[bg]=Захранване за лаптоп
+Comment[da]=Strømhåndtering for bærbar computer
+Comment[de]=Laptop-Energieverwaltung
+Comment[el]=Διαχείριση ενέργειας φορητού υπολογιστή
+Comment[es]=Administración de energía del portátil
+Comment[et]=Sülearvuti voolutarbe haldus
+Comment[gl]=Xestión de Enerxia de Portáteis
+Comment[ja]=ラップトップの電源管理
+Comment[nl]=Laptop energiebeheer
+Comment[pt]=Gestão de Energia de Portáteis
+Comment[pt_BR]=Gerenciamento de Energia do Laptop
+Comment[sv]=Strömhantering för bärbar dator
+Name=Power Management
+Name[ar]=إدخار الطاقة
+Name[bg]=Захранване
+Name[br]=Merañ ar gremm
+Name[da]=Energisparefunktion
+Name[de]=Energierverwaltung
+Name[el]=Διαχείριση ενέργειας
+Name[es]=Administración de energía
+Name[et]=Voolutarbe haldus
+Name[gl]=Xestión da Enerxia
+Name[ja]=電源管理
+Name[nl]=Energiebeheer
+Name[pt]=Gestão de Energia
+Name[pt_BR]=Gerenciamento de Energia
+Name[sv]=Energisparfunktion
+Init=klaptop_check
diff --git a/systemsettings/menu/medianotifications.desktop b/systemsettings/menu/medianotifications.desktop
new file mode 100644
index 0000000..a65ec47
--- /dev/null
+++ b/systemsettings/menu/medianotifications.desktop
@@ -0,0 +1,57 @@
+[Desktop Entry]
+Encoding=UTF-8
+Type=Application
+#DocPath=
+Icon=system
+Exec=kcmshell media
+
+
+X-KDE-Library=media
+X-KDE-FactoryName=media
+#X-KDE-ParentApp=kcontrol
+
+Name=Storage Media Notifications
+Name[ar]=تبليغات وسائط التخزين
+Name[bg]=Уведомяване за съхраняващи устройства
+Name[da]=Underretninger om lagringsmedie
+Name[de]=Speichermedien-Benachrichtigungen
+Name[el]=Ειδοποιήσεις μέσων αποθήκευσης
+Name[es]=Notificaciones de los medios de almacenamiento
+Name[et]=Andmekandjate märguanded
+Name[gl]=Notificazón de Dispositivos de Armacenaxe
+Name[ja]=記憶メディアの通知
+Name[nl]=Meldingen opslagmedia
+Name[pt]=Notificação de Suportes de Armazenamento
+Name[pt_BR]=Notificações de Mídia de Armazenamento
+Name[sv]=Underrättelser om lagringsmedia
+
+Comment=Configure Storage Media Notifications
+Comment[ar]=إعداد تبليغات وسائط التخزين
+Comment[bg]=Настройка на уведомяването за съхраняващи устройства
+Comment[da]=Indstil underretninger om lagringsmedie
+Comment[de]=Benachrichtigungen für Speichermedien konfigurieren
+Comment[el]=Ρύθμιση ειδοποιήσεων μέσων αποθήκευσης
+Comment[es]=Configurar las notificaciones de los medios de almacenamiento
+Comment[et]=Andmekandjate märguannete seadistused
+Comment[gl]=Configura as Notificazóns dos Médios de Armacenaxe
+Comment[ja]=記憶メディアの通知を設定
+Comment[nl]=Meldingen van opslagmedia instellen
+Comment[pt]=Configurar as Notificações de Suportes de Armazenamento
+Comment[pt_BR]=Configurar Notificações de Mídia de Armazenamento
+Comment[sv]=Anpassa underrättelser om lagringsmedia
+
+Keywords=storage,media,usb,cdrom,device
+Keywords[da]=lagring,medie,usb,cdrom,enhed
+Keywords[de]=Speicher,Medien,USB,CD-ROM,Gerät
+Keywords[el]=αποθήκευση,μέσα,usb,cdrom,συσκευή
+Keywords[es]=almacenamientos,medios,usb,cdrom,dispositivo
+Keywords[et]=andmekandjad,usb,cdrom,seade
+Keywords[ga]=stóras,meáin,usb,cdrom,gléas
+Keywords[gl]=armacenaxe,media,usb,cdrom,dispositivo
+Keywords[ja]=ストレージ,メディア,usb,cdrom,デバイス
+Keywords[nl]=storage,opslag,media,usb,cd-rom,device,apparaat,mp3-speler,usb-stick,geheugenkaart,ipod,iriver,mediaspeler,muziek
+Keywords[pt]=armazenamento,meio,suporte,usb,cdrom,dispositivo
+Keywords[pt_BR]=armazenamento,mídia,usb,cdrom,dispositivo
+Keywords[sv]=lagring,media,usb,cdrom,enhet
+
+#Categories=Qt;KDE;X-KDE-settings-peripherals
diff --git a/systemsettings/menu/system-settings-merge.menu b/systemsettings/menu/system-settings-merge.menu
new file mode 100644
index 0000000..70d4b07
--- /dev/null
+++ b/systemsettings/menu/system-settings-merge.menu
@@ -0,0 +1,11 @@
+ <!DOCTYPE Menu PUBLIC "-//freedesktop//DTD Menu 1.0//EN"
+ "http://www.freedesktop.org/standards/menu-spec/1.0/menu.dtd">
+
+<Menu>
+ <!-- The following menus are hidden by default -->
+ <Menu>
+ <Name>System Settings</Name>
+ <Directory>system-settings.directory</Directory>
+ <MergeFile>../system-settings.menu</MergeFile>
+ </Menu>
+</Menu>
diff --git a/systemsettings/menu/system-settings.directory b/systemsettings/menu/system-settings.directory
new file mode 100644
index 0000000..c8d424c
--- /dev/null
+++ b/systemsettings/menu/system-settings.directory
@@ -0,0 +1,34 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=System Settings
+Name[ar]=تعيينات النظام
+Name[bg]=Системни настройки
+Name[br]=Dibarzhoù ar Reizhiad
+Name[cs]=Nastavení systému
+Name[cy]=Gosodiadau Cysawd
+Name[da]=Systemopsætning
+Name[de]=Systemeinstellungen
+Name[el]=Ρυθμίσεις συστήματος
+Name[es]=Preferencias del sistema
+Name[et]=Süsteemi seadistused
+Name[fr]=Paramètres du Système
+Name[ga]=Socruithe an Chórais
+Name[gl]=Configurazón do Sistema
+Name[it]=Impostazioni di sistema
+Name[ja]=システム設定
+Name[ka]=სისტემის პარამეტრები
+Name[lt]=Sistemos nustatymai
+Name[nl]=Systeeminstellingen
+Name[pl]=Ustawienia systemowe
+Name[pt]=Configuração do Sistema
+Name[pt_BR]=Configurações do Sistema
+Name[sk]=Systémové nastavenia
+Name[sr]=Системске поставке
+Name[sr@Latn]=Sistemske postavke
+Name[sv]=Systeminställningar
+Name[tr]=Sistem Ayarları
+Name[xx]=xxSystem Settingsxx
+Name[zh_CN]=系统设置
+NoDisplay=true
+Icon=package_settings
+X-KDE-BaseGroup=systemsettings
diff --git a/systemsettings/menu/system-settings.menu b/systemsettings/menu/system-settings.menu
new file mode 100644
index 0000000..eda7062
--- /dev/null
+++ b/systemsettings/menu/system-settings.menu
@@ -0,0 +1,385 @@
+ <!DOCTYPE Menu PUBLIC "-//freedesktop//DTD Menu 1.0//EN"
+ "http://www.freedesktop.org/standards/menu-spec/1.0/menu.dtd">
+<!--
+This menu layout aims to conform to the structure described here:
+
+https://wiki.kubuntu.org/KubuntuSystemSettingsUsability
+
+-->
+<Menu>
+ <Name>System Settings</Name>
+
+ <DefaultLayout>
+ <Menuname>General</Menuname>
+ <Separator/>
+ <Menuname>Advanced</Menuname>
+ </DefaultLayout>
+
+ <!-- General page -->
+ <Menu>
+ <Name>General</Name>
+ <Directory>kde-settings-general.directory</Directory>
+
+ <Layout>
+ <Menuname>Personal</Menuname>
+ <Separator/>
+ <Menuname>Look and Feel</Menuname>
+ <Separator/>
+ <Menuname>Computer Administration</Menuname>
+ <Separator/>
+ <Menuname>Network and Connectivity</Menuname>
+ </Layout>
+
+ <!-- Personal -->
+ <Menu>
+ <Name>Personal</Name>
+ <Directory>kde-settings-personal.directory</Directory>
+
+ <Layout>
+ <Menuname>User Account</Menuname>
+ <Menuname>Regional</Menuname>
+ <Menuname>Accessibility</Menuname>
+ <Menuname>Default Applications</Menuname>
+ <!--<Menuname>Appearance</Menuname>
+ <Menuname>Panel</Menuname>
+ <Menuname>Desktop</Menuname>-->
+ <Merge type="menus" />
+ </Layout>
+
+ <!-- User Account -->
+ <Menu>
+ <Name>User Account</Name>
+ <Directory>kde-settings-useraccount.directory</Directory>
+ <Layout>
+ <Filename>kde-kcm_useraccount.desktop</Filename>
+ <Filename>kde-desktoppath.desktop</Filename>
+ <Merge type="files" />
+ </Layout>
+ <Include>
+ <Filename>kde-kcm_useraccount.desktop</Filename>
+ <Filename>kde-desktoppath.desktop</Filename>
+ <Category>X-KDE-systemsettings-personal-useraccount</Category>
+ </Include>
+ </Menu>
+
+ <!-- Regional -->
+ <Menu>
+ <Name>Regional</Name>
+ <Directory>kde-settings-regional.directory</Directory>
+ <Layout>
+ <Filename>kde-language.desktop</Filename>
+ <Filename>kde-spellchecking.desktop</Filename>
+ <Filename>kde-keyboard_layout.desktop</Filename>
+ <Merge type="files" />
+ </Layout>
+ <Include>
+ <Filename>kde-language.desktop</Filename>
+ <Filename>kde-spellchecking.desktop</Filename>
+ <Filename>kde-keyboard_layout.desktop</Filename>
+ <Category>X-KDE-systemsettings-personal-regional</Category>
+ </Include>
+ </Menu>
+
+ <!-- Accessibility -->
+ <Menu>
+ <Name>Accessibility</Name>
+ <Directory>kde-settings-accessibility_ss.directory</Directory>
+ <Layout>
+ <Filename>kde-kcmaccess.desktop</Filename>
+ <Filename>kde-khotkeys.desktop</Filename>
+ <Merge type="files" />
+ </Layout>
+ <Include>
+ <Filename>kde-kcmaccess.desktop</Filename>
+ <Filename>kde-khotkeys.desktop</Filename>
+ <Category>X-KDE-systemsettings-personal-accessibility</Category>
+ </Include>
+ </Menu>
+
+ <!-- Default Applications -->
+ <Menu>
+ <Name>Default Applications</Name>
+ <Directory>kde-settings-defaultapplications.directory</Directory>
+ <Layout>
+ <Filename>kde-defaultapplication.desktop</Filename>
+ <Filename>kde-filetypes.desktop</Filename>
+ <Merge type="files" />
+ </Layout>
+ <Include>
+ <Filename>kde-defaultapplication.desktop</Filename>
+ <Filename>kde-filetypes.desktop</Filename>
+ <Category>X-KDE-systemsettings-personal</Category>
+ </Include>
+ </Menu>
+
+ </Menu>
+
+
+ <!-- Look and Feel -->
+ <Menu>
+ <Name>Look and Feel</Name>
+ <Directory>kde-settings-looknfeel2.directory</Directory>
+ <Layout>
+ <Menuname>Appearance</Menuname>
+ <Menuname>Desktop</Menuname>
+ <Filename>kde-ksplashthememgr.desktop</Filename>
+ <Menuname>Window Behavior</Menuname>
+ <Menuname>Notifications</Menuname>
+ <Merge type="files" />
+ </Layout>
+ <Include>
+ <Filename>kde-ksplashthememgr.desktop</Filename>
+ <Category>X-KDE-systemsettings-lookandfeel</Category>
+ </Include>
+
+ <!-- Appearance -->
+ <Menu>
+ <Name>Appearance</Name>
+ <Directory>kde-settings-appearance.directory</Directory>
+ <Layout>
+ <Filename>kde-colors.desktop</Filename>
+ <Filename>kde-fonts.desktop</Filename>
+ <Filename>kcmgtk-xdg.desktop</Filename>
+ <Filename>kde-kcmfontinst.desktop</Filename>
+ <Filename>kde-icons.desktop</Filename>
+ <Filename>kde-style.desktop</Filename>
+ <Filename>kde-kwindecoration.desktop</Filename>
+ <Merge type="files" />
+ </Layout>
+ <Include>
+ <Filename>kde-colors.desktop</Filename>
+ <Filename>kde-fonts.desktop</Filename>
+ <Filename>kcmgtk-xdg.desktop</Filename>
+ <Filename>kde-kcmfontinst.desktop</Filename>
+ <Filename>kde-icons.desktop</Filename>
+ <Filename>kde-style.desktop</Filename>
+ <Filename>kde-kwindecoration.desktop</Filename>
+ <Category>X-KDE-systemsettings-lookandfeel-appearance</Category>
+ </Include>
+ </Menu>
+
+ <!-- Desktop -->
+ <Menu>
+ <Name>Desktop</Name>
+ <Directory>kde-settings-desktop.directory</Directory>
+
+ <Layout>
+ <Filename>kde-background.desktop</Filename>
+ <Filename>kde-screensaver.desktop</Filename>
+ <Filename>kde-desktopbehavior.desktop</Filename>
+ <Filename>kde-desktop.desktop</Filename>
+ <Merge type="files" />
+ </Layout>
+
+ <Include>
+ <Filename>kde-background.desktop</Filename>
+ <Filename>kde-screensaver.desktop</Filename>
+ <Filename>kde-desktopbehavior.desktop</Filename>
+ <Filename>kde-desktop.desktop</Filename>
+ <Category>X-KDE-systemsettings-lookandfeel-desktop</Category>
+ </Include>
+ </Menu>
+
+ <!-- Window Behavior -->
+ <Menu>
+ <Name>Window Behavior</Name>
+ <Directory>kde-settings-windowbehavior.directory</Directory>
+
+ <Layout>
+ <Filename>kde-kwinoptions.desktop</Filename>
+ <Filename>kde-kwinrules.desktop</Filename>
+ <Merge type="files" />
+ </Layout>
+ <Include>
+ <Filename>kde-kwinoptions.desktop</Filename>
+ <Filename>kde-kwinrules.desktop</Filename>
+ <Category>X-KDE-systemsettings-lookandfeel-windowbehavior</Category>
+ </Include>
+ </Menu>
+
+ <!-- Notifications -->
+ <Menu>
+ <Name>Notifications</Name>
+ <Directory>kde-settings-notifications.directory</Directory>
+
+ <Layout>
+ <Filename>kde-kcmnotify.desktop</Filename>
+ <Filename>kde-bell.desktop</Filename>
+ <Filename>kde-medianotifications.desktop</Filename>
+ <Merge type="files" />
+ </Layout>
+ <Include>
+ <Filename>kde-kcmnotify.desktop</Filename>
+ <Filename>kde-bell.desktop</Filename>
+ <Filename>kde-medianotifications.desktop</Filename>
+ <Category>X-KDE-systemsettings-lookandfeel-notifications</Category>
+ </Include>
+ </Menu>
+
+ </Menu>
+
+ <!-- Computer Administration -->
+ <Menu>
+ <Name>Computer Administration</Name>
+ <Directory>kde-settings-computeradministration.directory</Directory>
+
+ <Layout>
+ <Filename>kde-clock.desktop</Filename>
+ <Menuname>Keyboard and Mouse</Menuname>
+ <Filename>kde-displayconfig.desktop</Filename>
+ <Filename>kde-arts.desktop</Filename>
+ <Filename>kde-printers.desktop</Filename>
+<!-- <Filename>kde-laptoppowermanagement.desktop</Filename>-->
+ <!-- <Filename>kde-thinkpad.desktop</Filename>
+ <Filename>kde-kvaio.desktop</Filename>-->
+ <Filename>kde-userconfig.desktop</Filename>
+ <Merge type="files" />
+ </Layout>
+ <Include>
+ <Filename>kde-clock.desktop</Filename>
+ <Filename>kde-displayconfig.desktop</Filename>
+ <Filename>kde-arts.desktop</Filename>
+ <Filename>kde-printers.desktop</Filename>
+<!-- <Filename>kde-laptoppowermanagement.desktop</Filename>-->
+ <!-- <Filename>kde-thinkpad.desktop</Filename>
+ <Filename>kde-kvaio.desktop</Filename>-->
+ <Filename>kde-userconfig.desktop</Filename>
+ <Category>X-KDE-systemsettings-administration</Category>
+ </Include>
+
+ <!-- Keyboard and Mouse -->
+ <Menu>
+ <Name>Keyboard and Mouse</Name>
+ <Directory>kde-settings-keyboardmouse.directory</Directory>
+ <Layout>
+ <Filename>kde-keyboard.desktop</Filename>
+ <Filename>kde-keys.desktop</Filename>
+ <Filename>kde-mouse.desktop</Filename>
+ <Filename>kde-joystick.desktop</Filename>
+ <Merge type="files" />
+ </Layout>
+ <Include>
+ <Filename>kde-keyboard.desktop</Filename>
+ <Filename>kde-keys.desktop</Filename>
+ <Filename>kde-mouse.desktop</Filename>
+ <Filename>kde-joystick.desktop</Filename>
+ <Category>X-KDE-systemsettings-administration-keyboardmouse</Category>
+ </Include>
+ </Menu>
+
+ </Menu>
+
+ <!-- Network and Connectivity -->
+ <Menu>
+ <Name>Network and Connectivity</Name>
+ <Directory>kde-settings-networkconnectivity.directory</Directory>
+
+ <Layout>
+ <Menuname>Network Settings</Menuname>
+ <Menuname>Sharing</Menuname>
+ <Merge type="files" />
+ </Layout>
+
+ <Include>
+ <Category>X-KDE-systemsettings-network</Category>
+ </Include>
+
+ <!-- Network Settings -->
+ <Menu>
+ <Name>Network Settings</Name>
+ <Directory>kde-settings-networksettings.directory</Directory>
+
+ <Layout>
+ <Filename>kde-kcm_knetworkconfmodule_ss.desktop</Filename>
+ <Filename>kde-proxy.desktop</Filename>
+ <Filename>kde-netpref.desktop</Filename>
+ <Filename>kde-kcm_kdnssd.desktop</Filename>
+ <Merge type="files" />
+ </Layout>
+
+ <Include>
+ <Filename>kde-kcm_knetworkconfmodule_ss.desktop</Filename>
+ <Filename>kde-proxy.desktop</Filename>
+ <Filename>kde-netpref.desktop</Filename>
+ <Filename>kde-kcm_kdnssd.desktop</Filename>
+ <Category>X-KDE-systemsettings-network-networksettings</Category>
+ </Include>
+ </Menu>
+
+ <!-- Sharing -->
+ <Menu>
+ <Name>Sharing</Name>
+ <Directory>kde-settings-sharing.directory</Directory>
+
+ <Layout>
+ <Filename>kde-kcmkrfb.desktop</Filename>
+ <Filename>kde-fileshare.desktop</Filename>
+ <Filename>kde-lanbrowser.desktop</Filename>
+ <Merge type="files" />
+ </Layout>
+
+ <Include>
+ <Filename>kde-kcmkrfb.desktop</Filename>
+ <Filename>kde-fileshare.desktop</Filename>
+ <Filename>kde-lanbrowser.desktop</Filename>
+ <Category>X-KDE-systemsettings-network-sharing</Category>
+ </Include>
+ </Menu>
+ </Menu>
+ </Menu>
+
+ <!-- Advanced -->
+ <Menu>
+ <Name>Advanced</Name>
+
+ <Directory>kde-settings-advanced.directory</Directory>
+ <Layout>
+ <Menuname>System</Menuname>
+ <Separator/>
+ <Menuname>Advanced User Settings</Menuname>
+ </Layout>
+
+ <!-- System Administration -->
+ <Menu>
+ <Name>System</Name>
+ <Directory>kde-settings-system.directory</Directory>
+
+ <Layout>
+ <Filename>kde-mountconfig.desktop</Filename>
+ <Filename>kde-serviceconfig.desktop</Filename>
+ <Filename>kde-kdm.desktop</Filename>
+ <Merge type="files" />
+ </Layout>
+
+ <Include>
+ <Filename>kde-mountconfig.desktop</Filename>
+ <Filename>kde-serviceconfig.desktop</Filename>
+ <Filename>kde-kdm.desktop</Filename>
+ <Category>X-KDE-systemsettings-advancedadministration</Category>
+ </Include>
+ </Menu>
+
+ <!-- Advanced User Settings -->
+ <Menu>
+ <Name>Advanced User Settings</Name>
+ <Directory>kde-settings-advancedusersettings.directory</Directory>
+
+ <Layout>
+ <Filename>kde-audioencoding.desktop</Filename>
+ <Filename>kde-kresources.desktop</Filename>
+ <Filename>kde-kcmkded.desktop</Filename>
+ <Filename>kde-kcmsmserver.desktop</Filename>
+ <Merge type="files" />
+ </Layout>
+
+ <Include>
+ <Filename>kde-audioencoding.desktop</Filename>
+ <Filename>kde-kresources.desktop</Filename>
+ <Filename>kde-kcmkded.desktop</Filename>
+ <Filename>kde-kcmsmserver.desktop</Filename>
+ <Category>X-KDE-systemsettings-advancedusersettings</Category>
+ </Include>
+ </Menu>
+ </Menu>
+</Menu>
+
diff --git a/systemsettings/moduleiconitem.cpp b/systemsettings/moduleiconitem.cpp
new file mode 100644
index 0000000..3605d1b
--- /dev/null
+++ b/systemsettings/moduleiconitem.cpp
@@ -0,0 +1,52 @@
+/**
+ * This file is part of the System Settings package
+ * Copyright (C) 2005 Benjamin C Meyer
+* <ben+systempreferences at meyerhome dot net>
+ *
+ * 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 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 Steet, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "moduleiconitem.h"
+#include <kiconloader.h>
+
+#define IMAGE_SIZE 32
+
+ModuleIconItem::ModuleIconItem( KIconView *parent, KCModuleInfo module)
+ : QIconViewItem( parent, module.moduleName(),
+ SmallIcon( module.icon(), IMAGE_SIZE ) ),
+ currentState( KIcon::ActiveState), imageName(module.icon())
+{
+ modules.append(module);
+}
+
+ModuleIconItem::ModuleIconItem( KIconView *parent, const QString &text,
+ const QString &imageName )
+ : QIconViewItem( parent, text, SmallIcon( imageName, IMAGE_SIZE ) ),
+ currentState( KIcon::ActiveState )
+{
+ this->imageName = imageName;
+}
+
+void ModuleIconItem::loadIcon( bool enabled )
+{
+ int newState = enabled ? KIcon::DefaultState : KIcon::DisabledState;
+ if( newState == currentState )
+ return;
+
+ currentState = newState;
+ setPixmap( SmallIcon( imageName, IMAGE_SIZE, currentState ) );
+}
+
diff --git a/systemsettings/moduleiconitem.h b/systemsettings/moduleiconitem.h
new file mode 100644
index 0000000..48ff12c
--- /dev/null
+++ b/systemsettings/moduleiconitem.h
@@ -0,0 +1,57 @@
+/**
+ * This file is part of the System Settings package
+ * Copyright (C) 2005 Benjamin C Meyer
+ * <ben+systempreferences at meyerhome dot net>
+ *
+ * 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 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 Steet, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef MODULEICONITEM_H
+#define MODULEICONITEM_H
+
+#include <kiconview.h>
+#include <kcmoduleinfo.h>
+
+class ConfigModule;
+
+/**
+ * Stores information about what modules goes with this item.
+ * Also provides means of loading the enabled/disabled image (see kcmsearch).
+ */
+class ModuleIconItem : public QIconViewItem
+{
+
+public:
+ ModuleIconItem( KIconView *parent, KCModuleInfo module );
+
+ ModuleIconItem( KIconView *parent, const QString &text,
+ const QString &imageName );
+
+ /**
+ * Update the icon to either be enabled or not.
+ */
+ void loadIcon( bool enabled = true );
+
+ // The modules that go with this item
+ QValueList<KCModuleInfo> modules;
+
+private:
+ int currentState;
+ QString imageName;
+};
+
+#endif // MODULEICONITEM_H
+
diff --git a/systemsettings/modulesview.cpp b/systemsettings/modulesview.cpp
new file mode 100644
index 0000000..4aab7a9
--- /dev/null
+++ b/systemsettings/modulesview.cpp
@@ -0,0 +1,173 @@
+/**
+ * This file is part of the System Settings package
+ * Copyright (C) 2005 Benjamin C Meyer (ben+systempreferences at meyerhome dot net)
+ *
+ * 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 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 Steet, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "modulesview.h"
+
+#include <qlabel.h>
+#include <klocale.h>
+#include <kservicegroup.h>
+#include <qlayout.h>
+#include <kiconloader.h>
+#include <kcmultidialog.h>
+#include <kdialogbase.h>
+#include <kiconviewsearchline.h>
+#include <kapplication.h>
+#include <kaboutapplication.h>
+#include <kdebug.h>
+#include <qiconview.h>
+
+#include "kcmsearch.h"
+#include "moduleiconitem.h"
+#include "kcmodulemenu.h"
+
+ModulesView::ModulesView( KCModuleMenu *rootMenu, const QString &menuPath, QWidget *parent,
+ const char *name ) : QWidget( parent, name ), rootMenu( NULL )
+{
+ this->rootMenu = rootMenu;
+ this->menuPath = menuPath;
+
+ QVBoxLayout *layout = new QVBoxLayout( this, 11, 6, "layout" );
+
+ displayName = this->rootMenu->caption;
+
+ QValueList<MenuItem> subMenus = rootMenu->menuList(menuPath);
+ QValueList<MenuItem>::iterator it;
+ for ( it = subMenus.begin(); it != subMenus.end(); ++it ){
+ if( !(*it).menu )
+ continue;
+
+ // After the first time around add a line
+ if( it != subMenus.begin() ){
+ QFrame *line = new QFrame( this, "line");
+ line->setFrameShadow( QFrame::Sunken );
+ line->setFrameShape( QFrame::HLine );
+ layout->addWidget( line );
+ }
+
+ // Build the row of modules/icons
+ createRow( (*it).subMenu, layout );
+ }
+ layout->addStretch(1);
+
+ // Make empty iconView for the search widget
+ if( groups.count()==0 ) {
+ RowIconView *iconView = new RowIconView( this, "groupiconview" );
+ iconView->setLineWidth( 0 );
+ groups.append( iconView );
+ }
+ setPaletteBackgroundColor( groups[0]->paletteBackgroundColor() );
+
+ // Align them up!
+ {
+
+ uint most = 0;
+ QValueList<RowIconView*>::iterator it;
+ for ( it = groups.begin(); it != groups.end(); ++it ){
+ QIconViewItem *item = (*it)->firstItem();
+ while( item ) {
+ if(item->width() > most)
+ most = item->width();
+ item = item->nextItem();
+ }
+ }
+
+ for ( it = groups.begin(); it != groups.end(); ++it )
+ (*it)->setGridX(most);
+
+ }
+}
+
+ModulesView::~ModulesView()
+{
+}
+
+void ModulesView::createRow( const QString &parentPath, QBoxLayout *boxLayout )
+{
+ KServiceGroup::Ptr group = KServiceGroup::group( parentPath );
+ if ( !group ){
+ kdDebug() << "Invalid Group \"" << parentPath << "\". Check your installation."<< endl;
+ return;
+ }
+
+ // Make header
+ QHBoxLayout *rowLayout = new QHBoxLayout( 0, 0, 6, "rowLayout" );
+
+ // Heaer Icon
+ QLabel *icon = new QLabel( this, "groupicon" );
+ icon->setPixmap( SmallIcon( group->icon() ) );
+ icon->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)1,
+ (QSizePolicy::SizeType)5, 0, 0, icon->sizePolicy().hasHeightForWidth() ) );
+ rowLayout->addWidget( icon );
+
+ // Header Name
+ QLabel *textLabel = new QLabel( this, "groupcaption" );
+ textLabel->setText( group->caption() );
+ textLabel->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7,
+ (QSizePolicy::SizeType)5, 0, 0, textLabel->sizePolicy().hasHeightForWidth()));
+ QFont textLabel_font( textLabel->font() );
+ textLabel_font.setBold( true );
+ textLabel->setFont( textLabel_font );
+ rowLayout->addWidget( textLabel );
+
+ boxLayout->addLayout( rowLayout );
+
+ // Make IconView
+ RowIconView *iconView = new RowIconView( this, "groupiconview" );
+ iconView->setFrameShape( RowIconView::StyledPanel );
+ iconView->setLineWidth( 0 );
+ iconView->setSpacing( 0 );
+ iconView->setMargin( 0 );
+ iconView->setItemsMovable( false );
+ iconView->setSelectionMode(QIconView::NoSelection);
+ groups.append( iconView );
+ connect(iconView, SIGNAL( clicked( QIconViewItem* ) ),
+ this, SIGNAL( itemSelected( QIconViewItem* ) ) );
+ boxLayout->addWidget( iconView );
+
+ // Add all the items in their proper order
+ QValueList<MenuItem> list = rootMenu->menuList( parentPath );
+ QValueList<MenuItem>::iterator it;
+ for ( it = list.begin(); it != list.end(); ++it ){
+ if( !(*it).menu )
+ (void)new ModuleIconItem( iconView, (*it).item );
+ else
+ {
+ QString path = (*it).subMenu;
+ KServiceGroup::Ptr group = KServiceGroup::group( path );
+ if ( group ) {
+ ModuleIconItem *item = new ModuleIconItem( ((KIconView*)iconView),
+ group->caption(), group->icon() );
+ item->modules = rootMenu->modules( path );
+ }
+ }
+ }
+
+ // Force the height for those items that have two words.
+ iconView->setMinimumHeight( iconView->minimumSizeHint().height() );
+}
+
+void ModulesView::clearSelection() {
+ QValueList<RowIconView*>::iterator it;
+ for ( it = groups.begin(); it != groups.end(); ++it ) {
+ (*it)->clearSelection();
+ }
+}
+
+#include "modulesview.moc"
diff --git a/systemsettings/modulesview.h b/systemsettings/modulesview.h
new file mode 100644
index 0000000..281e69c
--- /dev/null
+++ b/systemsettings/modulesview.h
@@ -0,0 +1,100 @@
+/**
+ * This file is part of the System Preferences package
+ * Copyright (C) 2005 Benjamin C Meyer (ben+systempreferences at meyerhome dot net)
+ *
+ * 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 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 Steet, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef MODULESVIEW_H
+#define MODULESVIEW_H
+
+#include <kiconview.h>
+
+/**
+ * Overloaded to give a larger default size that fits with text of two lines.
+ */
+class RowIconView : public KIconView
+{
+
+public:
+ RowIconView( QWidget* parent, const char *name=0 )
+ : KIconView( parent, name ){ };
+
+ // Figure out the hight/width to have only one row
+ QSize minimumSizeHint() const {
+ int width = 0;
+ /*
+ for ( QIconViewItem *item = firstItem(); item; item = item->nextItem() )
+ width += item->width();
+ width += spacing()*(count())+(margin()+frameWidth()+lineWidth()+midLineWidth())*2 ;
+ */
+
+ width = count()*gridX()+frameWidth()*2;
+
+ int height = 0;
+ for ( QIconViewItem *item = firstItem(); item; item = item->nextItem() )
+ if(item->height() > height)
+ height = item->height();
+ // I honestly don't know where the 4+4 is coming from...
+ // What other spacing did I miss?
+ height += (margin()+frameWidth()+spacing()+lineWidth()+midLineWidth())*2+8;
+
+/*
+ int h = fontMetrics().height();
+ if ( h < 10 )
+ h = 10;
+ int f = 2 * frameWidth();
+ int height = ( 2*h ) + f + spacing() * 2 + 32 + lineWidth()*2 + 10;
+ */
+ return QSize( width, height );
+ };
+
+};
+
+class QBoxLayout;
+class KCModuleMenu;
+
+/**
+ * This widget contains the IconView's of all of the modules etc
+ * It is the basic thing that users see.
+ */
+class ModulesView : public QWidget
+{
+ // To search the groups
+ friend class KcmSearch;
+
+Q_OBJECT
+public:
+ void clearSelection();
+ QString displayName;
+
+signals:
+ void itemSelected( QIconViewItem* item );
+
+public:
+ ModulesView( KCModuleMenu *rootMenu, const QString &menuPath, QWidget *parent=0, const char *name=0 );
+ ~ModulesView();
+
+private:
+ QValueList<RowIconView*> groups;
+ KCModuleMenu *rootMenu;
+ QString menuPath;
+
+ void createRow( const QString &parentPath, QBoxLayout *layout );
+};
+
+#endif // MODULESVIEW_H
+
diff --git a/systemsettings/systemsettings.desktop b/systemsettings/systemsettings.desktop
new file mode 100644
index 0000000..1d56aa1
--- /dev/null
+++ b/systemsettings/systemsettings.desktop
@@ -0,0 +1,40 @@
+[Desktop Entry]
+Encoding=UTF-8
+Exec=systemsettings -caption "%c" %i %m
+Icon=systemsettings
+Type=Application
+DocPath=systemsettings/index.html
+X-KDE-StartupNotify=true
+
+Name=System Settings
+Name[ar]=تعيينات النظام
+Name[bg]=Системни настройки
+Name[br]=Dibarzhoù ar Reizhiad
+Name[cs]=Nastavení systému
+Name[cy]=Gosodiadau Cysawd
+Name[da]=Systemopsætning
+Name[de]=Systemeinstellungen
+Name[el]=Ρυθμίσεις συστήματος
+Name[es]=Preferencias del sistema
+Name[et]=Süsteemi seadistused
+Name[fr]=Paramètres du Système
+Name[ga]=Socruithe an Chórais
+Name[gl]=Configurazón do Sistema
+Name[it]=Impostazioni di sistema
+Name[ja]=システム設定
+Name[ka]=სისტემის პარამეტრები
+Name[lt]=Sistemos nustatymai
+Name[nl]=Systeeminstellingen
+Name[pl]=Ustawienia systemowe
+Name[pt]=Configuração do Sistema
+Name[pt_BR]=Configurações do Sistema
+Name[sk]=Systémové nastavenia
+Name[sr]=Системске поставке
+Name[sr@Latn]=Sistemske postavke
+Name[sv]=Systeminställningar
+Name[tr]=Sistem Ayarları
+Name[xx]=xxSystem Settingsxx
+Name[zh_CN]=系统设置
+
+X-DCOP-ServiceType=Unique
+Categories=Qt;KDE;Core;
diff --git a/systemsettings/systemsettingsrc b/systemsettings/systemsettingsrc
new file mode 100644
index 0000000..5fd0e95
--- /dev/null
+++ b/systemsettings/systemsettingsrc
@@ -0,0 +1,3 @@
+[MainWindow Toolbar mainToolBar]
+IconText=IconTextRight
+
diff --git a/systemsettings/systemsettingsui.rc b/systemsettings/systemsettingsui.rc
new file mode 100644
index 0000000..7998484
--- /dev/null
+++ b/systemsettings/systemsettingsui.rc
@@ -0,0 +1,32 @@
+<!DOCTYPE kpartgui>
+<kpartgui name="systemsettings" version="1">
+
+<MenuBar>
+ <Menu name="file"><Text>&amp;File</Text>
+ <Action name="resetModule"/>
+ <Action name="defaultModule"/>
+ <Separator/>
+ </Menu>
+
+ <Menu name="view"><Text>&amp;View</Text>
+ <Action name="showAll"/>
+ </Menu>
+
+ <Menu name="help">
+ <Action name="help_about_module" append="about_merge"/>
+ </Menu>
+</MenuBar>
+
+<ToolBar name="mainToolBar">
+ <Action name="showAll"/>
+ <Separator/>
+ <Action name="searchReset"/>
+ <Action name="searchText"/>
+ <Action name="search"/>
+</ToolBar>
+
+<ActionProperties>
+ <Action name="showAll" />
+</ActionProperties>
+
+</kpartgui>
diff --git a/systemsettings/version.h b/systemsettings/version.h
new file mode 100644
index 0000000..34bc2e6
--- /dev/null
+++ b/systemsettings/version.h
@@ -0,0 +1,27 @@
+/**
+ * This file is part of the System Settings package
+ * Copyright (C) 2005 Benjamin C Meyer (ben+systempreferences at meyerhome dot net)
+ *
+ * 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 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 Steet, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef VERSION_H
+#define VERSION_H
+
+#define SYSTEM_SETTINGS_VERSION "0.2"
+
+#endif // VERSION_H
+