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.
tdeaddons/konq-plugins/sidebar/metabar/src/configdialog.cpp

612 lines
20 KiB

/***************************************************************************
* Copyright (C) 2005 by Florian Roth *
* florian@synatic.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 Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
#include <tqgroupbox.h>
#include <tqlayout.h>
#include <tqtabwidget.h>
#include <tqlabel.h>
#include <tqlineedit.h>
#include <tqdir.h>
#include <tqfileinfo.h>
#include <tqmap.h>
#include <tqcstring.h>
#include <tqdatastream.h>
#include <kdebug.h>
#include <klocale.h>
#include <kicondialog.h>
#include <kapplication.h>
#include <kiconloader.h>
#include <kstandarddirs.h>
#include <tdefiledialog.h>
#include <ktar.h>
#include <karchive.h>
#include <dcopref.h>
#include <dcopclient.h>
#include "configdialog.h"
LinkEntry::LinkEntry(TQString name, TQString url, TQString icon){
LinkEntry::name = name;
LinkEntry::url = url;
LinkEntry::icon = icon;
}
ActionListItem::ActionListItem(TQListBox *listbox, const TQString &action, const TQString &text, const TQPixmap &pixmap) : TQListBoxPixmap(listbox, pixmap)
{
setAction(action);
setText(text);
}
ConfigDialog::ConfigDialog(TQWidget *parent, const char *name) : TQDialog(parent, name)
{
topWidgetName = parent->topLevelWidget()->name();
config = new TDEConfig("metabarrc");
iconConfig = new TDEConfig(locate("data", "metabar/iconsrc"));
setCaption(i18n("Configuration - Metabar"));
setIcon(SmallIcon("metabar"));
ok = new KPushButton(KStdGuiItem::ok(), this);
connect(ok, TQT_SIGNAL(clicked()), this, TQT_SLOT(accept()));
cancel = new KPushButton(KStdGuiItem::cancel(), this);
connect(cancel, TQT_SIGNAL(clicked()), this, TQT_SLOT(reject()));
TQTabWidget *tab = new TQTabWidget(this);
//general page
config->setGroup("General");
TQWidget *general = new TQWidget;
TQGroupBox *entries_group = new TQGroupBox(2, Qt::Horizontal, i18n("Items"), general);
entries_group->setSizePolicy(TQSizePolicy::Preferred, TQSizePolicy::Preferred);
TQLabel *entries_label = new TQLabel(i18n("Open with:"), entries_group);
max_entries = new KIntSpinBox(entries_group);
max_entries->setMinValue(1);
max_entries->setMaxValue(99);
max_entries->setLineStep(1);
max_entries->setValue(config->readNumEntry("MaxEntries", 3));
entries_label->setBuddy(max_entries);
TQLabel *actions_label = new TQLabel(i18n("Actions:"), entries_group);
max_actions = new KIntSpinBox(entries_group);
max_actions->setMinValue(1);
max_actions->setMaxValue(99);
max_actions->setLineStep(1);
max_actions->setValue(config->readNumEntry("MaxActions", 3));
actions_label->setBuddy(max_actions);
TQGroupBox *appearance_group = new TQGroupBox(1, Qt::Horizontal, i18n("Appearance"), general);
appearance_group->setSizePolicy(TQSizePolicy::Preferred, TQSizePolicy::Preferred);
animate = new TQCheckBox(i18n("Animate resize"), appearance_group);
animate->setChecked(config->readBoolEntry("AnimateResize", false));
servicemenus = new TQCheckBox(i18n("Show service menus"), appearance_group);
servicemenus->setChecked(config->readBoolEntry("ShowServicemenus", true));
showframe = new TQCheckBox(i18n("Show frame"), appearance_group);
showframe->setChecked(config->readBoolEntry("ShowFrame", true));
TQGroupBox *theme_group = new TQGroupBox(2, Qt::Horizontal, i18n("Themes"), general);
theme_group->setSizePolicy(TQSizePolicy::Preferred, TQSizePolicy::Preferred);
themes = new KComboBox(theme_group);
themes->setSizePolicy(TQSizePolicy::Expanding, TQSizePolicy::Preferred);
install_theme = new KPushButton(i18n("Install New Theme..."), theme_group);
install_theme->setSizePolicy(TQSizePolicy::Preferred, TQSizePolicy::Preferred);
connect(install_theme, TQT_SIGNAL(clicked()), this, TQT_SLOT(installTheme()));
loadThemes();
//link page
TQWidget *links = new TQWidget;
link_create = new KPushButton(i18n("New..."), links);
connect(link_create, TQT_SIGNAL(clicked()), this, TQT_SLOT(createLink()));
link_delete = new KPushButton(i18n("Delete"), links);
connect(link_delete, TQT_SIGNAL(clicked()), this, TQT_SLOT(deleteLink()));
link_edit = new KPushButton(i18n("Edit..."), links);
connect(link_edit, TQT_SIGNAL(clicked()), this, TQT_SLOT(editLink()));
link_up = new KPushButton(links);
link_up->setIconSet(SmallIconSet("up"));
link_up->setEnabled(false);
connect(link_up, TQT_SIGNAL(clicked()), this, TQT_SLOT(moveLinkUp()));
link_down = new KPushButton(links);
link_down->setIconSet(SmallIconSet("down"));
link_down->setEnabled(false);
connect(link_down, TQT_SIGNAL(clicked()), this, TQT_SLOT(moveLinkDown()));
link_list = new KListView(links);
link_list->setSizePolicy(TQSizePolicy::Expanding, TQSizePolicy::Expanding);
link_list->setSorting(-1);
link_list->setItemsMovable(TRUE);
link_list->addColumn(i18n("Name"));
link_list->addColumn(i18n("Address"));
connect(link_list, TQT_SIGNAL(doubleClicked(TQListViewItem*)), this, TQT_SLOT(editLink(TQListViewItem*)));
connect(link_list, TQT_SIGNAL(selectionChanged()), TQT_SLOT(updateArrows()));
TQWidget *actionPage = new TQWidget;
actionSelector = new KActionSelector(actionPage);
loadAvailableActions();
tab->addTab(general, i18n("General"));
tab->addTab(actionPage, i18n("Actions"));
tab->addTab(links, i18n("Links"));
//layout
TQGridLayout *general_layout = new TQGridLayout(general, 2, 2, 5, 5);
general_layout->addWidget(entries_group, 0, 0);
general_layout->addWidget(appearance_group, 0, 1);
general_layout->addMultiCellWidget(theme_group, 1, 1, 0, 1);
general_layout->addItem(new TQSpacerItem(10, 10, TQSizePolicy::Minimum, TQSizePolicy::Expanding), 2, 0);
//general_layout->addItem(new TQSpacerItem(10, 10, TQSizePolicy::Minimum, TQSizePolicy::Expanding), 0, 2);
TQVBoxLayout *link_button_layout = new TQVBoxLayout(0, 0, 5);
link_button_layout->addWidget(link_create);
link_button_layout->addWidget(link_edit);
link_button_layout->addWidget(link_delete);
link_button_layout->addItem(new TQSpacerItem(10, 10, TQSizePolicy::Minimum, TQSizePolicy::Expanding));
link_button_layout->addWidget(link_up);
link_button_layout->addWidget(link_down);
TQHBoxLayout *link_layout = new TQHBoxLayout(links, 5, 5);
link_layout->addWidget(link_list);
link_layout->addLayout(link_button_layout);
TQHBoxLayout *action_layout = new TQHBoxLayout(actionPage, 5, 5);
action_layout->addWidget(actionSelector);
TQHBoxLayout *bottom_layout = new TQHBoxLayout(0, 5, 5);
bottom_layout->addItem(new TQSpacerItem(10, 10, TQSizePolicy::Expanding, TQSizePolicy::Minimum));
bottom_layout->addWidget(ok);
bottom_layout->addWidget(cancel);
TQVBoxLayout *main_layout = new TQVBoxLayout(this, 5, 5);
main_layout->addWidget(tab);
main_layout->addLayout(bottom_layout);
//load config
config->setGroup("General");
TQStringList _links = config->readListEntry("Links");
for(TQStringList::Iterator it = _links.begin(); it != _links.end(); ++it){
config->setGroup("Link_" + (*it));
TQString icon_str = config->readEntry("Icon", "folder");
TQPixmap icon(icon_str);
if(icon.isNull()){
icon = SmallIcon(icon_str);
}
TQListViewItem *item = new TQListViewItem(link_list, link_list->lastItem(), config->readEntry("Name"), config->readEntry("URL"));
item->setPixmap(0, icon);
linkList.insert(item, new LinkEntry(config->readEntry("Name"), config->readEntry("URL"), icon_str));
}
config->setGroup("General");
TQStringList actions = config->readListEntry("Actions");
for(TQStringList::Iterator it = actions.begin(); it != actions.end(); ++it){
if((*it).startsWith("metabar/")){
if((*it).right((*it).length() - 8) == "share"){
TQString text = i18n("Share");
ActionListItem *item = new ActionListItem(actionSelector->selectedListBox(), *it, text, SmallIcon("network"));
TQListBoxItem *avItem = actionSelector->availableListBox()->findItem(text, TQt::ExactMatch);
if(avItem){
delete avItem;
}
}
}
else{
DCOPRef action(kapp->dcopClient()->appId(), TQCString(topWidgetName).append("/action/").append((*it).utf8()));
TQString text = action.call("plainText()");
TQString icon = iconConfig->readEntry(*it, action.call("icon()"));
ActionListItem *item = new ActionListItem(actionSelector->selectedListBox(), TQString(*it), text, SmallIcon(icon));
TQListBoxItem *avItem = actionSelector->availableListBox()->findItem(text, TQt::ExactMatch);
if(avItem){
delete avItem;
}
}
}
resize(400, 300);
}
ConfigDialog::~ConfigDialog()
{
delete config;
delete iconConfig;
}
void ConfigDialog::accept()
{
TQStringList groups = config->groupList();
for(TQStringList::Iterator it = groups.begin(); it != groups.end(); ++it){
if((*it).startsWith("Link_")){
config->deleteGroup(*it);
}
}
TQStringList links;
TQPtrDictIterator<LinkEntry> it(linkList);
TQListViewItem *item = link_list->firstChild();
while(item) {
LinkEntry *entry = linkList[item];
config->setGroup("Link_" + entry->name);
config->writeEntry("Name", entry->name);
config->writeEntry("URL", entry->url);
config->writeEntry("Icon", entry->icon);
links.append(entry->name);
item = item->nextSibling();
}
TQStringList actions;
TQListBox *box = actionSelector->selectedListBox();
for(int i = 0; i < box->numRows(); i++){
ActionListItem *item = static_cast<ActionListItem*>(box->item(i));
if(item){
actions.append(item->action());
}
}
config->setGroup("General");
config->writeEntry("Links", links);
config->writeEntry("Actions", actions);
config->writeEntry("Theme", themes->currentText());
config->writeEntry("MaxEntries", max_entries->value());
config->writeEntry("MaxActions", max_actions->value());
config->writeEntry("AnimateResize", animate->isChecked());
config->writeEntry("ShowServicemenus", servicemenus->isChecked());
config->writeEntry("ShowFrame", showframe->isChecked());
config->sync();
TQDialog::accept();
}
void ConfigDialog::createLink()
{
TQDialog *main = new TQDialog(this);
main->setCaption(i18n("Create Link"));
main->setIcon(SmallIcon("metabar"));
KPushButton *ok = new KPushButton(KStdGuiItem::ok(), main);
connect(ok, TQT_SIGNAL(clicked()), main, TQT_SLOT(accept()));
KPushButton *cancel = new KPushButton(KStdGuiItem::cancel(), main);
connect(cancel, TQT_SIGNAL(clicked()), main, TQT_SLOT(reject()));
TQLineEdit *name = new TQLineEdit(i18n("New link"), main);
TQLineEdit *url = new TQLineEdit("file:/", main);
KIconButton *icon = new KIconButton(main);
icon->setSizePolicy(TQSizePolicy::Minimum, TQSizePolicy::Minimum);
icon->setIconType(KIcon::Small, KIcon::Any);
icon->setStrictIconSize(true);
icon->setIcon("folder");
TQHBoxLayout *bottom_layout = new TQHBoxLayout(0, 0, 5);
bottom_layout->addItem(new TQSpacerItem(10, 10, TQSizePolicy::Expanding, TQSizePolicy::Minimum));
bottom_layout->addWidget(ok);
bottom_layout->addWidget(cancel);
TQGridLayout *layout = new TQGridLayout(0, 2, 3, 0, 5);
layout->addMultiCellWidget(icon, 0, 1, 0, 0);
layout->addWidget(new TQLabel(i18n("Name:"), main), 0, 1);
layout->addWidget(name, 0, 2);
layout->addWidget(new TQLabel(i18n("URL:"), main), 1, 1);
layout->addWidget(url, 1, 2);
TQVBoxLayout *main_layout = new TQVBoxLayout(main, 5, 5);
main_layout->addLayout(layout);
main_layout->addItem(new TQSpacerItem(10, 10, TQSizePolicy::Minimum, TQSizePolicy::Expanding));
main_layout->addLayout(bottom_layout);
main->resize(300, main->sizeHint().height());
if(main->exec() == TQDialog::Accepted){
TQString name_str = name->text();
TQString url_str = url->text();
TQString icon_str = icon->icon();
if(!name_str.isEmpty() && !url_str.isEmpty()){
if(icon_str.isEmpty()){
icon_str = kapp->iconLoader()->iconPath("folder", KIcon::Small);
}
TQPixmap icon(icon_str);
if(icon.isNull()){
icon = SmallIcon(icon_str);
}
TQListViewItem *item = new TQListViewItem(link_list, link_list->lastItem(), name_str, url_str);
item->setPixmap(0, icon);
linkList.insert(item, new LinkEntry(name_str, url_str, icon_str));
updateArrows();
}
}
delete main;
}
void ConfigDialog::deleteLink()
{
TQListViewItem *item = link_list->selectedItem();
if(item){
linkList.remove(item);
delete item;
updateArrows();
}
}
void ConfigDialog::editLink()
{
TQListViewItem *item = link_list->selectedItem();
editLink(item);
}
void ConfigDialog::editLink(TQListViewItem *item)
{
if(item){
TQDialog *main = new TQDialog(this);
main->setCaption(i18n("Edit Link"));
main->setIcon(SmallIcon("metabar"));
KPushButton *ok = new KPushButton(KStdGuiItem::ok(), main);
connect(ok, TQT_SIGNAL(clicked()), main, TQT_SLOT(accept()));
KPushButton *cancel = new KPushButton(KStdGuiItem::cancel(), main);
connect(cancel, TQT_SIGNAL(clicked()), main, TQT_SLOT(reject()));
TQLineEdit *name = new TQLineEdit(linkList[item]->name, main);
TQLineEdit *url = new TQLineEdit(linkList[item]->url, main);
KIconButton *icon = new KIconButton(main);
icon->setSizePolicy(TQSizePolicy::Minimum, TQSizePolicy::Minimum);
icon->setIconType(KIcon::Small, KIcon::Any);
icon->setStrictIconSize(true);
icon->setIcon(linkList[item]->icon);
TQHBoxLayout *bottom_layout = new TQHBoxLayout(0, 0, 5);
bottom_layout->addItem(new TQSpacerItem(10, 10, TQSizePolicy::Expanding, TQSizePolicy::Minimum));
bottom_layout->addWidget(ok);
bottom_layout->addWidget(cancel);
TQGridLayout *layout = new TQGridLayout(0, 2, 3, 0, 5);
layout->addMultiCellWidget(icon, 0, 1, 0, 0);
layout->addWidget(new TQLabel(i18n("Name:"), main), 0, 1);
layout->addWidget(name, 0, 2);
layout->addWidget(new TQLabel(i18n("URL:"), main), 1, 1);
layout->addWidget(url, 1, 2);
TQVBoxLayout *main_layout = new TQVBoxLayout(main, 5, 5);
main_layout->addLayout(layout);
main_layout->addItem(new TQSpacerItem(10, 10, TQSizePolicy::Minimum, TQSizePolicy::Expanding));
main_layout->addLayout(bottom_layout);
main->resize(300, main->sizeHint().height());
if(main->exec() == TQDialog::Accepted){
TQString name_str = name->text();
TQString url_str = url->text();
TQString icon_str = icon->icon();
if(!name_str.isEmpty() && !url_str.isEmpty()){
if(icon_str.isEmpty()){
icon_str = kapp->iconLoader()->iconPath("folder", KIcon::Small);
}
TQPixmap icon(icon_str);
if(icon.isNull()){
icon = SmallIcon(icon_str);
}
linkList[item]->name = name_str;
linkList[item]->url = url_str;
linkList[item]->icon = icon_str;
item->setText(0, name_str);
item->setText(1, url_str);
item->setPixmap(0, icon);
}
}
delete main;
}
}
void ConfigDialog::moveLinkUp()
{
TQListViewItem *item = link_list->selectedItem();
if(item){
if(link_list->itemIndex(item) > 0){
TQListViewItem *after;
TQListViewItem *above = item->itemAbove();
if(above){
after = above->itemAbove();
}
TQString name = linkList[item]->name;
TQString url = linkList[item]->url;
TQString icon_str = linkList[item]->icon;
TQPixmap icon(icon_str);
if(icon.isNull()){
icon = SmallIcon(icon_str);
}
delete linkList[item];
linkList.remove(item);
delete item;
TQListViewItem *newItem = new TQListViewItem(link_list, after, name, url);
newItem->setPixmap(0, icon);
link_list->setSelected(newItem, TRUE);
linkList.insert(newItem, new LinkEntry(name, url, icon_str));
updateArrows();
}
}
}
void ConfigDialog::moveLinkDown()
{
TQListViewItem *item = link_list->selectedItem();
if(item){
if(link_list->itemIndex(item) < linkList.count() - 1){
TQListViewItem *after = item->itemBelow();
TQString name = linkList[item]->name;
TQString url = linkList[item]->url;
TQString icon_str = linkList[item]->icon;
TQPixmap icon(icon_str);
if(icon.isNull()){
icon = SmallIcon(icon_str);
}
delete linkList[item];
linkList.remove(item);
delete item;
TQListViewItem *newItem = new TQListViewItem(link_list, after, name, url);
newItem->setPixmap(0, icon);
link_list->setSelected(newItem, TRUE);
linkList.insert(newItem, new LinkEntry(name, url, icon_str));
updateArrows();
}
}
}
void ConfigDialog::loadAvailableActions()
{
TQListBox *box = actionSelector->availableListBox();
TQByteArray data, replyData;
TQCString replyType;
if(DCOPClient::mainClient()->call(kapp->dcopClient()->appId(), topWidgetName, "actionMap()", data, replyType, replyData)){
if(replyType == "TQMap<TQCString,DCOPRef>"){
TQMap<TQCString,DCOPRef> actionMap;
TQDataStream reply(replyData, IO_ReadOnly);
reply >> actionMap;
iconConfig->setGroup("Icons");
TQMap<TQCString,DCOPRef>::Iterator it;
for(it = actionMap.begin(); it != actionMap.end(); ++it){
DCOPRef action = it.data();
TQString text = action.call("plainText()");
TQCString cname = action.call("name()");
TQString icon = iconConfig->readEntry(TQString(cname), action.call("icon()"));
ActionListItem *item = new ActionListItem(box, TQString(cname), text, SmallIcon(icon));
}
}
}
//metabar's own actions
ActionListItem *item = new ActionListItem(box, "metabar/share", i18n("Share"), SmallIcon("network"));
}
void ConfigDialog::updateArrows()
{
link_up->setEnabled( link_list->childCount()>1 && link_list->currentItem()!=link_list->firstChild() );
link_down->setEnabled( link_list->childCount()>1 && link_list->currentItem()!=link_list->lastItem() );
}
void ConfigDialog::loadThemes()
{
themes->clear();
TQString theme = config->readEntry("Theme", "default");
bool foundTheme = false;
TQStringList dirs = kapp->dirs()->findDirs("data", "metabar/themes");
for(TQStringList::Iterator it = dirs.begin(); it != dirs.end(); ++it){
TQStringList theme_list = TQDir(*it).entryList(TQDir::Dirs);
theme_list.remove(".");
theme_list.remove("..");
themes->insertStringList(theme_list);
if(theme_list.find(theme) != theme_list.end()){
foundTheme = true;
}
}
if(foundTheme){
themes->setCurrentText(theme);
}
else{
themes->insertItem(theme);
}
}
void ConfigDialog::installTheme()
{
TQString file = KFileDialog::getOpenFileName();
if(file.isNull() && file.isEmpty()) return;
TQString themedir = locateLocal("data", "metabar/themes");
if(themedir.isNull()) return;
KTar archive(file);
archive.open(IO_ReadOnly);
kapp->processEvents();
const KArchiveDirectory* rootDir = archive.directory();
rootDir->copyTo(themedir);
archive.close();
loadThemes();
}
#include "configdialog.moc"