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.
kooldock/src/setupdialogprg.cpp

703 lines
19 KiB

//
// C++ Implementation: setupdialogprg
//
// Description:
//
//
// Author: KoolDock team <radix@kde.cl>, (C) 2004
//
// Copyright: See COPYING file that comes with this distribution
//
//
#include <kfiledialog.h>
#include <kimageio.h>
#include <kicondialog.h>
#include <klocale.h>
#include <ksimpleconfig.h>
#include <kmessagebox.h>
#include <kstandarddirs.h>
#include <kpushbutton.h>
#include <keditlistbox.h>
#include <klineedit.h>
#include <qlistbox.h>
#include <krun.h>
#include <qiconview.h>
#include <qdir.h>
#include <qstringlist.h>
#include <qtabwidget.h>
#include "setupdialog.h"
#include "setupdialogprg.h"
#include "apppropprg.h"
#include "appProp.h"
#include "kooldock.h"
SetupDialogPrg::SetupDialogPrg(QWidget *parent, const char *name)
: SetupDialog(parent, name)
{
//Ignore list handlers
grabbing=0;
gwm=new KWinModule();
connect(gwm, SIGNAL(activeWindowChanged(WId)), SLOT(activeWindowChanged(WId)));
gwm->blockSignals(true);
in=ignoreBox->lineEdit();
//Remove useless buttons from widget
up=ignoreBox->upButton();
down=ignoreBox->downButton();
up->hide();
down->hide();
//End ignore list handlers
// some configuration variables
progPath = locateLocal("data", "kooldock");
menuPath = progPath + QString("/menu/");
KConfig *config = KGlobal::config();
config->setGroup("kooldock");
appdlg=new appPropPrg();
appdlg->user->setEnabled(false);
appdlg->cuser->setChecked(false);
appdlg->terminal->setChecked(false);
appdlg->tclose->setChecked(false);
appdlg->tclose->setEnabled(false);
connect(appdlg, SIGNAL(apply()), SLOT(appRestart()));
//Lets load the theme List
KStandardDirs sys;
QStringList bgPath = sys.findDirs("data", "kooldock/backgrounds");
for(unsigned int i=0; i<bgPath.count();i++)
{
QDir tmpdir(bgPath[i]);
QStringList theme_tmp(tmpdir.entryList(QDir::Dirs, QDir::Name));
//We do it like this to avoid showing "." and ".." instead of copying QDir::entryList directly into "theme"
for(unsigned int j=2; j<theme_tmp.count(); j++) theme->insertItem(theme_tmp[j]);
}
}
void SetupDialogPrg::appRestart()
{
if(!appdlg) return;
iconsChanged();
kdDebug(0) << "Refresh applist" << endl;
appClear();
appFill();
}
SetupDialogPrg::~SetupDialogPrg()
{
if(appdlg) delete(appdlg);
if(in) delete(in);
kdDebug(0) << "Destroying..." << endl;
}
// Setup dialog implementation
void SetupDialogPrg::iconsChanged()
{
toReloadIcons->setChecked(TRUE);
}
void SetupDialogPrg::configOK()
{
this->hide();
configApply();
}
void SetupDialogPrg::configApply()
{
int fShowTaskbar=0;
int fMinimizedOnly=0;
int fShowNotification=0;
int fShowBorders=0;
int fShowKMenu=0;
int fUseKBFX=0;
int fHidden=0;
int showNames=0;
int fCleaner=0;
int fHideOnClick=0;
int fStayBelow = 0;
int fSteppy=0;
int xinerama=0;
int fhideTimer=5;
int fShowNav=0;
int fSystray=0;
int fCurrent=0;
int fPriority=0;
int fpercentPos=0;
int fOrientation=0;
int fClipping=0;
int fClipIcons=0;
int fSpeed=0;
//Stop grabbing window
gwm->blockSignals(true);
grabbing=0;
grabWin->setText(i18n("Grab Window"));
if (chk5->isChecked() == true) fShowTaskbar = 1;
if (cbMinimizedOnly->isChecked() == true) fMinimizedOnly = 1;
if (chk6->isChecked() == true) fShowNotification = 1;
if (chk4->isChecked() == true) fShowBorders = 1;
if (chk7->isChecked() == true) fShowKMenu = 1;
if (chkUseKBFX->isChecked() == true) fUseKBFX = 1;
if (chk1->isChecked() == true)
{
fHidden = 1;
}
fhideTimer = hideTimer->value();
if (chk2->isChecked() == true) showNames = 1;
if (cbCleaner->isChecked() == true) fCleaner = 1;
if (hideOnClick->isChecked() == true) fHideOnClick = 1;
if (cbStayBelow->isChecked() == true) fStayBelow = 1;
if (Steppy->isChecked() == true) fSteppy = 1;
if (xrma->isChecked() == true) xinerama=1;
if (nav->isChecked()==true) fShowNav=1;
if (systray->isChecked()==true) fSystray=1;
if (currentDesk->isChecked()==true) fCurrent=1;
if (chClipping->isChecked()==true) fClipping=1;
if (chClipIcons->isChecked()==true) fClipIcons=1;
if (chkSpeed->isChecked()==true) fSpeed=1;
fPriority=Priority->value();
fpercentPos=percentPos->value();
kdDebug(0) << "Saving preferences..." << endl;
KConfig *config = KGlobal::config();
config->setGroup("kooldock");
config->writeEntry("ShowTaskbar", fShowTaskbar);
config->writeEntry("MinimizedOnly", fMinimizedOnly);
config->writeEntry("ShowNotification", fShowNotification);
config->writeEntry("BorderColor", kColorCombo3->color().name());
config->writeEntry("SmallIconSize", iwSmall->value());
config->writeEntry("BigIconSize", iwBig->value());
config->writeEntry("BigIconAmount", fAmount->value());
config->writeEntry("iSpace", sbSpace->value());
config->writeEntry("BackgroundColor", kColorCombo2->color().name());
config->writeEntry("SeparatorColor", kColorCombo4->color().name());
config->writeEntry("ShowKMenu", fShowKMenu);
config->writeEntry("KBFX", fUseKBFX);
config->writeEntry("Hidden", fHidden);
config->writeEntry("HideOnClick", fHideOnClick);
config->writeEntry("StayBelow", fStayBelow);
config->writeEntry("fSteppy", fSteppy);
config->writeEntry("Xinerama", xinerama);
config->writeEntry("nWideBg", nWideBg->isChecked());
config->writeEntry("scaleMax", opScale2->isChecked());
if(xinerama==1) {config->writeEntry("leftRes", SleftRes->value()); config->writeEntry("XinDesiredHeight", SHeight->value()); config->writeEntry("XinPreviousWidth", PWidth->value());}
config->writeEntry("hideTimer", fhideTimer);
config->writeEntry("Navigator", fShowNav);
config->writeEntry("Systray", fSystray);
config->writeEntry("currentDesktop", fCurrent);
config->writeEntry("Priority", fPriority);
config->writeEntry("Clipping", fClipping);
config->writeEntry("ClipIconArea", fClipIcons);
config->writeEntry("percentPos", fpercentPos);
if (op1->isChecked()) fOrientation=1;
if (op2->isChecked()) fOrientation=2;
if (op3->isChecked()) fOrientation=3;
config->writeEntry("fOrientation", fOrientation);
config->writeEntry("zoomSpeed", zoomSpeed->value());
config->writeEntry("speedControl", fSpeed);
// kosd config
config->writeEntry("showNames", showNames);
config->writeEntry("Cleaner", fCleaner);
config->writeEntry("xosdFont", xosdFont->currentText());
config->writeEntry("xosdColor", kColorCombo1->color().name());
config->writeEntry("xosdShadowColor", kColorCombo_shadow->color().name());
config->writeEntry("xosdShadowOffset", spinBox2->value());
config->writeEntry("xosdSize", xosdSize->value());
if (xosdBold->isChecked())
{
config->writeEntry("xosdBold", 1);
}
else
{
config->writeEntry("xosdBold", 0);
}
if (xosdItalic->isChecked())
{
config->writeEntry("xosdItalic", 1);
}
else
{
config->writeEntry("xosdItalic", 0);
}
config->writeEntry("ShowSShot", chkSshot->isChecked());
config->writeEntry("iconGrouping", chkGrouping->isChecked());
// save background configurations
if (chkImg->isChecked())
{
//Lets find exactly where the selected theme is
KStandardDirs sys;
QString theme_dir="kooldock/backgrounds/"+theme->currentText();
QStringList bgPath = sys.findDirs("data", theme_dir);
//Lets set the images and write the config
QString LeftImg=(QString)bgPath[0]+"background-left.png";
QString CenterImg=(QString)bgPath[0]+"background-center.png";
QString RightImg=(QString)bgPath[0]+"background-right.png";
// background image enabled
config->writeEntry("Solid", 0);
config->writeEntry("Theme", theme->currentText());
config->writeEntry("LeftImg", LeftImg);
config->writeEntry("RightImg", RightImg);
config->writeEntry("CenterImg", CenterImg);
config->writeEntry("ShowBorders", 0);
config->writeEntry("DockOpacity", 0);
}
else
{
// background image disabled
config->writeEntry("Solid", 1);
config->writeEntry("Theme", "");
config->writeEntry("LeftImg", "");
config->writeEntry("RightImg", "");
config->writeEntry("CenterImg", "");
config->writeEntry("ShowBorders", fShowBorders);
config->writeEntry("DockOpacity", spinBox1->value());
}
config->sync();
// write ignore list to file
QString progPath = locateLocal("data", "kooldock");
QString menuPath = progPath + QString("/menu/");
filepath = QString(progPath + "/ignorelist.conf");
if(ignoreBox->count()>0)
{
QFile out(filepath);
if (out.open(IO_WriteOnly))
{
QTextStream out_s(&out);
for(int i=0; i<ignoreBox->count(); i++)
{
out_s << ignoreBox->text(i) << "\n";
}
out.close();
}
}
else
{
QFile::remove(filepath);
}
emit apply();
}
void SetupDialogPrg::configCancel()
{
//Stop grabbing Windows
gwm->blockSignals(true);
grabWin->setText(i18n("Grab Window"));
grabbing=0;
this->hide();
}
void SetupDialogPrg::closeEvent( QCloseEvent *e )
{
e->ignore();
configCancel();
}
void SetupDialogPrg::chkFont()
{
bool tmp; //just to save some code
if(chk2->isChecked())
{
tmp=true;
}
else
{
tmp=false;
}
xosdBold->setEnabled(tmp);
xosdItalic->setEnabled(tmp);
xosdSize->setEnabled(tmp);
spinBox2->setEnabled(tmp);
kColorCombo1->setEnabled(tmp);
kColorCombo_shadow->setEnabled(tmp);
xosdFont->setEnabled(tmp);
cbCleaner->setEnabled(tmp);
}
void SetupDialogPrg::xrma_clicked()
{
if(xrma->isChecked()==true) {SleftRes->setEnabled(true); SHeight->setEnabled(true); PWidth->setEnabled(true);}
if(xrma->isChecked()==false) {SleftRes->setEnabled(false); SHeight->setEnabled(false); PWidth->setEnabled(false);}
}
void SetupDialogPrg::chkTask()
{
iconsChanged();
bool tmp;
if(chk5->isChecked())
{
tmp=true;
}
else
{
tmp=false;
}
chk6->setEnabled(tmp);
currentDesk->setEnabled(tmp);
chkSshot->setEnabled(tmp);
chkGrouping->setEnabled(tmp);
cbMinimizedOnly->setEnabled(tmp);
}
void SetupDialogPrg::chkHidden()
{
bool tmp;
if(chk1->isChecked())
{
tmp=true;
}
else
{
tmp=false;
}
hideTimer->setEnabled(tmp);
hideOnClick->setEnabled(tmp);
cbStayBelow->setEnabled(!tmp);
}
void SetupDialogPrg::applist_dropped(QDropEvent*e,const QValueList<QIconDragItem>&)
{
KIconLoader icon_obj;
QStringList lst;
QString name;
int pos;
QUriDrag::decodeLocalFiles(e, lst);
name=lst[0];
//Lets see if it is a desktop file
pos=name.findRev(".desktop", -1);
if(pos!=-1)
{
KSimpleConfig *desktopfile;
kdDebug(0) << "Desktop file dropped!" << endl;
desktopfile = new KSimpleConfig(lst[0], TRUE);
desktopfile->setGroup("Desktop Entry");
appdlg->cmdname->setText(desktopfile->readEntry("Name"));
appdlg->cmdpath->setText(desktopfile->readEntry("Exec"));
appdlg->iconbutton->setIcon(desktopfile->readEntry("Icon"));
delete(desktopfile);
}
else
{
//It was not a dekstop file, so lets create a new entry
//Lets set a default name based on the program name
pos=name.findRev("/", -1);
if(pos!=-1)
{
name.remove(1, pos);
name.remove("/", TRUE);
}
//Now we create and show the appProp dialog
//appdlg=new appPropPrg();
appdlg->cmdname->setText(name);
appdlg->cmdpath->setText(lst[0]);
//Based on the program name, lets try to set an icon; if it does
//not exists, the system will set the "default" icon
appdlg->iconbutton->setIcon(name);
}
appdlg->show();
}
void SetupDialogPrg::removeLauncher()
{
if(fileName!=NULL)
{
QString question=i18n("Do you want to remove ") + fileName + QString("?");
int remove = KMessageBox::questionYesNo(0, question, i18n("Remove Launcher"));
if(remove!=KMessageBox::Yes) return;
KSimpleConfig *desktopfile;
QDir homeDir = QDir::home();
if (homeDir.exists(progPath))
{
QDir dir(menuPath);
QStringList fileListRemove;
fileListRemove = dir.entryList("*.desktop");
for ( QStringList::Iterator it = fileListRemove.begin(); it != fileListRemove.end(); ++it )
{
if ( ((*it) != ".") && ((*it) != "..") )
{
desktopfile = new KSimpleConfig( menuPath + (*it), TRUE);
desktopfile->setGroup("Desktop Entry");
if(desktopfile->readEntry("Name")==fileName)
{
kdDebug(0) << "Removing " << menuPath + (*it) << endl;
delete(desktopfile);
if(QFile::remove(menuPath+(*it))==TRUE)
{
kdDebug(0) << "Item removed!" << endl;
//Lets update the launchers index
QString preffix;
fileListRemove.clear();
fileListRemove=dir.entryList("*.desktop");
QStringList fileListRemove2=fileListRemove;
//Not really sure why I couldn't do this within the other for, something like fileListRemove[i].remove(0,2).prepend(preffix), but hell it works
for(unsigned int i=0; i<fileListRemove2.count(); i++)
{
fileListRemove2[i].remove(0,2);
}
//Rename the files so they reflect their new position
for(unsigned int i=0; i<fileListRemove.count(); i++)
{
if(i<10) preffix=QString("0%1").arg(i);
if(i>=10) preffix=QString("%1").arg(i);
dir.rename(fileListRemove[i], QString("%1%2").arg(preffix).arg(fileListRemove2[i]));
}
//End updating
appClear();
appFill();
iconsChanged();
}
else
{
kdDebug(0) << "Unable to remove file!" << endl;
}
return;
}
delete(desktopfile);
}
}
}
}
}
void SetupDialogPrg::grabWin_clicked()
{
if(grabbing==0)
{
grabbing=1;
grabWin->setText(i18n("Grabbing..."));
gwm->blockSignals(false);
}
else
{
grabbing=0;
grabWin->setText(i18n("Grab Window"));
gwm->blockSignals(true);
}
}
void SetupDialogPrg::activeWindowChanged(WId id)
{
KWin::WindowInfo winfo;
winfo=KWin::windowInfo(id);
QString ninfo=winfo.visibleName();
if(ninfo!=caption())
{
in->setText(ninfo);
}
}
void SetupDialogPrg::buttonadd_clicked()
{
appdlg->cmdpath->setText("");
appdlg->cmdname->setText("");
appdlg->iconbutton->setIcon("unknown");
appdlg->show();
}
void SetupDialogPrg::showEvent(QShowEvent *)
{
//Here we fill the applist
appFill();
}
void SetupDialogPrg::appFill()
{
// fill the application list.
KSimpleConfig *desktopfile;
QDir homeDir = QDir::home();
KIconLoader icon_obj;
QPixmap pixm;
if(homeDir.exists(progPath))
{
QDir dir(menuPath);
fileList.clear();
fileList = dir.entryList("*.desktop");
for ( QStringList::Iterator it = fileList.begin(); it != fileList.end(); ++it )
{
if ( ((*it) != ".") && ((*it) != "..") )
{
desktopfile = new KSimpleConfig( menuPath + (*it), TRUE);
desktopfile->setGroup("Desktop Entry");
QPixmap pixm=icon_obj.loadIcon(desktopfile->readEntry("Icon") ,KIcon::Desktop,0,KIcon::DefaultState,0L,false);
new KIconViewItem(applist, desktopfile->readEntry("Name"), pixm);
delete(desktopfile);
}
}
}
}
void SetupDialogPrg::hideEvent ( QHideEvent * )
{
// the application list is erased here.
appClear();
}
void SetupDialogPrg::appClear()
{
applist->clear();
}
void SetupDialogPrg::left()
{
if (oldPos>0) {setnewpos(oldPos-1); oldPos--;iconsChanged();}
}
void SetupDialogPrg::right()
{
if (oldPos!=-1 && oldPos < (int)fileList.count()-1) {setnewpos(oldPos+1); oldPos++;iconsChanged();}
}
void SetupDialogPrg::applist_clicked(QIconViewItem *e, const QPoint&)
{
if(e!=NULL)
{oldPos=e->index();}
else
{oldPos=-1;}
}
void SetupDialogPrg::applist_contextMenuRequested(QIconViewItem *e,const QPoint&)
{
if(e!=NULL)
{
KPopupMenu *popup=new KPopupMenu();
KPopupMenu *setpos=new KPopupMenu();
fileName=e->text();
oldPos=e->index();
connect(setpos, SIGNAL(activated(int)), this, SLOT(setnewpos(int)));
//Load desktop data
KSimpleConfig *desktopfile;
QDir dir(menuPath);
fileList.clear();
fileList = dir.entryList("*.desktop");
int i=0;
for ( QStringList::Iterator it = fileList.begin(); it != fileList.end(); ++it )
{
if ( ((*it) != ".") && ((*it) != "..") )
{
desktopfile = new KSimpleConfig( menuPath + (*it), TRUE);
desktopfile->setGroup("Desktop Entry");
int menustate=setpos->insertItem(QString("%1").arg(desktopfile->readEntry("Name")),i);
if(i==oldPos) {setpos->setItemEnabled(menustate, false);filepath=menuPath + (*it);}
delete(desktopfile);
i++;
}
}
//End Load
popup->insertTitle(e->text());
popup->insertItem(i18n("Swap with"), setpos);
popup->insertItem(i18n("&Edit item"), this, SLOT(editItem()));
popup->insertItem(i18n("Remove"), this, SLOT(removeLauncher()));
popup->exec(QCursor::pos());
if(popup) delete(popup);
if(setpos) delete(setpos);
}
else
{
oldPos=-1;
}
}
void SetupDialogPrg::editItem()
{
KRun::runCommand("kfmclient openProperties " + filepath, "kfmclient", "");
}
void SetupDialogPrg::setnewpos(int newpos)
{
kdDebug(0) << "New pos " << QString("0%1").arg(newpos) << "requested for: " << fileName<< endl;
if(newpos==oldPos) return; //Nothing to be done
computeNewPos(newpos);
}
void SetupDialogPrg::computeNewPos(int pos)
{
QString preffix, preffix2;
QDir dir(menuPath);
fileList.clear();
fileList = dir.entryList("*.desktop");
//Lets remove the preffix of the files from fileList
for(unsigned int i=0; i<fileList.count(); i++)
{
fileList[i]=fileList[i].remove(0,2);
}
//Preffix for old position
if(oldPos<10) preffix=QString("0%1").arg(oldPos);
if(oldPos>=10) preffix=QString("%1").arg(oldPos);
//Preffix for new position
if(pos<10) preffix2=QString("0%1").arg(pos);
if(pos>=10) preffix2=QString("%1").arg(pos);
kdDebug(0) << "Old Position: " << oldPos << endl;
kdDebug(0) << "New Position: " << pos << endl;
dir.rename(QString("%1%2").arg(preffix).arg(fileList[oldPos]), QString("%1%2").arg(preffix2).arg(fileList[oldPos]));
dir.rename(QString("%1%2").arg(preffix2).arg(fileList[pos]), QString("%1%2").arg(preffix).arg(fileList[pos]));
appClear();
appFill();
}
void SetupDialogPrg::chkImgSlot()
{
if (chkImg->isChecked())
{
chkSolid->setChecked(false);
}
else
{
chkSolid->setChecked(true);
}
}
void SetupDialogPrg::chkSolidSlot()
{
if (chkSolid->isChecked())
{
chkImg->setChecked(false);
}
else
{
chkImg->setChecked(true);
}}
#include "setupdialogprg.moc"