📄 xaosdialog.cpp
字号:
locker.Lock(); if(openpanel==NULL) { openpanel=new BFilePanel(B_OPEN_PANEL, NULL, NULL, B_FILE_NODE, FALSE); savepanel=new BFilePanel(B_SAVE_PANEL, NULL, NULL, B_FILE_NODE, FALSE); } locker.Unlock(); if (d->type == DIALOG_OFILE) panel=savepanel; else panel=openpanel;}XaoSFileElement::~XaoSFileElement(){ locker.Lock(); if(openpanel || savepanel) { panel->Hide(); panel->SetTarget(be_app_messenger); // Use Be_app_messenger as /dev/null } if (target) delete target;}voidXaoSFileElement::GetMinimalSize(int *textwidth, int *width, int *height){ float w,h; inherited::GetMinimalSize(textwidth, width, height); browse->GetPreferredSize(&w, &h); *width+=(int)w+1; if(*height<h) *height=(int)h+1;}voidXaoSFileElement::SetIt(int xstart, int textwidth, int width, int top, int height, BView *view){ float w,h; browse->GetPreferredSize(&w, &h); inherited::SetIt(xstart,textwidth,width-w, top, height, view); browse->MoveTo(xstart+width+textwidth-w,top); browse->ResizeTo(w, height); view->AddChild(browse);}voidXaoSFileElement::GetValue(dialogparam *param){ param->dstring=strdup(text->Text());}voidXaoSFileElement::cleanup(void){ if (openpanel) {delete openpanel; openpanel=NULL;} if (savepanel) {delete savepanel; savepanel=NULL;}}/* Simple derived classes from string element */class XaoSFloatElement: public XaoSAStringElement{public: typedef XaoSAStringElement inherited; XaoSFloatElement(const menudialog *dialog); virtual void GetValue(dialogparam *param);};XaoSFloatElement::XaoSFloatElement(const menudialog *dialog):inherited(dialog){ char s[256]; sprintf(s,"%g",(double)dialog->deffloat); SetDefault(s);}voidXaoSFloatElement::GetValue(dialogparam *param){ param->number=ui_getfloat((const char *)text->Text());}class XaoSIntElement: public XaoSAStringElement{public: typedef XaoSAStringElement inherited; XaoSIntElement(const menudialog *dialog); virtual void GetValue(dialogparam *param);};XaoSIntElement::XaoSIntElement(const menudialog *dialog):inherited(dialog){ char s[256]; sprintf(s,"%i",dialog->defint); SetDefault(s);}voidXaoSIntElement::GetValue(dialogparam *param){ param->dint=dialog->defint; sscanf(text->Text(),"%i",¶m->dint);}class XaoSStringElement: public XaoSAStringElement{public: typedef XaoSAStringElement inherited; XaoSStringElement(const menudialog *dialog); virtual void GetValue(dialogparam *param);};XaoSStringElement::XaoSStringElement(const menudialog *dialog):inherited(dialog){ SetDefault(dialog->defstr);}voidXaoSStringElement::GetValue(dialogparam *param){ param->dstring=strdup(text->Text());}class OkCancelDialog: public XaoSElement{public: typedef XaoSElement inherited; OkCancelDialog(const menudialog *dialog); ~OkCancelDialog(); virtual void GetValue(dialogparam *param); virtual void GetMinimalSize(int *textwidth, int *width, int *height); virtual void SetIt(int xstart, int textwidth, int width, int top, int height, BView *view);private: BButton *ok,*cancel,*apply, *help;};OkCancelDialog::OkCancelDialog(const menudialog *dialog): inherited(dialog){ BRect r(0,0,10,10); ok=new BButton(r,"OkButton","Ok", new BMessage ('XaOk')); ok->MakeDefault(TRUE); cancel=new BButton(r,"Cancel","Cancel", new BMessage ('XaCn')); apply=new BButton(r,"Apply","Apply", new BMessage ('XaAp')); help=new BButton(r,"Help","Help", new BMessage ('XaHp'));}OkCancelDialog::~OkCancelDialog(){ //delete yes,cancel,apply;}voidOkCancelDialog::GetValue(dialogparam *param){}#define SPACE 2#define BORDERWIDTH 3voidOkCancelDialog::GetMinimalSize(int *textwidth, int *width, int *height){ float w, h; int maxw; ok->GetPreferredSize(&w, &h); maxw=(int)w; cancel->GetPreferredSize(&w, &h); if (w>maxw) maxw=(int)w; apply->GetPreferredSize(&w, &h); if (w>maxw) maxw=(int)w; help->GetPreferredSize(&w, &h); if (w>maxw) maxw=(int)w; h+=2*BORDERWIDTH; /* Default border makes it looking in different way */ *textwidth=0; *width=maxw*4+SPACE*6+BORDERWIDTH*8; *height=(int)h+1;}voidOkCancelDialog::SetIt(int xstart, int textwidth, int width, int top, int height, BView *view){ int wwidth=width+textwidth; int bwidth=wwidth/4-SPACE; view->AddChild(help); view->AddChild(cancel, help); view->AddChild(apply, cancel); view->AddChild(ok, apply); ok->MoveTo(xstart,top); ok->ResizeTo(bwidth, height); apply->MoveTo(xstart+wwidth/4+SPACE+BORDERWIDTH,top+BORDERWIDTH); apply->ResizeTo(bwidth - 2*BORDERWIDTH, height - 2*BORDERWIDTH); cancel->MoveTo(xstart+2*wwidth/4+SPACE+BORDERWIDTH,top+BORDERWIDTH); cancel->ResizeTo(bwidth - 2*BORDERWIDTH, height - 2*BORDERWIDTH); help->MoveTo(xstart+3*wwidth/4+SPACE+BORDERWIDTH,top+BORDERWIDTH); help->ResizeTo(bwidth - 2*BORDERWIDTH, height - 2*BORDERWIDTH);}BRectXaoSDialog::GetRect(BRect root, struct uih_context *context, const char *name){ int sizes[MAXELEMENTS]; int textwidth=0; int width=0; int height=0; int i; item = menu_findcommand (name); dialog = menu_getdialog(context, item); BRect rect2(0,0,200,200); box = new BBox(rect2, "dialog", B_FOLLOW_ALL); for(nitems=0; dialog[nitems].question; nitems++); for(i=0;i<nitems;i++) { switch(dialog[i].type) { case DIALOG_FLOAT: elements[i]=new XaoSFloatElement(dialog+i); break; case DIALOG_INT: elements[i]=new XaoSIntElement(dialog+i); break; case DIALOG_IFILE: case DIALOG_OFILE: elements[i]=new XaoSFileElement(dialog+i, this); break; case DIALOG_STRING: case DIALOG_KEYSTRING: elements[i]=new XaoSStringElement(dialog+i); break; case DIALOG_COORD: elements[i]=new XaoSComplexElement(dialog+i); break; case DIALOG_CHOICE: elements[i]=new XaoSChoiceElement(dialog+i); } } height=nitems*SEPARATOR; elements[i]=new OkCancelDialog(dialog+i); for(i=0;i<nitems+1;i++) { int tw,w,h; elements[i]->GetMinimalSize(&tw,&w,&h); if(tw>textwidth) textwidth=tw; if(w>width) width=w; height+=h; sizes[i]=h; } BRect rect(0,0,width+textwidth+2*BORDER,height+2*BORDER); //box = new BBox(rect, "dialog", B_FOLLOW_ALL); box->ResizeTo(width+textwidth+2*BORDER+1,height+2*BORDER+1); box->SetViewColor(216,216,216,0); int pos=BORDER; for(i=0;i<nitems+1;i++) { elements[i]->SetIt(5,textwidth,width,pos, sizes[i], box); pos+=sizes[i]+SEPARATOR; } if (nitems==1 && (dialog[0].type == DIALOG_OFILE || dialog[0].type == DIALOG_IFILE)) root.left=root.right=65536; BPoint location((root.left+root.right-rect.right)/2,(root.top+root.bottom-rect.bottom)/2); rect.OffsetBy(location); return rect;}XaoSDialog::XaoSDialog(BRect w, const char *name, port_id port, uih_context *c):inherited(GetRect(w,c,name),item->name, B_FLOATING_WINDOW, B_NOT_RESIZABLE | B_NOT_ZOOMABLE), mEventPort(port), context(c), name(name){ Lock(); AddChild(box); Show(); if (nitems==1 && (dialog[0].type == DIALOG_OFILE || dialog[0].type == DIALOG_IFILE)) { Hide(); ((XaoSFileElement *)elements[0])->ShowFileSelector(); } Unlock();}XaoSDialog::~XaoSDialog(void)//:~inherited(){ int i; for(i=0;i<nitems+1;i++) delete elements[i];}voidXaoSDialog::DoApply(void){ dialogparam *p=(dialogparam *)calloc(sizeof(*p),nitems); int i; for (i=0;i<nitems;i++) elements[i]->GetValue(p+i); SendEvent(XaoSEvent::Dialog, XaoSEvent(item, p));}voidXaoSDialog::SendEvent(long eventCode, const XaoSEvent &event) const{ (void)write_port(mEventPort, eventCode, &event, sizeof(XaoSEvent));}voidXaoSDialog::cleanup(void){ XaoSFileElement::cleanup();}voidXaoSDialog::MessageReceived(BMessage *message){ XaoSFileElement *p; switch(message->what) { case 'XaFi': message->FindPointer("Ptr",(void **)&p); p->ShowFileSelector(); break; case 'XaFp': case B_REFS_RECEIVED: message->FindPointer("Ptr",(void **)&p); if(!p->FileSelectorMessage(message) && nitems==1) {PostMessage(B_QUIT_REQUESTED); break;} if (nitems==1) DoApply(); break; case B_CANCEL: if (nitems==1) PostMessage(B_QUIT_REQUESTED); break; case 'XaOk': DoApply(); case 'XaCn': PostMessage(B_QUIT_REQUESTED); break; case 'XaAp': DoApply(); break; case 'XaHp': be_help(NULL,item->shortname); break; default: inherited::MessageReceived(message); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -