summaryrefslogtreecommitdiffstats
path: root/gtk/src/presets.c
diff options
context:
space:
mode:
authorJohn Stebbins <[email protected]>2019-07-24 15:03:22 -0700
committerJohn Stebbins <[email protected]>2019-07-26 12:57:20 -0700
commita1d064d2f01d963213b1336c0aeda9e7a1a6817f (patch)
tree3857d6faaa5c61a71d1106403f1cbf74ba93d992 /gtk/src/presets.c
parent30b59112b75ef6572615db032fb461d9e9c51fa2 (diff)
LinGui: WIP gtk4 support
Known issues and todo: notebooks, use GtkNotebookPage semantics in ui file fix keypress delete in queue_list fix dest_file grab-focus? (highlight of filename for editing) focus-in/out with GtkEventControllerKey preview_state_cb how to handle icon-ified preview? preview_configure_cb, saving preview window size? accelerator alt-d grab-focus destination key-press-event in chapter list, ghbcellrenderertext -> GtkEventControllerKey Why doesn't summary preview image scale correctly? "System" in about dialog? why is the tab there when "system" prop not set? GtkSeparatorToolitem seems to ignore "draw" prop?
Diffstat (limited to 'gtk/src/presets.c')
-rw-r--r--gtk/src/presets.c156
1 files changed, 113 insertions, 43 deletions
diff --git a/gtk/src/presets.c b/gtk/src/presets.c
index a088094d5..c35933334 100644
--- a/gtk/src/presets.c
+++ b/gtk/src/presets.c
@@ -1144,6 +1144,53 @@ get_selected_path(signal_user_data_t *ud)
return NULL;
}
+G_MODULE_EXPORT gboolean
+presets_window_delete_cb(
+ GtkWidget *xwidget,
+#if !GTK_CHECK_VERSION(3, 90, 0)
+ GdkEvent *event,
+#endif
+ signal_user_data_t *ud)
+{
+ GSimpleAction * action;
+ GVariant * state = g_variant_new_boolean(FALSE);
+
+ action = G_SIMPLE_ACTION(g_action_map_lookup_action(
+ G_ACTION_MAP(ud->app), "show-presets"));
+ g_action_change_state(G_ACTION(action), state);
+ return TRUE;
+}
+
+G_MODULE_EXPORT void
+presets_sz_alloc_cb(
+ GtkWidget *widget,
+#if GTK_CHECK_VERSION(3, 90, 0)
+ int width,
+ int height,
+ int baseline,
+#else
+ GdkRectangle *rect,
+#endif
+ signal_user_data_t *ud)
+{
+ if (gtk_widget_get_visible(widget))
+ {
+ gint w, h, ww, wh;
+ w = ghb_dict_get_int(ud->prefs, "presets_window_width");
+ h = ghb_dict_get_int(ud->prefs, "presets_window_height");
+
+ gtk_window_get_size(GTK_WINDOW(widget), &ww, &wh);
+ if ( w != ww || h != wh )
+ {
+ ghb_dict_set_int(ud->prefs, "presets_window_width", ww);
+ ghb_dict_set_int(ud->prefs, "presets_window_height", wh);
+ ghb_pref_set(ud->prefs, "presets_window_width");
+ ghb_pref_set(ud->prefs, "presets_window_height");
+ ghb_prefs_store();
+ }
+ }
+}
+
G_MODULE_EXPORT void
preset_select_action_cb(GSimpleAction *action, GVariant *param,
signal_user_data_t *ud)
@@ -2132,7 +2179,7 @@ preset_rename_action_cb(GSimpleAction *action, GVariant *param,
dialog = GHB_WIDGET(ud->builder, "preset_rename_dialog");
entry = GTK_ENTRY(GHB_WIDGET(ud->builder, "PresetReName"));
- gtk_entry_set_text(entry, name);
+ ghb_entry_set_text(entry, name);
response = gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_hide(dialog);
@@ -2143,7 +2190,7 @@ preset_rename_action_cb(GSimpleAction *action, GVariant *param,
char * desc;
// save the new name
- name = gtk_entry_get_text(entry);
+ name = ghb_entry_get_text(entry);
dict = hb_preset_get(path);
if (dict != NULL)
{
@@ -2248,7 +2295,7 @@ static void preset_save_action(signal_user_data_t *ud, gboolean as)
dialog = GHB_WIDGET(ud->builder, "preset_save_dialog");
entry = GTK_ENTRY(GHB_WIDGET(ud->builder, "PresetName"));
- gtk_entry_set_text(entry, name);
+ ghb_entry_set_text(entry, name);
widget = GHB_WIDGET(ud->builder, "PresetName");
gtk_widget_set_sensitive(widget, as);
@@ -2267,12 +2314,12 @@ static void preset_save_action(signal_user_data_t *ud, gboolean as)
gboolean def;
// save the preset
- name = gtk_entry_get_text(entry);
+ name = ghb_entry_get_text(entry);
category = ghb_dict_get_string(ud->settings, "PresetCategory");
if (!strcmp(category, "new"))
{
entry = GTK_ENTRY(GHB_WIDGET(ud->builder, "PresetCategoryName"));
- category = gtk_entry_get_text(entry);
+ category = ghb_entry_get_text(entry);
}
if (category == NULL || category[0] == 0)
{
@@ -2316,9 +2363,9 @@ preset_save_set_ok_sensitive(signal_user_data_t *ud)
category = ghb_dict_get_string(ud->settings, "PresetCategory");
entry = GTK_ENTRY(GHB_WIDGET(ud->builder, "PresetName"));
- name = gtk_entry_get_text(entry);
+ name = ghb_entry_get_text(entry);
entry = GTK_ENTRY(GHB_WIDGET(ud->builder, "PresetCategoryName"));
- category_name = gtk_entry_get_text(entry);
+ category_name = ghb_entry_get_text(entry);
sensitive = name[0] && (strcmp(category, "new") || category_name[0]);
gtk_widget_set_sensitive(ok_button, sensitive);
@@ -2435,6 +2482,14 @@ preset_remove_action_cb(GSimpleAction *action, GVariant *param,
// controls where valid drop locations are
G_MODULE_EXPORT gboolean
+#if GTK_CHECK_VERSION(3, 90, 0)
+presets_drag_motion_cb(
+ GtkTreeView *tv,
+ GdkDrop *ctx,
+ gint x,
+ gint y,
+ signal_user_data_t *ud)
+#else
presets_drag_motion_cb(
GtkTreeView *tv,
GdkDragContext *ctx,
@@ -2442,6 +2497,7 @@ presets_drag_motion_cb(
gint y,
guint time,
signal_user_data_t *ud)
+#endif
{
GtkTreeViewDropPosition drop_pos;
GtkTreeIter iter;
@@ -2454,13 +2510,29 @@ presets_drag_motion_cb(
gboolean src_folder, dst_folder;
GhbValue *src_preset, *dst_preset;
GtkWidget *widget;
+#if GTK_CHECK_VERSION(3, 90, 0)
+ // Dummy time for backwards compatibility
+ guint time = 0;
+#endif
+ treepath = g_object_get_data(G_OBJECT(tv), "dst-tree-path");
+ if (treepath != NULL)
+ {
+ gtk_tree_path_free(treepath);
+ }
+ g_object_set_data(G_OBJECT(tv), "dst-tree-path", NULL);
+
+#if GTK_CHECK_VERSION(3, 90, 0)
+ GdkDrag *drag_ctx = gdk_drop_get_drag(ctx);
+ widget = gtk_drag_get_source_widget(drag_ctx);
+#else
widget = gtk_drag_get_source_widget(ctx);
+#endif
if (widget == NULL || widget != GTK_WIDGET(tv))
return TRUE;
// Get the type of the object being dragged
- srctv = GTK_TREE_VIEW(gtk_drag_get_source_widget(ctx));
+ srctv = GTK_TREE_VIEW(widget);
select = gtk_tree_view_get_selection(srctv);
gtk_tree_selection_get_selected(select, &model, &iter);
path = ghb_tree_get_index(model, &iter);
@@ -2469,7 +2541,7 @@ presets_drag_motion_cb(
free(path);
if (src_preset == NULL)
{
- gdk_drag_status(ctx, 0, time);
+ ghb_drag_status(ctx, 0, time);
return TRUE;
}
@@ -2481,14 +2553,14 @@ presets_drag_motion_cb(
gtk_tree_view_get_dest_row_at_pos(tv, x, y, &treepath, &drop_pos);
if (treepath == NULL)
{
- gdk_drag_status(ctx, 0, time);
+ ghb_drag_status(ctx, 0, time);
return TRUE;
}
// Don't allow repositioning of builtin presets
if (src_ptype != HB_PRESET_TYPE_CUSTOM)
{
gtk_tree_view_set_drag_dest_row(tv, NULL, drop_pos);
- gdk_drag_status(ctx, 0, time);
+ ghb_drag_status(ctx, 0, time);
gtk_tree_path_free(treepath);
return TRUE;
}
@@ -2498,7 +2570,7 @@ presets_drag_motion_cb(
free(path);
if (dst_preset == NULL)
{
- gdk_drag_status(ctx, 0, time);
+ ghb_drag_status(ctx, 0, time);
gtk_tree_path_free(treepath);
return TRUE;
}
@@ -2510,7 +2582,7 @@ presets_drag_motion_cb(
if (dst_ptype != HB_PRESET_TYPE_CUSTOM)
{
gtk_tree_view_set_drag_dest_row(tv, NULL, drop_pos);
- gdk_drag_status(ctx, 0, time);
+ ghb_drag_status(ctx, 0, time);
gtk_tree_path_free(treepath);
return TRUE;
}
@@ -2524,7 +2596,7 @@ presets_drag_motion_cb(
free(path);
if (dst_preset == NULL)
{
- gdk_drag_status(ctx, 0, time);
+ ghb_drag_status(ctx, 0, time);
gtk_tree_path_free(treepath);
return TRUE;
}
@@ -2550,7 +2622,7 @@ presets_drag_motion_cb(
if (!src_folder && dst_folder && drop_pos == GTK_TREE_VIEW_DROP_BEFORE)
{
gtk_tree_view_set_drag_dest_row(tv, NULL, drop_pos);
- gdk_drag_status(ctx, 0, time);
+ ghb_drag_status(ctx, 0, time);
gtk_tree_path_free(treepath);
return TRUE;
}
@@ -2561,14 +2633,24 @@ presets_drag_motion_cb(
}
gtk_tree_view_set_drag_dest_row(tv, treepath, drop_pos);
- gtk_tree_path_free(treepath);
- gdk_drag_status(ctx, GDK_ACTION_MOVE, time);
+ ghb_drag_status(ctx, GDK_ACTION_MOVE, time);
+
+ g_object_set_data(G_OBJECT(tv), "dst-tree-path", treepath);
+ g_object_set_data(G_OBJECT(tv), "dst-drop-pos", (gpointer)drop_pos);
+
return TRUE;
}
G_MODULE_EXPORT void
-presets_drag_cb(
- GtkTreeView *dst_widget,
+#if GTK_CHECK_VERSION(3, 90, 0)
+presets_drag_data_received_cb(
+ GtkTreeView *tv,
+ GdkDrop *dc,
+ GtkSelectionData *selection_data,
+ signal_user_data_t *ud)
+#else
+presets_drag_data_received_cb(
+ GtkTreeView *tv,
GdkDragContext *dc,
gint x,
gint y,
@@ -2576,37 +2658,20 @@ presets_drag_cb(
guint info,
guint t,
signal_user_data_t *ud)
+#endif
{
+ GtkTreeModel *dst_model;
GtkTreePath *dst_treepath = NULL;
GtkTreeViewDropPosition drop_pos;
GtkTreeIter dst_iter, src_iter;
gint src_ptype;
gboolean src_folder, dst_folder;
- GtkTreeModel *dst_model = gtk_tree_view_get_model(dst_widget);
-
- // This doesn't work here for some reason...
- // gtk_tree_view_get_drag_dest_row(dstwidget, &path, &drop_pos);
- gtk_tree_view_get_dest_row_at_pos(dst_widget, x, y,
- &dst_treepath, &drop_pos);
- // This little hack is needed because attempting to drop after
- // the last item gives us no dst_treepath or drop_pos.
- if (dst_treepath == NULL)
- {
- gint n_children;
-
- n_children = gtk_tree_model_iter_n_children(dst_model, NULL);
- if (n_children)
- {
- drop_pos = GTK_TREE_VIEW_DROP_AFTER;
- dst_treepath = gtk_tree_path_new_from_indices(n_children-1, -1);
- }
- else
- {
- drop_pos = GTK_TREE_VIEW_DROP_BEFORE;
- dst_treepath = gtk_tree_path_new_from_indices(0, -1);
- }
- }
+ dst_model = gtk_tree_view_get_model(tv);
+ dst_treepath = g_object_get_data(G_OBJECT(tv), "dst-tree-path");
+ drop_pos = (GtkTreeViewDropPosition)g_object_get_data(G_OBJECT(tv),
+ "dst-drop-pos");
+ g_object_set_data(G_OBJECT(tv), "dst-tree-path", NULL);
if (dst_treepath == NULL)
{
return;
@@ -2617,7 +2682,12 @@ presets_drag_cb(
GtkTreeSelection *select;
hb_preset_index_t *dst_path, *src_path;
+#if GTK_CHECK_VERSION(3, 90, 0)
+ GdkDrag *drag_ctx = gdk_drop_get_drag(dc);
+ src_widget = GTK_TREE_VIEW(gtk_drag_get_source_widget(drag_ctx));
+#else
src_widget = GTK_TREE_VIEW(gtk_drag_get_source_widget(dc));
+#endif
select = gtk_tree_view_get_selection (src_widget);
gtk_tree_selection_get_selected(select, &src_model, &src_iter);