plugin_arg_form.cpp
来自「ncbi源码」· C++ 代码 · 共 1,188 行 · 第 1/3 页
CPP
1,188 行
return new CButtonFormatter(arg); case CPluginArg::eDocument: case CPluginArg::eObject: return new CSingleObjFormatter(arg, objs); default: LOG_POST(Error << "unhandled argument type: " << (int)arg.GetType()); break; } } else { switch (arg.GetType()) { case CPluginArg::eString: case CPluginArg::eInteger: case CPluginArg::eDouble: return new CMultiLineFormatter(arg); case CPluginArg::eDocument: case CPluginArg::eObject: return new CMultiObjFormatter(arg, objs); default: LOG_POST(Error << "unhandled argument type: " << (int)arg.GetType()); break; } } return NULL;}////// internal implementation//////// constants controlling layout//// default row height, in pixelsstatic const int sc_RowHeight = 25;// default row width, in pixelsstatic const int sc_RowWidth = 500;// default fraction of the width devoted to labelsstatic const float sc_LabelFrac = 0.33f;//// argument formatter for single-line input boxes//CSimpleFormatter::CSimpleFormatter(CPluginArg& arg) : m_Group(NULL), m_Input(NULL), m_Arg(&arg){}void CSimpleFormatter::Process(void){ if ( !m_Input || !m_Group || !m_Arg.GetPointer() ) { return; } string val(m_Input->value()); switch (m_Arg->GetType()) { case CPluginArg::eInteger: m_Arg->SetInteger(val); break; case CPluginArg::eDouble: m_Arg->SetDouble(val); break; case CPluginArg::eString: m_Arg->SetString(val); break; case CPluginArg::eFile: m_Arg->SetFile(val); break; default: LOG_POST(Error << "CSimpleFormatter: unhandled argument type"); break; }}Fl_Widget* CSimpleFormatter::GetWidget(){ if ( !m_Group ) { // // create a new group for our argument // // default pieces of text const char* label_text = m_Arg->GetDesc().c_str(); const char* initial_value = m_Arg->AsString().c_str(); const char* tooltip = NULL; if (m_Arg->IsSetLong_desc()) { tooltip = m_Arg->GetLong_desc().c_str(); } // label and value sc_RowWidth int label_width = int (sc_RowWidth * sc_LabelFrac); int value_width = sc_RowWidth - label_width; int label_y = 0; int row_height = sc_RowHeight; // create our input item m_Input = NULL; Fl_Button* button = NULL; switch (m_Arg->GetType()) { default: case CPluginArg::eString: m_Input = new Fl_Input(label_width, 0, value_width, row_height); break; case CPluginArg::eInteger: m_Input = new Fl_Int_Input(label_width, 0, value_width, row_height); break; case CPluginArg::eDouble: m_Input = new Fl_Float_Input(label_width, 0, value_width, row_height); break; case CPluginArg::eFile: label_y = 10; row_height += label_y; m_Input = new Fl_File_Input(label_width, 0, value_width - 30, row_height); // we also need a button... button = new Fl_Button(label_width + value_width - 22, 13, 19, 19); button->label("..."); button->callback((Fl_Callback*)&CSimpleFormatter::cb_FileOpen, (void*)m_Input); break; } _ASSERT(m_Input); m_Input->value(initial_value); m_Input->color(FL_BACKGROUND2_COLOR); m_Input->box(FL_DOWN_BOX); m_Input->tooltip(tooltip); m_Input->labelsize(12); m_Input->textsize(12); // create a label to go with this as well... Fl_Box* label = new Fl_Box(0, 0, label_width, row_height); label->label(label_text); label->align(FL_ALIGN_INSIDE | FL_ALIGN_RIGHT | FL_ALIGN_CLIP | FL_ALIGN_WRAP); label->labelsize(12); // create a group for this row m_Group = new Fl_Group(0, 0, sc_RowWidth, row_height); m_Group->add(label); m_Group->add_resizable(*m_Input); if (button) { m_Group->add(button); } m_Group->end(); } return m_Group;}void CSimpleFormatter::cb_FileOpen(Fl_Widget* w, void* data){ Fl_Input* input = static_cast<Fl_Input*>(data); if (input) { string str = NcbiFileBrowser("Select a file", "", input->value()); if ( !str.empty() ) { input->value(str.c_str()); } }}//// argument formatter for check-box arguments//CButtonFormatter::CButtonFormatter(CPluginArg& arg) : m_Button(NULL), m_Arg(&arg){}void CButtonFormatter::Process(void){ if ( !m_Button || !m_Arg.GetPointer() ) { return; } bool checked = m_Button->value() ? true : false; m_Arg->SetBoolean(checked);}Fl_Widget* CButtonFormatter::GetWidget(){ if ( !m_Button ) { // // create a new group for our argument // // default pieces of text const char* label_text = m_Arg->GetDesc().c_str(); bool initial_value = m_Arg->AsBoolean(); const char* tooltip = NULL; if (m_Arg->IsSetLong_desc()) { tooltip = m_Arg->GetLong_desc().c_str(); } m_Button = new Fl_Check_Button(0, 0, sc_RowWidth, sc_RowHeight, label_text); if (initial_value) { m_Button->value(1); } if (tooltip) { m_Button->tooltip(tooltip); } } return m_Button;}//// argument formatter for multiline-line input boxes//CMultiLineFormatter::CMultiLineFormatter(CPluginArg& arg) : m_Group(NULL), m_Input(NULL), m_Arg(&arg){}void CMultiLineFormatter::Process(void){ string val(m_Input->value()); vector<string> vals; string::iterator start = val.begin(); string::iterator curr = val.begin(); string::iterator end = val.end(); for ( ; curr != end; ++curr) { if (*curr == ',' || *curr == ';') { // tokenize if ( start != curr ) { vals.push_back(string(start, curr)); } for (++curr; curr != end; ++curr) { // skip whitespace if ( *curr != ',' && *curr != ';' && *curr != ' ' && *curr != '\t' && *curr != '\n' && *curr != '\r') { break; } } start = curr; } else if (*curr == '"') { // balance double quotes for (++curr; curr != end && *curr != '"'; ++curr) { } } } if ( start != curr ) { vals.push_back(string(start, curr)); } CPluginArg::TValues values; switch (m_Arg->GetType()) { case CPluginArg::eInteger: ITERATE (vector<string>, iter, vals) { CRef<CPluginValue> value(new CPluginValue()); value->SetInteger(*iter); values.push_back(value); } break; case CPluginArg::eDouble: ITERATE (vector<string>, iter, vals) { CRef<CPluginValue> value(new CPluginValue()); value->SetDouble(*iter); values.push_back(value); } break; case CPluginArg::eString: ITERATE (vector<string>, iter, vals) { CRef<CPluginValue> value(new CPluginValue()); value->SetString(*iter); values.push_back(value); } break; case CPluginArg::eFile: ITERATE (vector<string>, iter, vals) { CRef<CPluginValue> value(new CPluginValue()); value->SetFile(*iter); values.push_back(value); } break; default: LOG_POST(Error << "CMultiLineFormatter: unhandled argument type"); break; } m_Arg->SetList(values);}Fl_Widget* CMultiLineFormatter::GetWidget(void){ if ( !m_Group ) { // // create a new group for our argument // // default pieces of text const char* label_text = m_Arg->GetDesc().c_str(); string initial_value; ITERATE (CPluginArg::TData::TArray, iter, m_Arg->GetData().GetArray()) { if ( !initial_value.empty() ) { initial_value += "\n"; } initial_value += (*iter)->AsString(); } const char* tooltip = NULL; if (m_Arg->IsSetLong_desc()) { tooltip = m_Arg->GetLong_desc().c_str(); } // label and value sc_RowWidth int label_width = int (sc_RowWidth * sc_LabelFrac); int value_width = sc_RowWidth - label_width; int label_y = 0; int row_height = sc_RowHeight;// * 2; // create our input item m_Input = new Fl_Input(label_width, 0, value_width, row_height); _ASSERT(m_Input); m_Input->value(initial_value.c_str()); m_Input->box(FL_DOWN_BOX); m_Input->color(FL_BACKGROUND2_COLOR); m_Input->tooltip(tooltip); m_Input->align(FL_ALIGN_INSIDE | FL_ALIGN_LEFT | FL_ALIGN_TOP); m_Input->labelsize(12); m_Input->textsize(12); // create a label to go with this as well... Fl_Box* label = new Fl_Box(0, 0, label_width, row_height); label->label(label_text); label->align(FL_ALIGN_INSIDE | FL_ALIGN_RIGHT | FL_ALIGN_CLIP | FL_ALIGN_WRAP); label->labelsize(12); // create a group for this row m_Group = new Fl_Group(0, 0, sc_RowWidth, row_height); m_Group->add(label); m_Group->add_resizable(*m_Input); m_Group->end(); } return m_Group;}//// CMenuFormatter handles items with 'set' constraints//CMenuFormatter::CMenuFormatter(CPluginArg& arg) : m_Group(NULL),
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?