mirror of https://github.com/OpenTTD/OpenTTD
(svn r7409) -Codechange: Make the ResizeWindow function also available outside of window.c. This makes
it possible to programmatically resize windows specifying a delta x,y.release/0.5
parent
5f06024a2a
commit
cf385cccf3
92
window.c
92
window.c
|
@ -1026,6 +1026,55 @@ static bool HandleMouseOver(void)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Update all the widgets of a window based on their resize flags
|
||||||
|
* Both the areas of the old window and the new sized window are set dirty
|
||||||
|
* ensuring proper redrawal.
|
||||||
|
* @param w Window to resize
|
||||||
|
* @param x delta x-size of changed window (positive if larger, etc.(
|
||||||
|
* @param y delta y-size of changed window */
|
||||||
|
void ResizeWindow(Window *w, int x, int y)
|
||||||
|
{
|
||||||
|
Widget *wi;
|
||||||
|
bool resize_height = false;
|
||||||
|
bool resize_width = false;
|
||||||
|
|
||||||
|
if (x == 0 && y == 0) return;
|
||||||
|
|
||||||
|
SetWindowDirty(w);
|
||||||
|
for (wi = w->widget; wi->type != WWT_LAST; wi++) {
|
||||||
|
/* Isolate the resizing flags */
|
||||||
|
byte rsizeflag = GB(wi->display_flags, 0, 4);
|
||||||
|
|
||||||
|
if (rsizeflag == RESIZE_NONE) continue;
|
||||||
|
|
||||||
|
/* Resize the widget based on its resize-flag */
|
||||||
|
if (rsizeflag & RESIZE_LEFT) {
|
||||||
|
wi->left += x;
|
||||||
|
resize_width = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rsizeflag & RESIZE_RIGHT) {
|
||||||
|
wi->right += x;
|
||||||
|
resize_width = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rsizeflag & RESIZE_TOP) {
|
||||||
|
wi->top += y;
|
||||||
|
resize_height = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rsizeflag & RESIZE_BOTTOM) {
|
||||||
|
wi->bottom += y;
|
||||||
|
resize_height = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We resized at least 1 widget, so let's resize the window totally */
|
||||||
|
if (resize_width) w->width += x;
|
||||||
|
if (resize_height) w->height += y;
|
||||||
|
|
||||||
|
SetWindowDirty(w);
|
||||||
|
}
|
||||||
|
|
||||||
static bool _dragging_window;
|
static bool _dragging_window;
|
||||||
|
|
||||||
|
@ -1211,45 +1260,8 @@ static bool HandleWindowDragging(void)
|
||||||
_drag_delta.x += x;
|
_drag_delta.x += x;
|
||||||
_drag_delta.y += y;
|
_drag_delta.y += y;
|
||||||
|
|
||||||
SetWindowDirty(w);
|
/* ResizeWindow sets both pre- and after-size to dirty for redrawal */
|
||||||
|
ResizeWindow(w, x, y);
|
||||||
/* Scroll through all the windows and update the widgets if needed */
|
|
||||||
{
|
|
||||||
Widget *wi = w->widget;
|
|
||||||
bool resize_height = false;
|
|
||||||
bool resize_width = false;
|
|
||||||
|
|
||||||
while (wi->type != WWT_LAST) {
|
|
||||||
/* Isolate the resizing flags */
|
|
||||||
byte rsizeflag = GB(wi->display_flags, 0, 4);
|
|
||||||
|
|
||||||
if (rsizeflag != RESIZE_NONE) {
|
|
||||||
/* Resize this widget */
|
|
||||||
if (rsizeflag & RESIZE_LEFT) {
|
|
||||||
wi->left += x;
|
|
||||||
resize_width = true;
|
|
||||||
}
|
|
||||||
if (rsizeflag & RESIZE_RIGHT) {
|
|
||||||
wi->right += x;
|
|
||||||
resize_width = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rsizeflag & RESIZE_TOP) {
|
|
||||||
wi->top += y;
|
|
||||||
resize_height = true;
|
|
||||||
}
|
|
||||||
if (rsizeflag & RESIZE_BOTTOM) {
|
|
||||||
wi->bottom += y;
|
|
||||||
resize_height = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
wi++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* We resized at least 1 widget, so let's rezise the window totally */
|
|
||||||
if (resize_width) w->width = x + w->width;
|
|
||||||
if (resize_height) w->height = y + w->height;
|
|
||||||
}
|
|
||||||
|
|
||||||
e.event = WE_RESIZE;
|
e.event = WE_RESIZE;
|
||||||
e.we.sizing.size.x = x + w->width;
|
e.we.sizing.size.x = x + w->width;
|
||||||
|
@ -1257,8 +1269,6 @@ static bool HandleWindowDragging(void)
|
||||||
e.we.sizing.diff.x = x;
|
e.we.sizing.diff.x = x;
|
||||||
e.we.sizing.diff.y = y;
|
e.we.sizing.diff.y = y;
|
||||||
w->wndproc(w, &e);
|
w->wndproc(w, &e);
|
||||||
|
|
||||||
SetWindowDirty(w);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
1
window.h
1
window.h
|
@ -630,6 +630,7 @@ Window *AllocateWindowDesc(const WindowDesc *desc);
|
||||||
Window *AllocateWindowDescFront(const WindowDesc *desc, int window_number);
|
Window *AllocateWindowDescFront(const WindowDesc *desc, int window_number);
|
||||||
|
|
||||||
void DrawWindowViewport(const Window *w);
|
void DrawWindowViewport(const Window *w);
|
||||||
|
void ResizeWindow(Window *w, int x, int y);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the enabled/disabled status of a widget.
|
* Sets the enabled/disabled status of a widget.
|
||||||
|
|
Loading…
Reference in New Issue