int SDL_ToggleButtonEventHandler(SDL_Widget *widget,SDL_Event *event) { SDL_ToggleButton *Button=(SDL_ToggleButton*)widget; switch(event->type) { case SDL_MOUSEMOTION: if(SDL_WidgetIsInside(widget,event->motion.x,event->motion.y)) { if(Button->State == SDL_BUTTON_STATE_UP) { Button->State = SDL_BUTTON_STATE_HIGHLIGHTED; SDL_WidgetRedrawEvent(widget); } } else Button->State = SDL_BUTTON_STATE_UP; break; case SDL_MOUSEBUTTONUP: if(SDL_WidgetIsInside(widget,event->motion.x,event->motion.y)) { Button->State = SDL_BUTTON_STATE_HIGHLIGHTED; SDL_WidgetRedrawEvent(widget); } else Button->State = SDL_BUTTON_STATE_UP; break; default: break; } return 0; }
int SDL_ProgressBarEventHandler(SDL_Widget *widget, SDL_Event *event) { SDL_ProgressBar *ProgressBar=(SDL_ProgressBar*)widget; switch(event->type) { case SDL_MOUSEBUTTONDOWN: if(SDL_WidgetIsInside(widget,event->motion.x,event->motion.y)) { if(ProgressBar->Orientation == HORIZONTAL) { ProgressBar->State=PROGRESSBAR_DRAG; ProgressBar->CurrentLine = event->motion.x - widget->Rect.x; ProgressBar_CurrentValue(ProgressBar); SDL_WidgetRedrawEvent(widget); } } break; case SDL_MOUSEMOTION: if(ProgressBar->Orientation == HORIZONTAL) { if(ProgressBar->State==PROGRESSBAR_DRAG) { ProgressBar->CurrentLine = event->motion.x - widget->Rect.x; ProgressBar_CurrentValue(ProgressBar); SDL_WidgetRedrawEvent(widget); } } break; case SDL_MOUSEBUTTONUP: if(ProgressBar->State == PROGRESSBAR_DRAG || SDL_WidgetIsInside(widget,event->motion.x,event->motion.y)) { if(ProgressBar->Orientation == VERTICAL) { ProgressBar->CurrentLine = event->motion.y - widget->Rect.y; ProgressBar_CurrentValue(ProgressBar); SDL_WidgetRedrawEvent(widget); } else if(ProgressBar->Orientation == HORIZONTAL) { ProgressBar->CurrentLine = event->motion.x - widget->Rect.x; ProgressBar_CurrentValue(ProgressBar); SDL_WidgetRedrawEvent(widget); } ProgressBar->State=PROGRESSBAR_NORMAL; SDL_SignalEmit(widget,"clicked"); } break; default: break; } return 0; }
int SDL_PanelSetBackgroundColor(SDL_Widget *widget,Uint32 color) { SDL_Panel *Panel=(SDL_Panel*)widget; Panel->color=color; SDL_WidgetRedrawEvent(widget); return 1; }
static void SDL_ButtonSignalMouseButtonUp(SDL_Object *object,void *signaldata,void *userdata) { SDL_Button *Button=(SDL_Button*)object; SDL_Event *event=(SDL_Event *)signaldata; SDL_Widget *widget=(SDL_Widget*)object; if(SDL_WidgetIsInside(widget,event->motion.x,event->motion.y)) { Button->State = SDL_BUTTON_STATE_HIGHLIGHTED; SDL_WidgetRedrawEvent(widget); } else { if(Button->State != SDL_BUTTON_STATE_UP) { Button->State = SDL_BUTTON_STATE_UP; SDL_WidgetRedrawEvent(widget); } } }
static int SDL_ScrollbarPixeloffset(SDL_Scrollbar *Scrollbar) { SDL_Widget *widget=(SDL_Widget*)Scrollbar; int retval = 0; if(Scrollbar->CurrentValue < Scrollbar->MinValue) Scrollbar->CurrentValue = Scrollbar->MinValue; if(Scrollbar->CurrentValue > Scrollbar->MaxValue) Scrollbar->CurrentValue = Scrollbar->MaxValue; if(Scrollbar->Orientation == VERTICAL) { int height = widget->Rect.h * Scrollbar->NormalStepValue / Scrollbar->MaxValue; /* Height is the button height */ if(height < 6) height = 6; Scrollbar->PixelValue = Scrollbar->CurrentValue * (widget->Rect.h - height) / Scrollbar->MaxValue; if(Scrollbar->PixelValue > widget->Rect.h - height) Scrollbar->PixelValue = widget->Rect.h - height; retval = 1; } else { int width = widget->Rect.w * Scrollbar->NormalStepValue / Scrollbar->MaxValue; /* Width is the button height */ if(width < 6) width = 6; Scrollbar->PixelValue = Scrollbar->CurrentValue * (widget->Rect.w - width) / Scrollbar->MaxValue; if(Scrollbar->PixelValue > widget->Rect.w - width) Scrollbar->PixelValue = widget->Rect.w - width; retval = 1; } SDL_SignalEmit(widget,"value-changed",widget); SDL_WidgetRedrawEvent(widget); return retval; }
static void SDL_ButtonSignalMouseButtonDown(SDL_Object *object,void *signaldata,void *userdata) { SDL_Button *Button = (SDL_Button*) object; SDL_Event *event = (SDL_Event *) signaldata; SDL_Widget *widget = (SDL_Widget*) object; if(SDL_WidgetIsInside(widget,event->motion.x,event->motion.y) && event->button.button == 1) { Button->State = SDL_BUTTON_STATE_DOWN; SDL_SignalEmit(widget,"clicked",NULL); SDL_WidgetRedrawEvent(widget); } else Button->State = SDL_BUTTON_STATE_UP; }
static void SDL_SignalToggleButtonMouseButtonDown(SDL_Object *object,void *signaldata,void *userdata) { SDL_ToggleButton *Button=(SDL_ToggleButton*)object; SDL_Event *event=(SDL_Event*)signaldata; if(SDL_WidgetIsInside((SDL_Widget*)object,event->motion.x,event->motion.y)) { Button->State = SDL_BUTTON_STATE_DOWN; SDL_SignalObjectEmit(object,"clicked",NULL); SDL_WidgetRedrawEvent((SDL_Widget*)object); } else Button->State = SDL_BUTTON_STATE_UP; userdata=userdata; }
int SDL_LabelSetText(SDL_Widget *widget,char *text) { SDL_Label *Label=(SDL_Label*)widget; if(Label == NULL || text == NULL) return 0; if(Label->Caption) SDL_StringFree(Label->Caption); Label->Caption = SDL_StringCreate(text); SDL_WidgetRedrawEvent(widget); return 1; }
void SDL_ScrollbarSetCurrentValue(SDL_Widget *widget,int CurrentValue) { SDL_Scrollbar *Scrollbar=(SDL_Scrollbar*)widget; if(CurrentValue < 0) CurrentValue = 0; if(CurrentValue >= Scrollbar->MaxValue) CurrentValue = Scrollbar->MaxValue - 1; if(Scrollbar->CurrentValue != CurrentValue) { Scrollbar->CurrentValue = CurrentValue; Scrollbar->PixelValue = Scrollbar->CurrentValue * widget->Rect.h / Scrollbar->MaxValue; SDL_SignalEmit(widget,"value-changed",widget); SDL_WidgetRedrawEvent(widget); } }
int SDL_ScrollbarSetMaxValue(SDL_Widget *widget,int MaxValue) { SDL_Scrollbar *Scrollbar=(SDL_Scrollbar*)widget; if(MaxValue == 0) return 0; if(MaxValue < Scrollbar->CurrentValue) { Scrollbar->CurrentValue = MaxValue; SDL_SignalEmit(widget,"value-changed",widget); } Scrollbar->MaxValue = MaxValue; SDL_ScrollbarPixeloffset(Scrollbar); SDL_WidgetRedrawEvent(widget); return 1; }
static void SDL_ButtonSignalMouseMotion(SDL_Object *object,void *signaldata,void *userdata) { SDL_Button *Button=(SDL_Button*)object; SDL_Event *event = (SDL_Event *)signaldata; SDL_Widget *widget=(SDL_Widget*)object; if(SDL_WidgetIsInside(widget,event->motion.x,event->motion.y)) { if(Button->State == SDL_BUTTON_STATE_UP) { Button->State = SDL_BUTTON_STATE_HIGHLIGHTED; #if 0 if(Button->Style != NULL && Button->Style->Highlighted != NULL) { SDL_WidgetRedrawEvent(widget); } #endif } } }
int SDL_ProgressBarSetCurrentValue(SDL_Widget *widget,int value) { SDL_ProgressBar *ProgressBar=(SDL_ProgressBar*)widget; if(ProgressBar->State == PROGRESSBAR_DRAG) return 0; if(ProgressBar->CurrentValue != value ) { ProgressBar->CurrentValue = value; if(ProgressBar->Orientation == VERTICAL) { ProgressBar->CurrentLine = (value * widget->Rect.h) / (ProgressBar->MaxValue - ProgressBar->MinValue); } else { ProgressBar->CurrentLine = (value * widget->Rect.w) / (ProgressBar->MaxValue - ProgressBar->MinValue); } SDL_WidgetRedrawEvent(widget); } return 0; }
/* return 0 if no windows are available */ int SDL_WindowManagerEvent(SDL_Event *event) { SDL_WidgetList* WidgetList; SDL_Widget* focus_widget=NULL; SDL_Window *window; SDL_WindowManagerWindowEvent(event); window = SDL_WindowGetTopVisibleWindow(); if(SDL_WindowAvailable() == 0) return 0; if(window && event->type >= SDL_MOUSEMOTION) { event->motion.xrel = event->motion.x; event->motion.yrel = event->motion.y; event->motion.x -= window->Widget.Rect.x; event->motion.y -= window->Widget.Rect.y; } focus_widget = SDL_WindowGetFocusWidget(); if(event->type == SDL_MOUSEBUTTONDOWN && focus_widget != NULL && SDL_WidgetIsInside(focus_widget,event->motion.x,event->motion.y)) { SDL_WidgetEvent(focus_widget,event); return 1; } if(event->type == SDL_MOUSEBUTTONDOWN) { SDL_WidgetList* focus_widget = SDL_WindowGetWidgetList(); while(focus_widget) { SDL_Widget *w=(SDL_Widget*)focus_widget->Widget; if(SDL_WidgetIsInside(w,event->motion.x,event->motion.y)) { if(focus_widget->Widget->flags & WIDGET_FOCUSABLE) { SDL_WindowSetFocusWidget(focus_widget->Widget); SDL_WidgetRedrawEvent(focus_widget->Widget); } /* Bug found when there are overlapping widgets the focus is set to the wrong widget */ } focus_widget=focus_widget->Next; } } WidgetList = SDL_WindowGetWidgetList(); while(WidgetList) { /* ATTEN: here should be the old value of the WidgetList, if the win->WidgetList value changed in the following * SDL_WidgetEvent() function, then this pointer here could not update immediately. */ SDL_Widget *Widget=(SDL_Widget*)WidgetList->Widget; /* tangg added */ if(Widget && (Widget->flags & WIDGET_VISIBLE)) { SDL_WidgetEvent(Widget,event); } WidgetList=WidgetList->Next; } /* If the widgets don't handle the event pass the event to the event handler of the window */ { SDL_Window *Win; Win=SDL_WindowGetTopVisibleWindow(); if(Win && Win->EventHandler) { Win->EventHandler(*event); } } return 1; }
int SDL_WindowManagerWindowEvent(SDL_Event *event) { SDL_WindowListElem *CurrentWindow = (SDL_WindowListElem*)WindowList.last; SDL_WindowListElem *PreviousWindow = NULL; SDL_WindowListElem *StoredPreviousWindow = NULL; SDL_WindowListElem *StoredWindow = NULL; switch(event->type) { case SDL_KEYDOWN: switch( event->key.keysym.sym ) { case SDLK_TAB: { SDL_Widget *FocusWidget; SDL_WidgetList *WidgetList; SDL_Widget *FirstFocusWidget=NULL; int store=0; WidgetList = SDL_WindowGetWidgetList(); FocusWidget = SDL_WindowGetFocusWidget(); while(WidgetList) { if(FocusWidget == NULL) { if(WidgetList->Widget->flags & WIDGET_FOCUSABLE) { SDL_WindowSetFocusWidget(WidgetList->Widget); break; } } else { if((WidgetList->Widget->flags & WIDGET_FOCUSABLE) && FirstFocusWidget == NULL) FirstFocusWidget=WidgetList->Widget; if(store && (WidgetList->Widget->flags & WIDGET_FOCUSABLE)) { SDL_WindowSetFocusWidget(WidgetList->Widget); break; } if(WidgetList->Widget == FocusWidget) store=1; } WidgetList = WidgetList->Next; } if(WidgetList == NULL) { if(FirstFocusWidget) SDL_WindowSetFocusWidget(FirstFocusWidget); } SDL_WidgetRedrawEvent(FocusWidget); } break; default: break; } break; } if(event->type == SDL_MOUSEBUTTONDOWN && CurrentWindow) { while(CurrentWindow->ll.next) { if(SDL_WidgetIsInside(&CurrentWindow->Window->Widget,event->motion.x,event->motion.y)) { /* Remember the top most visible window which is clicked on */ StoredWindow = CurrentWindow; StoredPreviousWindow = PreviousWindow; } PreviousWindow = CurrentWindow; CurrentWindow = (SDL_WindowListElem*)CurrentWindow->ll.next; } if(StoredWindow) { /* If there is a window click, make sure it becomes the top visible window */ CurrentWindow->ll.next = &StoredWindow->ll; if(StoredPreviousWindow == NULL) WindowList.first = StoredWindow->ll.next; else StoredPreviousWindow->ll.next = StoredWindow->ll.next; StoredWindow->ll.next = NULL; return 1; } } return 0; }
static void SDL_PanelImageFrameUpdate(SDL_Object *object,void *signaldata,void *userdata) { SDL_WidgetRedrawEvent(userdata); }
static void SDL_ScrollbarSignalMouseMotion(SDL_Object *object,void *signaldata,void *userdata) { SDL_Scrollbar *Scrollbar=(SDL_Scrollbar*)object; SDL_Widget *widget=(SDL_Widget*)object; SDL_Event *Event=(SDL_Event*)signaldata; if(Scrollbar->State == SCROLLBAR_DRAG) { if(Scrollbar->Orientation == VERTICAL) { int height; height = widget->Rect.h * Scrollbar->NormalStepValue / Scrollbar->MaxValue; /* Height is the button height */ if(height < 6) height = 6; Scrollbar->PixelValue = Event->motion.y - widget->Rect.y - Scrollbar->offset; if(Scrollbar->PixelValue > widget->Rect.h - height) Scrollbar->PixelValue = widget->Rect.h - height; if(Scrollbar->PixelValue < 0) Scrollbar->PixelValue = 0; Scrollbar->CurrentValue = ((Scrollbar->MaxValue - Scrollbar->MinValue)* Scrollbar->PixelValue) / (widget->Rect.h - height); if(Scrollbar->CurrentValue < 0) Scrollbar->CurrentValue = 0; SDL_SignalEmit(widget,"value-changed",widget); SDL_WidgetRedrawEvent(widget); } else { int width; width = widget->Rect.w *Scrollbar->NormalStepValue / Scrollbar->MaxValue; /* Height is the button height */ if(width < 6) width = 6; Scrollbar->PixelValue = Event->motion.x - widget->Rect.x - Scrollbar->offset; if(Scrollbar->PixelValue > widget->Rect.w - width) Scrollbar->PixelValue = widget->Rect.w - width; if(Scrollbar->PixelValue < 0) Scrollbar->PixelValue = 0; Scrollbar->CurrentValue = ((Scrollbar->MaxValue - Scrollbar->MinValue) * Scrollbar->PixelValue) / (widget->Rect.w - width); if(Scrollbar->CurrentValue < 0) Scrollbar->CurrentValue = 0; SDL_SignalEmit(widget,"value-changed",widget); SDL_WidgetRedrawEvent(widget); } } }