1
0
Fork 0
mirror of https://gitlab.gnome.org/GNOME/calls.git synced 2024-09-29 15:25:24 +00:00

calls-main-window: Use HdyViewSwitcher and friends

Use HdyViewSwitcher to navigate between the dial pad, call history and
a contacts list.

Closes #56
This commit is contained in:
Bob Ham 2019-07-03 13:34:48 +01:00
parent dbebc17dbd
commit 251e3b0076
2 changed files with 149 additions and 73 deletions

View file

@ -49,8 +49,12 @@ struct _CallsMainWindow
GtkInfoBar *info;
GtkLabel *info_label;
HdySqueezer *squeezer;
GtkLabel *title_label;
HdyViewSwitcher *wide_switcher;
HdyViewSwitcher *narrow_switcher;
HdyViewSwitcherBar *switcher_bar;
GtkStack *main_stack;
GtkStack *header_bar_stack;
};
G_DEFINE_TYPE (CallsMainWindow, calls_main_window, GTK_TYPE_APPLICATION_WINDOW);
@ -107,46 +111,12 @@ about_action (GSimpleAction *action,
}
static void
new_call_action (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
CallsMainWindow *self = user_data;
gtk_stack_set_visible_child_name (self->header_bar_stack, "new-call");
}
static void
back_action (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
CallsMainWindow *self = user_data;
gtk_stack_set_visible_child_name (self->header_bar_stack, "history");
}
static const GActionEntry window_entries [] =
{
{ "about", about_action },
{ "new-call", new_call_action },
{ "back", back_action },
};
CallsMainWindow *
calls_main_window_new (GtkApplication *application, CallsProvider *provider)
{
return g_object_new (CALLS_TYPE_MAIN_WINDOW,
"application", application,
"provider", provider,
NULL);
}
static gboolean
show_message_timeout_cb (CallsMainWindow *self)
{
@ -202,6 +172,18 @@ call_removed_cb (CallsMainWindow *self, CallsCall *call, const gchar *reason)
}
static gboolean
set_switcher_bar_reveal (GBinding *binding,
const GValue *from_value,
GValue *to_value,
gpointer title_label)
{
g_value_set_boolean (to_value, g_value_get_object (from_value) == title_label);
return TRUE;
}
static void
set_property (GObject *object,
guint property_id,
@ -264,7 +246,12 @@ constructed (GObject *object)
/* Add new call box */
new_call_box = calls_new_call_box_new (self->provider);
gtk_stack_add_titled (self->main_stack, GTK_WIDGET (new_call_box),
"new-call", _("New call"));
"dial-pad", _("Dial pad"));
gtk_container_child_set (GTK_CONTAINER (self->main_stack),
GTK_WIDGET (new_call_box),
"icon-name", "input-dialpad-symbolic",
NULL);
gtk_stack_set_visible_child_name (self->main_stack, "dial-pad");
/* Add actions */
simple_action_group = g_simple_action_group_new ();
@ -277,22 +264,21 @@ constructed (GObject *object)
G_ACTION_GROUP (simple_action_group));
g_object_unref (simple_action_group);
// FIXME: if (no history)
{
new_call_action (NULL, NULL, self);
}
g_object_bind_property_full (self->squeezer,
"visible-child",
self->switcher_bar,
"reveal",
G_BINDING_SYNC_CREATE,
set_switcher_bar_reveal,
NULL,
self->title_label,
NULL);
parent_class->constructed (object);
}
static void
calls_main_window_init (CallsMainWindow *self)
{
gtk_widget_init_template (GTK_WIDGET (self));
}
static void
dispose (GObject *object)
{
@ -306,6 +292,24 @@ dispose (GObject *object)
}
static void
size_allocate (GtkWidget *widget,
GtkAllocation *allocation)
{
CallsMainWindow *self = CALLS_MAIN_WINDOW (widget);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (calls_main_window_parent_class);
hdy_squeezer_set_child_enabled (self->squeezer,
GTK_WIDGET (self->wide_switcher),
allocation->width > 600);
hdy_squeezer_set_child_enabled (self->squeezer,
GTK_WIDGET (self->narrow_switcher),
allocation->width > 400);
widget_class->size_allocate (widget, allocation);
}
static void
calls_main_window_class_init (CallsMainWindowClass *klass)
{
@ -326,11 +330,37 @@ calls_main_window_class_init (CallsMainWindowClass *klass)
g_object_class_install_properties (object_class, PROP_LAST_PROP, props);
widget_class->size_allocate = size_allocate;
gtk_widget_class_set_template_from_resource (widget_class, "/sm/puri/calls/ui/main-window.ui");
gtk_widget_class_bind_template_child (widget_class, CallsMainWindow, info_revealer);
gtk_widget_class_bind_template_child (widget_class, CallsMainWindow, info);
gtk_widget_class_bind_template_child (widget_class, CallsMainWindow, info_label);
gtk_widget_class_bind_template_child (widget_class, CallsMainWindow, squeezer);
gtk_widget_class_bind_template_child (widget_class, CallsMainWindow, title_label);
gtk_widget_class_bind_template_child (widget_class, CallsMainWindow, wide_switcher);
gtk_widget_class_bind_template_child (widget_class, CallsMainWindow, narrow_switcher);
gtk_widget_class_bind_template_child (widget_class, CallsMainWindow, switcher_bar);
gtk_widget_class_bind_template_child (widget_class, CallsMainWindow, main_stack);
gtk_widget_class_bind_template_child (widget_class, CallsMainWindow, header_bar_stack);
gtk_widget_class_bind_template_callback (widget_class, info_response_cb);
}
static void
calls_main_window_init (CallsMainWindow *self)
{
gtk_widget_init_template (GTK_WIDGET (self));
}
CallsMainWindow *
calls_main_window_new (GtkApplication *application, CallsProvider *provider)
{
g_return_val_if_fail (GTK_IS_APPLICATION (application), NULL);
g_return_val_if_fail (CALLS_IS_PROVIDER (provider), NULL);
return g_object_new (CALLS_TYPE_MAIN_WINDOW,
"application", application,
"provider", provider,
NULL);
}

