Skip to content

Commit

Permalink
* shoes/ruby.c: adding slider control.
Browse files Browse the repository at this point in the history
  • Loading branch information
_why committed Feb 28, 2009
1 parent 9d1b16e commit d3976de
Show file tree
Hide file tree
Showing 7 changed files with 129 additions and 3 deletions.
17 changes: 17 additions & 0 deletions shoes/canvas.c
Expand Up @@ -1031,6 +1031,23 @@ shoes_canvas_progress(int argc, VALUE *argv, VALUE self)
return progress;
}

VALUE
shoes_canvas_slider(int argc, VALUE *argv, VALUE self)
{
rb_arg_list args;
VALUE slider;
SETUP();

rb_parse_args(argc, argv, "|h&", &args);

if (!NIL_P(args.a[1]))
ATTRSET(args.a[0], change, args.a[1]);

slider = shoes_control_new(cSlider, args.a[0], self);
shoes_add_ele(canvas, slider);
return slider;
}

VALUE
shoes_canvas_radio(int argc, VALUE *argv, VALUE self)
{
Expand Down
1 change: 1 addition & 0 deletions shoes/canvas.h
Expand Up @@ -438,6 +438,7 @@ VALUE shoes_canvas_list_box(int, VALUE *, VALUE);
VALUE shoes_canvas_edit_line(int, VALUE *, VALUE);
VALUE shoes_canvas_edit_box(int, VALUE *, VALUE);
VALUE shoes_canvas_progress(int, VALUE *, VALUE);
VALUE shoes_canvas_slider(int, VALUE *, VALUE);
VALUE shoes_canvas_check(int, VALUE *, VALUE);
VALUE shoes_canvas_radio(int, VALUE *, VALUE);
VALUE shoes_canvas_contents(VALUE);
Expand Down
3 changes: 3 additions & 0 deletions shoes/native.h
Expand Up @@ -76,6 +76,9 @@ VALUE shoes_native_list_box_get_active(SHOES_CONTROL_REF, VALUE);
SHOES_CONTROL_REF shoes_native_progress(VALUE, shoes_canvas *, shoes_place *, VALUE, char *);
double shoes_native_progress_get_fraction(SHOES_CONTROL_REF);
void shoes_native_progress_set_fraction(SHOES_CONTROL_REF, double);
SHOES_CONTROL_REF shoes_native_slider(VALUE, shoes_canvas *, shoes_place *, VALUE, char *);
double shoes_native_slider_get_fraction(SHOES_CONTROL_REF);
void shoes_native_slider_set_fraction(SHOES_CONTROL_REF, double);
SHOES_CONTROL_REF shoes_native_check(VALUE, shoes_canvas *, shoes_place *, VALUE, char *);
VALUE shoes_native_check_get(SHOES_CONTROL_REF);
void shoes_native_check_set(SHOES_CONTROL_REF, int);
Expand Down
23 changes: 23 additions & 0 deletions shoes/native/gtk.c
Expand Up @@ -696,6 +696,7 @@ static void
shoes_widget_changed(GtkWidget *ref, gpointer data)
{
VALUE self = (VALUE)data;
printf("CHANGED!\n");
shoes_control_send(self, s_change);
}

Expand Down Expand Up @@ -950,6 +951,28 @@ shoes_native_progress_set_fraction(SHOES_CONTROL_REF ref, double perc)
gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(ref), perc);
}

SHOES_CONTROL_REF
shoes_native_slider(VALUE self, shoes_canvas *canvas, shoes_place *place, VALUE attr, char *msg)
{
SHOES_CONTROL_REF ref = gtk_hscale_new_with_range(0., 1., 0.01);
gtk_scale_set_draw_value(GTK_SCALE(ref), FALSE);
g_signal_connect(G_OBJECT(ref), "value-changed",
G_CALLBACK(shoes_widget_changed), (gpointer)self);
return ref;
}

double
shoes_native_slider_get_fraction(SHOES_CONTROL_REF ref)
{
return gtk_range_get_value(GTK_RANGE(ref));
}

void
shoes_native_slider_set_fraction(SHOES_CONTROL_REF ref, double perc)
{
gtk_range_set_value(GTK_RANGE(ref), perc);
}

