You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebase/kcontrol/input/core/themepage.cpp

213 lines
5.6 KiB

/*
* Copyright (C) 2003 Fredrik Höglund <fredrik@kde.org>
*
* Based on the large cursor code written by Rik Hemsley,
* Copyright (c) 2000 Rik Hemsley <rik@kde.org>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License version 2 as published by the Free Software Foundation.
*
* 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; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include <kglobal.h>
#include <kstandarddirs.h>
#include <kurl.h>
#include <kprocess.h>
#include <kio/job.h>
#include <kio/netaccess.h>
#include <kmessagebox.h>
#include <klocale.h>
#include <kconfig.h>
#include <klistview.h>
#include <kdialog.h>
#include <tqlayout.h>
#include <tqdir.h>
#include <tqpixmap.h>
#include <tqimage.h>
#include <tqlabel.h>
#include "themepage.h"
#include "themepage.moc"
#include "bitmaps.h"
namespace {
// Listview columns
enum Columns { NameColumn = 0, DescColumn, /* hidden */ DirColumn };
}
ThemePage::ThemePage( TQWidget* parent, const char* name )
: TQWidget( parent, name )
{
TQBoxLayout *layout = new TQVBoxLayout( this );
layout->setAutoAdd( true );
layout->setMargin( KDialog::marginHint() );
layout->setSpacing( KDialog::spacingHint() );
new TQLabel( i18n("Select the cursor theme you want to use:"), this );
// Create the theme list view
listview = new KListView( this );
listview->setFullWidth( true );
listview->setAllColumnsShowFocus( true );
listview->addColumn( i18n("Name") );
listview->addColumn( i18n("Description") );
connect( listview, TQT_SIGNAL(selectionChanged(TQListViewItem*)),
TQT_SLOT(selectionChanged(TQListViewItem*)) );
insertThemes();
}
ThemePage::~ThemePage()
{
}
void ThemePage::selectionChanged( TQListViewItem *item )
{
selectedTheme = item->text( DirColumn );
emit changed( selectedTheme != currentTheme );
}
void ThemePage::save()
{
if ( currentTheme == selectedTheme )
return;
bool whiteCursor = selectedTheme.right( 5 ) == "White";
bool largeCursor = selectedTheme.left( 5 ) == "Large";
KConfig c( "kcminputrc" );
c.setGroup( "Mouse" );
c.writeEntry( "LargeCursor", largeCursor );
c.writeEntry( "WhiteCursor", whiteCursor );
currentTheme = selectedTheme;
fixCursorFile();
KMessageBox::information( this, i18n("You have to restart KDE for these "
"changes to take effect."), i18n("Cursor Settings Changed"),
"CursorSettingsChanged" );
}
void ThemePage::load()
{
load( false );
}
void ThemePage::load( bool useDefaults )
{
bool largeCursor, whiteCursor;
KConfig c( "kcminputrc" );
c.setReadDefaults( useDefaults );
c.setGroup( "Mouse" );
largeCursor = c.readBoolEntry( "LargeCursor", false );
whiteCursor = c.readBoolEntry( "WhiteCursor", false );
if ( largeCursor )
currentTheme = whiteCursor ? "LargeWhite" : "LargeBlack";
else
currentTheme = whiteCursor ? "SmallWhite" : "SmallBlack";
selectedTheme = currentTheme;
TQListViewItem *item = listview->findItem( currentTheme, DirColumn );
item->setSelected( true );
}
void ThemePage::defaults()
{
load( true );
}
void ThemePage::insertThemes()
{
KListViewItem *item;
item = new KListViewItem( listview, i18n("Small black"),
i18n("Small black cursors"), "SmallBlack" );
item->setPixmap( 0, TQPixmap( arrow_small_black_xpm ) );
listview->insertItem( item );
item = new KListViewItem( listview, i18n("Large black"),
i18n("Large black cursors"), "LargeBlack" );
item->setPixmap( 0, TQPixmap( arrow_large_black_xpm ) );
listview->insertItem( item );
item = new KListViewItem( listview, i18n("Small white"),
i18n("Small white cursors"), "SmallWhite" );
item->setPixmap( 0, TQPixmap( arrow_small_white_xpm ) );
listview->insertItem( item );
item = new KListViewItem( listview, i18n("Large white"),
i18n("Large white cursors"), "LargeWhite" );
item->setPixmap( 0, TQPixmap( arrow_large_white_xpm ) );
listview->insertItem( item );
}
void ThemePage::fixCursorFile()
{
// Make sure we have the 'font' resource dir registered and can find the
// override dir.
//
// Next, if the user wants large cursors, copy the font
// cursor_large.pcf.gz to (localkdedir)/share/fonts/override/cursor.pcf.gz.
// Else remove the font cursor.pcf.gz from (localkdedir)/share/fonts/override.
//
// Run mkfontdir to update fonts.dir in that dir.
KGlobal::dirs()->addResourceType( "font", "share/fonts/" );
KIO::mkdir( KURL::fromPathOrURL(TQDir::homeDirPath() + "/.fonts/kde-override") );
TQString overrideDir = TQDir::homeDirPath() + "/.fonts/kde-override/";
KURL installedFont;
installedFont.setPath( overrideDir + "cursor.pcf.gz" );
if ( currentTheme == "SmallBlack" )
KIO::NetAccess::del( installedFont, this );
else {
KURL source;
if ( currentTheme == "LargeBlack" )
source.setPath( locate("data", "kcminput/cursor_large_black.pcf.gz") );
else if ( currentTheme == "LargeWhite" )
source.setPath( locate("data", "kcminput/cursor_large_white.pcf.gz") );
else if ( currentTheme == "SmallWhite" )
source.setPath( locate("data", "kcminput/cursor_small_white.pcf.gz") );
KIO::NetAccess::file_copy( source, installedFont, -1, true );
}
TQString cmd = KGlobal::dirs()->findExe( "mkfontdir" );
if ( !cmd.isEmpty() )
{
KProcess p;
p << cmd << overrideDir;
p.start(KProcess::Block);
}
}
// vim: set noet ts=4 sw=4: