From 52a56eb9ec31a3480a22c8c2412f8d4ac21ffa7f Mon Sep 17 00:00:00 2001 From: Vlad Mironov Date: Tue, 19 Mar 2013 07:05:23 +0000 Subject: YAPP: more correct animation git-svn-id: http://svn.miranda-ng.org/main/trunk@4103 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/YAPP/src/popwin.cpp | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) (limited to 'plugins') diff --git a/plugins/YAPP/src/popwin.cpp b/plugins/YAPP/src/popwin.cpp index cbc7eb8139..36cd3f6d30 100644 --- a/plugins/YAPP/src/popwin.cpp +++ b/plugins/YAPP/src/popwin.cpp @@ -35,28 +35,40 @@ int stack_size = 0; void RepositionWindows() { HWNDStackNode *current; - int x = pop_start_x, y = pop_start_y; + int x = pop_start_x, y; int height; if (options.animate == ANIMATE_HORZ) { - if (options.location == PL_BOTTOMRIGHT ||options.location == PL_TOPRIGHT) + if (options.location == PL_BOTTOMRIGHT || options.location == PL_TOPRIGHT) x -= options.win_width + 1; - if (options.location == PL_BOTTOMLEFT ||options.location == PL_TOPLEFT) + if (options.location == PL_BOTTOMLEFT || options.location == PL_TOPLEFT) x += options.win_width + 1; } + // Особый случай: выдвижение окна из-за верхнего края экрана. + if ((options.animate == ANIMATE_VERT) && (options.location == PL_TOPLEFT || options.location == PL_TOPRIGHT)) + y = 0; + else + y = pop_start_y; + current = hwnd_stack_top; - while(current) { + while (current) + { SendMessage(current->hwnd, PUM_GETHEIGHT, (WPARAM)&height, 0); - if (options.location == PL_BOTTOMRIGHT || options.location == PL_BOTTOMLEFT) y -= height + 1; - if (options.animate == ANIMATE_VERT) - if (options.location == PL_TOPRIGHT || options.location == PL_TOPLEFT) y += height + 1; + // Если окна размещать у нижнего края, то координата текущего окна меньше на его высоту. + if (options.location == PL_BOTTOMLEFT || options.location == PL_BOTTOMRIGHT) + y -= height + 1; + + // Перемещаем окно. SendMessage(current->hwnd, PUM_MOVE, (WPARAM)x, (LPARAM)y); - if (options.animate != ANIMATE_VERT) - if (options.location == PL_TOPRIGHT || options.location == PL_TOPLEFT) y += height + 1; + // Координата для следующего окна. + // Если окна размещать у верхнего края, то координата следующего окна больше на высоту текущего окна. + if (options.location == PL_TOPLEFT || options.location == PL_TOPRIGHT) + y += height + 1; + // Переходим к следующему окну. current = current->next; } } @@ -150,8 +162,12 @@ void RemoveWindowFromStack(HWND hwnd) current = current->next; } + // Если после удаления в стеке остались окна, то нужно провести сжатие: + // сдвинуть все окна к верхнему/нижнему краю экрана. if (hwnd_stack_top) + { RepositionWindows(); + } } void BroadcastMessage(UINT msg, WPARAM wParam, LPARAM lParam) -- cgit v1.2.3