← Back to team overview

ayatana-commits team mailing list archive

[Merge] lp:~dbarth/indicator-me/radio-buttons-and-indeterminate-status into lp:indicator-me

 

David Barth has proposed merging lp:~dbarth/indicator-me/radio-buttons-and-indeterminate-status into lp:indicator-me.

Requested reviews:
  Indicator Applet Developers (indicator-applet-developers)


This branch enables proper radio marks on status items and also computes the "indeterminate status" based on diverging online statuses.
-- 
https://code.launchpad.net/~dbarth/indicator-me/radio-buttons-and-indeterminate-status/+merge/21436
Your team ayatana-commits is subscribed to branch lp:indicator-me.
=== modified file 'src/me-service.c'
--- src/me-service.c	2010-03-11 13:06:53 +0000
+++ src/me-service.c	2010-03-16 10:46:19 +0000
@@ -92,44 +92,75 @@
 status_update (void) {
 	StatusProviderStatus oldglobal = global_status;
 	global_status = STATUS_PROVIDER_STATUS_DISCONNECTED;
+  gboolean indeterminate = FALSE;
 
 	/* Ask everyone what they think the status should be, if
 	   they're more connected, up the global level */
-	int i;
+  StatusProviderStatus i;
 	for (i = 0; i < STATUS_PROVIDER_CNT; i++) {
+    if (status_providers[i] == NULL) continue;
 		StatusProviderStatus localstatus = status_provider_get_status(status_providers[i]);
-		if (localstatus < global_status) {
+    g_debug ("provider[%d]: %s", i, status_strings[localstatus]);
+
+    if (localstatus >= STATUS_PROVIDER_STATUS_OFFLINE)
+      /* offline and disconnected is similar for some providers
+         so it's not meaningful to determine the 'indeterminate' status
+      */
+      continue;
+
+		if (localstatus != global_status) {
+      if (global_status < STATUS_PROVIDER_STATUS_OFFLINE)
+        /* at least one provider was maintaining a status better than 'offline'
+           and there's now another one with something different */
+        indeterminate = TRUE;
 			global_status = localstatus;
 		}
 	}
 
-	/* If changed */
-	if (global_status != oldglobal) {
-		g_debug("Global status changed to: %s", _(status_strings[global_status]));
-
-		/* Configure the icon on the panel */
-		status_service_dbus_set_status(dbus_interface, status_icons[global_status]);
-
-		/* If we're now disconnected, make setting the statuses
-		   insensitive. */
-		if (global_status == STATUS_PROVIDER_STATUS_DISCONNECTED) {
-			StatusProviderStatus i;
-			for (i = STATUS_PROVIDER_STATUS_ONLINE; i < STATUS_PROVIDER_STATUS_LAST; i++) {
-				if (status_menuitems[i] == NULL) continue;
-				dbusmenu_menuitem_property_set_bool(status_menuitems[i], DBUSMENU_MENUITEM_PROP_ENABLED, FALSE);
-			}
-		}
-
-		/* If we're now back to a state where we have an IM client
-		   connected then we need to resensitize the items. */
-		if (oldglobal == STATUS_PROVIDER_STATUS_DISCONNECTED) {
-			StatusProviderStatus i;
-			for (i = STATUS_PROVIDER_STATUS_ONLINE; i < STATUS_PROVIDER_STATUS_LAST; i++) {
-				if (status_menuitems[i] == NULL) continue;
-				dbusmenu_menuitem_property_set_bool(status_menuitems[i], DBUSMENU_MENUITEM_PROP_ENABLED, TRUE);
-			}
-		}
-	}
+  /* Configure the icon on the panel */
+  status_service_dbus_set_status(dbus_interface, indeterminate ? "user-indeterminate" : status_icons[global_status]);
+
+  g_debug("Global status changed to: %s", indeterminate ? "indeterminate" : status_strings[global_status]);
+
+  /* If we're now disconnected, make setting the statuses
+     insensitive. */
+  if (global_status == STATUS_PROVIDER_STATUS_DISCONNECTED) {
+    StatusProviderStatus i;
+    for (i = STATUS_PROVIDER_STATUS_ONLINE;
+         i < STATUS_PROVIDER_STATUS_LAST; i++) {
+      if (status_menuitems[i] == NULL) continue;
+      dbusmenu_menuitem_property_set_bool(status_menuitems[i],
+                                          DBUSMENU_MENUITEM_PROP_ENABLED,
+                                          FALSE);
+    }
+    return;
+  }
+
+  /* Ensure items are sensititive if they were previoulsy disabled */
+  if (oldglobal == STATUS_PROVIDER_STATUS_DISCONNECTED) {
+    StatusProviderStatus i;
+    for (i = STATUS_PROVIDER_STATUS_ONLINE;
+         i < STATUS_PROVIDER_STATUS_LAST; i++) {
+      if (status_menuitems[i] == NULL) continue;
+      dbusmenu_menuitem_property_set_bool(status_menuitems[i], DBUSMENU_MENUITEM_PROP_ENABLED, TRUE);
+    }
+  }
+
+  /* add a radio mark to the user status entry */
+  for (i = STATUS_PROVIDER_STATUS_ONLINE;
+       i < STATUS_PROVIDER_STATUS_LAST; i++) {
+    if (status_menuitems[i] == NULL) continue;
+    if (indeterminate
+        || (i != global_status)) {
+      dbusmenu_menuitem_property_set_int (status_menuitems[i],
+                                          DBUSMENU_MENUITEM_PROP_TOGGLE_STATE,
+                                          DBUSMENU_MENUITEM_TOGGLE_STATE_UNCHECKED);
+    } else {
+      dbusmenu_menuitem_property_set_int (status_menuitems[i],
+                                          DBUSMENU_MENUITEM_PROP_TOGGLE_STATE,
+                                          DBUSMENU_MENUITEM_TOGGLE_STATE_CHECKED);
+    }
+  }
 
 	return;
 }
@@ -346,6 +377,12 @@
 
 		dbusmenu_menuitem_property_set(status_menuitems[i], DBUSMENU_MENUITEM_PROP_LABEL, _(status_strings[i]));
 		dbusmenu_menuitem_property_set(status_menuitems[i], DBUSMENU_MENUITEM_PROP_ICON_NAME, status_icons[i]);
+    dbusmenu_menuitem_property_set (status_menuitems[i],
+                                    DBUSMENU_MENUITEM_PROP_TOGGLE_TYPE,
+                                    DBUSMENU_MENUITEM_TOGGLE_RADIO);
+    dbusmenu_menuitem_property_set_int (status_menuitems[i],
+                                        DBUSMENU_MENUITEM_PROP_TOGGLE_STATE,
+                                        DBUSMENU_MENUITEM_TOGGLE_STATE_UNCHECKED);
 		if (global_status == STATUS_PROVIDER_STATUS_DISCONNECTED) {
 			dbusmenu_menuitem_property_set_bool(status_menuitems[i], DBUSMENU_MENUITEM_PROP_ENABLED, FALSE);
 		}


Follow ups