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:
@@ -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();
|
||||
|
||||
@@ -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 -
|
||||
|
||||
|
||||
|
||||
@@ -30,7 +30,6 @@ private:
|
||||
|
||||
bool _LoadSettings(BMessage& settings);
|
||||
void _StoreSettings(const BMessage& windowSettings);
|
||||
BRect _GetNextWindowFrame(bool singlePackageMode);
|
||||
|
||||
void _CheckPackageDaemonRuns();
|
||||
bool _LaunchPackageDaemon();
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user