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.

Reply via email to