The RGB panel of the WINGs color panel lists the red, green, and blue values as base 10 numbers. However, hexadecimal numbers are very common when dealing with RGB colors. This patch adds two radio buttons at the bottom of the RGB panel to allow users to choose their preferred number system. --- WINGs/wcolorpanel.c | 103 +++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 85 insertions(+), 18 deletions(-)
diff --git a/WINGs/wcolorpanel.c b/WINGs/wcolorpanel.c index 2977702..64ce177 100644 --- a/WINGs/wcolorpanel.c +++ b/WINGs/wcolorpanel.c @@ -161,6 +161,9 @@ typedef struct W_ColorPanel { WMButton *grayPresetBtn[7]; /* RGB Panel */ + int rgbState; + WMButton *rgbDecB; + WMButton *rgbHexB; WMFrame *rgbFrm; WMLabel *rgbMinL; WMLabel *rgbMaxL; @@ -249,6 +252,11 @@ enum { CLmenuRemove } colorListMenuItem; +enum { + RGBdec, + RGBhex +}; + #define PWIDTH 194 #define PHEIGHT 266 #define colorWheelSize 150 @@ -313,6 +321,7 @@ static void grayBrightnessTextFieldCallback(void *observerData, WMNotification * static void rgbSliderCallback(WMWidget * w, void *data); static void rgbTextFieldCallback(void *observerData, WMNotification * notification); +static void rgbDecToHex(WMWidget *w, void *data); static void cmykSliderCallback(WMWidget * w, void *data); static void cmykTextFieldCallback(void *observerData, WMNotification * notification); @@ -703,6 +712,21 @@ static WMColorPanel *makeColorPanel(WMScreen * scrPtr, const char *name) WMMoveWidget(panel->rgbBlueT, 146, 57); WMSetTextFieldAlignment(panel->rgbBlueT, WALeft); WMAddNotificationObserver(rgbTextFieldCallback, panel, WMTextDidEndEditingNotification, panel->rgbBlueT); + + panel->rgbDecB = WMCreateButton(panel->rgbFrm, WBTRadio); + WMSetButtonText(panel->rgbDecB, "Decimal"); + WMSetButtonSelected(panel->rgbDecB, 1); + panel->rgbState = RGBdec; + WMSetButtonAction(panel->rgbDecB, rgbDecToHex, panel); + WMMoveWidget(panel->rgbDecB, 2, 81); + + panel->rgbHexB = WMCreateButton(panel->rgbFrm, WBTRadio); + WMSetButtonText(panel->rgbHexB, "Hexadecimal"); + WMSetButtonAction(panel->rgbHexB, rgbDecToHex, panel); + WMMoveWidget(panel->rgbHexB, 2, 104); + + WMGroupButtons(panel->rgbDecB, panel->rgbHexB); + /* End of RGB Panel */ /* Widgets for CMYK Panel */ @@ -2348,11 +2372,45 @@ static void grayBrightnessTextFieldCallback(void *observerData, WMNotification * /******************* RGB Panel Functions *****************/ +void rgbIntToChar(W_ColorPanel *panel, int *value) +{ + char tmp[4]; + char *format; + + if (panel->rgbState == RGBdec) + format = "%d"; + if (panel->rgbState == RGBhex) + format = "%0X"; + + sprintf(tmp, format, value[0]); + WMSetTextFieldText(panel->rgbRedT, tmp); + sprintf(tmp, format, value[1]); + WMSetTextFieldText(panel->rgbGreenT, tmp); + sprintf(tmp, format, value[2]); + WMSetTextFieldText(panel->rgbBlueT, tmp); +} + +int *rgbCharToInt(W_ColorPanel *panel) +{ + static int value[3]; + + if (panel->rgbState == RGBdec) { + value[0] = atoi(WMGetTextFieldText(panel->rgbRedT)); + value[1] = atoi(WMGetTextFieldText(panel->rgbGreenT)); + value[2] = atoi(WMGetTextFieldText(panel->rgbBlueT)); + } + if (panel->rgbState == RGBhex) { + value[0] = strtol(WMGetTextFieldText(panel->rgbRedT), NULL, 16); + value[1] = strtol(WMGetTextFieldText(panel->rgbGreenT), NULL, 16); + value[2] = strtol(WMGetTextFieldText(panel->rgbBlueT), NULL, 16); + } + return value; +} + static void rgbSliderCallback(WMWidget * w, void *data) { CPColor cpColor; int value[3]; - char tmp[4]; W_ColorPanel *panel = (W_ColorPanel *) data; /* Parameter not used, but tell the compiler that it is ok */ @@ -2362,12 +2420,7 @@ static void rgbSliderCallback(WMWidget * w, void *data) value[1] = WMGetSliderValue(panel->rgbGreenS); value[2] = WMGetSliderValue(panel->rgbBlueS); - sprintf(tmp, "%d", value[0]); - WMSetTextFieldText(panel->rgbRedT, tmp); - sprintf(tmp, "%d", value[1]); - WMSetTextFieldText(panel->rgbGreenT, tmp); - sprintf(tmp, "%d", value[2]); - WMSetTextFieldText(panel->rgbBlueT, tmp); + rgbIntToChar(panel, value); cpColor.rgb.red = value[0]; cpColor.rgb.green = value[1]; @@ -2381,17 +2434,14 @@ static void rgbSliderCallback(WMWidget * w, void *data) static void rgbTextFieldCallback(void *observerData, WMNotification * notification) { CPColor cpColor; - int value[3]; - char tmp[4]; + int *value; int n; W_ColorPanel *panel = (W_ColorPanel *) observerData; /* Parameter not used, but tell the compiler that it is ok */ (void) notification; - value[0] = atoi(WMGetTextFieldText(panel->rgbRedT)); - value[1] = atoi(WMGetTextFieldText(panel->rgbGreenT)); - value[2] = atoi(WMGetTextFieldText(panel->rgbBlueT)); + value = rgbCharToInt(panel); for (n = 0; n < 3; n++) { if (value[n] > 255) @@ -2400,12 +2450,7 @@ static void rgbTextFieldCallback(void *observerData, WMNotification * notificati value[n] = 0; } - sprintf(tmp, "%d", value[0]); - WMSetTextFieldText(panel->rgbRedT, tmp); - sprintf(tmp, "%d", value[1]); - WMSetTextFieldText(panel->rgbGreenT, tmp); - sprintf(tmp, "%d", value[2]); - WMSetTextFieldText(panel->rgbBlueT, tmp); + rgbIntToChar(panel, value); WMSetSliderValue(panel->rgbRedS, value[0]); WMSetSliderValue(panel->rgbGreenS, value[1]); @@ -2420,6 +2465,28 @@ static void rgbTextFieldCallback(void *observerData, WMNotification * notificati panel->lastChanged = WMRGBModeColorPanel; } +static void rgbDecToHex(WMWidget *w, void *data) +{ + W_ColorPanel *panel = (W_ColorPanel *) data; + (void) w; + int *value; + + if (WMGetButtonSelected(panel->rgbDecB) && panel->rgbState == RGBhex) { + WMSetLabelText(panel->rgbMaxL, "255"); + WMRedisplayWidget(panel->rgbMaxL); + value = rgbCharToInt(panel); + panel->rgbState = RGBdec; + rgbIntToChar(panel, value); + } + if (WMGetButtonSelected(panel->rgbHexB) && panel->rgbState == RGBdec) { + WMSetLabelText(panel->rgbMaxL, "FF"); + WMRedisplayWidget(panel->rgbMaxL); + value = rgbCharToInt(panel); + panel->rgbState = RGBhex; + rgbIntToChar(panel, value); + } +} + /******************* CMYK Panel Functions *****************/ static void cmykSliderCallback(WMWidget * w, void *data) -- 1.9.1 -- To unsubscribe, send mail to wmaker-dev-unsubscr...@lists.windowmaker.org.