Patch by Ankur Sethi: Use layout-management in the OpenWindow of DiskProbe.

Works around the issue from ticket #1809.

Thanks a lot! Please note some changes I have made:
* When using layout management, use the contructors that don't take BRects
  and "follow modes". (You forgot that for the BButtons.)
* You reversed the button order.
* I found it more convenient to use a BGridLayoutBuilder. And it seemed odd
  to only add the menu bar layout item, not also the label item.
* Finally, to create a patch, cd into the Haiku root folder and use "svn diff",
  like "svn diff src/apps/diskprobe/ > patch.diff". I had to apply your patch
  manually line by line, I am not very firm with "patch", although I am sure
  there would have been a way to do it... :-)

Nice work!


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30174 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stephan Aßmus 2009-04-15 15:26:31 +00:00
parent a0320c161d
commit 7cc93cd01c
2 changed files with 40 additions and 57 deletions

View File

@ -1,21 +1,24 @@
/* /*
* Copyright 2004-2006, Axel Dörfler, axeld@pinc-software.de. All rights reserved. * Copyright 2009 Ankur Sethi <get.me.ankur@gmail.com>
* Distributed under the terms of the MIT License. * Copyright 2004-2006, Axel Dörfler, axeld@pinc-software.de.
* All rights reserved. Distributed under the terms of the MIT License.
*/ */
#include "OpenWindow.h" #include "OpenWindow.h"
#include "DiskProbe.h"
#include <Application.h> #include <Application.h>
#include <Screen.h>
#include <MenuField.h>
#include <PopUpMenu.h>
#include <MenuItem.h>
#include <Button.h> #include <Button.h>
#include <Directory.h> #include <Directory.h>
#include <Entry.h> #include <Entry.h>
#include <GroupLayout.h>
#include <GridLayoutBuilder.h>
#include <MenuField.h>
#include <MenuItem.h>
#include <Path.h> #include <Path.h>
#include <PopUpMenu.h>
#include <Screen.h>
#include "DiskProbe.h"
static const uint32 kMsgProbeFile = 'prDv'; static const uint32 kMsgProbeFile = 'prDv';
@ -24,60 +27,39 @@ static const uint32 kMsgProbeDevice = 'prFl';
OpenWindow::OpenWindow() OpenWindow::OpenWindow()
: BWindow(BRect(0, 0, 35, 10), "DiskProbe", B_TITLED_WINDOW, : BWindow(BRect(0, 0, 35, 10), "DiskProbe", B_TITLED_WINDOW,
B_NOT_RESIZABLE | B_NOT_ZOOMABLE | B_ASYNCHRONOUS_CONTROLS) B_NOT_RESIZABLE | B_NOT_ZOOMABLE | B_ASYNCHRONOUS_CONTROLS
| B_AUTO_UPDATE_SIZE_LIMITS)
{ {
BView *view = new BView(Bounds(), B_EMPTY_STRING, B_FOLLOW_ALL, B_WILL_DRAW);
view->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
AddChild(view);
fDevicesMenu = new BPopUpMenu("devices"); fDevicesMenu = new BPopUpMenu("devices");
CollectDevices(fDevicesMenu); CollectDevices(fDevicesMenu);
if (BMenuItem *item = fDevicesMenu->ItemAt(0)) if (BMenuItem *item = fDevicesMenu->ItemAt(0))
item->SetMarked(true); item->SetMarked(true);
BRect rect = Bounds().InsetByCopy(8, 8); BMenuField *field = new BMenuField("Examine Device:", fDevicesMenu, NULL);
BMenuField *field = new BMenuField(rect, "devices", "Examine Device:", fDevicesMenu);
field->ResizeToPreferred();
field->SetDivider(field->StringWidth(field->Label()) + 8);
view->AddChild(field);
BButton *probeDeviceButton = new BButton(BRect(10, 10, 20, 20), "file", "Probe Device", BButton *probeDeviceButton = new BButton("device", "Probe Device",
new BMessage(kMsgProbeDevice), B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM); new BMessage(kMsgProbeDevice));
probeDeviceButton->ResizeToPreferred();
rect = probeDeviceButton->Bounds();
probeDeviceButton->MoveTo(Bounds().Width() - 8 - rect.Width(),
Bounds().Height() - 8 - rect.Height());
view->AddChild(probeDeviceButton);
// MakeDefault() may change the size and location of the button
rect = probeDeviceButton->Frame();
float width = rect.Width() + 58.0f;
probeDeviceButton->MakeDefault(true); probeDeviceButton->MakeDefault(true);
BButton *button = new BButton(rect, "file", "Probe File" B_UTF8_ELLIPSIS, BButton *probeFileButton = new BButton("file", "Probe File" B_UTF8_ELLIPSIS,
new BMessage(kMsgProbeFile), B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM); new BMessage(kMsgProbeFile));
button->ResizeToPreferred();
button->MoveBy(-button->Bounds().Width() - 8, 0);
view->AddChild(button);
width += button->Bounds().Width();
button = new BButton(button->Frame(), "cancel", "Cancel", BButton *cancelButton = new BButton("cancel", "Cancel",
new BMessage(B_QUIT_REQUESTED), B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM); new BMessage(B_QUIT_REQUESTED));
button->ResizeToPreferred();
button->MoveBy(-button->Bounds().Width() - 8, 0);
view->AddChild(button);
width += button->Bounds().Width();
// make sure the window is large enough
if (width < Bounds().Width()) SetLayout(new BGroupLayout(B_HORIZONTAL));
width = Bounds().Width();
float height = button->Bounds().Height() + 24.0f + field->Frame().bottom; AddChild(BGridLayoutBuilder(8, 8)
if (height < Bounds().Height()) .Add(field, 0, 0, 3)
height = Bounds().Height(); .Add(cancelButton, 0, 1)
.Add(probeFileButton, 1, 1)
ResizeTo(width, height); .Add(probeDeviceButton, 2, 1)
.SetInsets(8, 8, 8, 8)
);
// TODO: This does not center the window, since with layout management,
// the window will still have an invalid size at this point.
BScreen screen(this); BScreen screen(this);
MoveTo(screen.Frame().left + (screen.Frame().Width() - Frame().Width()) / 2, MoveTo(screen.Frame().left + (screen.Frame().Width() - Frame().Width()) / 2,
screen.Frame().top + (screen.Frame().Height() - Frame().Height()) / 2); screen.Frame().top + (screen.Frame().Height() - Frame().Height()) / 2);

View File

@ -13,17 +13,18 @@ class BMenu;
class OpenWindow : public BWindow { class OpenWindow : public BWindow {
public: public:
OpenWindow(); OpenWindow();
virtual ~OpenWindow(); virtual ~OpenWindow();
virtual void MessageReceived(BMessage *message); virtual void MessageReceived(BMessage* message);
virtual bool QuitRequested(); virtual bool QuitRequested();
static void CollectDevices(BMenu *menu, BEntry *startEntry = NULL); static void CollectDevices(BMenu* menu,
BEntry* startEntry = NULL);
private: private:
BMenu *fDevicesMenu; BMenu* fDevicesMenu;
}; };
#endif /* OPEN_WINDOW_H */ #endif /* OPEN_WINDOW_H */