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).
This commit is contained in:
Axel Dörfler
2015-09-08 17:58:02 +02:00
parent bafcf01610
commit f7c2983edc
8 changed files with 90 additions and 114 deletions
+1 -1
View File
@@ -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();
+4 -28
View File
@@ -3,6 +3,7 @@
* All rights reserved. Distributed under the terms of the MIT License.
*/
#include "App.h"
#include <stdio.h>
@@ -14,6 +15,7 @@
#include <package/PackageInfo.h>
#include <Path.h>
#include <Roster.h>
#include <Screen.h>
#include <String.h>
#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 -
-1
View File
@@ -30,7 +30,6 @@ private:
bool _LoadSettings(BMessage& settings);
void _StoreSettings(const BMessage& windowSettings);
BRect _GetNextWindowFrame(bool singlePackageMode);
void _CheckPackageDaemonRuns();
bool _LaunchPackageDaemon();
+68 -19
View File
@@ -1,10 +1,12 @@
/*
* Copyright 2015, Axel Dörfler, <[email protected]>.
* Copyright 2013-2014, Stephan Aßmus <[email protected]>.
* Copyright 2013, Rene Gollent, [email protected].
* Copyright 2013, Ingo Weinhold, [email protected].
* All rights reserved. Distributed under the terms of the MIT License.
*/
#include "MainWindow.h"
#include <map>
@@ -21,6 +23,7 @@
#include <MenuBar.h>
#include <MenuItem.h>
#include <Messenger.h>
#include <Screen.h>
#include <ScrollView.h>
#include <StringList.h>
#include <StringView.h>
@@ -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()
{
+6 -4
View File
@@ -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();
@@ -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)
{
-3
View File
@@ -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);
+11 -1
View File
@@ -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();