DriveSetup: solved a few issues of CreateParametersPanel.
* I obviously wasn't really done last time: now the panel behaves as it should.
This commit is contained in:
@@ -136,54 +136,8 @@ AbstractParametersPanel::MessageReceived(BMessage* message)
|
|||||||
status_t
|
status_t
|
||||||
AbstractParametersPanel::Go(BString& parameters)
|
AbstractParametersPanel::Go(BString& parameters)
|
||||||
{
|
{
|
||||||
// Without an editor, we cannot change anything, anyway
|
BMessage storage;
|
||||||
if (fEditor == NULL) {
|
return Go(parameters, storage);
|
||||||
parameters = "";
|
|
||||||
if (fReturnStatus == B_CANCELED)
|
|
||||||
fReturnStatus = B_OK;
|
|
||||||
|
|
||||||
if (!Lock())
|
|
||||||
return B_ERROR;
|
|
||||||
} else {
|
|
||||||
// run the window thread, to get an initial layout of the controls
|
|
||||||
Hide();
|
|
||||||
Show();
|
|
||||||
if (!Lock())
|
|
||||||
return B_CANCELED;
|
|
||||||
|
|
||||||
// center the panel above the parent window
|
|
||||||
CenterIn(fWindow->Frame());
|
|
||||||
|
|
||||||
Show();
|
|
||||||
Unlock();
|
|
||||||
|
|
||||||
// block this thread now, but keep the window repainting
|
|
||||||
while (true) {
|
|
||||||
status_t status = acquire_sem_etc(fExitSemaphore, 1,
|
|
||||||
B_CAN_INTERRUPT | B_RELATIVE_TIMEOUT, 50000);
|
|
||||||
if (status != B_TIMED_OUT && status != B_INTERRUPTED)
|
|
||||||
break;
|
|
||||||
fWindow->UpdateIfNeeded();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Lock())
|
|
||||||
return B_CANCELED;
|
|
||||||
|
|
||||||
if (fReturnStatus == B_OK) {
|
|
||||||
if (fEditor->ValidateParameters()) {
|
|
||||||
status_t err = fEditor->GetParameters(parameters);
|
|
||||||
if (err != B_OK)
|
|
||||||
fReturnStatus = err;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
status_t status = fReturnStatus;
|
|
||||||
|
|
||||||
Quit();
|
|
||||||
// NOTE: this object is toast now!
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -240,6 +194,77 @@ AbstractParametersPanel::Init(B_PARAMETER_EDITOR_TYPE type,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
AbstractParametersPanel::Go(BString& parameters, BMessage& storage)
|
||||||
|
{
|
||||||
|
// Without an editor, we cannot change anything, anyway
|
||||||
|
if (fEditor == NULL && NeedsEditor()) {
|
||||||
|
parameters = "";
|
||||||
|
if (fReturnStatus == B_CANCELED)
|
||||||
|
fReturnStatus = B_OK;
|
||||||
|
|
||||||
|
if (!Lock())
|
||||||
|
return B_ERROR;
|
||||||
|
} else {
|
||||||
|
// run the window thread, to get an initial layout of the controls
|
||||||
|
Hide();
|
||||||
|
Show();
|
||||||
|
if (!Lock())
|
||||||
|
return B_CANCELED;
|
||||||
|
|
||||||
|
// center the panel above the parent window
|
||||||
|
CenterIn(fWindow->Frame());
|
||||||
|
|
||||||
|
Show();
|
||||||
|
Unlock();
|
||||||
|
|
||||||
|
// block this thread now, but keep the window repainting
|
||||||
|
while (true) {
|
||||||
|
status_t status = acquire_sem_etc(fExitSemaphore, 1,
|
||||||
|
B_CAN_INTERRUPT | B_RELATIVE_TIMEOUT, 50000);
|
||||||
|
if (status != B_TIMED_OUT && status != B_INTERRUPTED)
|
||||||
|
break;
|
||||||
|
fWindow->UpdateIfNeeded();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Lock())
|
||||||
|
return B_CANCELED;
|
||||||
|
|
||||||
|
if (fReturnStatus == B_OK) {
|
||||||
|
if (fEditor != NULL && fEditor->ValidateParameters()) {
|
||||||
|
status_t status = fEditor->GetParameters(parameters);
|
||||||
|
if (status != B_OK)
|
||||||
|
fReturnStatus = status;
|
||||||
|
}
|
||||||
|
if (fReturnStatus == B_OK)
|
||||||
|
fReturnStatus = ParametersReceived(parameters, storage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
status_t status = fReturnStatus;
|
||||||
|
|
||||||
|
Quit();
|
||||||
|
// NOTE: this object is toast now!
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
AbstractParametersPanel::NeedsEditor() const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
AbstractParametersPanel::ParametersReceived(const BString& parameters,
|
||||||
|
BMessage& storage)
|
||||||
|
{
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
AbstractParametersPanel::AddControls(BLayoutBuilder::Group<>& builder,
|
AbstractParametersPanel::AddControls(BLayoutBuilder::Group<>& builder,
|
||||||
BView* editorView)
|
BView* editorView)
|
||||||
|
|||||||
@@ -37,7 +37,11 @@ protected:
|
|||||||
void Init(B_PARAMETER_EDITOR_TYPE type,
|
void Init(B_PARAMETER_EDITOR_TYPE type,
|
||||||
const BString& diskSystem,
|
const BString& diskSystem,
|
||||||
BPartition* partition);
|
BPartition* partition);
|
||||||
|
status_t Go(BString& parameters, BMessage& storage);
|
||||||
|
|
||||||
|
virtual bool NeedsEditor() const;
|
||||||
|
virtual status_t ParametersReceived(const BString& parameters,
|
||||||
|
BMessage& storage);
|
||||||
virtual void AddControls(BLayoutBuilder::Group<>& builder,
|
virtual void AddControls(BLayoutBuilder::Group<>& builder,
|
||||||
BView* editorView);
|
BView* editorView);
|
||||||
|
|
||||||
|
|||||||
@@ -60,25 +60,25 @@ status_t
|
|||||||
CreateParametersPanel::Go(off_t& offset, off_t& size, BString& name,
|
CreateParametersPanel::Go(off_t& offset, off_t& size, BString& name,
|
||||||
BString& type, BString& parameters)
|
BString& type, BString& parameters)
|
||||||
{
|
{
|
||||||
// The object will be deleted in Go(), so we need to get the values before
|
// The object will be deleted in Go(), so we need to get the values via
|
||||||
|
// a BMessage
|
||||||
|
|
||||||
|
BMessage storage;
|
||||||
|
status_t status = AbstractParametersPanel::Go(parameters, storage);
|
||||||
|
if (status != B_OK)
|
||||||
|
return status;
|
||||||
|
|
||||||
// Return the value back as bytes.
|
// Return the value back as bytes.
|
||||||
size = fSizeSlider->Size();
|
size = storage.GetInt64("size", 0);
|
||||||
offset = fSizeSlider->Offset();
|
offset = storage.GetInt64("offset", 0);
|
||||||
|
|
||||||
// get name
|
// get name
|
||||||
name.SetTo(fNameTextControl->Text());
|
name.SetTo(storage.GetString("name", NULL));
|
||||||
|
|
||||||
// get type
|
// get type
|
||||||
if (BMenuItem* item = fTypeMenuField->Menu()->FindMarked()) {
|
type.SetTo(storage.GetString("type", NULL));
|
||||||
const char* _type;
|
|
||||||
BMessage* message = item->Message();
|
|
||||||
if (!message || message->FindString("type", &_type) < B_OK)
|
|
||||||
_type = kPartitionTypeBFS;
|
|
||||||
type << _type;
|
|
||||||
}
|
|
||||||
|
|
||||||
return AbstractParametersPanel::Go(parameters);
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -114,6 +114,41 @@ CreateParametersPanel::MessageReceived(BMessage* message)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
CreateParametersPanel::NeedsEditor() const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
CreateParametersPanel::ParametersReceived(const BString& parameters,
|
||||||
|
BMessage& storage)
|
||||||
|
{
|
||||||
|
// Return the value back as bytes.
|
||||||
|
status_t status = storage.SetInt64("size", fSizeSlider->Size());
|
||||||
|
if (status == B_OK)
|
||||||
|
status = storage.SetInt64("offset", fSizeSlider->Offset());
|
||||||
|
|
||||||
|
// get name
|
||||||
|
if (status == B_OK)
|
||||||
|
status = storage.SetString("name", fNameTextControl->Text());
|
||||||
|
|
||||||
|
// get type
|
||||||
|
if (BMenuItem* item = fTypeMenuField->Menu()->FindMarked()) {
|
||||||
|
const char* type;
|
||||||
|
BMessage* message = item->Message();
|
||||||
|
if (!message || message->FindString("type", &type) != B_OK)
|
||||||
|
type = kPartitionTypeBFS;
|
||||||
|
|
||||||
|
if (status == B_OK)
|
||||||
|
status = storage.SetString("type", type);
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
CreateParametersPanel::AddControls(BLayoutBuilder::Group<>& builder,
|
CreateParametersPanel::AddControls(BLayoutBuilder::Group<>& builder,
|
||||||
BView* editorView)
|
BView* editorView)
|
||||||
@@ -136,7 +171,8 @@ CreateParametersPanel::AddControls(BLayoutBuilder::Group<>& builder,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
builder.Add(editorView);
|
if (editorView != NULL)
|
||||||
|
builder.Add(editorView);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -33,6 +33,9 @@ public:
|
|||||||
virtual void MessageReceived(BMessage* message);
|
virtual void MessageReceived(BMessage* message);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
virtual bool NeedsEditor() const;
|
||||||
|
virtual status_t ParametersReceived(const BString& parameters,
|
||||||
|
BMessage& storage);
|
||||||
virtual void AddControls(BLayoutBuilder::Group<>& builder,
|
virtual void AddControls(BLayoutBuilder::Group<>& builder,
|
||||||
BView* editorView);
|
BView* editorView);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user