From 9a7e7a267a0aa78a78ac53150f89b111866c0ff4 Mon Sep 17 00:00:00 2001 From: jules Date: Tue, 11 Sep 2012 10:57:09 +0100 Subject: [PATCH] New method: Rectangle::constainedWithin(). --- .../juce_core/native/juce_win32_Threads.cpp | 2 +- .../juce_graphics/geometry/juce_Rectangle.h | 18 ++++++- .../juce_graphics/native/juce_win32_Fonts.cpp | 4 +- .../native/juce_win32_Windowing.cpp | 10 ++-- .../windows/juce_TopLevelWindow.cpp | 52 +++++++------------ .../windows/juce_TopLevelWindow.h | 4 +- 6 files changed, 47 insertions(+), 43 deletions(-) diff --git a/modules/juce_core/native/juce_win32_Threads.cpp b/modules/juce_core/native/juce_win32_Threads.cpp index 75bfcabc73..7129092185 100644 --- a/modules/juce_core/native/juce_win32_Threads.cpp +++ b/modules/juce_core/native/juce_win32_Threads.cpp @@ -322,7 +322,7 @@ void Process::terminate() ExitProcess (0); } -bool juce_IsRunningInWine() +bool juce_isRunningInWine() { HMODULE ntdll = GetModuleHandleA ("ntdll"); return ntdll != 0 && GetProcAddress (ntdll, "wine_get_version") != nullptr; diff --git a/modules/juce_graphics/geometry/juce_Rectangle.h b/modules/juce_graphics/geometry/juce_Rectangle.h index 1d853bc1b1..c44c0e3783 100644 --- a/modules/juce_graphics/geometry/juce_Rectangle.h +++ b/modules/juce_graphics/geometry/juce_Rectangle.h @@ -42,7 +42,6 @@ class Rectangle public: //============================================================================== /** Creates a rectangle of zero size. - The default co-ordinates will be (0, 0, 0, 0). */ Rectangle() noexcept @@ -585,6 +584,23 @@ public: return false; } + /** Tries to fit this rectangle within a target area, returning the result. + + If this rectangle is not completely inside the target area, then it'll be + shifted (without changing its size) so that it lies within the target. If it + is larger than the target rectangle in either dimension, then that dimension + will be reduced to fit within the target. + */ + Rectangle constrainedWithin (const Rectangle& areaToFitWithin) const noexcept + { + const int newW = jmin (w, areaToFitWithin.getWidth()); + const int newH = jmin (h, areaToFitWithin.getHeight()); + + return Rectangle (jlimit (areaToFitWithin.getX(), areaToFitWithin.getRight() - newW, pos.x), + jlimit (areaToFitWithin.getY(), areaToFitWithin.getBottom() - newH, pos.y), + newW, newH); + } + /** Returns the smallest rectangle that can contain the shape created by applying a transform to this rectangle. diff --git a/modules/juce_graphics/native/juce_win32_Fonts.cpp b/modules/juce_graphics/native/juce_win32_Fonts.cpp index 7838e7ae3d..cd8f271d31 100644 --- a/modules/juce_graphics/native/juce_win32_Fonts.cpp +++ b/modules/juce_graphics/native/juce_win32_Fonts.cpp @@ -158,13 +158,13 @@ StringArray Font::findAllTypefaceStyles (const String& family) return results; } -extern bool juce_IsRunningInWine(); +extern bool juce_isRunningInWine(); struct DefaultFontNames { DefaultFontNames() { - if (juce_IsRunningInWine()) + if (juce_isRunningInWine()) { // If we're running in Wine, then use fonts that might be available on Linux.. defaultSans = "Bitstream Vera Sans"; diff --git a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp index 7be3cfff09..19820608ad 100644 --- a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp +++ b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp @@ -41,8 +41,8 @@ #endif extern void juce_repeatLastProcessPriority(); -extern void juce_CheckCurrentlyFocusedTopLevelWindow(); // in juce_TopLevelWindow.cpp -extern bool juce_IsRunningInWine(); +extern void juce_checkCurrentlyFocusedTopLevelWindow(); // in juce_TopLevelWindow.cpp +extern bool juce_isRunningInWine(); typedef bool (*CheckEventBlockedByModalComps) (const MSG&); extern CheckEventBlockedByModalComps isEventBlockedByModalComps; @@ -63,10 +63,10 @@ static UpdateLayeredWinFunc updateLayeredWindow = nullptr; bool Desktop::canUseSemiTransparentWindows() noexcept { - if (updateLayeredWindow == nullptr && ! juce_IsRunningInWine()) + if (updateLayeredWindow == nullptr && ! juce_isRunningInWine()) updateLayeredWindow = (UpdateLayeredWinFunc) getUser32Function ("UpdateLayeredWindow"); - return updateLayeredWindow != 0; + return updateLayeredWindow != nullptr; } //============================================================================== @@ -2310,7 +2310,7 @@ private: else Desktop::getInstance().setKioskModeComponent (nullptr); // turn kiosk mode off if we lose focus - juce_CheckCurrentlyFocusedTopLevelWindow(); + juce_checkCurrentlyFocusedTopLevelWindow(); modifiersAtLastCallback = -1; return 0; diff --git a/modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp b/modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp index 7bac3a92bd..a5d348bad5 100644 --- a/modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp +++ b/modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp @@ -29,8 +29,7 @@ class TopLevelWindowManager : private Timer, { public: //============================================================================== - TopLevelWindowManager() - : currentActive (nullptr) + TopLevelWindowManager() : currentActive (nullptr) { } @@ -126,8 +125,8 @@ private: juce_ImplementSingleton_SingleThreaded (TopLevelWindowManager) -void juce_CheckCurrentlyFocusedTopLevelWindow(); -void juce_CheckCurrentlyFocusedTopLevelWindow() +void juce_checkCurrentlyFocusedTopLevelWindow(); +void juce_checkCurrentlyFocusedTopLevelWindow() { TopLevelWindowManager* const wm = TopLevelWindowManager::getInstanceWithoutCreating(); @@ -136,23 +135,22 @@ void juce_CheckCurrentlyFocusedTopLevelWindow() } //============================================================================== -TopLevelWindow::TopLevelWindow (const String& name, - const bool addToDesktop_) +TopLevelWindow::TopLevelWindow (const String& name, const bool shouldAddToDesktop) : Component (name), useDropShadow (true), useNativeTitleBar (false), - windowIsActive_ (false) + isCurrentlyActive (false) { setOpaque (true); - if (addToDesktop_) + if (shouldAddToDesktop) Component::addToDesktop (TopLevelWindow::getDesktopWindowStyleFlags()); else setDropShadowEnabled (true); setWantsKeyboardFocus (true); setBroughtToFrontOnMouseClick (true); - windowIsActive_ = TopLevelWindowManager::getInstance()->addWindow (this); + isCurrentlyActive = TopLevelWindowManager::getInstance()->addWindow (this); } TopLevelWindow::~TopLevelWindow() @@ -174,9 +172,9 @@ void TopLevelWindow::focusOfChildComponentChanged (FocusChangeType) void TopLevelWindow::setWindowActive (const bool isNowActive) { - if (windowIsActive_ != isNowActive) + if (isCurrentlyActive != isNowActive) { - windowIsActive_ = isNowActive; + isCurrentlyActive = isNowActive; activeWindowStatusChanged(); } } @@ -209,11 +207,8 @@ int TopLevelWindow::getDesktopWindowStyleFlags() const { int styleFlags = ComponentPeer::windowAppearsOnTaskbar; - if (useDropShadow) - styleFlags |= ComponentPeer::windowHasDropShadow; - - if (useNativeTitleBar) - styleFlags |= ComponentPeer::windowHasTitleBar; + if (useDropShadow) styleFlags |= ComponentPeer::windowHasDropShadow; + if (useNativeTitleBar) styleFlags |= ComponentPeer::windowHasTitleBar; return styleFlags; } @@ -300,17 +295,16 @@ void TopLevelWindow::centreAroundComponent (Component* c, const int width, const Point targetCentre (c->localPointToGlobal (c->getLocalBounds().getCentre())); Rectangle parentArea (c->getParentMonitorArea()); - if (getParentComponent() != nullptr) + if (Component* const parent = getParentComponent()) { - targetCentre = getParentComponent()->getLocalPoint (nullptr, targetCentre); - parentArea = getParentComponent()->getLocalBounds(); + targetCentre = parent->getLocalPoint (nullptr, targetCentre); + parentArea = parent->getLocalBounds(); } - parentArea.reduce (12, 12); - - setBounds (jlimit (parentArea.getX(), jmax (parentArea.getX(), parentArea.getRight() - width), targetCentre.getX() - width / 2), - jlimit (parentArea.getY(), jmax (parentArea.getY(), parentArea.getBottom() - height), targetCentre.getY() - height / 2), - width, height); + setBounds (Rectangle (targetCentre.x - width / 2, + targetCentre.y - height / 2, + width, height) + .constrainedWithin (parentArea.reduced (12, 12))); } } @@ -322,7 +316,7 @@ int TopLevelWindow::getNumTopLevelWindows() noexcept TopLevelWindow* TopLevelWindow::getTopLevelWindow (const int index) noexcept { - return static_cast (TopLevelWindowManager::getInstance()->windows [index]); + return TopLevelWindowManager::getInstance()->windows [index]; } TopLevelWindow* TopLevelWindow::getActiveTopLevelWindow() noexcept @@ -338,16 +332,10 @@ TopLevelWindow* TopLevelWindow::getActiveTopLevelWindow() noexcept { int numTWLParents = 0; - const Component* c = tlw->getParentComponent(); - - while (c != nullptr) - { + for (const Component* c = tlw->getParentComponent(); c != nullptr; c = c->getParentComponent()) if (dynamic_cast (c) != nullptr) ++numTWLParents; - c = c->getParentComponent(); - } - if (bestNumTWLParents < numTWLParents) { best = tlw; diff --git a/modules/juce_gui_basics/windows/juce_TopLevelWindow.h b/modules/juce_gui_basics/windows/juce_TopLevelWindow.h index 5664cc3bdc..e2ade8c2a2 100644 --- a/modules/juce_gui_basics/windows/juce_TopLevelWindow.h +++ b/modules/juce_gui_basics/windows/juce_TopLevelWindow.h @@ -76,7 +76,7 @@ public: @see activeWindowStatusChanged */ - bool isActiveWindow() const noexcept { return windowIsActive_; } + bool isActiveWindow() const noexcept { return isCurrentlyActive; } //============================================================================== /** This will set the bounds of the window so that it's centred in front of another @@ -153,7 +153,7 @@ protected: private: friend class TopLevelWindowManager; - bool useDropShadow, useNativeTitleBar, windowIsActive_; + bool useDropShadow, useNativeTitleBar, isCurrentlyActive; ScopedPointer shadower; void setWindowActive (bool isNowActive);