gnome-commander r2336 - in trunk: . doc/C po src src/dialogs



Author: epiotr
Date: Sat Dec  6 23:01:27 2008
New Revision: 2336
URL: http://svn.gnome.org/viewvc/gnome-commander?rev=2336&view=rev

Log:
advrename: addded dialog for managing profiles

Added:
   trunk/src/dialogs/gnome-cmd-advrename-profiles-dialog.cc
   trunk/src/dialogs/gnome-cmd-advrename-profiles-dialog.h
Modified:
   trunk/ChangeLog
   trunk/NEWS
   trunk/doc/C/gnome-commander.xml
   trunk/po/POTFILES.in
   trunk/src/dialogs/Makefile.am
   trunk/src/gnome-cmd-advrename-dialog.cc

Modified: trunk/NEWS
==============================================================================
--- trunk/NEWS	(original)
+++ trunk/NEWS	Sat Dec  6 23:01:27 2008
@@ -13,9 +13,9 @@
 
 New features:
  * Support for PDF metatags in advanced file rename templates
+ * Revamped advanced file rename tool (regex backreferences ('\number'), profiles,
+   upper/lowercase conversion, blanks trimming and much more)
  * Support for metadata tags in internal viewer
- * Support for regex backreferences ('\number') in advanced file rename tool (since GLib 2.14)
- * Advanced file rename tool - upper/lowercase conversion and trimming blanks
  * New colour theme: cafezinho
  * New or updated docs: de, en, es
  * New or updated translations: ar, de, es, eu, pl

Modified: trunk/doc/C/gnome-commander.xml
==============================================================================
--- trunk/doc/C/gnome-commander.xml	(original)
+++ trunk/doc/C/gnome-commander.xml	Sat Dec  6 23:01:27 2008
@@ -5918,13 +5918,11 @@
                             <para>Support for PDF metatags in advanced file rename templates</para>
                         </listitem>
                         <listitem>
-                            <para>Support for metadata tags in internal viewer</para>
-                        </listitem>
-                        <listitem>
-                            <para>Support for  regex backreferences ('\number') in advanced file rename tool (since GLib 2.14)</para>
+                            <para>Revamped advanced file rename tool (regex backreferences ('\number'), profiles,
+                                  upper/lowercase conversion, blanks trimming and much more)</para>
                         </listitem>
                         <listitem>
-                            <para>Advanced file rename tool - upper/lowercase conversion and trimming blanks</para>
+                            <para>Support for metadata tags in internal viewer</para>
                         </listitem>
                         <listitem>
                             <para>New colour theme: cafezinho</para>

Modified: trunk/po/POTFILES.in
==============================================================================
--- trunk/po/POTFILES.in	(original)
+++ trunk/po/POTFILES.in	Sat Dec  6 23:01:27 2008
@@ -7,6 +7,7 @@
 plugins/cvs/interface.c
 plugins/fileroller/file-roller-plugin.c
 plugins/test/test-plugin.c
+src/dialogs/gnome-cmd-advrename-profiles-dialog.cc
 src/dialogs/gnome-cmd-advrename-regex-dialog.cc
 src/dirlist.cc
 src/eggcellrendererkeys.cc

Modified: trunk/src/dialogs/Makefile.am
==============================================================================
--- trunk/src/dialogs/Makefile.am	(original)
+++ trunk/src/dialogs/Makefile.am	Sat Dec  6 23:01:27 2008
@@ -16,4 +16,5 @@
 	-DPLUGIN_DIR=\""$(libdir)/$(PACKAGE)/plugins"\"
 
 libgcmd_dialogs_a_SOURCES = \
+	gnome-cmd-advrename-profiles-dialog.h gnome-cmd-advrename-profiles-dialog.cc \
 	gnome-cmd-advrename-regex-dialog.h gnome-cmd-advrename-regex-dialog.cc

