Compare commits
7 Commits
css-variab
...
federico-f
Author | SHA1 | Date | |
---|---|---|---|
|
2d311154a1 | ||
|
eedae6fe91 | ||
|
a78c0acc21 | ||
|
593d7f44d6 | ||
|
c28327bdf7 | ||
|
7579fe92a6 | ||
|
8d17642575 |
132
ChangeLog
132
ChangeLog
@@ -1,3 +1,135 @@
|
||||
2006-04-17 Federico Mena Quintero <federico@novell.com>
|
||||
|
||||
* gtk/gtkfilechooserdefault.c (pending_select_paths_process):
|
||||
Oops, we *do* need to check that we are in OPEN mode before
|
||||
selecting the first row in the file list. See
|
||||
https://bugzilla.novell.com/show_bug.cgi?id=166906
|
||||
(gtk_file_chooser_default_get_paths): If we are in the case for
|
||||
the file list, and the list has no selected rows, jump to the case
|
||||
for the filename entry. This is so that
|
||||
|
||||
1. The user types a filename in the SAVE filename entry
|
||||
("foo.txt").
|
||||
|
||||
2. He then double-clicks on a folder ("bar") in the file
|
||||
list.
|
||||
|
||||
will yield the expected "bar/foo.txt" selection.
|
||||
|
||||
2006-03-29 Federico Mena Quintero <federico@novell.com>
|
||||
|
||||
* gtk/gtkpathbar.c (gtk_path_bar_init): Reduce the inter-button
|
||||
spacing to 0.
|
||||
|
||||
* gtk/gtkfilechooserdefault.c (browse_widgets_create): Make the
|
||||
location label bold.
|
||||
|
||||
2006-03-29 Federico Mena Quintero <federico@novell.com>
|
||||
|
||||
* gtk/gtkfilechooserdefault.c (location_mode_set): Just change the
|
||||
location_mode field if we are in SAVE/CREATE_FOLDER modes.
|
||||
(gtk_file_chooser_default_get_paths): Get the path based on the
|
||||
currently focused widget, or the last-focused widget. This is
|
||||
what we should have been doing in the beginning, but it worked out
|
||||
fine because we didn't have the possibility of a filename entry in
|
||||
OPEN mode.
|
||||
(gtk_file_chooser_default_should_respond): Handle the case where
|
||||
the last focused widget is the location_entry.
|
||||
|
||||
2006-03-28 Federico Mena Quintero <federico@novell.com>
|
||||
|
||||
* gtk/gtkfilechoosersettings.[ch]: New files with a simple
|
||||
framework for saving/loading settings from the file chooser in
|
||||
$XDG_CONFIG_HOME/gtk-2.0/gtkfilechooser.
|
||||
|
||||
* gtk/gtkfilechooserdefault.c (gtk_file_chooser_default_unmap):
|
||||
Save the current settings.
|
||||
(settings_save): New helper function. We save the location_mode
|
||||
and show_hidden flags.
|
||||
(gtk_file_chooser_default_map): Load the settings.
|
||||
(settings_load): New helper function.
|
||||
|
||||
* gtk/gtkfilechooserentry.c
|
||||
(_gtk_file_chooser_entry_set_file_part): Oops, don't modify
|
||||
in_change. Our handlers are what set the file_part, so they
|
||||
*must* be run when we modify the text.
|
||||
|
||||
2006-03-27 Federico Mena Quintero <federico@novell.com>
|
||||
|
||||
* gtk/gtkfilechooserprivate.h (struct _GtkFileChooserDefault):
|
||||
Removed the save_file_name_entry. We'll make this be the same as
|
||||
the location_entry widget.
|
||||
(struct _GtkFileChooserDefault): Leave only location_button,
|
||||
location_entry_box, location_label, location_entry. We'll use a
|
||||
single toggle button for the location entry, which will appear
|
||||
below the path bar.
|
||||
(struct _GtkFileChooserDefault): Added a
|
||||
processing_pending_selections flag.
|
||||
|
||||
* gtk/gtkfilechooserdefault.c (save_widgets_create): Destroy the
|
||||
old location_entry if necessary, and hide the location toggle
|
||||
widgets.
|
||||
(update_chooser_entry): In multiple selection mode, just clear the
|
||||
location_entry.
|
||||
(check_save_entry): Allow running in OPEN or SELECT_FOLDER modes
|
||||
if we are in LOCATION_MODE_FILENAME_ENTRY.
|
||||
(gtk_file_chooser_default_should_respond): Switch to a folder if
|
||||
the location_entry contains a folder name in OPEN and SAVE mode,
|
||||
not just SAVE mode. If the entry doesn't contain a folder name,
|
||||
but is otherwise well-formed, and we are in OPEN mode, return that
|
||||
we should respond with that filename.
|
||||
(gtk_file_chooser_default_initial_focus): Focus the location_entry
|
||||
if appropriate.
|
||||
(browse_widgets_create): Create the location_entry_box and the
|
||||
location_label here.
|
||||
(update_appearance): Call location_mode_set() when switching back
|
||||
to OPEN/SELECT_FOLDER mode. Hide the location_button when
|
||||
switching to SAVE/CREATE_FOLDER mode.
|
||||
(pending_select_paths_process): Turn the
|
||||
processing_pending_selections flag on and off around changes to
|
||||
the current selection. Don't special-case OPEN mode anymore,
|
||||
since the new flag will take care of things in
|
||||
update_chooser_entry().
|
||||
(update_chooser_entry): Don't do anything if
|
||||
processing_pending_selections is TRUE. This keeps the entry from
|
||||
being polluted when changing folders.
|
||||
(location_popup_handler): In OPEN/SELECT_FOLDER modes, toggle
|
||||
between the path bar and the entry. In SAVE/CREATE_FOLDER modes, simply focus the
|
||||
location_entry.
|
||||
(update_from_entry): Removed.
|
||||
(location_entry_create): Removed.
|
||||
(open_location_cb): Removed.
|
||||
(file_list_build_popup_menu): Don't add an "Open _Location" menu item.
|
||||
(location_entry_set_initial_text): Don't do anything if
|
||||
current_folder is NULL.
|
||||
|
||||
* gtk/gtkfilechooserentry.c
|
||||
(_gtk_file_chooser_entry_set_file_part): Turn in_change on and off
|
||||
around the call to gtk_entry_set_text(). This makes completion
|
||||
not happen when the caller has explicitly set a name.
|
||||
|
||||
2006-03-24 Federico Mena Quintero <federico@novell.com>
|
||||
|
||||
* gtk/gtkfilechooserprivate.h (struct _GtkFileChooserDefault):
|
||||
Added fields location_mode_box, location_pathbar_radio,
|
||||
location_filename_radio, location_widget_box, location_label,
|
||||
location_entry. The radio buttons will switch between the pathbar
|
||||
and the location entry; the other boxes are for layout purposes.
|
||||
(enum LocationMode): New enum.
|
||||
(struct _GtkFileChooserDefault): Added a location_mode field.
|
||||
|
||||
* gtk/gtkfilechooserdefault.c (browse_widgets_create): Create the
|
||||
location radio buttons to switch between the pathbar and the
|
||||
location entry. Pack the browse_path_bar in the new
|
||||
location_widget_box instead of a generic hbox.
|
||||
(location_buttons_create): New function.
|
||||
(gtk_file_chooser_default_init): Initialize impl->location_mode.
|
||||
(location_switch_to_path_bar): New function.
|
||||
(location_switch_to_filename_entry): New function.
|
||||
|
||||
* gtk/gtkfilechooserbutton.c (model_add_special): The display_name
|
||||
should not be const.
|
||||
|
||||
2006-03-24 Matthias Clasen <mclasen@redhat.com>
|
||||
|
||||
* gtk/gtktextview.c (gtk_text_view_value_changed): Don't call
|
||||
|
@@ -1,3 +1,135 @@
|
||||
2006-04-17 Federico Mena Quintero <federico@novell.com>
|
||||
|
||||
* gtk/gtkfilechooserdefault.c (pending_select_paths_process):
|
||||
Oops, we *do* need to check that we are in OPEN mode before
|
||||
selecting the first row in the file list. See
|
||||
https://bugzilla.novell.com/show_bug.cgi?id=166906
|
||||
(gtk_file_chooser_default_get_paths): If we are in the case for
|
||||
the file list, and the list has no selected rows, jump to the case
|
||||
for the filename entry. This is so that
|
||||
|
||||
1. The user types a filename in the SAVE filename entry
|
||||
("foo.txt").
|
||||
|
||||
2. He then double-clicks on a folder ("bar") in the file
|
||||
list.
|
||||
|
||||
will yield the expected "bar/foo.txt" selection.
|
||||
|
||||
2006-03-29 Federico Mena Quintero <federico@novell.com>
|
||||
|
||||
* gtk/gtkpathbar.c (gtk_path_bar_init): Reduce the inter-button
|
||||
spacing to 0.
|
||||
|
||||
* gtk/gtkfilechooserdefault.c (browse_widgets_create): Make the
|
||||
location label bold.
|
||||
|
||||
2006-03-29 Federico Mena Quintero <federico@novell.com>
|
||||
|
||||
* gtk/gtkfilechooserdefault.c (location_mode_set): Just change the
|
||||
location_mode field if we are in SAVE/CREATE_FOLDER modes.
|
||||
(gtk_file_chooser_default_get_paths): Get the path based on the
|
||||
currently focused widget, or the last-focused widget. This is
|
||||
what we should have been doing in the beginning, but it worked out
|
||||
fine because we didn't have the possibility of a filename entry in
|
||||
OPEN mode.
|
||||
(gtk_file_chooser_default_should_respond): Handle the case where
|
||||
the last focused widget is the location_entry.
|
||||
|
||||
2006-03-28 Federico Mena Quintero <federico@novell.com>
|
||||
|
||||
* gtk/gtkfilechoosersettings.[ch]: New files with a simple
|
||||
framework for saving/loading settings from the file chooser in
|
||||
$XDG_CONFIG_HOME/gtk-2.0/gtkfilechooser.
|
||||
|
||||
* gtk/gtkfilechooserdefault.c (gtk_file_chooser_default_unmap):
|
||||
Save the current settings.
|
||||
(settings_save): New helper function. We save the location_mode
|
||||
and show_hidden flags.
|
||||
(gtk_file_chooser_default_map): Load the settings.
|
||||
(settings_load): New helper function.
|
||||
|
||||
* gtk/gtkfilechooserentry.c
|
||||
(_gtk_file_chooser_entry_set_file_part): Oops, don't modify
|
||||
in_change. Our handlers are what set the file_part, so they
|
||||
*must* be run when we modify the text.
|
||||
|
||||
2006-03-27 Federico Mena Quintero <federico@novell.com>
|
||||
|
||||
* gtk/gtkfilechooserprivate.h (struct _GtkFileChooserDefault):
|
||||
Removed the save_file_name_entry. We'll make this be the same as
|
||||
the location_entry widget.
|
||||
(struct _GtkFileChooserDefault): Leave only location_button,
|
||||
location_entry_box, location_label, location_entry. We'll use a
|
||||
single toggle button for the location entry, which will appear
|
||||
below the path bar.
|
||||
(struct _GtkFileChooserDefault): Added a
|
||||
processing_pending_selections flag.
|
||||
|
||||
* gtk/gtkfilechooserdefault.c (save_widgets_create): Destroy the
|
||||
old location_entry if necessary, and hide the location toggle
|
||||
widgets.
|
||||
(update_chooser_entry): In multiple selection mode, just clear the
|
||||
location_entry.
|
||||
(check_save_entry): Allow running in OPEN or SELECT_FOLDER modes
|
||||
if we are in LOCATION_MODE_FILENAME_ENTRY.
|
||||
(gtk_file_chooser_default_should_respond): Switch to a folder if
|
||||
the location_entry contains a folder name in OPEN and SAVE mode,
|
||||
not just SAVE mode. If the entry doesn't contain a folder name,
|
||||
but is otherwise well-formed, and we are in OPEN mode, return that
|
||||
we should respond with that filename.
|
||||
(gtk_file_chooser_default_initial_focus): Focus the location_entry
|
||||
if appropriate.
|
||||
(browse_widgets_create): Create the location_entry_box and the
|
||||
location_label here.
|
||||
(update_appearance): Call location_mode_set() when switching back
|
||||
to OPEN/SELECT_FOLDER mode. Hide the location_button when
|
||||
switching to SAVE/CREATE_FOLDER mode.
|
||||
(pending_select_paths_process): Turn the
|
||||
processing_pending_selections flag on and off around changes to
|
||||
the current selection. Don't special-case OPEN mode anymore,
|
||||
since the new flag will take care of things in
|
||||
update_chooser_entry().
|
||||
(update_chooser_entry): Don't do anything if
|
||||
processing_pending_selections is TRUE. This keeps the entry from
|
||||
being polluted when changing folders.
|
||||
(location_popup_handler): In OPEN/SELECT_FOLDER modes, toggle
|
||||
between the path bar and the entry. In SAVE/CREATE_FOLDER modes, simply focus the
|
||||
location_entry.
|
||||
(update_from_entry): Removed.
|
||||
(location_entry_create): Removed.
|
||||
(open_location_cb): Removed.
|
||||
(file_list_build_popup_menu): Don't add an "Open _Location" menu item.
|
||||
(location_entry_set_initial_text): Don't do anything if
|
||||
current_folder is NULL.
|
||||
|
||||
* gtk/gtkfilechooserentry.c
|
||||
(_gtk_file_chooser_entry_set_file_part): Turn in_change on and off
|
||||
around the call to gtk_entry_set_text(). This makes completion
|
||||
not happen when the caller has explicitly set a name.
|
||||
|
||||
2006-03-24 Federico Mena Quintero <federico@novell.com>
|
||||
|
||||
* gtk/gtkfilechooserprivate.h (struct _GtkFileChooserDefault):
|
||||
Added fields location_mode_box, location_pathbar_radio,
|
||||
location_filename_radio, location_widget_box, location_label,
|
||||
location_entry. The radio buttons will switch between the pathbar
|
||||
and the location entry; the other boxes are for layout purposes.
|
||||
(enum LocationMode): New enum.
|
||||
(struct _GtkFileChooserDefault): Added a location_mode field.
|
||||
|
||||
* gtk/gtkfilechooserdefault.c (browse_widgets_create): Create the
|
||||
location radio buttons to switch between the pathbar and the
|
||||
location entry. Pack the browse_path_bar in the new
|
||||
location_widget_box instead of a generic hbox.
|
||||
(location_buttons_create): New function.
|
||||
(gtk_file_chooser_default_init): Initialize impl->location_mode.
|
||||
(location_switch_to_path_bar): New function.
|
||||
(location_switch_to_filename_entry): New function.
|
||||
|
||||
* gtk/gtkfilechooserbutton.c (model_add_special): The display_name
|
||||
should not be const.
|
||||
|
||||
2006-03-24 Matthias Clasen <mclasen@redhat.com>
|
||||
|
||||
* gtk/gtktextview.c (gtk_text_view_value_changed): Don't call
|
||||
|
@@ -1,392 +0,0 @@
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
#include <demos.h>
|
||||
|
||||
static GtkTextBuffer *info_buffer;
|
||||
static GtkTextBuffer *source_buffer;
|
||||
|
||||
static gchar *current_file = NULL;
|
||||
|
||||
enum {
|
||||
TITLE_COLUMN,
|
||||
FILENAME_COLUMN,
|
||||
FUNC_COLUMN,
|
||||
ITALIC_COLUMN,
|
||||
NUM_COLUMNS
|
||||
};
|
||||
|
||||
gboolean
|
||||
read_line (FILE *stream, GString *str)
|
||||
{
|
||||
int n_read = 0;
|
||||
|
||||
flockfile (stream);
|
||||
|
||||
g_string_truncate (str, 0);
|
||||
|
||||
while (1)
|
||||
{
|
||||
int c;
|
||||
|
||||
c = getc_unlocked (stream);
|
||||
|
||||
if (c == EOF)
|
||||
goto done;
|
||||
else
|
||||
n_read++;
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case '\r':
|
||||
case '\n':
|
||||
{
|
||||
int next_c = getc_unlocked (stream);
|
||||
|
||||
if (!(next_c == EOF ||
|
||||
(c == '\r' && next_c == '\n') ||
|
||||
(c == '\n' && next_c == '\r')))
|
||||
ungetc (next_c, stream);
|
||||
|
||||
goto done;
|
||||
}
|
||||
default:
|
||||
g_string_append_c (str, c);
|
||||
}
|
||||
}
|
||||
|
||||
done:
|
||||
|
||||
funlockfile (stream);
|
||||
|
||||
return n_read > 0;
|
||||
}
|
||||
|
||||
void
|
||||
load_file (const gchar *filename)
|
||||
{
|
||||
FILE *file;
|
||||
GtkTextIter start, end;
|
||||
GString *buffer = g_string_new (NULL);
|
||||
int state = 0;
|
||||
gboolean in_para = 0;
|
||||
|
||||
if (current_file && !strcmp (current_file, filename))
|
||||
return;
|
||||
|
||||
g_free (current_file);
|
||||
current_file = g_strdup (filename);
|
||||
|
||||
gtk_text_buffer_get_bounds (info_buffer, &start, &end);
|
||||
gtk_text_buffer_delete (info_buffer, &start, &end);
|
||||
|
||||
gtk_text_buffer_get_bounds (source_buffer, &start, &end);
|
||||
gtk_text_buffer_delete (source_buffer, &start, &end);
|
||||
|
||||
file = fopen (filename, "r");
|
||||
if (!file)
|
||||
{
|
||||
g_warning ("Cannot open %s: %s\n", filename, g_strerror (errno));
|
||||
return;
|
||||
}
|
||||
|
||||
gtk_text_buffer_get_iter_at_offset (info_buffer, &start, 0);
|
||||
while (read_line (file, buffer))
|
||||
{
|
||||
gchar *p = buffer->str;
|
||||
gchar *q;
|
||||
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
/* Reading title */
|
||||
while (*p == '/' || *p == '*' || isspace (*p))
|
||||
p++;
|
||||
q = p + strlen (p);
|
||||
while (q > p && isspace (*(q - 1)))
|
||||
q--;
|
||||
|
||||
if (q > p)
|
||||
{
|
||||
int len_chars = g_utf8_pointer_to_offset (p, q);
|
||||
|
||||
end = start;
|
||||
|
||||
g_assert (strlen (p) >= q - p);
|
||||
gtk_text_buffer_insert (info_buffer, &end, p, q - p);
|
||||
start = end;
|
||||
|
||||
gtk_text_iter_backward_chars (&start, len_chars);
|
||||
gtk_text_buffer_apply_tag_by_name (info_buffer, "title", &start, &end);
|
||||
|
||||
start = end;
|
||||
|
||||
state++;
|
||||
}
|
||||
break;
|
||||
|
||||
case 1:
|
||||
/* Reading body of info section */
|
||||
while (isspace (*p))
|
||||
p++;
|
||||
if (*p == '*' && *(p + 1) == '/')
|
||||
{
|
||||
gtk_text_buffer_get_iter_at_offset (source_buffer, &start, 0);
|
||||
state++;
|
||||
}
|
||||
else
|
||||
{
|
||||
int len;
|
||||
|
||||
while (*p == '*' || isspace (*p))
|
||||
p++;
|
||||
|
||||
len = strlen (p);
|
||||
while (isspace (*(p + len - 1)))
|
||||
len--;
|
||||
|
||||
if (len > 0)
|
||||
{
|
||||
if (in_para)
|
||||
gtk_text_buffer_insert (info_buffer, &start, " ", 1);
|
||||
|
||||
g_assert (strlen (p) >= len);
|
||||
gtk_text_buffer_insert (info_buffer, &start, p, len);
|
||||
in_para = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
gtk_text_buffer_insert (info_buffer, &start, "\n", 1);
|
||||
in_para = 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 2:
|
||||
/* Skipping blank lines */
|
||||
while (isspace (*p))
|
||||
p++;
|
||||
if (*p)
|
||||
{
|
||||
p = buffer->str;
|
||||
state++;
|
||||
/* Fall through */
|
||||
}
|
||||
else
|
||||
break;
|
||||
|
||||
case 3:
|
||||
/* Reading program body */
|
||||
gtk_text_buffer_insert (source_buffer, &start, p, -1);
|
||||
gtk_text_buffer_insert (info_buffer, &start, "\n", 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
gtk_text_buffer_get_bounds (source_buffer, &start, &end);
|
||||
gtk_text_buffer_apply_tag_by_name (info_buffer, "source", &start, &end);
|
||||
}
|
||||
|
||||
gboolean
|
||||
button_press_event_cb (GtkTreeView *tree_view,
|
||||
GdkEventButton *event,
|
||||
GtkTreeModel *model)
|
||||
{
|
||||
if (event->type == GDK_2BUTTON_PRESS)
|
||||
{
|
||||
GtkTreePath *path = NULL;
|
||||
|
||||
gtk_tree_view_get_path_at_pos (tree_view,
|
||||
event->window,
|
||||
event->x,
|
||||
event->y,
|
||||
&path,
|
||||
NULL);
|
||||
|
||||
if (path)
|
||||
{
|
||||
GtkTreeIter iter;
|
||||
gboolean italic;
|
||||
GVoidFunc func;
|
||||
|
||||
gtk_tree_model_get_iter (model, &iter, path);
|
||||
gtk_tree_store_get (GTK_TREE_STORE (model),
|
||||
&iter,
|
||||
FUNC_COLUMN, &func,
|
||||
ITALIC_COLUMN, &italic,
|
||||
-1);
|
||||
(func) ();
|
||||
gtk_tree_store_set (GTK_TREE_STORE (model),
|
||||
&iter,
|
||||
ITALIC_COLUMN, !italic,
|
||||
-1);
|
||||
gtk_tree_path_free (path);
|
||||
}
|
||||
|
||||
gtk_signal_emit_stop_by_name (GTK_OBJECT (tree_view),
|
||||
"button_press_event");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
selection_cb (GtkTreeSelection *selection,
|
||||
GtkTreeModel *model)
|
||||
{
|
||||
GtkTreeIter iter;
|
||||
GValue value = {0, };
|
||||
|
||||
if (! gtk_tree_selection_get_selected (selection, NULL, &iter))
|
||||
return;
|
||||
|
||||
gtk_tree_model_get_value (model, &iter,
|
||||
FILENAME_COLUMN,
|
||||
&value);
|
||||
load_file (g_value_get_string (&value));
|
||||
g_value_unset (&value);
|
||||
}
|
||||
|
||||
static GtkWidget *
|
||||
create_text (GtkTextBuffer **buffer,
|
||||
gboolean is_source)
|
||||
{
|
||||
GtkWidget *scrolled_window;
|
||||
GtkWidget *text_view;
|
||||
PangoFontDescription *font_desc;
|
||||
|
||||
scrolled_window = gtk_scrolled_window_new (NULL, NULL);
|
||||
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
|
||||
GTK_POLICY_AUTOMATIC,
|
||||
GTK_POLICY_AUTOMATIC);
|
||||
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window),
|
||||
GTK_SHADOW_IN);
|
||||
|
||||
text_view = gtk_text_view_new ();
|
||||
gtk_container_add (GTK_CONTAINER (scrolled_window), text_view);
|
||||
|
||||
*buffer = gtk_text_buffer_new (NULL);
|
||||
gtk_text_view_set_buffer (GTK_TEXT_VIEW (text_view), *buffer);
|
||||
gtk_text_view_set_editable (GTK_TEXT_VIEW (text_view), FALSE);
|
||||
gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (text_view), FALSE);
|
||||
|
||||
if (is_source)
|
||||
{
|
||||
font_desc = pango_font_description_from_string ("Courier 10");
|
||||
gtk_widget_modify_font (text_view, font_desc);
|
||||
pango_font_description_free (font_desc);
|
||||
}
|
||||
|
||||
gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (text_view), !is_source);
|
||||
|
||||
return scrolled_window;
|
||||
}
|
||||
|
||||
/* Technically a list, but if we do go to 80 demos, we may want to move to a tree */
|
||||
static GtkWidget *
|
||||
create_tree (void)
|
||||
{
|
||||
GtkTreeSelection *selection;
|
||||
GtkCellRenderer *cell;
|
||||
GtkWidget *tree_view;
|
||||
GtkTreeViewColumn *column;
|
||||
GtkTreeStore *model;
|
||||
GtkTreeIter iter;
|
||||
gint i;
|
||||
|
||||
model = gtk_tree_store_new_with_types (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_BOOLEAN);
|
||||
tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
|
||||
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view));
|
||||
|
||||
gtk_tree_selection_set_type (GTK_TREE_SELECTION (selection),
|
||||
GTK_TREE_SELECTION_SINGLE);
|
||||
gtk_widget_set_usize (tree_view, 200, -1);
|
||||
|
||||
for (i=0; i < G_N_ELEMENTS (testgtk_demos); i++)
|
||||
{
|
||||
gtk_tree_store_append (GTK_TREE_STORE (model), &iter, NULL);
|
||||
|
||||
gtk_tree_store_set (GTK_TREE_STORE (model),
|
||||
&iter,
|
||||
TITLE_COLUMN, testgtk_demos[i].title,
|
||||
FILENAME_COLUMN, testgtk_demos[i].filename,
|
||||
FUNC_COLUMN, testgtk_demos[i].func,
|
||||
ITALIC_COLUMN, FALSE,
|
||||
-1);
|
||||
}
|
||||
|
||||
cell = gtk_cell_renderer_text_new ();
|
||||
column = gtk_tree_view_column_new_with_attributes ("Widget",
|
||||
cell,
|
||||
"text", TITLE_COLUMN,
|
||||
"italic", ITALIC_COLUMN,
|
||||
NULL);
|
||||
gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view),
|
||||
GTK_TREE_VIEW_COLUMN (column));
|
||||
|
||||
gtk_signal_connect (GTK_OBJECT (selection), "selection_changed", selection_cb, model);
|
||||
gtk_signal_connect (GTK_OBJECT (tree_view), "button_press_event", GTK_SIGNAL_FUNC (button_press_event_cb), model);
|
||||
|
||||
return tree_view;
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
GtkWidget *window;
|
||||
GtkWidget *notebook;
|
||||
GtkWidget *hbox;
|
||||
GtkWidget *tree;
|
||||
GtkTextTag *tag;
|
||||
|
||||
gtk_init (&argc, &argv);
|
||||
|
||||
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
||||
gtk_signal_connect (GTK_OBJECT (window), "destroy",
|
||||
GTK_SIGNAL_FUNC (gtk_main_quit), NULL);
|
||||
|
||||
hbox = gtk_hbox_new (FALSE, 0);
|
||||
gtk_container_add (GTK_CONTAINER (window), hbox);
|
||||
|
||||
tree = create_tree ();
|
||||
gtk_box_pack_start (GTK_BOX (hbox), tree, FALSE, FALSE, 0);
|
||||
|
||||
notebook = gtk_notebook_new ();
|
||||
gtk_box_pack_start (GTK_BOX (hbox), notebook, TRUE, TRUE, 0);
|
||||
|
||||
gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
|
||||
create_text (&info_buffer, FALSE),
|
||||
gtk_label_new ("Info"));
|
||||
|
||||
|
||||
gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
|
||||
create_text (&source_buffer, TRUE),
|
||||
gtk_label_new ("Source"));
|
||||
|
||||
tag = gtk_text_buffer_create_tag (info_buffer, "title");
|
||||
gtk_object_set (GTK_OBJECT (tag),
|
||||
"font", "Sans 18",
|
||||
NULL);
|
||||
|
||||
tag = gtk_text_buffer_create_tag (info_buffer, "source");
|
||||
gtk_object_set (GTK_OBJECT (tag),
|
||||
"font", "Courier 10",
|
||||
"pixels_above_lines", 0,
|
||||
"pixels_below_lines", 0,
|
||||
NULL);
|
||||
|
||||
gtk_window_set_default_size (GTK_WINDOW (window), 600, 400);
|
||||
gtk_widget_show_all (window);
|
||||
|
||||
|
||||
load_file (testgtk_demos[0].filename);
|
||||
|
||||
gtk_main ();
|
||||
|
||||
return 0;
|
||||
}
|
@@ -302,6 +302,7 @@ gtk_private_h_sources = \
|
||||
gtkfilechooserentry.h \
|
||||
gtkfilechooserdefault.h \
|
||||
gtkfilechooserprivate.h \
|
||||
gtkfilechoosersettings.h \
|
||||
gtkfilechooserutils.h \
|
||||
gtkfilesystemunix.h \
|
||||
gtkfilesystemmodel.h \
|
||||
@@ -382,6 +383,7 @@ gtk_c_sources = \
|
||||
gtkfilechooserembed.c \
|
||||
gtkfilechooserentry.c \
|
||||
gtkfilechooserdefault.c \
|
||||
gtkfilechoosersettings.c \
|
||||
gtkfilechooserutils.c \
|
||||
gtkfilechooserwidget.c \
|
||||
gtkfilefilter.c \
|
||||
|
@@ -1330,7 +1330,7 @@ static inline void
|
||||
model_add_special (GtkFileChooserButton *button)
|
||||
{
|
||||
const gchar *homedir;
|
||||
const gchar *display_name;
|
||||
gchar *display_name;
|
||||
gchar *desktopdir = NULL;
|
||||
GtkListStore *store;
|
||||
GtkTreeIter iter;
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -141,6 +141,11 @@ typedef enum {
|
||||
RELOAD_WAS_UNMAPPED /* We had a folder but got unmapped; reload is needed */
|
||||
} ReloadState;
|
||||
|
||||
typedef enum {
|
||||
LOCATION_MODE_PATH_BAR,
|
||||
LOCATION_MODE_FILENAME_ENTRY
|
||||
} LocationMode;
|
||||
|
||||
struct _GtkFileChooserDefault
|
||||
{
|
||||
GtkVBox parent_instance;
|
||||
@@ -152,7 +157,6 @@ struct _GtkFileChooserDefault
|
||||
/* Save mode widgets */
|
||||
GtkWidget *save_widgets;
|
||||
|
||||
GtkWidget *save_file_name_entry;
|
||||
GtkWidget *save_folder_label;
|
||||
GtkWidget *save_folder_combo;
|
||||
GtkWidget *save_expander;
|
||||
@@ -182,6 +186,12 @@ struct _GtkFileChooserDefault
|
||||
GtkWidget *extra_align;
|
||||
GtkWidget *extra_widget;
|
||||
|
||||
GtkWidget *location_button;
|
||||
GtkWidget *location_entry_box;
|
||||
GtkWidget *location_label;
|
||||
GtkWidget *location_entry;
|
||||
LocationMode location_mode;
|
||||
|
||||
GtkListStore *shortcuts_model;
|
||||
GtkTreeModel *shortcuts_filter_model;
|
||||
|
||||
@@ -241,6 +251,7 @@ struct _GtkFileChooserDefault
|
||||
guint list_sort_ascending : 1;
|
||||
guint changing_folder : 1;
|
||||
guint shortcuts_current_folder_active : 1;
|
||||
guint processing_pending_selections : 1;
|
||||
|
||||
#if 0
|
||||
guint shortcuts_drag_outside : 1;
|
||||
|
535
gtk/gtkfilechoosersettings.c
Normal file
535
gtk/gtkfilechoosersettings.c
Normal file
@@ -0,0 +1,535 @@
|
||||
/* GTK - The GIMP Toolkit
|
||||
* gtkfilechoosersettings.c: Internal settings for the GtkFileChooser widget
|
||||
* Copyright (C) 2006, Novell, Inc.
|
||||
*
|
||||
* Authors: Federico Mena-Quintero <federico@novell.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
/* TODO:
|
||||
*
|
||||
* - Persist these:
|
||||
* - hpaned position
|
||||
* - browse_for_other_folders?
|
||||
*
|
||||
* - Do we want lockdown?
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <glib/gi18n-lib.h>
|
||||
#include "gtkfilechoosersettings.h"
|
||||
|
||||
/* Increment this every time you change the configuration format */
|
||||
#define CONFIG_VERSION 0
|
||||
|
||||
#define ELEMENT_TOPLEVEL "gtkfilechooser"
|
||||
#define ELEMENT_LOCATION "location"
|
||||
#define ELEMENT_SHOW_HIDDEN "show_hidden"
|
||||
#define ATTRIBUTE_VERSION "version"
|
||||
#define ATTRIBUTE_MODE "mode"
|
||||
#define ATTRIBUTE_VALUE "value"
|
||||
#define MODE_PATH_BAR "path-bar"
|
||||
#define MODE_FILENAME_ENTRY "filename-entry"
|
||||
#define VALUE_TRUE "true"
|
||||
#define VALUE_FALSE "false"
|
||||
|
||||
#define EQ(a, b) (g_ascii_strcasecmp ((a), (b)) == 0)
|
||||
|
||||
static char *
|
||||
get_config_dirname (void)
|
||||
{
|
||||
return g_build_filename (g_get_user_config_dir (), "gtk-2.0", NULL);
|
||||
}
|
||||
|
||||
static char *
|
||||
get_config_filename (void)
|
||||
{
|
||||
return g_build_filename (g_get_user_config_dir (), "gtk-2.0", "gtkfilechooser", NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
set_defaults (GtkFileChooserSettings *settings)
|
||||
{
|
||||
settings->location_mode = LOCATION_MODE_PATH_BAR;
|
||||
settings->show_hidden = FALSE;
|
||||
}
|
||||
|
||||
typedef enum {
|
||||
STATE_START,
|
||||
STATE_END,
|
||||
STATE_ERROR,
|
||||
STATE_IN_TOPLEVEL,
|
||||
STATE_IN_LOCATION,
|
||||
STATE_IN_SHOW_HIDDEN
|
||||
} State;
|
||||
|
||||
struct parse_state {
|
||||
GtkFileChooserSettings *settings;
|
||||
int version;
|
||||
State state;
|
||||
};
|
||||
|
||||
static const char *
|
||||
get_attribute_value (const char **attribute_names,
|
||||
const char **attribute_values,
|
||||
const char *attribute)
|
||||
{
|
||||
const char **name;
|
||||
const char **value;
|
||||
|
||||
name = attribute_names;
|
||||
value = attribute_values;
|
||||
|
||||
while (*name)
|
||||
{
|
||||
if (EQ (*name, attribute))
|
||||
return *value;
|
||||
|
||||
name++;
|
||||
value++;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
set_missing_attribute_error (struct parse_state *state,
|
||||
int line,
|
||||
int col,
|
||||
const char *attribute,
|
||||
GError **error)
|
||||
{
|
||||
state->state = STATE_ERROR;
|
||||
g_set_error (error,
|
||||
G_MARKUP_ERROR,
|
||||
G_MARKUP_ERROR_INVALID_CONTENT,
|
||||
_("Line %d, column %d: missing attribute \"%s\""),
|
||||
line,
|
||||
col,
|
||||
attribute);
|
||||
}
|
||||
|
||||
static void
|
||||
set_unexpected_element_error (struct parse_state *state,
|
||||
int line,
|
||||
int col,
|
||||
const char *element,
|
||||
GError **error)
|
||||
{
|
||||
state->state = STATE_ERROR;
|
||||
g_set_error (error,
|
||||
G_MARKUP_ERROR,
|
||||
G_MARKUP_ERROR_UNKNOWN_ELEMENT,
|
||||
_("Line %d, column %d: unexpected element \"%s\""),
|
||||
line,
|
||||
col,
|
||||
element);
|
||||
}
|
||||
|
||||
static void
|
||||
set_unexpected_element_end_error (struct parse_state *state,
|
||||
int line,
|
||||
int col,
|
||||
const char *expected_element,
|
||||
const char *unexpected_element,
|
||||
GError **error)
|
||||
{
|
||||
state->state = STATE_ERROR;
|
||||
g_set_error (error,
|
||||
G_MARKUP_ERROR,
|
||||
G_MARKUP_ERROR_UNKNOWN_ELEMENT,
|
||||
_("Line %d, column %d: expected end of element \"%s\", but got element for \"%s\" instead"),
|
||||
line,
|
||||
col,
|
||||
expected_element,
|
||||
unexpected_element);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
parse_start_element_cb (GMarkupParseContext *context,
|
||||
const char *element_name,
|
||||
const char **attribute_names,
|
||||
const char **attribute_values,
|
||||
gpointer data,
|
||||
GError **error)
|
||||
{
|
||||
struct parse_state *state;
|
||||
int line, col;
|
||||
|
||||
state = data;
|
||||
g_markup_parse_context_get_position (context, &line, &col);
|
||||
|
||||
switch (state->state)
|
||||
{
|
||||
case STATE_START:
|
||||
if (EQ (element_name, ELEMENT_TOPLEVEL))
|
||||
{
|
||||
const char *version_str;
|
||||
|
||||
state->state = STATE_IN_TOPLEVEL;
|
||||
|
||||
version_str = get_attribute_value (attribute_names, attribute_values, ATTRIBUTE_VERSION);
|
||||
if (!version_str)
|
||||
state->version = -1;
|
||||
else
|
||||
if (sscanf (version_str, "%d", &state->version) != 1 || state->version < 0)
|
||||
state->version = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
state->state = STATE_ERROR;
|
||||
g_set_error (error,
|
||||
G_MARKUP_ERROR,
|
||||
G_MARKUP_ERROR_UNKNOWN_ELEMENT,
|
||||
_("Line %d, column %d: expected \"%s\" at the toplevel, but found \"%s\" instead"),
|
||||
line,
|
||||
col,
|
||||
ELEMENT_TOPLEVEL,
|
||||
element_name);
|
||||
}
|
||||
break;
|
||||
|
||||
case STATE_END:
|
||||
g_assert_not_reached ();
|
||||
break;
|
||||
|
||||
case STATE_ERROR:
|
||||
g_assert_not_reached ();
|
||||
break;
|
||||
|
||||
case STATE_IN_TOPLEVEL:
|
||||
if (EQ (element_name, ELEMENT_LOCATION))
|
||||
{
|
||||
const char *location_mode_str;
|
||||
|
||||
state->state = STATE_IN_LOCATION;
|
||||
|
||||
location_mode_str = get_attribute_value (attribute_names, attribute_values, ATTRIBUTE_MODE);
|
||||
if (!location_mode_str)
|
||||
set_missing_attribute_error (state, line, col, ATTRIBUTE_MODE, error);
|
||||
else if (EQ (location_mode_str, MODE_PATH_BAR))
|
||||
state->settings->location_mode = LOCATION_MODE_PATH_BAR;
|
||||
else if (EQ (location_mode_str, MODE_FILENAME_ENTRY))
|
||||
state->settings->location_mode = LOCATION_MODE_FILENAME_ENTRY;
|
||||
else
|
||||
{
|
||||
state->state = STATE_ERROR;
|
||||
g_set_error (error,
|
||||
G_MARKUP_ERROR,
|
||||
G_MARKUP_ERROR_INVALID_CONTENT,
|
||||
_("Line %d, column %d: expected \"%s\" or \"%s\", but found \"%s\" instead"),
|
||||
line,
|
||||
col,
|
||||
MODE_PATH_BAR,
|
||||
MODE_FILENAME_ENTRY,
|
||||
location_mode_str);
|
||||
}
|
||||
}
|
||||
else if (EQ (element_name, ELEMENT_SHOW_HIDDEN))
|
||||
{
|
||||
const char *value_str;
|
||||
|
||||
state->state = STATE_IN_SHOW_HIDDEN;
|
||||
|
||||
value_str = get_attribute_value (attribute_names, attribute_values, ATTRIBUTE_VALUE);
|
||||
|
||||
if (!value_str)
|
||||
set_missing_attribute_error (state, line, col, ATTRIBUTE_VALUE, error);
|
||||
else if (EQ (value_str, VALUE_TRUE))
|
||||
state->settings->show_hidden = TRUE;
|
||||
else if (EQ (value_str, VALUE_FALSE))
|
||||
state->settings->show_hidden = FALSE;
|
||||
else
|
||||
{
|
||||
state->state = STATE_ERROR;
|
||||
g_set_error (error,
|
||||
G_MARKUP_ERROR,
|
||||
G_MARKUP_ERROR_INVALID_CONTENT,
|
||||
_("Line %d, column %d: expected \"%s\" or \"%s\", but found \"%s\" instead"),
|
||||
line,
|
||||
col,
|
||||
VALUE_FALSE,
|
||||
VALUE_TRUE,
|
||||
value_str);
|
||||
}
|
||||
}
|
||||
else
|
||||
set_unexpected_element_error (state, line, col, element_name, error);
|
||||
|
||||
break;
|
||||
|
||||
case STATE_IN_LOCATION:
|
||||
case STATE_IN_SHOW_HIDDEN:
|
||||
set_unexpected_element_error (state, line, col, element_name, error);
|
||||
break;
|
||||
|
||||
default:
|
||||
g_assert_not_reached ();
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
parse_end_element_cb (GMarkupParseContext *context,
|
||||
const char *element_name,
|
||||
gpointer data,
|
||||
GError **error)
|
||||
{
|
||||
struct parse_state *state;
|
||||
int line, col;
|
||||
|
||||
state = data;
|
||||
g_markup_parse_context_get_position (context, &line, &col);
|
||||
|
||||
switch (state->state)
|
||||
{
|
||||
case STATE_START:
|
||||
g_assert_not_reached ();
|
||||
break;
|
||||
|
||||
case STATE_END:
|
||||
g_assert_not_reached ();
|
||||
break;
|
||||
|
||||
case STATE_ERROR:
|
||||
g_assert_not_reached ();
|
||||
break;
|
||||
|
||||
case STATE_IN_TOPLEVEL:
|
||||
if (EQ (element_name, ELEMENT_TOPLEVEL))
|
||||
state->state = STATE_END;
|
||||
else
|
||||
set_unexpected_element_end_error (state, line, col, ELEMENT_TOPLEVEL, element_name, error);
|
||||
|
||||
break;
|
||||
|
||||
case STATE_IN_LOCATION:
|
||||
if (EQ (element_name, ELEMENT_LOCATION))
|
||||
state->state = STATE_IN_TOPLEVEL;
|
||||
else
|
||||
set_unexpected_element_end_error (state, line, col, ELEMENT_LOCATION, element_name, error);
|
||||
|
||||
break;
|
||||
|
||||
case STATE_IN_SHOW_HIDDEN:
|
||||
if (EQ (element_name, ELEMENT_SHOW_HIDDEN))
|
||||
state->state = STATE_IN_TOPLEVEL;
|
||||
else
|
||||
set_unexpected_element_end_error (state, line, col, ELEMENT_SHOW_HIDDEN, element_name, error);
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
g_assert_not_reached ();
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
parse_config (GtkFileChooserSettings *settings,
|
||||
const char *contents,
|
||||
GError **error)
|
||||
{
|
||||
GMarkupParser parser = { 0, };
|
||||
GMarkupParseContext *context;
|
||||
struct parse_state state;
|
||||
gboolean retval;
|
||||
|
||||
parser.start_element = parse_start_element_cb;
|
||||
parser.end_element = parse_end_element_cb;
|
||||
|
||||
state.settings = settings;
|
||||
state.version = -1;
|
||||
state.state = STATE_START;
|
||||
|
||||
context = g_markup_parse_context_new (&parser,
|
||||
0,
|
||||
&state,
|
||||
NULL);
|
||||
|
||||
retval = g_markup_parse_context_parse (context, contents, -1, error);
|
||||
g_markup_parse_context_free (context);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
read_config (GtkFileChooserSettings *settings,
|
||||
GError **error)
|
||||
{
|
||||
char *filename;
|
||||
char *contents;
|
||||
gsize contents_len;
|
||||
gboolean success;
|
||||
|
||||
filename = get_config_filename ();
|
||||
|
||||
success = g_file_get_contents (filename, &contents, &contents_len, error);
|
||||
g_free (filename);
|
||||
|
||||
if (!success)
|
||||
{
|
||||
set_defaults (settings);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
success = parse_config (settings, contents, error);
|
||||
|
||||
g_free (contents);
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
static void
|
||||
ensure_settings_read (GtkFileChooserSettings *settings)
|
||||
{
|
||||
if (settings->settings_read)
|
||||
return;
|
||||
|
||||
/* NULL GError */
|
||||
read_config (settings, NULL);
|
||||
|
||||
settings->settings_read = TRUE;
|
||||
}
|
||||
|
||||
G_DEFINE_TYPE (GtkFileChooserSettings,
|
||||
_gtk_file_chooser_settings,
|
||||
G_TYPE_OBJECT);
|
||||
|
||||
static void
|
||||
_gtk_file_chooser_settings_class_init (GtkFileChooserSettingsClass *class)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_file_chooser_settings_init (GtkFileChooserSettings *settings)
|
||||
{
|
||||
}
|
||||
|
||||
GtkFileChooserSettings *
|
||||
_gtk_file_chooser_settings_new (void)
|
||||
{
|
||||
return g_object_new (GTK_FILE_CHOOSER_SETTINGS_TYPE, NULL);
|
||||
}
|
||||
|
||||
LocationMode
|
||||
_gtk_file_chooser_settings_get_location_mode (GtkFileChooserSettings *settings)
|
||||
{
|
||||
ensure_settings_read (settings);
|
||||
return settings->location_mode;
|
||||
}
|
||||
|
||||
void
|
||||
_gtk_file_chooser_settings_set_location_mode (GtkFileChooserSettings *settings,
|
||||
LocationMode location_mode)
|
||||
{
|
||||
settings->location_mode = location_mode;
|
||||
}
|
||||
|
||||
gboolean
|
||||
_gtk_file_chooser_settings_get_show_hidden (GtkFileChooserSettings *settings)
|
||||
{
|
||||
ensure_settings_read (settings);
|
||||
return settings->show_hidden;
|
||||
}
|
||||
|
||||
void
|
||||
_gtk_file_chooser_settings_set_show_hidden (GtkFileChooserSettings *settings,
|
||||
gboolean show_hidden)
|
||||
{
|
||||
settings->show_hidden = show_hidden ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
static char *
|
||||
settings_to_markup (GtkFileChooserSettings *settings)
|
||||
{
|
||||
const char *location_mode_str;
|
||||
const char *show_hidden_str;
|
||||
|
||||
if (settings->location_mode == LOCATION_MODE_PATH_BAR)
|
||||
location_mode_str = MODE_PATH_BAR;
|
||||
else if (settings->location_mode == LOCATION_MODE_FILENAME_ENTRY)
|
||||
location_mode_str = MODE_FILENAME_ENTRY;
|
||||
else
|
||||
{
|
||||
g_assert_not_reached ();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
show_hidden_str = settings->show_hidden ? VALUE_TRUE : VALUE_FALSE;
|
||||
|
||||
return g_strdup_printf
|
||||
("<" ELEMENT_TOPLEVEL ">\n" /* <gtkfilechooser> */
|
||||
" <" ELEMENT_LOCATION " " ATTRIBUTE_MODE "=\"%s\"/>\n" /* <location mode="path-bar"/> */
|
||||
" <" ELEMENT_SHOW_HIDDEN " " ATTRIBUTE_VALUE "=\"%s\"/>\n" /* <show_hidden value="false"/> */
|
||||
"</" ELEMENT_TOPLEVEL ">\n", /* </gtkfilechooser> */
|
||||
location_mode_str,
|
||||
show_hidden_str);
|
||||
}
|
||||
|
||||
gboolean
|
||||
_gtk_file_chooser_settings_save (GtkFileChooserSettings *settings,
|
||||
GError **error)
|
||||
{
|
||||
char *contents;
|
||||
char *filename;
|
||||
char *dirname;
|
||||
gboolean retval;
|
||||
|
||||
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
||||
|
||||
contents = settings_to_markup (settings);
|
||||
|
||||
filename = get_config_filename ();
|
||||
dirname = NULL;
|
||||
|
||||
retval = FALSE;
|
||||
|
||||
if (!g_file_set_contents (filename, contents, -1, NULL))
|
||||
{
|
||||
char *dirname;
|
||||
int saved_errno;
|
||||
|
||||
/* Directory is not there? */
|
||||
|
||||
dirname = get_config_dirname ();
|
||||
if (g_mkdir_with_parents (dirname, 0700) != 0) /* 0700 per the XDG basedir spec */
|
||||
{
|
||||
saved_errno = errno;
|
||||
g_set_error (error,
|
||||
G_FILE_ERROR,
|
||||
g_file_error_from_errno (saved_errno),
|
||||
_("Could not create directory: %s"),
|
||||
dirname);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!g_file_set_contents (filename, contents, -1, error))
|
||||
goto out;
|
||||
}
|
||||
|
||||
retval = TRUE;
|
||||
|
||||
out:
|
||||
|
||||
g_free (contents);
|
||||
g_free (dirname);
|
||||
g_free (filename);
|
||||
|
||||
return retval;
|
||||
}
|
75
gtk/gtkfilechoosersettings.h
Normal file
75
gtk/gtkfilechoosersettings.h
Normal file
@@ -0,0 +1,75 @@
|
||||
/* GTK - The GIMP Toolkit
|
||||
* gtkfilechoosersettings.h: Internal settings for the GtkFileChooser widget
|
||||
* Copyright (C) 2006, Novell, Inc.
|
||||
*
|
||||
* Authors: Federico Mena-Quintero <federico@novell.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __GTK_FILE_CHOOSER_SETTINGS_H__
|
||||
#define __GTK_FILE_CHOOSER_SETTINGS_H__
|
||||
|
||||
#include <glib-object.h>
|
||||
#include "gtkfilechooserprivate.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GTK_FILE_CHOOSER_SETTINGS_TYPE (_gtk_file_chooser_settings_get_type ())
|
||||
|
||||
typedef struct _GtkFileChooserSettings GtkFileChooserSettings;
|
||||
typedef struct _GtkFileChooserSettingsClass GtkFileChooserSettingsClass;
|
||||
|
||||
struct _GtkFileChooserSettings
|
||||
{
|
||||
GObject object;
|
||||
|
||||
LocationMode location_mode;
|
||||
|
||||
guint settings_read : 1;
|
||||
|
||||
guint show_hidden : 1;
|
||||
};
|
||||
|
||||
struct _GtkFileChooserSettingsClass
|
||||
{
|
||||
GObjectClass parent_class;
|
||||
};
|
||||
|
||||
GType _gtk_file_chooser_settings_get_type (void) G_GNUC_CONST;
|
||||
|
||||
GtkFileChooserSettings *_gtk_file_chooser_settings_new (void);
|
||||
|
||||
LocationMode _gtk_file_chooser_settings_get_location_mode (GtkFileChooserSettings *settings);
|
||||
void _gtk_file_chooser_settings_set_location_mode (GtkFileChooserSettings *settings,
|
||||
LocationMode location_mode);
|
||||
|
||||
gboolean _gtk_file_chooser_settings_get_show_hidden (GtkFileChooserSettings *settings);
|
||||
void _gtk_file_chooser_settings_set_show_hidden (GtkFileChooserSettings *settings,
|
||||
gboolean show_hidden);
|
||||
|
||||
gboolean _gtk_file_chooser_settings_save (GtkFileChooserSettings *settings,
|
||||
GError **error);
|
||||
|
||||
/* FIXME: persist these options:
|
||||
*
|
||||
* - paned width
|
||||
* - show_hidden
|
||||
*/
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif
|
@@ -140,7 +140,7 @@ gtk_path_bar_init (GtkPathBar *path_bar)
|
||||
GTK_WIDGET_SET_FLAGS (path_bar, GTK_NO_WINDOW);
|
||||
gtk_widget_set_redraw_on_allocate (GTK_WIDGET (path_bar), FALSE);
|
||||
|
||||
path_bar->spacing = 3;
|
||||
path_bar->spacing = 0;
|
||||
path_bar->up_slider_button = get_slider_button (path_bar, GTK_ARROW_LEFT);
|
||||
path_bar->down_slider_button = get_slider_button (path_bar, GTK_ARROW_RIGHT);
|
||||
path_bar->icon_size = FALLBACK_ICON_SIZE;
|
||||
|
@@ -147,7 +147,9 @@ test_widgets_for_current_action (GtkFileChooserDialog *dialog,
|
||||
if (has_action (open_actions, G_N_ELEMENTS (open_actions), impl->action))
|
||||
{
|
||||
passed = passed && (impl->save_widgets == NULL
|
||||
&& impl->save_file_name_entry == NULL
|
||||
&& (impl->location_mode == LOCATION_MODE_PATH_BAR
|
||||
? impl->location_entry == NULL
|
||||
: impl->location_entry != NULL)
|
||||
&& impl->save_folder_label == NULL
|
||||
&& impl->save_folder_combo == NULL
|
||||
&& impl->save_expander == NULL
|
||||
@@ -157,10 +159,10 @@ test_widgets_for_current_action (GtkFileChooserDialog *dialog,
|
||||
{
|
||||
/* FIXME: we can't use GTK_IS_FILE_CHOOSER_ENTRY() because it uses
|
||||
* _gtk_file_chooser_entry_get_type(), which is a non-exported symbol.
|
||||
* So, we just test impl->save_file_name_entry for being non-NULL
|
||||
* So, we just test impl->location_entry for being non-NULL
|
||||
*/
|
||||
passed = passed && (GTK_IS_CONTAINER (impl->save_widgets) && GTK_WIDGET_DRAWABLE (impl->save_widgets)
|
||||
&& impl->save_file_name_entry != NULL && GTK_WIDGET_DRAWABLE (impl->save_file_name_entry)
|
||||
&& impl->location_entry != NULL && GTK_WIDGET_DRAWABLE (impl->location_entry)
|
||||
&& GTK_IS_LABEL (impl->save_folder_label) && GTK_WIDGET_DRAWABLE (impl->save_folder_label)
|
||||
&& GTK_IS_COMBO_BOX (impl->save_folder_combo) && GTK_WIDGET_DRAWABLE (impl->save_folder_combo)
|
||||
&& GTK_IS_EXPANDER (impl->save_expander) && GTK_WIDGET_DRAWABLE (impl->save_expander)
|
||||
|
Reference in New Issue
Block a user