diff options
author | rubidium <rubidium@openttd.org> | 2007-07-27 12:49:04 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2007-07-27 12:49:04 +0000 |
commit | 13ab17bca8f57c7bf3b832963e2cc45576811fbb (patch) | |
tree | f4c661f7c16cd7e6a54b5db9b261dbabb7f187ed /src/window.cpp | |
parent | ff85f640db4871a197a92e283147a55c6b2e6132 (diff) | |
download | openttd-13ab17bca8f57c7bf3b832963e2cc45576811fbb.tar.xz |
(svn r10704) -Codechange: provide an infrastructure to have resizable windows that are smaller than the default window size.
Diffstat (limited to 'src/window.cpp')
-rw-r--r-- | src/window.cpp | 55 |
1 files changed, 40 insertions, 15 deletions
diff --git a/src/window.cpp b/src/window.cpp index 819c8ffc3..6fa049e0c 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -590,15 +590,17 @@ static Window *FindFreeWindow() * Only addition here is window_number, which is the window_number being assigned to the new window * @param x offset in pixels from the left of the screen * @param y offset in pixels from the top of the screen - * @param width width in pixels of the window - * @param height height in pixels of the window + * @param min_width minimum width in pixels of the window + * @param min_height minimum height in pixels of the window + * @param def_width default width in pixels of the window + * @param def_height default height in pixels of the window * @param *proc see WindowProc function to call when any messages/updates happen to the window * @param cls see WindowClass class of the window, used for identification and grouping * @param *widget see Widget pointer to the window layout and various elements * @param window_number number being assigned to the new window * @return Window pointer of the newly created window */ static Window *LocalAllocateWindow( - int x, int y, int width, int height, + int x, int y, int min_width, int min_height, int def_width, int def_height, WindowProc *proc, WindowClass cls, const Widget *widget, int window_number) { Window *w = FindFreeWindow(); @@ -617,12 +619,12 @@ static Window *LocalAllocateWindow( w->caption_color = 0xFF; w->left = x; w->top = y; - w->width = width; - w->height = height; + w->width = min_width; + w->height = min_height; w->wndproc = proc; AssignWidgetToWindow(w, widget); - w->resize.width = width; - w->resize.height = height; + w->resize.width = min_width; + w->resize.height = min_height; w->resize.step_width = 1; w->resize.step_height = 1; w->window_number = window_number; @@ -653,6 +655,23 @@ static Window *LocalAllocateWindow( } CallWindowEventNP(w, WE_CREATE); + + /* Try to make windows smaller when our window is too small */ + if (min_width != def_width || min_height != def_height) { + int enlarge_x = max(min(def_width - min_width, _screen.width - min_width), 0); + int enlarge_y = max(min(def_height - min_height, _screen.height - min_height), 0); + + /* X and Y has to go by step.. calculate it. + * The cast to int is necessary else x/y are implicitly casted to + * unsigned int, which won't work. */ + if (w->resize.step_width > 1) enlarge_x -= enlarge_x % (int)w->resize.step_width; + if (w->resize.step_height > 1) enlarge_y -= enlarge_y % (int)w->resize.step_height; + + ResizeWindow(w, enlarge_x, enlarge_y); + if (w->left < 0) w->left = 0; + if (w->top < 0) w->top = 0; + } + SetWindowDirty(w); return w; @@ -675,7 +694,7 @@ Window *AllocateWindow( int x, int y, int width, int height, WindowProc *proc, WindowClass cls, const Widget *widget) { - return LocalAllocateWindow(x, y, width, height, proc, cls, widget, 0); + return LocalAllocateWindow(x, y, width, height, width, height, proc, cls, widget, 0); } struct SizeRect { @@ -800,24 +819,24 @@ static Window *LocalAllocateWindowDesc(const WindowDesc *desc, int window_number w->left < _screen.width - 20 && w->left > -60 && w->top < _screen.height - 20) { pt.x = w->left + 10; - if (pt.x > _screen.width + 10 - desc->width) { - pt.x = (_screen.width + 10 - desc->width) - 20; + if (pt.x > _screen.width + 10 - desc->default_width) { + pt.x = (_screen.width + 10 - desc->default_width) - 20; } pt.y = w->top + 10; } else { switch (desc->left) { case WDP_ALIGN_TBR: { /* Align the right side with the top toolbar */ w = FindWindowById(WC_MAIN_TOOLBAR, 0); - pt.x = (w->left + w->width) - desc->width; + pt.x = (w->left + w->width) - desc->default_width; } break; case WDP_ALIGN_TBL: /* Align the left side with the top toolbar */ pt.x = FindWindowById(WC_MAIN_TOOLBAR, 0)->left; break; case WDP_AUTO: /* Find a good automatic position for the window */ - pt = GetAutoPlacePosition(desc->width, desc->height); + pt = GetAutoPlacePosition(desc->default_width, desc->default_height); goto allocate_window; case WDP_CENTER: /* Centre the window horizontally */ - pt.x = (_screen.width - desc->width) / 2; + pt.x = (_screen.width - desc->default_width) / 2; break; default: pt.x = desc->left; @@ -826,7 +845,7 @@ static Window *LocalAllocateWindowDesc(const WindowDesc *desc, int window_number switch (desc->top) { case WDP_CENTER: /* Centre the window vertically */ - pt.y = (_screen.height - desc->height) / 2; + pt.y = (_screen.height - desc->default_height) / 2; break; /* WDP_AUTO sets the position at once and is controlled by desc->left. * Both left and top must be set to WDP_AUTO */ @@ -842,7 +861,7 @@ static Window *LocalAllocateWindowDesc(const WindowDesc *desc, int window_number } allocate_window: - w = LocalAllocateWindow(pt.x, pt.y, desc->width, desc->height, desc->proc, desc->cls, desc->widgets, window_number); + w = LocalAllocateWindow(pt.x, pt.y, desc->minimum_width, desc->minimum_height, desc->default_width, desc->default_height, desc->proc, desc->cls, desc->widgets, window_number); w->desc_flags = desc->flags; return w; } @@ -1074,6 +1093,12 @@ void ResizeWindow(Window *w, int x, int y) bool resize_height = false; bool resize_width = false; + /* X and Y has to go by step.. calculate it. + * The cast to int is necessary else x/y are implicitly casted to + * unsigned int, which won't work. */ + if (w->resize.step_width > 1) x -= x % (int)w->resize.step_width; + if (w->resize.step_height > 1) y -= y % (int)w->resize.step_height; + if (x == 0 && y == 0) return; SetWindowDirty(w); |