diff --git a/data/new-call-symbolic.svg b/data/new-call-symbolic.svg new file mode 100644 index 0000000..945c1e8 --- /dev/null +++ b/data/new-call-symbolic.svg @@ -0,0 +1,17 @@ + + + + + + + image/svg+xml + + + + + + + + + + \ No newline at end of file diff --git a/src/calls-call-display.c b/src/calls-call-display.c index a8c3431..4fee4fa 100644 --- a/src/calls-call-display.c +++ b/src/calls-call-display.c @@ -41,16 +41,17 @@ struct _CallsCallDisplay GTimer *timer; guint timeout; + GtkLabel *incoming_phone_call; GtkBox *party_box; GtkLabel *primary_contact_info; GtkLabel *secondary_contact_info; GtkLabel *status; - GtkLabel *time; - GtkButton *answer; - GtkToggleButton *mute; + GtkBox *controls; + GtkBox *gsm_controls; + GtkBox *general_controls; GtkButton *hang_up; - GtkToggleButton *speaker; + GtkButton *answer; GtkRevealer *dial_pad_revealer; }; @@ -88,6 +89,12 @@ hang_up_clicked_cb (GtkButton *button, } } +static void +hold_toggled_cb (GtkToggleButton *togglebutton, + CallsCallDisplay *self) +{ +} + static void mute_toggled_cb (GtkToggleButton *togglebutton, CallsCallDisplay *self) @@ -101,6 +108,13 @@ speaker_toggled_cb (GtkToggleButton *togglebutton, } +static void +add_call_clicked_cb (GtkButton *button, + CallsCallDisplay *self) +{ +} + + static void dial_pad_symbol_clicked_cb (CallsCallDisplay *self, gchar symbol, @@ -157,7 +171,7 @@ timeout_cb (CallsCallDisplay *self) g_string_append_printf (str, "%02u", (guint)elapsed); - gtk_label_set_text (self->time, str->str); + gtk_label_set_text (self->status, str->str); g_string_free (str, TRUE); return TRUE; @@ -167,38 +181,91 @@ timeout_cb (CallsCallDisplay *self) #undef MINUTE } + +static void +stop_timeout (CallsCallDisplay *self) +{ + if (self->timeout == 0) + { + return; + } + + g_source_remove (self->timeout); + self->timeout = 0; +} + + static void call_state_changed_cb (CallsCallDisplay *self, CallsCallState state) { - GString *state_str = g_string_new(""); + GtkStyleContext *hang_up_style; g_return_if_fail (CALLS_IS_CALL_DISPLAY (self)); - calls_call_state_to_string (state_str, state); - gtk_label_set_text (self->status, state_str->str); - g_debug ("Call state changed to `%s'", state_str->str); - g_string_free (state_str, TRUE); + hang_up_style = gtk_widget_get_style_context + (GTK_WIDGET (self->hang_up)); + /* Widgets */ switch (state) { case CALLS_CALL_STATE_INCOMING: + gtk_widget_hide (GTK_WIDGET (self->status)); + gtk_widget_hide (GTK_WIDGET (self->controls)); + gtk_widget_show (GTK_WIDGET (self->incoming_phone_call)); gtk_widget_show (GTK_WIDGET (self->answer)); - gtk_widget_hide (GTK_WIDGET (self->mute)); - gtk_widget_hide (GTK_WIDGET (self->speaker)); + gtk_style_context_remove_class + (hang_up_style, GTK_STYLE_CLASS_DESTRUCTIVE_ACTION); break; - case CALLS_CALL_STATE_ACTIVE: - case CALLS_CALL_STATE_HELD: + case CALLS_CALL_STATE_DIALING: case CALLS_CALL_STATE_ALERTING: + case CALLS_CALL_STATE_ACTIVE: + case CALLS_CALL_STATE_HELD: case CALLS_CALL_STATE_WAITING: + gtk_style_context_add_class + (hang_up_style, GTK_STYLE_CLASS_DESTRUCTIVE_ACTION); gtk_widget_hide (GTK_WIDGET (self->answer)); - gtk_widget_show (GTK_WIDGET (self->mute)); - gtk_widget_show (GTK_WIDGET (self->speaker)); + gtk_widget_hide (GTK_WIDGET (self->incoming_phone_call)); + gtk_widget_show (GTK_WIDGET (self->controls)); + gtk_widget_show (GTK_WIDGET (self->status)); + + gtk_widget_set_visible + (GTK_WIDGET (self->gsm_controls), + state != CALLS_CALL_STATE_DIALING + && state != CALLS_CALL_STATE_ALERTING); break; + case CALLS_CALL_STATE_DISCONNECTED: break; } + + /* Status text */ + switch (state) + { + case CALLS_CALL_STATE_INCOMING: + break; + + case CALLS_CALL_STATE_DIALING: + case CALLS_CALL_STATE_ALERTING: + gtk_label_set_text (self->status, _("Calling...")); + break; + + case CALLS_CALL_STATE_ACTIVE: + case CALLS_CALL_STATE_HELD: + case CALLS_CALL_STATE_WAITING: + if (self->timeout == 0) + { + self->timeout = g_timeout_add + (500, (GSourceFunc)timeout_cb, self); + timeout_cb (self); + } + break; + + case CALLS_CALL_STATE_DISCONNECTED: + stop_timeout (self); + break; + } } @@ -230,7 +297,7 @@ set_party (CallsCallDisplay *self, CallsParty *party) const gchar *name, *number; image = calls_party_create_image (party); - gtk_box_pack_end (self->party_box, image, TRUE, FALSE, 0); + gtk_box_pack_end (self->party_box, image, TRUE, TRUE, 0); gtk_image_set_pixel_size (GTK_IMAGE (image), 100); gtk_widget_show (image); @@ -276,8 +343,6 @@ constructed (GObject *object) CallsCallDisplay *self = CALLS_CALL_DISPLAY (object); self->timer = g_timer_new (); - self->timeout = g_timeout_add (500, (GSourceFunc)timeout_cb, self); - timeout_cb (self); call_state_changed_cb (self, calls_call_get_state (self->call)); @@ -296,6 +361,7 @@ dispose (GObject *object) GObjectClass *parent_class = g_type_class_peek (GTK_TYPE_OVERLAY); CallsCallDisplay *self = CALLS_CALL_DISPLAY (object); + stop_timeout (self); g_clear_object (&self->call); parent_class->dispose (object); @@ -307,7 +373,6 @@ finalize (GObject *object) GObjectClass *parent_class = g_type_class_peek (GTK_TYPE_OVERLAY); CallsCallDisplay *self = CALLS_CALL_DISPLAY (object); - g_source_remove (self->timeout); g_timer_destroy (self->timer); parent_class->finalize (object); @@ -335,20 +400,23 @@ calls_call_display_class_init (CallsCallDisplayClass *klass) gtk_widget_class_set_template_from_resource (widget_class, "/sm/puri/calls/ui/call-display.ui"); + gtk_widget_class_bind_template_child (widget_class, CallsCallDisplay, incoming_phone_call); gtk_widget_class_bind_template_child (widget_class, CallsCallDisplay, party_box); gtk_widget_class_bind_template_child (widget_class, CallsCallDisplay, primary_contact_info); gtk_widget_class_bind_template_child (widget_class, CallsCallDisplay, secondary_contact_info); gtk_widget_class_bind_template_child (widget_class, CallsCallDisplay, status); - gtk_widget_class_bind_template_child (widget_class, CallsCallDisplay, time); - gtk_widget_class_bind_template_child (widget_class, CallsCallDisplay, answer); - gtk_widget_class_bind_template_child (widget_class, CallsCallDisplay, mute); + gtk_widget_class_bind_template_child (widget_class, CallsCallDisplay, controls); + gtk_widget_class_bind_template_child (widget_class, CallsCallDisplay, gsm_controls); + gtk_widget_class_bind_template_child (widget_class, CallsCallDisplay, general_controls); gtk_widget_class_bind_template_child (widget_class, CallsCallDisplay, hang_up); - gtk_widget_class_bind_template_child (widget_class, CallsCallDisplay, speaker); + gtk_widget_class_bind_template_child (widget_class, CallsCallDisplay, answer); gtk_widget_class_bind_template_child (widget_class, CallsCallDisplay, dial_pad_revealer); gtk_widget_class_bind_template_callback (widget_class, answer_clicked_cb); gtk_widget_class_bind_template_callback (widget_class, hang_up_clicked_cb); + gtk_widget_class_bind_template_callback (widget_class, hold_toggled_cb); gtk_widget_class_bind_template_callback (widget_class, mute_toggled_cb); gtk_widget_class_bind_template_callback (widget_class, speaker_toggled_cb); + gtk_widget_class_bind_template_callback (widget_class, add_call_clicked_cb); gtk_widget_class_bind_template_callback (widget_class, dial_pad_symbol_clicked_cb); gtk_widget_class_bind_template_callback (widget_class, hide_dial_pad_clicked_cb); } diff --git a/src/calls-call-window.c b/src/calls-call-window.c index ee82382..2c57a10 100644 --- a/src/calls-call-window.c +++ b/src/calls-call-window.c @@ -45,6 +45,8 @@ struct _CallsCallWindow GListStore *call_holders; + GtkRevealer *info_revealer; + guint info_timeout; GtkInfoBar *info; GtkLabel *info_label; @@ -85,6 +87,15 @@ update_visibility (CallsCallWindow *self) } +static gboolean +show_message_timeout_cb (CallsCallWindow *self) +{ + gtk_revealer_set_reveal_child (self->info_revealer, FALSE); + self->info_timeout = 0; + return FALSE; +} + + static void show_message (CallsCallWindow *self, const gchar *text, @@ -92,8 +103,27 @@ show_message (CallsCallWindow *self, { gtk_info_bar_set_message_type (self->info, type); gtk_label_set_text (self->info_label, text); - gtk_widget_show (GTK_WIDGET (self->info)); - gtk_widget_queue_allocate (GTK_WIDGET (self)); + gtk_revealer_set_reveal_child (self->info_revealer, TRUE); + + if (self->info_timeout) + { + g_source_remove (self->info_timeout); + } + self->info_timeout = g_timeout_add_seconds + (3, + (GSourceFunc)show_message_timeout_cb, + self); +} + + +static inline void +stop_info_timeout (CallsCallWindow *self) +{ + if (self->info_timeout) + { + g_source_remove (self->info_timeout); + self->info_timeout = 0; + } } @@ -102,8 +132,8 @@ info_response_cb (GtkInfoBar *infobar, gint response_id, CallsCallWindow *self) { - gtk_widget_hide (GTK_WIDGET (self->info)); - gtk_widget_queue_allocate (GTK_WIDGET (self)); + stop_info_timeout (self); + gtk_revealer_set_reveal_child (self->info_revealer, FALSE); } @@ -376,6 +406,7 @@ dispose (GObject *object) } g_clear_object (&self->call_holders); + stop_info_timeout (self); parent_class->dispose (object); } @@ -401,6 +432,7 @@ calls_call_window_class_init (CallsCallWindowClass *klass) g_object_class_install_properties (object_class, PROP_LAST_PROP, props); gtk_widget_class_set_template_from_resource (widget_class, "/sm/puri/calls/ui/call-window.ui"); + gtk_widget_class_bind_template_child (widget_class, CallsCallWindow, info_revealer); gtk_widget_class_bind_template_child (widget_class, CallsCallWindow, info); gtk_widget_class_bind_template_child (widget_class, CallsCallWindow, info_label); gtk_widget_class_bind_template_child (widget_class, CallsCallWindow, main_stack); diff --git a/src/calls-call.h b/src/calls-call.h index 23dd148..9e51913 100644 --- a/src/calls-call.h +++ b/src/calls-call.h @@ -35,7 +35,7 @@ G_DECLARE_INTERFACE (CallsCall, calls_call, CALLS, CALL, GObject); typedef enum { - CALLS_CALL_STATE_ACTIVE, + CALLS_CALL_STATE_ACTIVE = 1, CALLS_CALL_STATE_HELD, CALLS_CALL_STATE_DIALING, CALLS_CALL_STATE_ALERTING, diff --git a/src/calls-main-window.c b/src/calls-main-window.c index 7336eca..b981053 100644 --- a/src/calls-main-window.c +++ b/src/calls-main-window.c @@ -44,6 +44,8 @@ struct _CallsMainWindow CallsProvider *provider; + GtkRevealer *info_revealer; + guint info_timeout; GtkInfoBar *info; GtkLabel *info_label; @@ -145,13 +147,41 @@ calls_main_window_new (GtkApplication *application, CallsProvider *provider) } +static gboolean +show_message_timeout_cb (CallsMainWindow *self) +{ + gtk_revealer_set_reveal_child (self->info_revealer, FALSE); + self->info_timeout = 0; + return FALSE; +} + + static void show_message (CallsMainWindow *self, const gchar *text, GtkMessageType type) { gtk_info_bar_set_message_type (self->info, type); gtk_label_set_text (self->info_label, text); - gtk_widget_show (GTK_WIDGET (self->info)); - gtk_widget_queue_allocate (GTK_WIDGET (self)); + gtk_revealer_set_reveal_child (self->info_revealer, TRUE); + + if (self->info_timeout) + { + g_source_remove (self->info_timeout); + } + self->info_timeout = g_timeout_add_seconds + (3, + (GSourceFunc)show_message_timeout_cb, + self); +} + + +static inline void +stop_info_timeout (CallsMainWindow *self) +{ + if (self->info_timeout) + { + g_source_remove (self->info_timeout); + self->info_timeout = 0; + } } @@ -160,8 +190,8 @@ info_response_cb (GtkInfoBar *infobar, gint response_id, CallsMainWindow *self) { - gtk_widget_hide (GTK_WIDGET (self->info)); - gtk_widget_queue_allocate (GTK_WIDGET (self)); + stop_info_timeout (self); + gtk_revealer_set_reveal_child (self->info_revealer, FALSE); } @@ -269,6 +299,7 @@ dispose (GObject *object) GObjectClass *parent_class = g_type_class_peek (GTK_TYPE_APPLICATION_WINDOW); CallsMainWindow *self = CALLS_MAIN_WINDOW (object); + stop_info_timeout (self); g_clear_object (&self->provider); parent_class->dispose (object); @@ -296,6 +327,7 @@ calls_main_window_class_init (CallsMainWindowClass *klass) 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, main_stack); diff --git a/src/calls.gresources.xml b/src/calls.gresources.xml index 73577f7..34bc78e 100644 --- a/src/calls.gresources.xml +++ b/src/calls.gresources.xml @@ -11,4 +11,7 @@ new-call-box.ui new-call-header-bar.ui + + new-call-symbolic.svg + diff --git a/src/meson.build b/src/meson.build index 1e109a2..86880ce 100644 --- a/src/meson.build +++ b/src/meson.build @@ -76,7 +76,7 @@ calls_enum_sources = gnome.mkenums_simple('enum-types', calls_resources = gnome.compile_resources( 'calls-resources', 'calls.gresources.xml', - source_dir: 'ui', + source_dir: ['ui', '../data'], c_name: 'call', ) diff --git a/src/ui/call-display.ui b/src/ui/call-display.ui index dd46ccd..597d274 100644 --- a/src/ui/call-display.ui +++ b/src/ui/call-display.ui @@ -9,144 +9,302 @@ False center - 8 + 12 12 12 - 8 + 12 vertical - center + True True 300 - - - True - False - vertical - - - True - False - 6 - 6 - - - - - - - - - True - False - 4 - 4 - - - - True False vertical + True - - True + + False False - Active + 40 + 12 + Incoming phone call - + True False - 00:00 - 30 - 40 - - - - - - - - Answer - True - True - True - True - + vertical + True + + + True + False + 6 + 6 + + + + + + + + + True + False + 4 + 4 + + True False - 12 - True - 65 - 65 + vertical - + True - True - True - True - - - - True - False - microphone-sensitivity-muted-symbolic - 3 - - + False + 30 + 40 + + + - + True - True - True - True - + False + 12 + True + vertical + False - + True False - input-dialpad-symbolic - 3 + 12 + 65 + True + True + + + True + True + True + True + True + False + + + + True + False + vertical + + + True + False + microphone-sensitivity-muted-symbolic + 3 + True + + + + + True + False + 4 + Mute + + + + + + + + + True + True + True + True + True + False + + + + True + False + vertical + + + True + False + audio-volume-high-symbolic + 3 + True + + + + + True + False + 4 + Speaker + + + + + + + + + True + True + True + True + False + + + + True + False + vertical + + + True + False + /sm/puri/calls/new-call-symbolic.svg + 3 + True + + + + + True + False + 4 + Add call + + + + + + - - - - - True - True - True - True - - + True False - audio-volume-high-symbolic - 3 + 12 + 65 + + + True + True + True + True + True + False + + + + True + False + vertical + + + True + False + media-playback-pause-symbolic + 3 + True + + + + + True + False + 4 + Hold + + + + + + + + + True + True + True + True + + True + + + True + False + vertical + + + True + False + input-dialpad-symbolic + 3 + True + + + + + True + False + 4 + Dial pad + + + + + + + + + True + True + True + True + True + + - - - False - 30 - True - - + + + + + False + 50 + 30 + True + + + + + True + False + horizontal + True True @@ -157,6 +315,7 @@ start True 150 + True + + + Answer + + + + + True + call-start-symbolic + 5 + + + + @@ -254,4 +444,14 @@ + + + + + + + + + + diff --git a/src/ui/call-window.ui b/src/ui/call-window.ui index a46ac24..d0ba139 100644 --- a/src/ui/call-window.ui +++ b/src/ui/call-window.ui @@ -11,40 +11,52 @@ Calls - + True False - vertical - - + + + True False - True - True - - - + start + False + slide-down + + + True False - 6 - end - - - - - - False - False - - - - - False - 16 - - - True + True + + + False - label - True + 6 + end + + + + + + False + False + + + + + False + 16 + + + True + False + label + True + + + True + True + + True @@ -52,10 +64,6 @@ - - True - True - @@ -102,10 +110,6 @@ - - True - True - diff --git a/src/ui/main-window.ui b/src/ui/main-window.ui index 1967f91..7395b79 100644 --- a/src/ui/main-window.ui +++ b/src/ui/main-window.ui @@ -10,61 +10,61 @@ False - + True False - vertical - - + + + True False - True - True - - - + start + False + slide-down + + + True False - 6 - end - - - - - - False - False - 0 - - - - - False - 16 - - - True + True + + + False - label - True + 6 + end + + + + + + False + False + + + + + False + 16 + + + True + False + label + True + + + True + True + + True True - 0 - - True - True - 0 - - - True - True - 1 - @@ -81,11 +81,6 @@ - - True - True - 2 -