From f7c2983edc4573504fece2e673f10a0258789a15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Tue, 8 Sep 2015 17:50:22 +0200 Subject: [PATCH] HaikuDepot: change window frame setting. * Moved entirely into MainWindow. * Moved duplicated code into separate methods. * Resize the main window on larger screens by default, as we can make use of the extra space. * Use BWindow::MoveOnScreen() instead of make_sure_frame_is_on_screen() as the former has more info. And is even smarter now as it can optionally resize windows to fit on screen. * Center window on screen by default (ie. when there are no settings). --- headers/os/interface/Window.h | 2 +- src/apps/haikudepot/ui/App.cpp | 32 +------- src/apps/haikudepot/ui/App.h | 1 - src/apps/haikudepot/ui/MainWindow.cpp | 87 +++++++++++++++++----- src/apps/haikudepot/ui/MainWindow.h | 10 ++- src/apps/haikudepot/ui_generic/support.cpp | 57 -------------- src/apps/haikudepot/ui_generic/support.h | 3 - src/kits/interface/Window.cpp | 12 ++- 8 files changed, 90 insertions(+), 114 deletions(-) diff --git a/headers/os/interface/Window.h b/headers/os/interface/Window.h index 37fbf8815f..b423e57cd7 100644 --- a/headers/os/interface/Window.h +++ b/headers/os/interface/Window.h @@ -170,7 +170,7 @@ public: void CenterIn(const BRect& rect); void CenterOnScreen(); void CenterOnScreen(screen_id id); - void MoveOnScreen(); + void MoveOnScreen(bool resize = false); virtual void Show(); virtual void Hide(); diff --git a/src/apps/haikudepot/ui/App.cpp b/src/apps/haikudepot/ui/App.cpp index 9fa06bd1f7..6e22734d8c 100644 --- a/src/apps/haikudepot/ui/App.cpp +++ b/src/apps/haikudepot/ui/App.cpp @@ -3,6 +3,7 @@ * All rights reserved. Distributed under the terms of the MIT License. */ + #include "App.h" #include @@ -14,6 +15,7 @@ #include #include #include +#include #include #include "support.h" @@ -73,7 +75,7 @@ App::ReadyToRun() BMessage settings; _LoadSettings(settings); - fMainWindow = new MainWindow(_GetNextWindowFrame(false), settings); + fMainWindow = new MainWindow(settings); _ShowWindow(fMainWindow); } @@ -175,8 +177,7 @@ App::_Open(const BEntry& entry) BMessage settings; _LoadSettings(settings); - MainWindow* window = new MainWindow(_GetNextWindowFrame(true), settings, - package); + MainWindow* window = new MainWindow(settings, package); _ShowWindow(window); } @@ -229,31 +230,6 @@ App::_StoreSettings(const BMessage& settings) } -BRect -App::_GetNextWindowFrame(bool singlePackageMode) -{ - BRect frame; - const char* frameName; - if (singlePackageMode) { - frame = BRect(50.0, 50.0, 649.0, 349.0); - frameName = "small window frame"; - } - else { - frame = BRect(50.0, 50.0, 749.0, 549.0); - frameName = "window frame"; - } - BMessage settings; - if (_LoadSettings(settings)) { - BRect windowFrame; - if (settings.FindRect(frameName, &windowFrame) == B_OK) - frame = windowFrame; - } - - make_sure_frame_is_on_screen(frame); - return frame; -} - - // #pragma mark - diff --git a/src/apps/haikudepot/ui/App.h b/src/apps/haikudepot/ui/App.h index f4f0e39d2f..b596d73291 100644 --- a/src/apps/haikudepot/ui/App.h +++ b/src/apps/haikudepot/ui/App.h @@ -30,7 +30,6 @@ private: bool _LoadSettings(BMessage& settings); void _StoreSettings(const BMessage& windowSettings); - BRect _GetNextWindowFrame(bool singlePackageMode); void _CheckPackageDaemonRuns(); bool _LaunchPackageDaemon(); diff --git a/src/apps/haikudepot/ui/MainWindow.cpp b/src/apps/haikudepot/ui/MainWindow.cpp index 80307b46c0..099f81ca82 100644 --- a/src/apps/haikudepot/ui/MainWindow.cpp +++ b/src/apps/haikudepot/ui/MainWindow.cpp @@ -1,10 +1,12 @@ /* + * Copyright 2015, Axel Dörfler, . * Copyright 2013-2014, Stephan Aßmus . * Copyright 2013, Rene Gollent, rene@gollent.com. * Copyright 2013, Ingo Weinhold, ingo_weinhold@gmx.de. * All rights reserved. Distributed under the terms of the MIT License. */ + #include "MainWindow.h" #include @@ -21,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -113,9 +116,9 @@ private: }; -MainWindow::MainWindow(BRect frame, const BMessage& settings) +MainWindow::MainWindow(const BMessage& settings) : - BWindow(frame, B_TRANSLATE_SYSTEM_NAME("HaikuDepot"), + BWindow(BRect(50, 50, 650, 550), B_TRANSLATE_SYSTEM_NAME("HaikuDepot"), B_DOCUMENT_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL, B_ASYNCHRONOUS_CONTROLS | B_AUTO_UPDATE_SIZE_LIMITS), fScreenshotWindow(NULL), @@ -201,17 +204,14 @@ MainWindow::MainWindow(BRect frame, const BMessage& settings) if (settings.FindBool("show source packages", &showOption) == B_OK) fModel.SetShowSourcePackages(showOption); - BString username; - if (settings.FindString("username", &username) == B_OK - && username.Length() > 0) { - fModel.SetUsername(username); - } - if (fModel.ShowFeaturedPackages()) fListLayout->SetVisibleItem((int32)0); else fListLayout->SetVisibleItem(1); + _RestoreUserName(settings); + _RestoreWindowFrame(settings); + // start worker threads BPackageRoster().StartWatching(this, B_WATCH_PACKAGE_INSTALLATION_LOCATIONS); @@ -222,10 +222,9 @@ MainWindow::MainWindow(BRect frame, const BMessage& settings) } -MainWindow::MainWindow(BRect frame, const BMessage& settings, - const PackageInfoRef& package) +MainWindow::MainWindow(const BMessage& settings, const PackageInfoRef& package) : - BWindow(frame, B_TRANSLATE_SYSTEM_NAME("HaikuDepot"), + BWindow(BRect(50, 50, 650, 350), B_TRANSLATE_SYSTEM_NAME("HaikuDepot"), B_DOCUMENT_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL, B_ASYNCHRONOUS_CONTROLS | B_AUTO_UPDATE_SIZE_LIMITS), fScreenshotWindow(NULL), @@ -249,11 +248,8 @@ MainWindow::MainWindow(BRect frame, const BMessage& settings, fModel.AddListener(fModelListener); // Restore settings - BString username; - if (settings.FindString("username", &username) == B_OK - && username.Length() > 0) { - fModel.SetUsername(username); - } + _RestoreUserName(settings); + _RestoreWindowFrame(settings); fPackageInfoView->SetPackage(package); @@ -507,9 +503,8 @@ MainWindow::MessageReceived(BMessage* message) void MainWindow::StoreSettings(BMessage& settings) const { - if (fSinglePackageMode) - settings.AddRect("small window frame", Frame()); - else { + settings.AddRect(_WindowFrameName(), Frame()); + if (!fSinglePackageMode) { settings.AddRect("window frame", Frame()); BMessage columnSettings; @@ -628,6 +623,60 @@ MainWindow::_BuildUserMenu(BMenuBar* menuBar) } +void +MainWindow::_RestoreUserName(const BMessage& settings) +{ + BString username; + if (settings.FindString("username", &username) == B_OK + && username.Length() > 0) { + fModel.SetUsername(username); + } +} + + +const char* +MainWindow::_WindowFrameName() const +{ + if (fSinglePackageMode) + return "small window frame"; + + return "window frame"; +} + + +void +MainWindow::_RestoreWindowFrame(const BMessage& settings) +{ + BRect frame = Frame(); + + BRect windowFrame; + bool fromSettings = false; + if (settings.FindRect(_WindowFrameName(), &windowFrame) == B_OK) { + frame = windowFrame; + fromSettings = true; + } else if (!fSinglePackageMode) { + // Resize to occupy a certain screen size + BRect screenFrame = BScreen(this).Frame(); + float width = frame.Width(); + float height = frame.Height(); + if (width < screenFrame.Width() * .666f + && height < screenFrame.Height() * .666f) { + frame.bottom = frame.top + screenFrame.Height() * .666f; + frame.right = frame.left + + std::min(screenFrame.Width() * .666f, height * 7 / 5); + } + } + + MoveTo(frame.LeftTop()); + ResizeTo(frame.Width(), frame.Height()); + + if (fromSettings) + MoveOnScreen(true); + else + CenterOnScreen(); +} + + void MainWindow::_InitWorkerThreads() { diff --git a/src/apps/haikudepot/ui/MainWindow.h b/src/apps/haikudepot/ui/MainWindow.h index 3cae3e2374..784350a8a0 100644 --- a/src/apps/haikudepot/ui/MainWindow.h +++ b/src/apps/haikudepot/ui/MainWindow.h @@ -35,10 +35,8 @@ enum { class MainWindow : public BWindow, private PackageInfoListener, private PackageActionHandler { public: - MainWindow(BRect frame, - const BMessage& settings); - MainWindow(BRect frame, - const BMessage& settings, + MainWindow(const BMessage& settings); + MainWindow(const BMessage& settings, const PackageInfoRef& package); virtual ~MainWindow(); @@ -63,6 +61,10 @@ private: void _BuildMenu(BMenuBar* menuBar); void _BuildUserMenu(BMenuBar* menuBar); + void _RestoreUserName(const BMessage& settings); + const char* _WindowFrameName() const; + void _RestoreWindowFrame(const BMessage& settings); + void _InitWorkerThreads(); void _AdoptModel(); diff --git a/src/apps/haikudepot/ui_generic/support.cpp b/src/apps/haikudepot/ui_generic/support.cpp index d508769d00..5d2e25ecd7 100644 --- a/src/apps/haikudepot/ui_generic/support.cpp +++ b/src/apps/haikudepot/ui_generic/support.cpp @@ -79,63 +79,6 @@ save_settings(const BMessage* message, const char* fileName, const char* folder) } -bool -make_sure_frame_is_on_screen(BRect& frame, float borderWidth, - float tabHeight, BWindow* window) -{ - if (!frame.IsValid()) - return false; - - BScreen* screen = window != NULL ? new BScreen(window) - : new BScreen(B_MAIN_SCREEN_ID); - - if (!screen->IsValid()) { - delete screen; - return false; - } - - BRect screenFrame = screen->Frame(); - - // Validate borderWidth and tabHeight - if (borderWidth < 0.0f) - borderWidth = 0.0f; - else - borderWidth = std::min(borderWidth, floorf(screenFrame.Width() / 4.0f)); - - if (tabHeight < 0.0f) - tabHeight = 0.0f; - else - tabHeight = std::min(tabHeight, floorf(screenFrame.Height() / 4.0f)); - - // Account for window border and tab. It doesn't matter much if the - // decorator frame is wider, just as long as the user can grab a - // border to move the window - screenFrame.InsetBy(borderWidth, borderWidth); - screenFrame.top += tabHeight; - - if (!screenFrame.Contains(frame)) { - // make sure frame fits in the screen - if (frame.Width() > screenFrame.Width()) - frame.right -= frame.Width() - screenFrame.Width(); - if (frame.Height() > screenFrame.Height()) - frame.bottom -= frame.Height() - screenFrame.Height(); - - // frame is now at the most the size of the screen - if (frame.right > screenFrame.right) - frame.OffsetBy(-(frame.right - screenFrame.right), 0.0); - if (frame.bottom > screenFrame.bottom) - frame.OffsetBy(0.0, -(frame.bottom - screenFrame.bottom)); - if (frame.left < screenFrame.left) - frame.OffsetBy((screenFrame.left - frame.left), 0.0); - if (frame.top < screenFrame.top) - frame.OffsetBy(0.0, (screenFrame.top - frame.top)); - } - - delete screen; - return true; -} - - status_t get_app_resources(BResources& resources) { diff --git a/src/apps/haikudepot/ui_generic/support.h b/src/apps/haikudepot/ui_generic/support.h index 31ec2c4108..46f26b2489 100644 --- a/src/apps/haikudepot/ui_generic/support.h +++ b/src/apps/haikudepot/ui_generic/support.h @@ -21,9 +21,6 @@ status_t load_settings(BMessage* message, const char* fileName, status_t save_settings(const BMessage* message, const char* fileName, const char* folder = NULL); -bool make_sure_frame_is_on_screen(BRect& frame, float borderWidth = 5.0f, - float tabHeight = 20.0f, BWindow* window = NULL); - status_t get_app_resources(BResources& resources); void set_small_font(BView* view); diff --git a/src/kits/interface/Window.cpp b/src/kits/interface/Window.cpp index 70cc845447..b1d61bfbd3 100644 --- a/src/kits/interface/Window.cpp +++ b/src/kits/interface/Window.cpp @@ -2569,7 +2569,7 @@ BWindow::CenterOnScreen(screen_id id) void -BWindow::MoveOnScreen() +BWindow::MoveOnScreen(bool resize) { // Set size limits now if needed UpdateSizeLimits(); @@ -2584,6 +2584,16 @@ BWindow::MoveOnScreen() frame.InsetBy(-borderWidth, -borderWidth); frame.top -= tabHeight; + if (resize) { + // Make sure the window fits on the screen + if (frame.Width() > screenFrame.Width()) + frame.right -= frame.Width() - screenFrame.Width(); + if (frame.Height() > screenFrame.Height()) + frame.bottom -= frame.Height() - screenFrame.Height(); + + ResizeTo(frame.Width(), frame.Height()); + } + if (!frame.Intersects(screenFrame)) { // Off and away CenterOnScreen();