Added: trunk/src/dialogs/gnome-cmd-advrename-profiles-dialog.cc
==============================================================================
--- (empty file)
+++ trunk/src/dialogs/gnome-cmd-advrename-profiles-dialog.cc	Sat Dec  6 23:01:27 2008
@@ -0,0 +1,325 @@
+/*
+    GNOME Commander - A GNOME based file manager
+    Copyright (C) 2001-2006 Marcus Bjurman
+    Copyright (C) 2007-2008 Piotr Eljasiak
+
+    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 St, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include <config.h>
+
+#include "gnome-cmd-includes.h"
+#include "gnome-cmd-data.h"
+#include "gnome-cmd-advrename-profiles-dialog.h"
+#include "gnome-cmd-treeview.h"
+#include "gnome-cmd-hintbox.h"
+#include "utils.h"
+
+using namespace std;
+
+
+typedef vector<GnomeCmdData::AdvrenameConfig::Profile> Profiles;
+
+static Profiles profiles;
+static GnomeCmdData::AdvrenameConfig::Profile default_profile;       //  current settings in advrename dlg
+
+
+static GtkTreeModel *create_and_fill_model (Profiles &profiles);
+static GtkWidget *create_view_and_model (Profiles &profiles);
+
+static void cell_edited_callback (GtkCellRendererText *cell, gchar *path_string, gchar *new_text, GtkWidget *view);
+static void add_clicked_callback (GtkButton *button, GtkWidget *view);
+static void edit_clicked_callback (GtkButton *button, GtkWidget *view);
+static void remove_clicked_callback (GtkButton *button, GtkWidget *view);
+static void import_clicked_callback (GtkButton *button, GtkWidget *view);
+static void response_callback (GtkDialog *dialog, int response_id, Profiles *profiles);
+
+
+enum
+{
+    COL_PROFILE_IDX,
+    COL_NAME,
+    COL_TEMPLATE,
+    NUM_COLUMNS
+} ;
+
+
+gboolean gnome_cmd_advrename_profiles_dialog_new (const gchar *title, GtkWindow *parent, GnomeCmdData::AdvrenameConfig &cfg, gboolean new_profile)
+{
+    profiles = cfg.profiles;
+    default_profile = cfg.default_profile;
+    default_profile.name = _("New profile");
+
+    GtkWidget *dialog = gtk_dialog_new_with_buttons (title, parent,
+                                                     GtkDialogFlags (GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT),
+                                                     GTK_STOCK_HELP, GTK_RESPONSE_HELP,
+                                                     GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                                     GTK_STOCK_OK, GTK_RESPONSE_OK,
+                                                     NULL);
+
+    GtkWidget *vbox, *hbox, *scrolled_window, *view, *box, *button;
+
+    gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
+    gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
+    gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
+    gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 2);
+    gtk_window_set_resizable (GTK_WINDOW (dialog), TRUE);
+
+    vbox = gtk_vbox_new (FALSE, 12);
+    gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
+    gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), vbox);
+
+    hbox = gtk_hbox_new (FALSE, 12);
+    gtk_container_add (GTK_CONTAINER (vbox), hbox);
+
+    scrolled_window = gtk_scrolled_window_new (NULL, NULL);
+    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+    gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_IN);
+    gtk_box_pack_start (GTK_BOX (hbox), scrolled_window, TRUE, TRUE, 0);
+
+    view = create_view_and_model (profiles);
+    gtk_widget_set_size_request (view, 400, -1);
+    gtk_container_add (GTK_CONTAINER (scrolled_window), view);
+
+    box = gnome_cmd_hint_box_new (_("To rename a profile, click on the "
+                                    "corresponding row and type a new "
+                                    "name, or press escape to cancel."));
+    gtk_box_pack_start (GTK_BOX (vbox), box, FALSE, FALSE, 0);
+
+    vbox = gtk_vbox_new (FALSE, 12);
+    gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
+
+    button = gtk_button_new_from_stock (GTK_STOCK_ADD);
+    g_signal_connect (button, "clicked", G_CALLBACK (add_clicked_callback), view);
+    gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+
+    button = gtk_button_new_from_stock (GTK_STOCK_EDIT);
+    g_signal_connect (button, "clicked", G_CALLBACK (edit_clicked_callback), view);
+    gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+
+    button = gtk_button_new_from_stock (GTK_STOCK_REMOVE);
+    g_signal_connect (button, "clicked", G_CALLBACK (remove_clicked_callback), view);
+    gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+
+    button = gtk_button_new_with_mnemonic (_("_Import..."));
+    gtk_button_set_image (GTK_BUTTON (button),
+                          gtk_image_new_from_stock (GTK_STOCK_OPEN, GTK_ICON_SIZE_BUTTON));
+    g_signal_connect (button, "clicked", G_CALLBACK (import_clicked_callback), view);
+    gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+
+    button = gtk_button_new_with_mnemonic (_("Import _remote..."));
+    gtk_button_set_image (GTK_BUTTON (button),
+                          gtk_image_new_from_stock (GTK_STOCK_OPEN, GTK_ICON_SIZE_BUTTON));
+    g_signal_connect (button, "clicked", G_CALLBACK (import_clicked_callback), view);
+    gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+
+    gtk_widget_show_all (GTK_DIALOG (dialog)->vbox);
+
+    gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
+
+    g_signal_connect (dialog, "response", G_CALLBACK (response_callback), &profiles);
+
+    if (new_profile)
+        add_clicked_callback (NULL, view);
+
+    gint result = gtk_dialog_run (GTK_DIALOG (dialog));
+
+    if (result==GTK_RESPONSE_OK)
+    {
+        cfg.profiles.clear();
+
+        GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (view));
+        GtkTreeIter i;
+
+        for (gboolean valid_iter=gtk_tree_model_get_iter_first (model, &i); valid_iter; valid_iter=gtk_tree_model_iter_next (model, &i))
+        {
+            guint n;
+
+            gtk_tree_model_get (model, &i, COL_PROFILE_IDX, &n, -1);
+
+            cfg.profiles.push_back(profiles[n]);
+        }
+    }
+
+    gtk_widget_destroy (dialog);
+
+    return result==GTK_RESPONSE_OK;
+}
+
+
+static GtkTreeModel *create_and_fill_model (Profiles &profiles)
+{
+    GtkListStore *store = gtk_list_store_new (NUM_COLUMNS,
+                                              G_TYPE_UINT,
+                                              G_TYPE_STRING,
+                                              G_TYPE_STRING);
+
+    GtkTreeIter i;
+
+    for (Profiles::const_iterator p=profiles.begin(); p!=profiles.end(); ++p)
+    {
+        gtk_list_store_append (store, &i);
+        gtk_list_store_set (store, &i,
+                            COL_PROFILE_IDX, p-profiles.begin(),
+                            COL_NAME, p->name.c_str(),
+                            COL_TEMPLATE, p->template_string.c_str(),
+                            -1);
+    }
+
+    return GTK_TREE_MODEL (store);
+}
+
+
+static GtkWidget *create_view_and_model (Profiles &profiles)
+{
+    GtkWidget *view = gtk_tree_view_new ();
+
+    g_object_set (view,
+                  "rules-hint", TRUE,
+                  "reorderable", TRUE,
+                  "enable-search", TRUE,
+                  "search-column", COL_NAME,
+                  NULL);
+
+    GtkCellRenderer *renderer = NULL;
+    GtkTreeViewColumn *col = NULL;
+
+    GtkTooltips *tips = gtk_tooltips_new ();
+
+    col = gnome_cmd_treeview_create_new_text_column (GTK_TREE_VIEW (view), renderer, COL_NAME, _("Profile"));
+    gtk_tooltips_set_tip (tips, col->button, _("Profile name"), NULL);
+    g_signal_connect(renderer, "edited", (GCallback) cell_edited_callback, view);
+
+    g_object_set (renderer,
+                  "editable", TRUE,
+                  NULL);
+
+    col = gnome_cmd_treeview_create_new_text_column (GTK_TREE_VIEW (view), renderer, COL_TEMPLATE, _("Template"));
+    gtk_tooltips_set_tip (tips, col->button, _("Template"), NULL);
+
+    g_object_set (renderer,
+                  "foreground-set", TRUE,
+                  "foreground", "DarkGray",
+                  "ellipsize-set", TRUE,
+                  "ellipsize", PANGO_ELLIPSIZE_END,
+                  NULL);
+
+    GtkTreeModel *model = create_and_fill_model (profiles);
+
+    gtk_tree_view_set_model (GTK_TREE_VIEW (view), model);
+
+    g_object_unref (model);          // destroy model automatically with view
+
+    GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
+    gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
+
+    GtkTreeIter iter;
+
+    if (gtk_tree_model_get_iter_first (gtk_tree_view_get_model (GTK_TREE_VIEW (view)), &iter))      // select the first row here...
+        gtk_tree_selection_select_iter (selection, &iter);
+
+    return view;
+}
+
+
+static void cell_edited_callback (GtkCellRendererText *cell, gchar *path_string, gchar *new_text, GtkWidget *view)
+{
+    GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (view));
+    GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
+    GtkTreeIter iter;
+
+    gint col = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell), "column"));
+
+    if (gtk_tree_model_get_iter (model, &iter, path))
+    {
+        guint idx;
+
+        gtk_tree_model_get (model, &iter, COL_PROFILE_IDX, &idx, -1);
+        gtk_list_store_set (GTK_LIST_STORE (model), &iter, col, new_text, -1);
+        profiles[idx].name = new_text;
+    }
+
+    gtk_tree_path_free (path);
+}
+
+
+static void add_clicked_callback (GtkButton *button, GtkWidget *view)
+{
+    GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (view));
+    GtkTreeIter i;
+
+    profiles.push_back(default_profile);
+
+    GnomeCmdData::AdvrenameConfig::Profile &p = profiles.back();
+
+    gtk_list_store_append (GTK_LIST_STORE (model), &i);
+    gtk_list_store_set (GTK_LIST_STORE (model), &i,
+                        COL_PROFILE_IDX, profiles.size()-1,
+                        COL_NAME, p.name.c_str(),
+                        COL_TEMPLATE, p.template_string.c_str(),
+                        -1);
+
+    GtkTreePath *path = gtk_tree_model_get_path (model, &i);
+    gtk_widget_grab_focus (view);
+    gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), path, gtk_tree_view_get_column (GTK_TREE_VIEW (view),0), TRUE);
+    gtk_tree_path_free(path);
+}
+
+
+static void edit_clicked_callback (GtkButton *button, GtkWidget *view)
+{
+}
+
+
+static void remove_clicked_callback (GtkButton *button, GtkWidget *view)
+{
+    GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
+    GtkTreeIter iter;
+
+    if (gtk_tree_selection_get_selected (selection, NULL, &iter))
+    {
+        GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (view));
+        gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
+        gtk_tree_selection_select_iter (selection, &iter);
+    }
+}
+
+
+static void import_clicked_callback (GtkButton *button, GtkWidget *view)
+{
+}
+
+
+static void response_callback (GtkDialog *dialog, int response_id, Profiles *profiles)
+{
+    switch (response_id)
+    {
+        case GTK_RESPONSE_HELP:
+            gnome_cmd_help_display ("gnome-commander.xml", "gnome-commander-advanced-rename");
+            g_signal_stop_emission_by_name (dialog, "response");
+            break;
+
+        case GTK_RESPONSE_OK:
+            break;
+
+        case GTK_RESPONSE_NONE:
+        case GTK_RESPONSE_DELETE_EVENT:
+        case GTK_RESPONSE_CANCEL:
+            break;
+
+        default :
+            g_assert_not_reached ();
+    }
+}

Added: trunk/src/dialogs/gnome-cmd-advrename-profiles-dialog.h
==============================================================================
--- (empty file)
+++ trunk/src/dialogs/gnome-cmd-advrename-profiles-dialog.h	Sat Dec  6 23:01:27 2008
@@ -0,0 +1,28 @@
+/*
+    GNOME Commander - A GNOME based file manager
+    Copyright (C) 2001-2006 Marcus Bjurman
+    Copyright (C) 2007-2008 Piotr Eljasiak
+
+    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 St, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#ifndef __GNOME_CMD_ADVRENAME_PROFILES_DIALOG_H__
+#define __GNOME_CMD_ADVRENAME_PROFILES_DIALOG_H__
+
+#include "gnome-cmd-data.h"
+
+gboolean gnome_cmd_advrename_profiles_dialog_new (const gchar *title, GtkWindow *parent, GnomeCmdData::AdvrenameConfig &cfg, gboolean new_profile);
+
+#endif // __GNOME_CMD_ADVRENAME_PROFILES_DIALOG_H__

Modified: trunk/src/gnome-cmd-advrename-dialog.cc
==============================================================================
--- trunk/src/gnome-cmd-advrename-dialog.cc	(original)
+++ trunk/src/gnome-cmd-advrename-dialog.cc	Sat Dec  6 23:01:27 2008
@@ -28,6 +28,7 @@
 #include "gnome-cmd-includes.h"
 #include "gnome-cmd-convert.h"
 #include "gnome-cmd-advrename-dialog.h"
+#include "dialogs/gnome-cmd-advrename-profiles-dialog.h"
 #include "dialogs/gnome-cmd-advrename-regex-dialog.h"
 #include "gnome-cmd-advrename-lexer.h"
 #include "gnome-cmd-file.h"
@@ -572,12 +573,29 @@
 }
 
 
-void GnomeCmdAdvrenameDialog::Private::manage_profiles(GnomeCmdAdvrenameDialog::Private *priv, guint new_profile, GtkWidget *menu)
+void GnomeCmdAdvrenameDialog::Private::manage_profiles(GnomeCmdAdvrenameDialog::Private *priv, guint new_profile, GtkWidget *widget)
 {
+    GtkWidget *dialog = gtk_widget_get_ancestor (priv->menu_button[PROFILE_MENU], GNOME_CMD_TYPE_ADVRENAME_DIALOG);
+
+    g_return_if_fail (dialog!=NULL);
+
+    GnomeCmdData::AdvrenameConfig &cfg = GNOME_CMD_ADVRENAME_DIALOG(dialog)->defaults;
+
+    cfg.default_profile.template_string = gtk_entry_get_text (GTK_ENTRY (priv->template_entry));
+    if (cfg.default_profile.template_string.empty())  cfg.default_profile.template_string = "$N";
+
+    if (gnome_cmd_advrename_profiles_dialog_new (_("Profiles"), GTK_WINDOW (dialog), cfg,  new_profile))
+    {
+        GtkWidget *menu = widget->parent;
+
+        g_signal_handlers_disconnect_by_func (G_OBJECT (priv->menu_button[PROFILE_MENU]), gpointer (on_menu_button_clicked), menu);
+        g_object_unref (gtk_item_factory_from_widget (menu));
+        g_signal_connect (G_OBJECT (priv->menu_button[PROFILE_MENU]), "clicked", G_CALLBACK (on_menu_button_clicked), priv->create_placeholder_menu(PROFILE_MENU, &cfg));
+    }
 }
 
 
-void GnomeCmdAdvrenameDialog::Private::load_profile(GnomeCmdAdvrenameDialog::Private *priv, guint profile_idx, GtkWidget *menu)
+void GnomeCmdAdvrenameDialog::Private::load_profile(GnomeCmdAdvrenameDialog::Private *priv, guint profile_idx, GtkWidget *widget)
 {
     GtkWidget *dialog = gtk_widget_get_ancestor (priv->menu_button[PROFILE_MENU], GNOME_CMD_TYPE_ADVRENAME_DIALOG);
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]