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:
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user