[ekiga] Main Window: Implemented new actions toolbar.



commit 9b20435a8975a403d6d98dfe352d9800bb51f08a
Author: Damien Sandras <dsandras beip be>
Date:   Sun Feb 5 14:12:40 2012 +0100

    Main Window: Implemented new actions toolbar.
    
    The general UI design was also improved.
    
    This new actions toolbar provides a shortcut to the various panel
    sections of the main window. This is more convenient to use than
    switching between pages using the menu or the notebook arrays. It also
    provides a more compact user interface.
    
    I made use of GNOME icons in order to make them themeable.
    
    The video preview button was moved out of the call window back into the
    main window as suggested by Thierry Simonet. This provides the video
    preview action back.

 src/gui/call_window.cpp |   46 +++-------------
 src/gui/main_window.cpp |  140 ++++++++++++++++++++++++++++++++++++++++++----
 2 files changed, 135 insertions(+), 51 deletions(-)
---
diff --git a/src/gui/call_window.cpp b/src/gui/call_window.cpp
index 8edd8e9..d288269 100644
--- a/src/gui/call_window.cpp
+++ b/src/gui/call_window.cpp
@@ -130,7 +130,6 @@ struct _EkigaCallWindowPrivate
 
   GtkWidget *main_menu;
   GtkWidget *call_panel_toolbar;
-  GtkWidget *preview_button;
   GtkWidget *hold_button;
   GtkWidget *audio_settings_button;
   GtkWidget *video_settings_button;
@@ -238,9 +237,6 @@ static void stay_on_top_changed_nt (gpointer id,
                                     GmConfEntry *entry,
                                     gpointer data);
 
-static void toolbar_toggle_button_changed_cb (GtkWidget *widget,
-                                              gpointer data);
-
 static void hangup_call_cb (GtkWidget * /*widget*/,
                             gpointer data);
 
@@ -590,15 +586,6 @@ fullscreen_changed_cb (G_GNUC_UNUSED GtkWidget *widget,
 }
 
 static void
