From acfa924c0115bc143edbb979cba089c175133da7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Fri, 17 Mar 2006 17:09:40 +0000 Subject: [PATCH] * The workspaces window now cannot be moved with the Workspaces app anymore; was a bit strange anyway - this closed bug #317. * The selected window now gets a selection frame in case it can be moved. * If the window cannot be moved, a new workspace isn't selected either. * When choosing a workspace, the one currently selected also gets a selection frame. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@16823 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/app/WorkspacesLayer.cpp | 49 ++++++++++++++++++++++++----- src/servers/app/WorkspacesLayer.h | 1 + 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/servers/app/WorkspacesLayer.cpp b/src/servers/app/WorkspacesLayer.cpp index 345f76b6b0..de78adcb41 100644 --- a/src/servers/app/WorkspacesLayer.cpp +++ b/src/servers/app/WorkspacesLayer.cpp @@ -171,14 +171,18 @@ WorkspacesLayer::_DrawWindow(DrawingEngine* drawingEngine, const BRect& workspac RGBColor yellow; if (decorator != NULL) yellow = decorator->Colors().window_tab; - RGBColor gray(180, 180, 180); + RGBColor frameColor(180, 180, 180); RGBColor white(255, 255, 255); if (!active) { _DarkenColor(yellow); - _DarkenColor(gray); + _DarkenColor(frameColor); _DarkenColor(white); } + if (window == fSelectedWindow) { + // TODO: what about standard navigation color here? + frameColor.SetColor(80, 80, 80); + } if (tabFrame.left < frame.left) tabFrame.left = frame.left; @@ -194,7 +198,7 @@ WorkspacesLayer::_DrawWindow(DrawingEngine* drawingEngine, const BRect& workspac if (decorator != NULL) drawingEngine->StrokeLine(tabFrame.LeftTop(), tabFrame.RightBottom(), yellow); - drawingEngine->StrokeRect(frame, gray); + drawingEngine->StrokeRect(frame, frameColor); frame.InsetBy(1, 1); drawingEngine->FillRect(frame, white); @@ -239,6 +243,9 @@ WorkspacesLayer::_DrawWorkspace(DrawingEngine* drawingEngine, // draw active frame RGBColor black(0, 0, 0); drawingEngine->StrokeRect(rect, black); + } else if (index == fSelectedWorkspace) { + RGBColor gray(80, 80, 80); + drawingEngine->StrokeRect(rect, gray); } rect.InsetBy(1, 1); @@ -282,6 +289,14 @@ WorkspacesLayer::_DarkenColor(RGBColor& color) const } +void +WorkspacesLayer::_Invalidate() const +{ + BRegion region(Frame()); + Window()->MarkContentDirty(region); +} + + void WorkspacesLayer::Draw(DrawingEngine* drawingEngine, BRegion* effectiveClipping, BRegion* windowContentClipping, bool deep) @@ -400,11 +415,17 @@ WorkspacesLayer::MouseDown(BMessage* message, BPoint where) // If this window is movable, we keep it selected - if (fSelectedWindow != NULL && (fSelectedWindow->Flags() & B_NOT_MOVABLE) != 0) + if (fSelectedWindow != NULL && (fSelectedWindow->Flags() & B_NOT_MOVABLE) != 0 + || fSelectedWindow == Window()) { fSelectedWindow = NULL; + index = -1; + } fLeftTopOffset = where - windowFrame.LeftTop(); fSelectedWorkspace = index; + + if (index >= 0) + _Invalidate(); } @@ -418,14 +439,20 @@ WorkspacesLayer::MouseUp(BMessage* message, BPoint where) Window()->Desktop()->SetWorkspace(index); } + if (fSelectedWindow != NULL) { + // We need to hide the selection frame again + _Invalidate(); + } + fSelectedWindow = NULL; + fSelectedWorkspace = -1; } void WorkspacesLayer::MouseMoved(BMessage* message, BPoint where) { - if (fSelectedWindow == NULL) + if (fSelectedWindow == NULL && fSelectedWorkspace < 0) return; // check if the correct mouse button is pressed @@ -441,6 +468,15 @@ WorkspacesLayer::MouseMoved(BMessage* message, BPoint where) int32 index; BRect workspaceFrame = _WorkspaceAt(where, index); + + if (fSelectedWindow == NULL) { + if (fSelectedWorkspace >= 0 && fSelectedWorkspace != index) { + fSelectedWorkspace = index; + _Invalidate(); + } + return; + } + workspaceFrame.InsetBy(1, 1); if (index != fSelectedWorkspace) { @@ -481,8 +517,7 @@ void WorkspacesLayer::WindowChanged(WindowLayer* window) { // TODO: be smarter about this! - BRegion region(Frame()); - Window()->MarkContentDirty(region); + _Invalidate(); } diff --git a/src/servers/app/WorkspacesLayer.h b/src/servers/app/WorkspacesLayer.h index ca1061223c..8621cf1c70 100644 --- a/src/servers/app/WorkspacesLayer.h +++ b/src/servers/app/WorkspacesLayer.h @@ -49,6 +49,7 @@ class WorkspacesLayer : public ViewLayer { int32 index); void _DarkenColor(RGBColor& color) const; + void _Invalidate() const; private: WindowLayer* fSelectedWindow;