mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-13 12:20:10 +00:00
color editor: Improve popup positioning
Don't make the popup follow the slider while it is open; that makes interaction with it unnecessarily hard. Also move all the popups inwards a little bit, so they are not flush with the scales, which looks untidy. https://bugzilla.gnome.org/show_bug.cgi?id=763380
This commit is contained in:
parent
5f00a9b4ec
commit
d345a7a60e
@ -61,6 +61,8 @@ struct _GtkColorEditorPrivate
|
||||
GtkAdjustment *v_adj;
|
||||
GtkAdjustment *a_adj;
|
||||
|
||||
gint popup_position;
|
||||
|
||||
guint text_changed : 1;
|
||||
guint use_alpha : 1;
|
||||
};
|
||||
@ -170,6 +172,7 @@ dismiss_current_popup (GtkColorEditor *editor)
|
||||
{
|
||||
gtk_widget_hide (editor->priv->current_popup);
|
||||
editor->priv->current_popup = NULL;
|
||||
editor->priv->popup_position = 0;
|
||||
if (editor->priv->popdown_focus)
|
||||
{
|
||||
gtk_widget_grab_focus (editor->priv->popdown_focus);
|
||||
@ -185,21 +188,28 @@ popup_edit (GtkWidget *widget,
|
||||
GtkWidget *popup = NULL;
|
||||
GtkWidget *toplevel;
|
||||
GtkWidget *focus;
|
||||
gint position;
|
||||
gint s, e;
|
||||
|
||||
if (widget == editor->priv->sv_plane)
|
||||
{
|
||||
popup = editor->priv->sv_popup;
|
||||
focus = editor->priv->s_entry;
|
||||
position = 0;
|
||||
}
|
||||
else if (widget == editor->priv->h_slider)
|
||||
{
|
||||
popup = editor->priv->h_popup;
|
||||
focus = editor->priv->h_entry;
|
||||
gtk_range_get_slider_range (GTK_RANGE (editor->priv->h_slider), &s, &e);
|
||||
position = (s + e) / 2;
|
||||
}
|
||||
else if (widget == editor->priv->a_slider)
|
||||
{
|
||||
popup = editor->priv->a_popup;
|
||||
focus = editor->priv->a_entry;
|
||||
gtk_range_get_slider_range (GTK_RANGE (editor->priv->a_slider), &s, &e);
|
||||
position = (s + e) / 2;
|
||||
}
|
||||
|
||||
if (popup == editor->priv->current_popup)
|
||||
@ -210,6 +220,7 @@ popup_edit (GtkWidget *widget,
|
||||
toplevel = gtk_widget_get_toplevel (GTK_WIDGET (editor));
|
||||
editor->priv->popdown_focus = gtk_window_get_focus (GTK_WINDOW (toplevel));
|
||||
editor->priv->current_popup = popup;
|
||||
editor->priv->popup_position = position;
|
||||
gtk_widget_show (popup);
|
||||
gtk_widget_grab_focus (focus);
|
||||
}
|
||||
@ -248,11 +259,14 @@ get_child_position (GtkOverlay *overlay,
|
||||
|
||||
if (widget == editor->priv->sv_popup)
|
||||
{
|
||||
gtk_widget_translate_coordinates (editor->priv->sv_plane,
|
||||
gtk_widget_get_parent (editor->priv->grid),
|
||||
0, -6,
|
||||
&allocation->x, &allocation->y);
|
||||
if (gtk_widget_get_direction (GTK_WIDGET (overlay)) == GTK_TEXT_DIR_RTL)
|
||||
allocation->x = 0;
|
||||
else
|
||||
allocation->x = gtk_widget_get_allocated_width (GTK_WIDGET (overlay)) - req.width;
|
||||
allocation->y = req.height / 3;
|
||||
}
|
||||
else if (widget == editor->priv->h_popup)
|
||||
{
|
||||
@ -262,12 +276,12 @@ get_child_position (GtkOverlay *overlay,
|
||||
if (gtk_widget_get_direction (GTK_WIDGET (overlay)) == GTK_TEXT_DIR_RTL)
|
||||
gtk_widget_translate_coordinates (editor->priv->h_slider,
|
||||
gtk_widget_get_parent (editor->priv->grid),
|
||||
- req.width, (s + e - req.height) / 2,
|
||||
- req.width - 6, editor->priv->popup_position - req.height / 2,
|
||||
&allocation->x, &allocation->y);
|
||||
else
|
||||
gtk_widget_translate_coordinates (editor->priv->h_slider,
|
||||
gtk_widget_get_parent (editor->priv->grid),
|
||||
alloc.width, (s + e - req.height) / 2,
|
||||
alloc.width + 6, editor->priv->popup_position - req.height / 2,
|
||||
&allocation->x, &allocation->y);
|
||||
}
|
||||
else if (widget == editor->priv->a_popup)
|
||||
@ -277,7 +291,7 @@ get_child_position (GtkOverlay *overlay,
|
||||
|
||||
gtk_widget_translate_coordinates (editor->priv->a_slider,
|
||||
gtk_widget_get_parent (editor->priv->grid),
|
||||
(s + e - req.width) / 2, - req.height,
|
||||
editor->priv->popup_position - req.width / 2, - req.height - 6,
|
||||
&allocation->x, &allocation->y);
|
||||
}
|
||||
else
|
||||
|
Loading…
Reference in New Issue
Block a user