summaryrefslogtreecommitdiffstats
path: root/src/ege-adjustment-action.cpp
diff options
context:
space:
mode:
authorJon A. Cruz <jon@joncruz.org>2007-03-21 01:08:04 +0000
committerjoncruz <joncruz@users.sourceforge.net>2007-03-21 01:08:04 +0000
commit2b522af2c4c02dd7548663347d536871fc7f2f3d (patch)
treec8d15c0b3df04317c849afcddb74eb9ecc1dcabc /src/ege-adjustment-action.cpp
parentplumb XML::Document parameter into duplication, courtesy of bryce (diff)
downloadinkscape-2b522af2c4c02dd7548663347d536871fc7f2f3d.tar.gz
inkscape-2b522af2c4c02dd7548663347d536871fc7f2f3d.zip
Adding labels to popup menu values
(bzr r2724)
Diffstat (limited to 'src/ege-adjustment-action.cpp')
-rw-r--r--src/ege-adjustment-action.cpp111
1 files changed, 101 insertions, 10 deletions
diff --git a/src/ege-adjustment-action.cpp b/src/ege-adjustment-action.cpp
index 179f1f248..d140ae12c 100644
--- a/src/ege-adjustment-action.cpp
+++ b/src/ege-adjustment-action.cpp
@@ -75,6 +75,14 @@ static void ege_adjustment_action_defocus( EgeAdjustmentAction* action );
static GtkActionClass* gParentClass = 0;
static GQuark gDataName = 0;
+typedef struct _EgeAdjustmentDescr EgeAdjustmentDescr;
+
+struct _EgeAdjustmentDescr
+{
+ gchar* descr;
+ gdouble value;
+};
+
struct _EgeAdjustmentActionPrivate
{
GtkAdjustment* adj;
@@ -87,6 +95,7 @@ struct _EgeAdjustmentActionPrivate
gdouble step;
gdouble page;
gboolean transferFocus;
+ GList* descriptions;
};
#define EGE_ADJUSTMENT_ACTION_GET_PRIVATE( o ) ( G_TYPE_INSTANCE_GET_PRIVATE( (o), EGE_ADJUSTMENT_ACTION_TYPE, EgeAdjustmentActionPrivate ) )
@@ -213,6 +222,7 @@ static void ege_adjustment_action_init( EgeAdjustmentAction* action )
action->private_data->step = 0.0;
action->private_data->page = 0.0;
action->private_data->transferFocus = FALSE;
+ action->private_data->descriptions = 0;
}
EgeAdjustmentAction* ege_adjustment_action_new( GtkAdjustment* adjustment,
@@ -349,6 +359,59 @@ GtkWidget* ege_adjustment_action_get_focuswidget( EgeAdjustmentAction* action )
return action->private_data->focusWidget;
}
+static void i_free_description( gpointer data, gpointer user_data ) {
+ (void)user_data;
+ if ( data ) {
+ EgeAdjustmentDescr* descr = (EgeAdjustmentDescr*)data;
+ if ( descr->descr ) {
+ g_free( descr->descr );
+ descr->descr = 0;
+ }
+ g_free( descr );
+ }
+}
+
+static gint i_compare_descriptions( gconstpointer a, gconstpointer b )
+{
+ gint val = 0;
+
+ EgeAdjustmentDescr const * aa = (EgeAdjustmentDescr const *)a;
+ EgeAdjustmentDescr const * bb = (EgeAdjustmentDescr const *)b;
+
+ if ( aa && bb ) {
+ if ( aa->value < bb->value ) {
+ val = -1;
+ } else if ( aa->value > bb->value ) {
+ val = 1;
+ }
+ }
+
+ return val;
+}
+
+void ege_adjustment_action_set_descriptions( EgeAdjustmentAction* action, gchar const** descriptions, gdouble const* values, guint count )
+{
+ g_return_if_fail( IS_EGE_ADJUSTMENT_ACTION(action) );
+
+ if ( action->private_data->descriptions ) {
+ g_list_foreach( action->private_data->descriptions, i_free_description, 0 );
+ g_list_free( action->private_data->descriptions );
+ action->private_data->descriptions = 0;
+ }
+
+ if ( count && descriptions && values ) {
+ guint i = 0;
+ for ( i = 0; i < count; i++ ) {
+ EgeAdjustmentDescr* descr = g_new0( EgeAdjustmentDescr, 1 );
+ if ( descriptions[i] ) {
+ descr->descr = g_strdup( descriptions[i] );
+ descr->value = values[i];
+ }
+ action->private_data->descriptions = g_list_insert_sorted( action->private_data->descriptions, (gpointer)descr, i_compare_descriptions );
+ }
+ }
+}
+
static void process_menu_action( GtkWidget* obj, gpointer data )
{
GtkCheckMenuItem* item = GTK_CHECK_MENU_ITEM(obj);
@@ -397,10 +460,37 @@ static void process_menu_action( GtkWidget* obj, gpointer data )
}
}
-static void create_single_menu( GCallback toggleCb, int val, GtkWidget* menu, EgeAdjustmentAction* act, GtkWidget** dst, GSList** group, gdouble num, gboolean active )
+static void create_single_menu_item( GCallback toggleCb, int val, GtkWidget* menu, EgeAdjustmentAction* act, GtkWidget** dst, GSList** group, gdouble num, gboolean active )
{
- char* fmt = g_strdup_printf("%%0.%df", act->private_data->digits);
- char *str = g_strdup_printf ( fmt, num );
+ gdouble epsilon = 0.1;
+ char* fmt = 0;
+ char* str = 0;
+ EgeAdjustmentDescr* marker = 0;
+ GList* cur = act->private_data->descriptions;
+
+ switch ( act->private_data->digits ) {
+ case 0: epsilon = 1.0; break;
+ case 1: epsilon = 0.1; break;
+ case 2: epsilon = 0.01; break;
+ case 3: epsilon = 0.001; break;
+ case 4: epsilon = 0.0001; break;
+ }
+
+ while ( cur ) {
+ EgeAdjustmentDescr* descr = (EgeAdjustmentDescr*)cur->data;
+ gdouble delta = num - descr->value;
+ if ( delta < 0.0 ) {
+ delta = -delta;
+ }
+ if ( delta < epsilon ) {
+ marker = descr;
+ break;
+ }
+ cur = g_list_next( cur );
+ }
+
+ fmt = g_strdup_printf("%%0.%df%%s%%s", act->private_data->digits);
+ str = g_strdup_printf ( fmt, num, (marker?" ":""), (marker?marker->descr:"") );
*dst = gtk_radio_menu_item_new_with_label( *group, str );
if ( !*group) {
@@ -438,24 +528,25 @@ static GtkWidget* create_popup_number_menu( EgeAdjustmentAction* act )
NULL );
if ( base < upper ) {
- create_single_menu( G_CALLBACK(process_menu_action), BUMP_TOP, menu, act, &single, &group, upper, FALSE );
+ create_single_menu_item( G_CALLBACK(process_menu_action), BUMP_TOP, menu, act, &single, &group, upper, FALSE );
if ( (base + page) < upper ) {
- create_single_menu( G_CALLBACK(process_menu_action), BUMP_PAGE_UP, menu, act, &single, &group, base + page, FALSE );
+ create_single_menu_item( G_CALLBACK(process_menu_action), BUMP_PAGE_UP, menu, act, &single, &group, base + page, FALSE );
}
if ( (base + step) < upper ) {
- create_single_menu( G_CALLBACK(process_menu_action), BUMP_UP, menu, act, &single, &group, base + step, FALSE );
+ create_single_menu_item( G_CALLBACK(process_menu_action), BUMP_UP, menu, act, &single, &group, base + step, FALSE );
}
}
- create_single_menu( G_CALLBACK(process_menu_action), BUMP_NONE, menu, act, &single, &group, base, TRUE );
+ create_single_menu_item( G_CALLBACK(process_menu_action), BUMP_NONE, menu, act, &single, &group, base, TRUE );
+
if ( base > lower ) {
if ( (base - step) > lower ) {
- create_single_menu( G_CALLBACK(process_menu_action), BUMP_DOWN, menu, act, &single, &group, base - step, FALSE );
+ create_single_menu_item( G_CALLBACK(process_menu_action), BUMP_DOWN, menu, act, &single, &group, base - step, FALSE );
}
if ( (base - page) > lower ) {
- create_single_menu( G_CALLBACK(process_menu_action), BUMP_PAGE_DOWN, menu, act, &single, &group, base - page, FALSE );
+ create_single_menu_item( G_CALLBACK(process_menu_action), BUMP_PAGE_DOWN, menu, act, &single, &group, base - page, FALSE );
}
- create_single_menu( G_CALLBACK(process_menu_action), BUMP_BOTTOM, menu, act, &single, &group, lower, FALSE );
+ create_single_menu_item( G_CALLBACK(process_menu_action), BUMP_BOTTOM, menu, act, &single, &group, lower, FALSE );
}
return menu;