Simplified window accounting and application quitting. Added silent relaunch. Serialize prefs saving through app. Replaced deprecated B_CLOSE_REQUESTED with B_QUIT_REQUESTED for Command-W. Set Command-Q to target application.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@32981 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Jonas Sundström
2009-09-07 04:12:22 +00:00
parent 257f000bd2
commit 4230fe9a76
3 changed files with 49 additions and 26 deletions
+28 -3
View File
@@ -49,7 +49,7 @@ struct people_field gFields[] = {
TPeopleApp::TPeopleApp(void)
: BApplication(APP_SIG),
fHaveWindow(false)
fWindowCount(0)
{
fPosition.Set(6, TITLE_BAR_HEIGHT, 6 + WIND_WIDTH, TITLE_BAR_HEIGHT + WIND_HEIGHT);
BPoint pos = fPosition.LeftTop();
@@ -179,9 +179,17 @@ TPeopleApp::MessageReceived(BMessage *msg)
{
switch (msg->what) {
case M_NEW:
case B_SILENT_RELAUNCH:
NewWindow();
break;
case M_WINDOW_QUITS:
SavePreferences(msg);
fWindowCount--;
if (fWindowCount < 1)
PostMessage(B_QUIT_REQUESTED);
break;
default:
BApplication::MessageReceived(msg);
}
@@ -212,7 +220,7 @@ TPeopleApp::RefsReceived(BMessage *message)
void
TPeopleApp::ReadyToRun(void)
{
if (!fHaveWindow)
if (fWindowCount < 1)
NewWindow();
}
@@ -224,7 +232,7 @@ TPeopleApp::NewWindow(entry_ref *ref)
window = new TPeopleWindow(fPosition, "New Person", ref);
window->Show();
fHaveWindow = true;
fWindowCount++;
fPosition.OffsetBy(20, 20);
if (fPosition.bottom > BScreen(B_MAIN_SCREEN_ID).Frame().bottom)
@@ -248,3 +256,20 @@ TPeopleApp::FindWindow(entry_ref ref)
}
return NULL;
}
void
TPeopleApp::SavePreferences(BMessage* message)
{
BRect frame;
if (message->FindRect("frame", &frame) != B_OK)
return;
BPoint leftTop = frame.LeftTop();
if (fPrefs) {
fPrefs->Seek(0, 0);
fPrefs->Write(&leftTop, sizeof(BPoint));
}
}
+6 -2
View File
@@ -34,7 +34,8 @@ enum messages{
M_UNDO, M_SELECT, M_GROUP_MENU, M_DIRTY,
M_NAME, M_NICKNAME, M_COMPANY, M_ADDRESS,
M_CITY, M_STATE, M_ZIP, M_COUNTRY, M_HPHONE,
M_WPHONE, M_FAX, M_EMAIL, M_URL, M_GROUP
M_WPHONE, M_FAX, M_EMAIL, M_URL, M_GROUP,
M_WINDOW_QUITS
};
enum fields {
@@ -63,8 +64,11 @@ class TPeopleApp : public BApplication {
BFile *fPrefs;
private:
bool fHaveWindow;
void SavePreferences(BMessage* message);
uint32 fWindowCount;
BRect fPosition;
};
#endif /* PEOPLEAPP_H */
+15 -21
View File
@@ -44,7 +44,7 @@ TPeopleWindow::TPeopleWindow(BRect frame, const char *title, entry_ref *ref)
menu = new BMenu("File");
menu->AddItem(item = new BMenuItem("New Person" B_UTF8_ELLIPSIS, new BMessage(M_NEW), 'N'));
item->SetTarget(NULL, be_app);
menu->AddItem(new BMenuItem("Close", new BMessage(B_CLOSE_REQUESTED), 'W'));
menu->AddItem(new BMenuItem("Close", new BMessage(B_QUIT_REQUESTED), 'W'));
menu->AddSeparatorItem();
menu->AddItem(fSave = new BMenuItem("Save", new BMessage(M_SAVE), 'S'));
fSave->SetEnabled(FALSE);
@@ -52,7 +52,9 @@ TPeopleWindow::TPeopleWindow(BRect frame, const char *title, entry_ref *ref)
menu->AddItem(fRevert = new BMenuItem("Revert", new BMessage(M_REVERT), 'R'));
fRevert->SetEnabled(FALSE);
menu->AddSeparatorItem();
menu->AddItem(new BMenuItem("Quit", new BMessage(B_QUIT_REQUESTED), 'Q'));
item = new BMenuItem("Quit", new BMessage(B_QUIT_REQUESTED), 'Q');
item->SetTarget(NULL, be_app);
menu->AddItem(item);
menuBar->AddItem(menu);
menu = new BMenu("Edit");
@@ -93,7 +95,6 @@ TPeopleWindow::~TPeopleWindow(void)
WatchChanges(false);
delete fRef;
delete fPanel;
}
@@ -268,12 +269,9 @@ TPeopleWindow::MessageReceived(BMessage* msg)
bool
TPeopleWindow::QuitRequested(void)
{
int32 count = 0;
int32 index = 0;
BPoint pos;
BRect r;
status_t result;
TPeopleWindow *window;
printf("TPeopleWindow::QuitRequested(void)\n");
status_t result;
if (fView->CheckSave()) {
result = (new BAlert("", "Save changes before quitting?",
@@ -289,20 +287,16 @@ TPeopleWindow::QuitRequested(void)
return false;
}
while ((window = (TPeopleWindow *)be_app->WindowAt(index++))) {
if (window->FindView("PeopleView"))
count++;
}
if (fPanel)
delete fPanel;
if (count == 1) {
r = Frame();
pos = r.LeftTop();
if (((TPeopleApp*)be_app)->fPrefs) {
((TPeopleApp*)be_app)->fPrefs->Seek(0, 0);
((TPeopleApp*)be_app)->fPrefs->Write(&pos, sizeof(BPoint));
}
be_app->PostMessage(B_QUIT_REQUESTED);
BMessage message(M_WINDOW_QUITS);
message.AddRect("frame", Frame());
if (be_app->Lock()) {
be_app->PostMessage(&message);
be_app->Unlock();
}
return true;
}