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)
|
TPeopleApp::TPeopleApp(void)
|
||||||
: BApplication(APP_SIG),
|
: BApplication(APP_SIG),
|
||||||
fHaveWindow(false)
|
fWindowCount(0)
|
||||||
{
|
{
|
||||||
fPosition.Set(6, TITLE_BAR_HEIGHT, 6 + WIND_WIDTH, TITLE_BAR_HEIGHT + WIND_HEIGHT);
|
fPosition.Set(6, TITLE_BAR_HEIGHT, 6 + WIND_WIDTH, TITLE_BAR_HEIGHT + WIND_HEIGHT);
|
||||||
BPoint pos = fPosition.LeftTop();
|
BPoint pos = fPosition.LeftTop();
|
||||||
@@ -179,9 +179,17 @@ TPeopleApp::MessageReceived(BMessage *msg)
|
|||||||
{
|
{
|
||||||
switch (msg->what) {
|
switch (msg->what) {
|
||||||
case M_NEW:
|
case M_NEW:
|
||||||
|
case B_SILENT_RELAUNCH:
|
||||||
NewWindow();
|
NewWindow();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case M_WINDOW_QUITS:
|
||||||
|
SavePreferences(msg);
|
||||||
|
fWindowCount--;
|
||||||
|
if (fWindowCount < 1)
|
||||||
|
PostMessage(B_QUIT_REQUESTED);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
BApplication::MessageReceived(msg);
|
BApplication::MessageReceived(msg);
|
||||||
}
|
}
|
||||||
@@ -212,7 +220,7 @@ TPeopleApp::RefsReceived(BMessage *message)
|
|||||||
void
|
void
|
||||||
TPeopleApp::ReadyToRun(void)
|
TPeopleApp::ReadyToRun(void)
|
||||||
{
|
{
|
||||||
if (!fHaveWindow)
|
if (fWindowCount < 1)
|
||||||
NewWindow();
|
NewWindow();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -224,7 +232,7 @@ TPeopleApp::NewWindow(entry_ref *ref)
|
|||||||
|
|
||||||
window = new TPeopleWindow(fPosition, "New Person", ref);
|
window = new TPeopleWindow(fPosition, "New Person", ref);
|
||||||
window->Show();
|
window->Show();
|
||||||
fHaveWindow = true;
|
fWindowCount++;
|
||||||
fPosition.OffsetBy(20, 20);
|
fPosition.OffsetBy(20, 20);
|
||||||
|
|
||||||
if (fPosition.bottom > BScreen(B_MAIN_SCREEN_ID).Frame().bottom)
|
if (fPosition.bottom > BScreen(B_MAIN_SCREEN_ID).Frame().bottom)
|
||||||
@@ -248,3 +256,20 @@ TPeopleApp::FindWindow(entry_ref ref)
|
|||||||
}
|
}
|
||||||
return NULL;
|
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_UNDO, M_SELECT, M_GROUP_MENU, M_DIRTY,
|
||||||
M_NAME, M_NICKNAME, M_COMPANY, M_ADDRESS,
|
M_NAME, M_NICKNAME, M_COMPANY, M_ADDRESS,
|
||||||
M_CITY, M_STATE, M_ZIP, M_COUNTRY, M_HPHONE,
|
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 {
|
enum fields {
|
||||||
@@ -63,8 +64,11 @@ class TPeopleApp : public BApplication {
|
|||||||
BFile *fPrefs;
|
BFile *fPrefs;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool fHaveWindow;
|
void SavePreferences(BMessage* message);
|
||||||
|
|
||||||
|
uint32 fWindowCount;
|
||||||
BRect fPosition;
|
BRect fPosition;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* PEOPLEAPP_H */
|
#endif /* PEOPLEAPP_H */
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ TPeopleWindow::TPeopleWindow(BRect frame, const char *title, entry_ref *ref)
|
|||||||
menu = new BMenu("File");
|
menu = new BMenu("File");
|
||||||
menu->AddItem(item = new BMenuItem("New Person" B_UTF8_ELLIPSIS, new BMessage(M_NEW), 'N'));
|
menu->AddItem(item = new BMenuItem("New Person" B_UTF8_ELLIPSIS, new BMessage(M_NEW), 'N'));
|
||||||
item->SetTarget(NULL, be_app);
|
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->AddSeparatorItem();
|
||||||
menu->AddItem(fSave = new BMenuItem("Save", new BMessage(M_SAVE), 'S'));
|
menu->AddItem(fSave = new BMenuItem("Save", new BMessage(M_SAVE), 'S'));
|
||||||
fSave->SetEnabled(FALSE);
|
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'));
|
menu->AddItem(fRevert = new BMenuItem("Revert", new BMessage(M_REVERT), 'R'));
|
||||||
fRevert->SetEnabled(FALSE);
|
fRevert->SetEnabled(FALSE);
|
||||||
menu->AddSeparatorItem();
|
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);
|
menuBar->AddItem(menu);
|
||||||
|
|
||||||
menu = new BMenu("Edit");
|
menu = new BMenu("Edit");
|
||||||
@@ -93,7 +95,6 @@ TPeopleWindow::~TPeopleWindow(void)
|
|||||||
WatchChanges(false);
|
WatchChanges(false);
|
||||||
|
|
||||||
delete fRef;
|
delete fRef;
|
||||||
delete fPanel;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -268,12 +269,9 @@ TPeopleWindow::MessageReceived(BMessage* msg)
|
|||||||
bool
|
bool
|
||||||
TPeopleWindow::QuitRequested(void)
|
TPeopleWindow::QuitRequested(void)
|
||||||
{
|
{
|
||||||
int32 count = 0;
|
printf("TPeopleWindow::QuitRequested(void)\n");
|
||||||
int32 index = 0;
|
|
||||||
BPoint pos;
|
status_t result;
|
||||||
BRect r;
|
|
||||||
status_t result;
|
|
||||||
TPeopleWindow *window;
|
|
||||||
|
|
||||||
if (fView->CheckSave()) {
|
if (fView->CheckSave()) {
|
||||||
result = (new BAlert("", "Save changes before quitting?",
|
result = (new BAlert("", "Save changes before quitting?",
|
||||||
@@ -289,20 +287,16 @@ TPeopleWindow::QuitRequested(void)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
while ((window = (TPeopleWindow *)be_app->WindowAt(index++))) {
|
if (fPanel)
|
||||||
if (window->FindView("PeopleView"))
|
delete fPanel;
|
||||||
count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (count == 1) {
|
BMessage message(M_WINDOW_QUITS);
|
||||||
r = Frame();
|
message.AddRect("frame", Frame());
|
||||||
pos = r.LeftTop();
|
if (be_app->Lock()) {
|
||||||
if (((TPeopleApp*)be_app)->fPrefs) {
|
be_app->PostMessage(&message);
|
||||||
((TPeopleApp*)be_app)->fPrefs->Seek(0, 0);
|
be_app->Unlock();
|
||||||
((TPeopleApp*)be_app)->fPrefs->Write(&pos, sizeof(BPoint));
|
|
||||||
}
|
|
||||||
be_app->PostMessage(B_QUIT_REQUESTED);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user