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;
|
||||
}
|
||||
|
||||
/** 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;
|
||||
|
||||
|
@ -1211,45 +1260,8 @@ static bool HandleWindowDragging(void)
|
|||
_drag_delta.x += x;
|
||||
_drag_delta.y += y;
|
||||
|
||||
SetWindowDirty(w);
|
||||
|
||||
/* 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;
|
||||
}
|
||||
/* ResizeWindow sets both pre- and after-size to dirty for redrawal */
|
||||
ResizeWindow(w, x, y);
|
||||
|
||||
e.event = WE_RESIZE;
|
||||
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.y = y;
|
||||
w->wndproc(w, &e);
|
||||
|
||||
SetWindowDirty(w);
|
||||
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);
|
||||
|
||||
void DrawWindowViewport(const Window *w);
|
||||
void ResizeWindow(Window *w, int x, int y);
|
||||
|
||||
/**
|
||||
* Sets the enabled/disabled status of a widget.
|
||||
|
|
Loading…
Reference in New Issue