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.
167 lines
4.6 KiB
167 lines
4.6 KiB
/* -*- 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 <QStandardItem>
|
|
#include <QStandardItemModel>
|
|
#include <QItemSelection>
|
|
#include <QFileDialog>
|
|
|
|
#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;
|
|
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() {
|
|
QFileDialog* dialog = new QFileDialog();
|
|
dialog->setFileMode(QFileDialog::Directory);
|
|
QString filename="";
|
|
if(dialog->exec())
|
|
filename= dialog->selectedFiles()[0];
|
|
if(!filename.isEmpty()) {
|
|
archive_create(filename.toLocal8Bit().constData());
|
|
}
|
|
}
|