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].