/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Pix
*
* Copyright (C) 2009 The Free Software Foundation, Inc.
*
* 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, see .
*/
#include
#include
#include
#include
#include "gth-script-editor-dialog.h"
#include "gth-script-file.h"
#define GET_WIDGET(name) _gtk_builder_get_widget (self->priv->builder, (name))
static GthTemplateCode Command_Special_Codes[] = {
{ GTH_TEMPLATE_CODE_TYPE_QUOTED, N_("Quoted text"), GTH_SCRIPT_CODE_QUOTE, 1 },
{ GTH_TEMPLATE_CODE_TYPE_SIMPLE, N_("File URI"), GTH_SCRIPT_CODE_URI, 0 },
{ GTH_TEMPLATE_CODE_TYPE_SIMPLE, N_("File path"), GTH_SCRIPT_CODE_PATH, 0 },
{ GTH_TEMPLATE_CODE_TYPE_SIMPLE, N_("File name"), GTH_SCRIPT_CODE_BASENAME, 0 },
{ GTH_TEMPLATE_CODE_TYPE_SIMPLE, N_("File name, no extension"), GTH_SCRIPT_CODE_BASENAME_NO_EXTENSION, 0 },
{ GTH_TEMPLATE_CODE_TYPE_SIMPLE, N_("File extension"), GTH_SCRIPT_CODE_EXTENSION, 0 },
{ GTH_TEMPLATE_CODE_TYPE_SIMPLE, N_("Folder path"), GTH_SCRIPT_CODE_PARENT_PATH, 0 },
{ GTH_TEMPLATE_CODE_TYPE_DATE, N_("Current date"), GTH_SCRIPT_CODE_TIMESTAMP, 1 },
{ GTH_TEMPLATE_CODE_TYPE_ASK_VALUE, N_("Ask a value"), GTH_SCRIPT_CODE_ASK_VALUE, 2 },
{ GTH_TEMPLATE_CODE_TYPE_FILE_ATTRIBUTE, N_("File attribute"), GTH_SCRIPT_CODE_FILE_ATTRIBUTE, 1 },
};
enum {
SHORTCUT_NAME_COLUMN = 0,
SHORTCUT_SENSITIVE_COLUMN
};
struct _GthScriptEditorDialogPrivate {
GthWindow *shortcut_window;
GtkBuilder *builder;
GtkWidget *accel_button;
char *script_id;
gboolean script_visible;
gboolean wait_command;
gboolean shell_script;
gboolean for_each_file;
GthShortcut *shortcut;
};
G_DEFINE_TYPE_WITH_CODE (GthScriptEditorDialog,
gth_script_editor_dialog,
GTK_TYPE_DIALOG,
G_ADD_PRIVATE (GthScriptEditorDialog))
static void
gth_script_editor_dialog_finalize (GObject *object)
{
GthScriptEditorDialog *dialog;
dialog = GTH_SCRIPT_EDITOR_DIALOG (object);
g_object_unref (dialog->priv->builder);
g_free (dialog->priv->script_id);
G_OBJECT_CLASS (gth_script_editor_dialog_parent_class)->finalize (object);
}
static void
gth_script_editor_dialog_class_init (GthScriptEditorDialogClass *class)
{
GObjectClass *object_class;
object_class = (GObjectClass*) class;
object_class->finalize = gth_script_editor_dialog_finalize;
}
static void
gth_script_editor_dialog_init (GthScriptEditorDialog *dialog)
{
dialog->priv = gth_script_editor_dialog_get_instance_private (dialog);
dialog->priv->builder = NULL;
dialog->priv->accel_button = NULL;
dialog->priv->script_id = NULL;
dialog->priv->script_visible = FALSE;
dialog->priv->wait_command = FALSE;
dialog->priv->shell_script = FALSE;
dialog->priv->for_each_file = FALSE;
dialog->priv->shortcut = NULL;
dialog->priv->shortcut_window = NULL;
}
static void
update_sensitivity (GthScriptEditorDialog *self)
{
/* FIXME */
}
static void
edit_command_button_clicked_cb (GtkButton *button,
gpointer user_data)
{
GthScriptEditorDialog *self = user_data;
GtkWidget *dialog;
dialog = gth_template_editor_dialog_new (Command_Special_Codes,
G_N_ELEMENTS (Command_Special_Codes),
0,
_("Edit Command"),
GTK_WINDOW (self));
gth_template_editor_dialog_set_preview_func (GTH_TEMPLATE_EDITOR_DIALOG (dialog),
(TemplatePreviewFunc) gth_script_get_preview,
NULL);
gth_template_editor_dialog_set_template (GTH_TEMPLATE_EDITOR_DIALOG (dialog),
gtk_entry_get_text (GTK_ENTRY (GET_WIDGET ("command_entry"))));
g_signal_connect (dialog,
"response",
G_CALLBACK (gth_template_editor_dialog_default_response),
GET_WIDGET ("command_entry"));
gtk_widget_show (dialog);
}
static gboolean
accel_button_change_value_cb (GthAccelButton *button,
guint keycode,
GdkModifierType modifiers,
gpointer user_data)
{
GthScriptEditorDialog *self = user_data;
gboolean change;
change = gth_window_can_change_shortcut (self->priv->shortcut_window,
self->priv->shortcut != NULL ? self->priv->shortcut->detailed_action : NULL,
GTH_SHORTCUT_CONTEXT_BROWSER_VIEWER,
GTH_SHORTCUT_VIEWER_CONTEXT_ANY,
keycode,
modifiers,
GTK_WINDOW (self));
return change ? GDK_EVENT_PROPAGATE : GDK_EVENT_STOP;
}
static void
gth_script_editor_dialog_construct (GthScriptEditorDialog *self,
const char *title,
GtkWindow *parent)
{
if (title != NULL)
gtk_window_set_title (GTK_WINDOW (self), title);
if (parent != NULL) {
gtk_window_set_transient_for (GTK_WINDOW (self), parent);
_gtk_dialog_add_to_window_group (GTK_DIALOG (self));
}
gtk_dialog_add_buttons (GTK_DIALOG (self),
_GTK_LABEL_CANCEL, GTK_RESPONSE_CANCEL,
_GTK_LABEL_SAVE, GTK_RESPONSE_OK,
NULL);
_gtk_dialog_add_class_to_response (GTK_DIALOG (self), GTK_RESPONSE_OK, GTK_STYLE_CLASS_SUGGESTED_ACTION);
self->priv->builder = gtk_builder_new_from_resource ("/org/x/Pix/list_tools/data/ui/script-editor.ui");
gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (self))), _gtk_builder_get_widget (self->priv->builder, "script_editor"), TRUE, TRUE, 0);
self->priv->accel_button = gth_accel_button_new ();
g_signal_connect (self->priv->accel_button,
"change-value",
G_CALLBACK (accel_button_change_value_cb),
self);
gtk_widget_show (self->priv->accel_button);
gtk_box_pack_start (GTK_BOX (GET_WIDGET ("accel_box")), self->priv->accel_button, FALSE, FALSE, 0);
g_signal_connect (GET_WIDGET ("edit_command_button"),
"clicked",
G_CALLBACK (edit_command_button_clicked_cb),
self);
/**/
gth_script_editor_dialog_set_script (self, NULL);
}
GtkWidget *
gth_script_editor_dialog_new (const char *title,
GthWindow *shortcut_window,
GtkWindow *parent)
{
GthScriptEditorDialog *self;
self = g_object_new (GTH_TYPE_SCRIPT_EDITOR_DIALOG,
"use-header-bar", _gtk_settings_get_dialogs_use_header (),
"resizable", TRUE,
NULL);
self->priv->shortcut_window = shortcut_window;
gth_script_editor_dialog_construct (self, title, parent);
return (GtkWidget *) self;
}
static void
_gth_script_editor_dialog_set_new_script (GthScriptEditorDialog *self)
{
gtk_entry_set_text (GTK_ENTRY (GET_WIDGET ("name_entry")), "");
gtk_entry_set_text (GTK_ENTRY (GET_WIDGET ("command_entry")), "");
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("shell_script_checkbutton")), TRUE);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("for_each_file_checkbutton")), FALSE);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("wait_command_checkbutton")), FALSE);
gth_accel_button_set_accelerator (GTH_ACCEL_BUTTON (self->priv->accel_button), 0, 0);
}
void
gth_script_editor_dialog_set_script (GthScriptEditorDialog *self,
GthScript *script)
{
g_free (self->priv->script_id);
self->priv->script_id = NULL;
self->priv->script_visible = TRUE;
self->priv->shortcut = NULL;
_gth_script_editor_dialog_set_new_script (self);
if (script != NULL) {
self->priv->script_id = g_strdup (gth_script_get_id (script));
self->priv->script_visible = gth_script_is_visible (script);
gtk_entry_set_text (GTK_ENTRY (GET_WIDGET ("name_entry")), gth_script_get_display_name (script));
gtk_entry_set_text (GTK_ENTRY (GET_WIDGET ("command_entry")), gth_script_get_command (script));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("shell_script_checkbutton")), gth_script_is_shell_script (script));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("for_each_file_checkbutton")), gth_script_for_each_file (script));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("wait_command_checkbutton")), gth_script_wait_command (script));
self->priv->shortcut = gth_window_get_shortcut (self->priv->shortcut_window, gth_script_get_detailed_action (script));
if (self->priv->shortcut != NULL) {
gth_accel_button_set_accelerator (GTH_ACCEL_BUTTON (self->priv->accel_button),
self->priv->shortcut->keyval,
self->priv->shortcut->modifiers);
}
}
update_sensitivity (self);
}
GthScript *
gth_script_editor_dialog_get_script (GthScriptEditorDialog *self,
GError **error)
{
GthScript *script;
guint keyval;
GdkModifierType modifiers;
char *accelerator;
script = gth_script_new ();
if (self->priv->script_id != NULL)
g_object_set (script, "id", self->priv->script_id, NULL);
gth_accel_button_get_accelerator (GTH_ACCEL_BUTTON (self->priv->accel_button), &keyval, &modifiers);
accelerator = gtk_accelerator_name (keyval, modifiers);
g_object_set (script,
"display-name", gtk_entry_get_text (GTK_ENTRY (GET_WIDGET ("name_entry"))),
"command", gtk_entry_get_text (GTK_ENTRY (GET_WIDGET ("command_entry"))),
"visible", self->priv->script_visible,
"shell-script", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("shell_script_checkbutton"))),
"for-each-file", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("for_each_file_checkbutton"))),
"wait-command", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (GET_WIDGET ("wait_command_checkbutton"))),
"accelerator", accelerator,
NULL);
if (g_strcmp0 (gth_script_get_display_name (script), "") == 0) {
*error = g_error_new (GTH_ERROR, 0, _("No name specified"));
g_object_unref (script);
return NULL;
}
if (g_strcmp0 (gth_script_get_command (script), "") == 0) {
*error = g_error_new (GTH_ERROR, 0, _("No command specified"));
g_object_unref (script);
return NULL;
}
g_free (accelerator);
return script;
}