-toolbar_toggle_button_changed_cb (G_GNUC_UNUSED GtkWidget *widget,
-				  gpointer data)
-{
-  bool shown = gm_conf_get_bool ((gchar *) data);
-
-  gm_conf_set_bool ((gchar *) data, !shown);
-}
-
-static void
 hangup_call_cb (GtkWidget * /*widget*/,
                 gpointer data)
 {
@@ -735,6 +722,8 @@ on_videooutput_device_opened_cb (Ekiga::VideoOutputManager & /* manager */,
   EkigaCallWindow *cw = EKIGA_CALL_WINDOW (self);
   int vv;
 
+  gtk_widget_show_all (GTK_WIDGET (cw));
+
   if (both_streams) {
     gtk_menu_section_set_sensitive (cw->priv->main_menu, "local_video", TRUE);
     gtk_menu_section_set_sensitive (cw->priv->main_menu, "fullscreen", TRUE);
@@ -768,6 +757,9 @@ on_videooutput_device_closed_cb (Ekiga::VideoOutputManager & /* manager */, gpoi
   gtk_menu_section_set_sensitive (cw->priv->main_menu, "local_video", FALSE);
   gtk_menu_section_set_sensitive (cw->priv->main_menu, "fullscreen", TRUE);
   gtk_menu_section_set_sensitive (cw->priv->main_menu, "zoom_in", FALSE);
+
+  if (cw->priv->calling_state == Standby)
+    gtk_widget_hide (GTK_WIDGET (cw));
 }
 
 //FIXME Set_stay_on_top "window_show object"
@@ -849,6 +841,8 @@ on_size_changed_cb (Ekiga::VideoOutputManager & /* manager */,
   EkigaCallWindow *cw = EKIGA_CALL_WINDOW (self);
 
   ekiga_call_window_set_video_size (EKIGA_CALL_WINDOW (cw), width, height);
+
+  gtk_widget_show_all (GTK_WIDGET (cw));
 }
 
 static void
@@ -876,6 +870,7 @@ on_videoinput_device_closed_cb (Ekiga::VideoInputManager & /* manager */,
 {
   EkigaCallWindow *cw = EKIGA_CALL_WINDOW (self);
 
+
   ekiga_call_window_channels_menu_update_sensitivity (cw, TRUE, FALSE, FALSE);
   ekiga_call_window_update_logo (cw);
 
@@ -1349,7 +1344,6 @@ ekiga_call_window_update_calling_state (EkigaCallWindow *cw,
       gtk_menu_set_sensitive (cw->priv->main_menu, "disconnect", FALSE);
       gtk_menu_section_set_sensitive (cw->priv->main_menu, "hold_call", FALSE);
       gtk_widget_set_sensitive (GTK_WIDGET (cw->priv->hold_button), FALSE);
-      gtk_widget_set_sensitive (GTK_WIDGET (cw->priv->preview_button), TRUE);
 
       /* Destroy the transfer call popup */
       if (cw->priv->transfer_call_popup)
@@ -1362,7 +1356,6 @@ ekiga_call_window_update_calling_state (EkigaCallWindow *cw,
 
       /* Update the menus and toolbar items */
       gtk_menu_set_sensitive (cw->priv->main_menu, "disconnect", TRUE);
-      gtk_widget_set_sensitive (GTK_WIDGET (cw->priv->preview_button), FALSE);
       break;
 
 
@@ -1372,7 +1365,6 @@ ekiga_call_window_update_calling_state (EkigaCallWindow *cw,
       gtk_menu_set_sensitive (cw->priv->main_menu, "disconnect", TRUE);
       gtk_menu_section_set_sensitive (cw->priv->main_menu, "hold_call", TRUE);
       gtk_widget_set_sensitive (GTK_WIDGET (cw->priv->hold_button), TRUE);
-      gtk_widget_set_sensitive (GTK_WIDGET (cw->priv->preview_button), FALSE);
       break;
 
 
@@ -2439,28 +2431,6 @@ ekiga_call_window_init_gui (EkigaCallWindow *cw)
 		    G_CALLBACK (show_window_cb),
 		    (gpointer) cw->priv->video_settings_window);
 
-  /* Video Preview Button */
-  item = gtk_tool_item_new ();
-  cw->priv->preview_button = gtk_toggle_button_new ();
-  gtk_button_set_relief (GTK_BUTTON (cw->priv->preview_button), GTK_RELIEF_NONE);
-  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (cw->priv->preview_button),
-                                gm_conf_get_bool (VIDEO_DEVICES_KEY "enable_preview"));
-  image = gtk_image_new_from_icon_name (GM_ICON_CAMERA_VIDEO,
-                                        GTK_ICON_SIZE_MENU);
-  gtk_container_add (GTK_CONTAINER (cw->priv->preview_button), image);
-  gtk_container_add (GTK_CONTAINER (item), cw->priv->preview_button);
-  gtk_tool_item_set_expand (GTK_TOOL_ITEM (item), FALSE);
-
-  gtk_widget_show (cw->priv->preview_button);
-  gtk_toolbar_insert (GTK_TOOLBAR (cw->priv->call_panel_toolbar),
-		      GTK_TOOL_ITEM (item), -1);
-  gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM (item),
-				  _("Display images from your camera device"));
-
-  g_signal_connect (cw->priv->preview_button, "toggled",
-		    G_CALLBACK (toolbar_toggle_button_changed_cb),
-		    (gpointer) VIDEO_DEVICES_KEY "enable_preview");
-
   /* Call Pause */
   item = gtk_tool_item_new ();
   cw->priv->hold_button = gtk_toggle_button_new ();
diff --git a/src/gui/main_window.cpp b/src/gui/main_window.cpp
index d4b30da..4c4252f 100644
--- a/src/gui/main_window.cpp
+++ b/src/gui/main_window.cpp
@@ -120,13 +120,16 @@ struct _EkigaMainWindowPrivate
   GtkAccelGroup *accel;
   GtkWidget *main_menu;
   GtkWidget *main_notebook;
-  GtkWidget *hpaned;
 
   /* Dialpad uri toolbar */
   GtkWidget *uri_toolbar;
   GtkWidget *entry;
   GtkListStore *completion;
 
+  /* Actions toolbar */
+  GtkWidget *actions_toolbar;
+  GtkWidget *preview_button;
+
   /* notebook pages
    *  (we store the numbers so we know where we are)
    */
@@ -272,6 +275,24 @@ static void  show_widget_cb (GtkWidget * /*widget*/,
                              gpointer data);
 
 
+/* DESCRIPTION  :  This callback is called when the user clicks a button
+ *                 in the actions toolbar to change a page in the notebook.
+ * BEHAVIOR     :  Update the config key accordingly.
+ * PRE          :  A valid pointer to the main window GmObject.
+ */
+static void panel_section_action_clicked_cb (GtkWidget * /*widget*/,
+                                             gpointer data);
+
+
+/* DESCRIPTION  :  This callback is called when the user toggles the
+ *                 preview button in the actions toolbar.
+ * BEHAVIOR     :  Update the config key accordingly.
+ * PRE          :  A valid pointer to the main window GmObject.
+ */
+static void video_preview_action_toggled_cb (GtkToggleToolButton *b,
+                                             gpointer data);
+
+
 /* DESCRIPTION  :  This callback is called when the user changes the
  *                 page in the main notebook.
  * BEHAVIOR     :  Update the config key accordingly.
@@ -330,8 +351,18 @@ static gboolean statusbar_clicked_cb (GtkWidget *,
 				      GdkEventButton *,
 				      gpointer);
 
+/* DESCRIPTION  :  /
+ * BEHAVIOR     :  Creates the uri toolbar in the dialpad panel.
+ * PRE          :  The main window GMObject.
+ */
 static void ekiga_main_window_init_uri_toolbar (EkigaMainWindow *mw);
 
+/* DESCRIPTION  :  /
+ * BEHAVIOR     :  Creates the actions toolbar in the main window.
+ * PRE          :  The main window GMObject.
+ */
+static void ekiga_main_window_init_actions_toolbar (EkigaMainWindow *mw);
+
 static void ekiga_main_window_add_device_dialog_show (EkigaMainWindow *main_window,
                                                       const Ekiga::Device & device,
                                                       DeviceType device_type);
@@ -644,6 +675,10 @@ static void on_setup_call_cb (boost::shared_ptr<Ekiga::CallManager> manager,
 
     mw->priv->current_call = call;
   }
+
+  /* Unsensitive a few things */
+  gtk_widget_set_sensitive (GTK_WIDGET (mw->priv->uri_toolbar), false);
+  gtk_widget_set_sensitive (GTK_WIDGET (mw->priv->preview_button), false);
 }
 
 
@@ -706,6 +741,10 @@ static void on_cleared_call_cb (boost::shared_ptr<Ekiga::CallManager>  /*manager
   /* Hide call window */
   call_window = GnomeMeeting::Process ()->GetCallWindow ();
   gtk_widget_hide (call_window);
+
+  /* Sensitive a few things back */
+  gtk_widget_set_sensitive (GTK_WIDGET (mw->priv->uri_toolbar), true);
+  gtk_widget_set_sensitive (GTK_WIDGET (mw->priv->preview_button), true);
 }
 
 static void on_cleared_incoming_call_cb (std::string /*reason*/,
@@ -730,6 +769,10 @@ static void on_cleared_incoming_call_cb (std::string /*reason*/,
   /* Hide call window */
   call_window = GnomeMeeting::Process ()->GetCallWindow ();
   gtk_widget_hide (call_window);
+
+  /* Sensitive a few things back */
+  gtk_widget_set_sensitive (GTK_WIDGET (mw->priv->uri_toolbar), true);
+  gtk_widget_set_sensitive (GTK_WIDGET (mw->priv->preview_button), true);
 }
 
 
@@ -1111,6 +1154,22 @@ show_widget_cb (GtkWidget * /*widget*/,
 
 
 static void
+panel_section_action_clicked_cb (GtkWidget * /*widget*/,
+                                 gpointer data)
+{
+  gm_conf_set_int (USER_INTERFACE_KEY "main_window/panel_section", GPOINTER_TO_INT (data));
+}
+
+
+static void
+video_preview_action_toggled_cb (GtkToggleToolButton *b,
+                                 G_GNUC_UNUSED gpointer data)
+{
+  gm_conf_set_bool (VIDEO_DEVICES_KEY "enable_preview", gtk_toggle_tool_button_get_active (b));
+}
+
+
+static void
 panel_section_changed_cb (G_GNUC_UNUSED GtkNotebook *notebook,
                           G_GNUC_UNUSED gpointer page,
                           gint page_num,
@@ -1581,6 +1640,60 @@ ekiga_main_window_init_uri_toolbar (EkigaMainWindow *mw)
 }
 
 static void
+ekiga_main_window_init_actions_toolbar (EkigaMainWindow *mw)
+{
+  GtkWidget *image = NULL;
+  GtkToolItem *item = NULL;
+
+  g_return_if_fail (EKIGA_IS_MAIN_WINDOW (mw));
+
+  /* The call horizontal toolbar */
+  mw->priv->actions_toolbar = gtk_toolbar_new ();
+  gtk_toolbar_set_style (GTK_TOOLBAR (mw->priv->actions_toolbar), GTK_TOOLBAR_ICONS);
+  gtk_toolbar_set_show_arrow (GTK_TOOLBAR (mw->priv->actions_toolbar), FALSE);
+
+  /* The video preview button */
+  image = gtk_image_new_from_icon_name ("camera-video", GTK_ICON_SIZE_MENU);
+  mw->priv->preview_button = GTK_WIDGET (gtk_toggle_tool_button_new ());
+  gtk_tool_button_set_icon_widget (GTK_TOOL_BUTTON (mw->priv->preview_button), image);
+  gtk_tool_item_set_expand (GTK_TOOL_ITEM (mw->priv->preview_button), false);
+  gtk_toolbar_insert (GTK_TOOLBAR (mw->priv->actions_toolbar), GTK_TOOL_ITEM (mw->priv->preview_button), -1);
+  gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (mw->priv->preview_button),
+                                     gm_conf_get_bool (VIDEO_DEVICES_KEY "enable_preview"));
+  g_signal_connect (mw->priv->preview_button, "toggled",
+                    G_CALLBACK (video_preview_action_toggled_cb), NULL);
+
+  /* Separator */
+  item = gtk_separator_tool_item_new ();
+  gtk_toolbar_insert (GTK_TOOLBAR (mw->priv->actions_toolbar),
+		      GTK_TOOL_ITEM (item), -1);
+
+  /* The roster button */
+  image = gtk_image_new_from_icon_name ("avatar-default", GTK_ICON_SIZE_MENU);
+  item = gtk_tool_button_new (image, NULL);
+  gtk_tool_item_set_expand (GTK_TOOL_ITEM (item), false);
+  gtk_toolbar_insert (GTK_TOOLBAR (mw->priv->actions_toolbar), item, -1);
+  g_signal_connect (item, "clicked",
+                    G_CALLBACK (panel_section_action_clicked_cb), GINT_TO_POINTER (CONTACTS));
+
+  /* The dialpad button */
+  image = gtk_image_new_from_icon_name ("input-dialpad", GTK_ICON_SIZE_MENU);
+  item = gtk_tool_button_new (image, NULL);
+  gtk_tool_item_set_expand (GTK_TOOL_ITEM (item), false);
+  gtk_toolbar_insert (GTK_TOOLBAR (mw->priv->actions_toolbar), item, -1);
+  g_signal_connect (item, "clicked",
+                    G_CALLBACK (panel_section_action_clicked_cb), GINT_TO_POINTER (DIALPAD));
+
+  /* The history button */
+  image = gtk_image_new_from_icon_name ("document-open-recent", GTK_ICON_SIZE_MENU);
+  item = gtk_tool_button_new (image, NULL);
+  gtk_tool_item_set_expand (GTK_TOOL_ITEM (item), false);
+  gtk_toolbar_insert (GTK_TOOLBAR (mw->priv->actions_toolbar), item, -1);
+  g_signal_connect (item, "clicked",
+                    G_CALLBACK (panel_section_action_clicked_cb), GINT_TO_POINTER (CALL));
+}
+
+static void
 ekiga_main_window_init_menu (EkigaMainWindow *mw)
 {
   GtkWidget *addressbook_window = NULL;
@@ -1823,25 +1936,27 @@ ekiga_main_window_init_gui (EkigaMainWindow *mw)
   gtk_box_pack_start (GTK_BOX (window_vbox), mw->priv->main_menu,
                       FALSE, FALSE, 0);
 
+  /* The actions toolbar */
+  ekiga_main_window_init_actions_toolbar (mw);
+  gtk_box_pack_start (GTK_BOX (window_vbox), mw->priv->actions_toolbar,
+                      false, false, 0);
+
   /* The status toolbar */
   ekiga_main_window_init_status_toolbar (mw);
   gtk_box_pack_start (GTK_BOX (window_vbox), mw->priv->status_toolbar,
                       false, true, 0);
 
-  /* The 2 parts of the gui */
-  mw->priv->hpaned = gtk_hpaned_new ();
-  gtk_box_pack_start (GTK_BOX (window_vbox), mw->priv->hpaned,
-                      true, true, 0);
-
+  /* The notebook pages */
   mw->priv->main_notebook = gtk_notebook_new ();
   gtk_notebook_popup_enable (GTK_NOTEBOOK (mw->priv->main_notebook));
-  gtk_notebook_set_show_tabs (GTK_NOTEBOOK (mw->priv->main_notebook), true);
-  gtk_notebook_set_scrollable (GTK_NOTEBOOK (mw->priv->main_notebook), true);
+  gtk_notebook_set_show_tabs (GTK_NOTEBOOK (mw->priv->main_notebook), false);
+  gtk_notebook_set_scrollable (GTK_NOTEBOOK (mw->priv->main_notebook), false);
 
   ekiga_main_window_init_contact_list (mw);
   ekiga_main_window_init_dialpad (mw);
   ekiga_main_window_init_history (mw);
-  gtk_paned_pack1 (GTK_PANED (mw->priv->hpaned), mw->priv->main_notebook, true, false);
+  gtk_box_pack_start (GTK_BOX (window_vbox), mw->priv->main_notebook,
+                      true, true, 0);
 
   /* The statusbar */
   gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (mw->priv->statusbar), TRUE);
@@ -1858,12 +1973,10 @@ ekiga_main_window_init_gui (EkigaMainWindow *mw)
   g_signal_connect_after (mw->priv->main_notebook, "switch-page",
 			  G_CALLBACK (panel_section_changed_cb),
 			  mw);
+  gtk_widget_show_all (window_vbox);
 
   /* Show the current panel section */
-  PanelSection section = (PanelSection)
-    gm_conf_get_int (USER_INTERFACE_KEY "main_window/panel_section");
-  gtk_widget_show (mw->priv->hpaned);
-  gtk_widget_show_all (gtk_paned_get_child1 (GTK_PANED (mw->priv->hpaned)));
+  PanelSection section = (PanelSection) gm_conf_get_int (USER_INTERFACE_KEY "main_window/panel_section");
   gtk_notebook_set_current_page (GTK_NOTEBOOK (mw->priv->main_notebook), section);
 }
 
@@ -2088,6 +2201,7 @@ ekiga_main_window_connect_engine_signals (EkigaMainWindow *mw)
   mw->priv->connections.push_back (conn);
 }
 
+//FIXME the following 2 functions are weird: shouldn't they be merged?
 GtkWidget *
 ekiga_main_window_new (Ekiga::ServiceCore *core)
 {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]