/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*- theme.h for ObConf, the configuration tool for Openbox Copyright (c) 2003-2007 Dana Jansens Copyright (c) 2003 Tim Riley 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. See the COPYING file for a copy of the GNU General Public License. */ #include "maindialog.h" #include #include #include #include #include "obconf-qt.h" #include "tree.h" #include "preview_update.h" #include "archive.h" #include "preview.h" using namespace Obconf; void MainDialog::theme_install(const char* path) { gchar* name; if((name = archive_install(path))) tree_set_string("theme/name", name); g_free(name); theme_load_all(); } void MainDialog::theme_load_all() { gchar* name; gchar* p; GList* it, *next; gint i; RrFont* active, *inactive, *menu_t, *menu_i, *osd; QModelIndex currentItemIndex; name = tree_get_string("theme/name", "TheBear"); if(themes) { g_list_foreach(themes, (GFunc)g_free, NULL); g_list_free(themes); themes = NULL; } p = g_build_filename(g_get_home_dir(), ".themes", NULL); add_theme_dir(p); g_free(p); { GSList* it; for(it = obt_paths_data_dirs(paths); it; it = g_slist_next(it)) { p = g_build_filename((char*)it->data, "themes", NULL); add_theme_dir(p); g_free(p); } } add_theme_dir(THEME_DIR); themes = g_list_sort(themes, (GCompareFunc) strcasecmp); themes_model->clear(); /* return to regular scheduled programming */ i = 0; for(it = themes; it; it = next) { next = g_list_next(it); /* remove duplicates */ if(next && !strcmp((char*)it->data, (char*)next->data)) { g_free(it->data); themes = g_list_delete_link(themes, it); continue; } QStandardItem* item = new QStandardItem(QString::fromUtf8((char*)it->data)); themes_model->appendRow(item); if(!strcmp(name, (char*)it->data)) { currentItemIndex = item->index(); ui.theme_names->selectionModel()->select(currentItemIndex, QItemSelectionModel::Select); } ++i; } // FIXME: preview_update_all(); g_free(name); if(currentItemIndex.isValid()) ui.theme_names->scrollTo(currentItemIndex, QAbstractItemView::PositionAtCenter); } void MainDialog::add_theme_dir(const char* dirname) { GDir* dir; const gchar* n; if((dir = g_dir_open(dirname, 0, NULL))) { while((n = g_dir_read_name(dir))) { { gchar* full; full = g_build_filename(dirname, n, "openbox-3", "themerc", NULL); if(!g_file_test(full, GFileTest(G_FILE_TEST_IS_REGULAR | G_FILE_TEST_IS_SYMLINK))) n = NULL; g_free(full); } if(n) { themes = g_list_append(themes, g_strdup(n)); } } g_dir_close(dir); } } void MainDialog::theme_setup_tab() { QItemSelectionModel* selModel = ui.theme_names->selectionModel(); connect(selModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)), SLOT(onThemeNamesSelectionChanged(QItemSelection,QItemSelection))); } void MainDialog::onThemeNamesSelectionChanged(const QItemSelection & selected, const QItemSelection & deselected) { QModelIndex sel = selected.indexes().first(); if(sel.isValid()) { QStandardItem* item = themes_model->itemFromIndex(sel); QVariant val = item->data(Qt::DisplayRole); if(val.isValid()) { QString name = val.toString(); tree_set_string("theme/name", name.toUtf8().constData()); } } } void MainDialog::on_install_theme_clicked() { QString filename = QFileDialog::getOpenFileName(this, tr("Choose an Openbox theme"), QString(), "Openbox theme archives (*.obt);;"); if(!filename.isEmpty()) { theme_install(filename.toLocal8Bit().constData()); } } void MainDialog::on_theme_archive_clicked() { QString filename = QFileDialog::getSaveFileName(this, tr("Choose an Openbox theme"), QString(), "Openbox theme archives (*.obt);;"); if(!filename.isEmpty()) { archive_create(filename.toLocal8Bit().constData()); } }