⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xaosdialog.cpp

📁 另一个分形程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
   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",&param->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 + -