SHOES_CONTROL_REF
shoes_native_check(VALUE self, shoes_canvas *canvas, shoes_place *place, VALUE attr, char *msg)
{
Expand Down
35 changes: 35 additions & 0 deletions shoes/native/windows.c
Expand Up @@ -374,6 +374,16 @@ shoes_slot_win32proc(
break;
*/

case WM_HSCROLL:
if (LOWORD(w) == TB_THUMBTRACK)
{
int id = GetDlgCtrlID((HWND)l);
VALUE control = rb_ary_entry(canvas->slot->controls, id - SHOES_CONTROL1);
if (!NIL_P(control))
shoes_control_send(control, s_change);
}
break;

case WM_COMMAND:
if ((HWND)l)
{
Expand Down Expand Up @@ -1336,6 +1346,31 @@ shoes_native_progress_set_fraction(SHOES_CONTROL_REF ref, double perc)
SendMessage(ref, PBM_SETPOS, (int)(perc * 100), 0L);
}

SHOES_CONTROL_REF
shoes_native_slider(VALUE self, shoes_canvas *canvas, shoes_place *place, VALUE attr, char *msg)
{
HWND ref = CreateWindowEx(WS_EX_TRANSPARENT, TRACKBAR_CLASS, msg,
WS_VISIBLE | WS_CHILD | PBS_SMOOTH,
place->ix + place->dx, place->iy + place->dy, place->iw, place->ih,
canvas->slot->window, NULL,
(HINSTANCE)GetWindowLong(canvas->slot->window, GWL_HINSTANCE),
NULL);
SetWindowPos(ref, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOREDRAW);
return ref;
}

double
shoes_native_slider_get_fraction(SHOES_CONTROL_REF ref)
{
return SendMessage(ref, TBM_GETPOS, 0, 0) * 0.01;
}

void
shoes_native_slider_set_fraction(SHOES_CONTROL_REF ref, double perc)
{
SendMessage(ref, TBM_SETPOS, (int)(perc * 100), 0L);
}

SHOES_CONTROL_REF
shoes_native_check(VALUE self, shoes_canvas *canvas, shoes_place *place, VALUE attr, char *msg)
{
Expand Down
48 changes: 47 additions & 1 deletion shoes/ruby.c
Expand Up @@ -13,7 +13,7 @@
#include "shoes/effects.h"
#include <math.h>

VALUE cShoes, cApp, cDialog, cShoesWindow, cMouse, cCanvas, cFlow, cStack, cMask, cWidget, cShape, cImage, cEffect, cVideo, cTimerBase, cTimer, cEvery, cAnim, cPattern, cBorder, cBackground, cTextBlock, cPara, cBanner, cTitle, cSubtitle, cTagline, cCaption, cInscription, cTextClass, cSpan, cDel, cStrong, cSub, cSup, cCode, cEm, cIns, cLinkUrl, cNative, cButton, cCheck, cRadio, cEditLine, cEditBox, cListBox, cProgress, cColor, cDownload, cResponse, cColors, cLink, cLinkHover, ssNestSlot;
VALUE cShoes, cApp, cDialog, cShoesWindow, cMouse, cCanvas, cFlow, cStack, cMask, cWidget, cShape, cImage, cEffect, cVideo, cTimerBase, cTimer, cEvery, cAnim, cPattern, cBorder, cBackground, cTextBlock, cPara, cBanner, cTitle, cSubtitle, cTagline, cCaption, cInscription, cTextClass, cSpan, cDel, cStrong, cSub, cSup, cCode, cEm, cIns, cLinkUrl, cNative, cButton, cCheck, cRadio, cEditLine, cEditBox, cListBox, cProgress, cSlider, cColor, cDownload, cResponse, cColors, cLink, cLinkHover, ssNestSlot;
VALUE eVlcError, eImageError, eInvMode, eNotImpl;
VALUE reHEX_SOURCE, reHEX3_SOURCE, reRGB_SOURCE, reRGBA_SOURCE, reGRAY_SOURCE, reGRAYA_SOURCE, reLF;
VALUE symAltQuest, symAltSlash, symAltDot;
Expand Down Expand Up @@ -3550,6 +3550,47 @@ shoes_check_draw(VALUE self, VALUE c, VALUE actual)
return self;
}

VALUE
shoes_slider_draw(VALUE self, VALUE c, VALUE actual)
{
SETUP_CONTROL(0, 0, FALSE);

if (RTEST(actual))
{
if (self_t->ref == NULL)
{
self_t->ref = shoes_native_slider(self, canvas, &place, self_t->attr, msg);
shoes_native_control_position(self_t->ref, &self_t->place, self, canvas, &place);
}
else
shoes_native_control_repaint(self_t->ref, &self_t->place, canvas, &place);
}

FINISH();

return self;
}

VALUE
shoes_slider_get_fraction(VALUE self)
{
double perc = 0.;
GET_STRUCT(control, self_t);
if (self_t->ref != NULL)
perc = shoes_native_slider_get_fraction(self_t->ref);
return rb_float_new(perc);
}

VALUE
shoes_slider_set_fraction(VALUE self, VALUE _perc)
{
double perc = min(max(NUM2DBL(_perc), 0.0), 1.0);
GET_STRUCT(control, self_t);
if (self_t->ref != NULL)
shoes_native_slider_set_fraction(self_t->ref, perc);
return self;
}

VALUE
shoes_check_is_checked(VALUE self)
{
Expand Down Expand Up @@ -4800,6 +4841,11 @@ shoes_ruby_init()
rb_define_method(cProgress, "draw", CASTHOOK(shoes_progress_draw), 2);
rb_define_method(cProgress, "fraction", CASTHOOK(shoes_progress_get_fraction), 0);
rb_define_method(cProgress, "fraction=", CASTHOOK(shoes_progress_set_fraction), 1);
cSlider = rb_define_class_under(cShoes, "Slider", cNative);
rb_define_method(cSlider, "draw", CASTHOOK(shoes_slider_draw), 2);
rb_define_method(cSlider, "fraction", CASTHOOK(shoes_slider_get_fraction), 0);
rb_define_method(cSlider, "fraction=", CASTHOOK(shoes_slider_set_fraction), 1);
rb_define_method(cSlider, "change", CASTHOOK(shoes_control_change), -1);
cCheck = rb_define_class_under(cShoes, "Check", cNative);
rb_define_method(cCheck, "draw", CASTHOOK(shoes_check_draw), 2);
rb_define_method(cCheck, "checked?", CASTHOOK(shoes_check_is_checked), 0);
Expand Down
5 changes: 3 additions & 2 deletions shoes/ruby.h
Expand Up @@ -77,7 +77,7 @@ static inline void flip_endian(unsigned char* x, int length) {

#undef s_host

extern VALUE cShoes, cApp, cDialog, cShoesWindow, cMouse, cCanvas, cFlow, cStack, cMask, cNative, cShape, cVideo, cImage, cEffect, cEvery, cTimer, cAnim, cPattern, cBorder, cBackground, cPara, cBanner, cTitle, cSubtitle, cTagline, cCaption, cInscription, cLinkText, cTextBlock, cTextClass, cSpan, cStrong, cSub, cSup, cCode, cDel, cEm, cIns, cButton, cEditLine, cEditBox, cListBox, cProgress, cCheck, cRadio, cColor, cDownload, cResponse, cColors, cLink, cLinkHover, ssNestSlot;
extern VALUE cShoes, cApp, cDialog, cShoesWindow, cMouse, cCanvas, cFlow, cStack, cMask, cNative, cShape, cVideo, cImage, cEffect, cEvery, cTimer, cAnim, cPattern, cBorder, cBackground, cPara, cBanner, cTitle, cSubtitle, cTagline, cCaption, cInscription, cLinkText, cTextBlock, cTextClass, cSpan, cStrong, cSub, cSup, cCode, cDel, cEm, cIns, cButton, cEditLine, cEditBox, cListBox, cProgress, cSlider, cCheck, cRadio, cColor, cDownload, cResponse, cColors, cLink, cLinkHover, ssNestSlot;
extern VALUE aMsgList;
extern VALUE eInvMode, eNotImpl, eImageError;
extern VALUE reHEX_SOURCE, reHEX3_SOURCE, reRGB_SOURCE, reRGBA_SOURCE, reGRAY_SOURCE, reGRAYA_SOURCE, reLF;
Expand Down Expand Up @@ -191,7 +191,7 @@ void shoes_ele_remove_all(VALUE);
void shoes_cairo_rect(cairo_t *, double, double, double, double, double);
void shoes_cairo_arc(cairo_t *, double, double, double, double, double, double);

#define SYMBOL_DEFS(f) f(bind); f(gsub); f(keys); f(update); f(merge); f(new); f(URI); f(now); f(debug); f(info); f(warn); f(error); f(run); f(to_a); f(to_ary); f(to_f); f(to_i); f(to_int); f(to_s); f(to_str); f(to_pattern); f(align); f(angle); f(angle1); f(angle2); f(arrow); f(autoplay); f(begin); f(body); f(cancel); f(call); f(center); f(change); f(checked); f(choose); f(click); f(corner); f(curve); f(distance); f(displace_left); f(displace_top); f(downcase); f(draw); f(emphasis); f(end); f(family); f(fill); f(finish); f(font); f(fullscreen); f(group); f(hand); f(headers); f(hidden); f(host); f(hover); f(href); f(insert); f(inner); f(items); f(justify); f(kerning); f(keypress); f(match); f(method); f(motion); f(link); f(leading); f(leave); f(ok); f(outer); f(path); f(points); f(port); f(progress); f(redirect); f(release); f(request_uri); f(rise); f(scheme); f(save); f(size); f(state); f(wheel); f(scroll); f(stretch); f(strikecolor); f(strikethrough); f(stroke); f(start); f(attach); f(text); f(title); f(top); f(right); f(bottom); f(left); f(up); f(down); f(height); f(remove); f(resizable); f(strokewidth); f(cap); f(width); f(margin); f(margin_left); f(margin_right); f(margin_top); f(margin_bottom); f(radius); f(secret); f(blur); f(glow); f(shadow); f(arc); f(rect); f(oval); f(line); f(shape); f(star); f(project); f(round); f(square); f(undercolor); f(underline); f(variant); f(weight); f(wrap);
#define SYMBOL_DEFS(f) f(bind); f(gsub); f(keys); f(update); f(merge); f(new); f(URI); f(now); f(debug); f(info); f(warn); f(error); f(run); f(to_a); f(to_ary); f(to_f); f(to_i); f(to_int); f(to_s); f(to_str); f(to_pattern); f(align); f(angle); f(angle1); f(angle2); f(arrow); f(autoplay); f(begin); f(body); f(cancel); f(call); f(center); f(change); f(checked); f(choose); f(click); f(corner); f(curve); f(distance); f(displace_left); f(displace_top); f(downcase); f(draw); f(emphasis); f(end); f(family); f(fill); f(finish); f(font); f(fullscreen); f(group); f(hand); f(headers); f(hidden); f(host); f(hover); f(href); f(insert); f(inner); f(items); f(justify); f(kerning); f(keypress); f(match); f(method); f(motion); f(link); f(leading); f(leave); f(ok); f(outer); f(path); f(points); f(port); f(progress); f(redirect); f(release); f(request_uri); f(rise); f(scheme); f(save); f(size); f(slider); f(state); f(wheel); f(scroll); f(stretch); f(strikecolor); f(strikethrough); f(stroke); f(start); f(attach); f(text); f(title); f(top); f(right); f(bottom); f(left); f(up); f(down); f(height); f(remove); f(resizable); f(strokewidth); f(cap); f(width); f(margin); f(margin_left); f(margin_right); f(margin_top); f(margin_bottom); f(radius); f(secret); f(blur); f(glow); f(shadow); f(arc); f(rect); f(oval); f(line); f(shape); f(star); f(project); f(round); f(square); f(undercolor); f(underline); f(variant); f(weight); f(wrap);
#define SYMBOL_INTERN(name) s_##name = rb_intern("" # name)
#define SYMBOL_ID(name) ID s_##name
#define SYMBOL_EXTERN(name) extern ID s_##name
Expand Down Expand Up @@ -258,6 +258,7 @@ SYMBOL_DEFS(SYMBOL_EXTERN);
f("+edit_line", edit_line, -1); \
f("+edit_box", edit_box, -1); \
f("+progress", progress, -1); \
f("+slider", slider, -1); \
f("+check", check, -1); \
f("+radio", radio, -1); \
f(".app", get_app, 0); \
Expand Down

0 comments on commit d3976de

Please sign in to comment.