View file

@ -67,45 +67,91 @@
</object>
</child>
<child>
<object class="GtkStack" id="main_stack">
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="CallsHistoryBox" id="history_view">
<object class="GtkStack" id="main_stack">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_focus">False</property>
<property name="expand">True</property>
<child>
<object class="CallsHistoryBox" id="history_view">
<property name="visible">True</property>
<property name="can_focus">True</property>
</object>
<packing>
<property name="name">recent</property>
<property name="title" translatable="yes">Recent</property>
<property name="icon_name">document-open-recent</property>
</packing>
</child>
<child>
<object class="GtkBox" id="contacts">
<property name="visible">True</property>
<property name="can_focus">True</property>
</object>
<packing>
<property name="name">contacts</property>
<property name="title" translatable="yes">Contacts</property>
<property name="icon_name">system-users</property>
</packing>
</child>
</object>
</child>
<child>
<object class="HdyViewSwitcherBar" id="switcher_bar">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stack">main_stack</property>
<property name="reveal">True</property>
</object>
<packing>
<property name="name">history</property>
<property name="title" translatable="yes">History</property>
</packing>
</child>
</object>
</child>
</object>
</child>
<child type="titlebar">
<object class="GtkStack" id="header_bar_stack">
<property name="can_focus">False</property>
<object class="HdyHeaderBar">
<property name="visible">True</property>
<property name="visible_child_name" bind-source="main_stack" bind-property="visible_child_name" bind-flags="bidirectional|sync-create"/>
<child>
<object class="CallsHistoryHeaderBar" id="history_header_bar">
<property name="can_focus">False</property>
<property name="centering_policy">strict</property>
<property name="can_focus">False</property>
<property name="show_close_button">True</property>
<property name="title">Calls</property>
<child type="title">
<object class="HdySqueezer" id="squeezer">
<property name="visible">True</property>
<property name="transition-type">crossfade</property>
<child>
<object class="HdyViewSwitcher" id="wide_switcher">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">center</property>
<property name="policy">wide</property>
<property name="stack">main_stack</property>
</object>
</child>
<child>
<object class="HdyViewSwitcher" id="narrow_switcher">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">center</property>
<property name="policy">narrow</property>
<property name="stack">main_stack</property>
</object>
</child>
<child>
<object class="GtkLabel" id="title_label">
<property name="visible">True</property>
<property name="halign">center</property>
<property name="label">Calls</property>
<style>
<class name="title"/>
</style>
</object>
</child>
</object>
<packing>
<property name="name">history</property>
</packing>
</child>
<child>
<object class="CallsNewCallHeaderBar" id="new_call_header_bar">
<property name="can_focus">False</property>
<property name="visible">True</property>
</object>
<packing>
<property name="name">new-call</property>
</packing>
</child>
</object>
</child>