[PATCH 1/2] WPrefs: Add ability to set integer values in Expert panel

Doug Torrance <[email protected]>
Newsgroups gmane.compw.window-managers.windowmaker.devel
Message-ID <[email protected]>
Previously, only boolean values could be changed using the Expert panel.
This patch adds the ability to change integer values.  A new class,
OPTION_WMAKER_INT, is added.  When this class is used, a textfield and two
buttons (up and down) appear instead of a checkbox.  Users can either type
the integer value or increment/decrement it using the arrows.
---
 WPrefs.app/Expert.c | 99 +++++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 93 insertions(+), 6 deletions(-)

diff --git a/WPrefs.app/Expert.c b/WPrefs.app/Expert.c
index 6db1dfa..0c6ed7b 100644
--- a/WPrefs.app/Expert.c
+++ b/WPrefs.app/Expert.c
@@ -33,7 +33,8 @@ static const struct {
 	enum {
 		OPTION_WMAKER,
 		OPTION_WMAKER_ARRAY,
-		OPTION_USERDEF
+		OPTION_USERDEF,
+		OPTION_WMAKER_INT
 	} class;
 
 	const char *op_name;  /* The identifier for the option in the config file */
@@ -96,6 +97,7 @@ static const struct {
 };
 
 
+
 typedef struct _Panel {
 	WMBox *box;
 	char *sectionName;
@@ -108,10 +110,37 @@ typedef struct _Panel {
 
 	WMButton *swi[wlengthof_nocheck(expert_options)];
 
+	WMTextField *textfield[wlengthof_nocheck(expert_options)];
+
 } _Panel;
 
 #define ICON_FILE	"expert"
 
+static void changeIntTextfield(void *data, int delta)
+{
+	WMTextField *textfield;
+	char *text;
+	int value;
+
+	textfield = (WMTextField *)data;
+	text = WMGetTextFieldText(textfield);
+	value = atoi(text);
+	value += delta;
+	sprintf(text, "%d", value);
+	WMSetTextFieldText(textfield, text);
+}
+
+static void downButtonCallback(WMWidget *self, void *data)
+{
+	(void) self;
+	changeIntTextfield(data, -1);
+}
+
+static void upButtonCallback(WMWidget *self, void *data)
+{
+	(void) self;
+	changeIntTextfield(data, 1);
+}
 
 static void createPanel(Panel *p)
 {
@@ -137,11 +166,13 @@ static void createPanel(Panel *p)
 
 	udb = WMGetStandardUserDefaults();
 	for (i = 0; i < wlengthof(expert_options); i++) {
-		panel->swi[i] = WMCreateSwitchButton(f);
-		WMResizeWidget(panel->swi[i], FRAME_WIDTH - 40, 25);
-		WMMoveWidget(panel->swi[i], 5, 5 + i * 25);
+		if (expert_options[i].class != OPTION_WMAKER_INT) {
+			panel->swi[i] = WMCreateSwitchButton(f);
+			WMResizeWidget(panel->swi[i], FRAME_WIDTH - 40, 25);
+			WMMoveWidget(panel->swi[i], 5, 5 + i * 25);
 
-		WMSetButtonText(panel->swi[i], _(expert_options[i].label));
+			WMSetButtonText(panel->swi[i], _(expert_options[i].label));
+		}
 
 		switch (expert_options[i].class) {
 		case OPTION_WMAKER:
@@ -163,6 +194,49 @@ static void createPanel(Panel *p)
 			state = WMGetUDBoolForKey(udb, expert_options[i].op_name);
 			break;
 
+		case OPTION_WMAKER_INT:
+		{
+			char tmp[10];
+			WMButton *up, *down;
+			WMLabel *label;
+
+			panel->textfield[i] = WMCreateTextField(f);
+			WMResizeWidget(panel->textfield[i], 41, 20);
+			WMMoveWidget(panel->textfield[i], 22, 7 + i * 25);
+
+			down = WMCreateCommandButton(f);
+			WMSetButtonImage(down, WMGetSystemPixmap(WMWidgetScreen(down), WSIArrowDown));
+			WMSetButtonAltImage(down,
+					    WMGetSystemPixmap(WMWidgetScreen(down), WSIHighlightedArrowDown));
+			WMSetButtonImagePosition(down, WIPImageOnly);
+			WMSetButtonAction(down, downButtonCallback, panel->textfield[i]);
+			WMResizeWidget(down, 16, 16);
+			WMMoveWidget(down, 5, 9 + i * 25);
+
+			up = WMCreateCommandButton(f);
+			WMSetButtonImage(up, WMGetSystemPixmap(WMWidgetScreen(up), WSIArrowUp));
+			WMSetButtonAltImage(up, WMGetSystemPixmap(WMWidgetScreen(up), WSIHighlightedArrowUp));
+			WMSetButtonImagePosition(up, WIPImageOnly);
+			WMSetButtonAction(up, upButtonCallback, panel->textfield[i]);
+			WMResizeWidget(up, 16, 16);
+			WMMoveWidget(up, 64, 9 + i * 25);
+
+			label = WMCreateLabel(f);
+			WMSetLabelText(label, _(expert_options[i].label));
+			WMResizeWidget(label, FRAME_WIDTH - 99, 25);
+			WMMoveWidget(label, 85, 5 + i * 25);
+
+			if (GetStringForKey(expert_options[i].op_name))
+				state = GetIntegerForKey(expert_options[i].op_name);
+			else
+				state = expert_options[i].def_state;
+
+			sprintf(tmp, "%d", state);
+			WMSetTextFieldText(panel->textfield[i], tmp);
+
+			break;
+		}
+
 		default:
 #ifdef DEBUG
 			wwarning("export_options[%d].class = %d, this should not happen\n",
@@ -171,7 +245,8 @@ static void createPanel(Panel *p)
 			state = expert_options[i].def_state;
 			break;
 		}
-		WMSetButtonSelected(panel->swi[i], state);
+		if (expert_options[i].class != OPTION_WMAKER_INT)
+			WMSetButtonSelected(panel->swi[i], state);
 	}
 
 	WMMapSubwidgets(panel->box);
@@ -204,6 +279,18 @@ static void storeDefaults(_Panel *panel)
 		case OPTION_USERDEF:
 			WMSetUDBoolForKey(udb, WMGetButtonSelected(panel->swi[i]), expert_options[i].op_name);
 			break;
+
+		case OPTION_WMAKER_INT:
+		{
+			char *text;
+			int value;
+
+			text = WMGetTextFieldText(panel->textfield[i]);
+			value = atoi(text);
+
+			SetIntegerForKey(value, expert_options[i].op_name);
+			break;
+		}
 		}
 	}
 }
-- 
2.1.4


-- 
To unsubscribe, send mail to [email protected].
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.