本文整理汇总了C++中WindowRef类的典型用法代码示例。如果您正苦于以下问题:C++ WindowRef类的具体用法?C++ WindowRef怎么用?C++ WindowRef使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了WindowRef类的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: getWindowIndex
void AppBase::privateUpdate__()
{
mFrameCount++;
// service asio::io_service
mIo->poll();
if( getNumWindows() > 0 ) {
WindowRef mainWin = getWindowIndex( 0 );
if( mainWin )
mainWin->getRenderer()->makeCurrentContext();
}
mSignalUpdate.emit();
update();
mTimeline->stepTo( static_cast<float>( getElapsedSeconds() ) );
double now = mTimer.getSeconds();
if( now > mFpsLastSampleTime + mFpsSampleInterval ) {
//calculate average Fps over sample interval
uint32_t framesPassed = mFrameCount - mFpsLastSampleFrame;
mAverageFps = (float)(framesPassed / (now - mFpsLastSampleTime));
mFpsLastSampleTime = now;
mFpsLastSampleFrame = mFrameCount;
}
}
开发者ID:kitschpatrol,项目名称:Cinder,代码行数:29,代码来源:AppBase.cpp
示例2: getWindowIndex
void SlingshotSmokeApp::setup()
{
mVolumeMult = 5.0;
mLastTime = 0;
getWindowIndex(0)->getSignalDraw().connect([=]() { drawRender(); });
mAudioSource = AudioSource();
mAudioSource.setup();
vec2 fluidResolution = vec2(512);
vec2 smokeResolution = app::getWindowSize();
mFluid = Fluid(fluidResolution);
mSmokers.reserve(2);
mSmokers.push_back(shared_ptr<FakeSmoker>(new FakeSmoker(fluidResolution, smokeResolution)));
mSmokers.push_back(shared_ptr<PositionSmoker>(new PositionSmoker(fluidResolution, smokeResolution)));
mSmokers.push_back(shared_ptr<TransitionSmoker>(new TransitionSmoker(fluidResolution, smokeResolution)));
mSmokers.push_back(shared_ptr<BottomSmoker>(new BottomSmoker(fluidResolution, smokeResolution)));
mCurrentSmoker = 0;
mSmokers[mCurrentSmoker]->light(vec2(0.5, 0.2), mParams);
gl::GlslProg::Format renderFormat;
renderFormat.vertex(app::loadAsset("passthru.vert"));
renderFormat.fragment(app::loadAsset("Smokers/smoke_draw.frag"));
mRenderProg = gl::GlslProg::create(renderFormat);
mRenderProg->uniform("i_resolution", smokeResolution);
gl::Texture2d::Format texFmt;
texFmt.setInternalFormat(GL_RGBA32F);
texFmt.setDataType(GL_FLOAT);
texFmt.setTarget(GL_TEXTURE_2D);
texFmt.setWrap(GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE);
gl::Fbo::Format fmt;
fmt.disableDepth()
.setColorTextureFormat(texFmt);
mSmokeField = PingPongFBO(fmt, smokeResolution, 4);
// Do params last so that all the FBOs are in the right context
vec2 paramsSize = vec2(255, 512);
auto format = Window::Format();
format.setSize(paramsSize + vec2(40, 20));
format.setPos(ivec2(100));
WindowRef paramsWindow = createWindow(format);
paramsWindow->getSignalDraw().connect([=]() { drawParams(); });
mParams = params::InterfaceGl::create(paramsWindow, "Options", paramsSize);
mParams->addParam("Volume", &mVolumeMult)
.max(10.0)
.min(0.0)
.step(0.1);
}
开发者ID:ulyssesp,项目名称:slingshot-smoke,代码行数:56,代码来源:SlingshotSmokeApp.cpp
示例3: initialize
bool initialize( const WindowRef& window ) override
{
// Make sure our window is positioned and sized correctly.
window->setBorderless( true );
window->setPos( mRift->getNativeWindowPos() );
window->setSize( mRift->getNativeWindowResolution() );
// Create or resize the frame buffer.
mRift->initializeFrameBuffer();
initializeDistortion();
return true;
}
开发者ID:AphexHenry,项目名称:Oculus-Experiments,代码行数:11,代码来源:CinderOculus.cpp
示例4: connect
void TouchUi::connect( const WindowRef& window, int signalPriority )
{
mSignalPriority = signalPriority;
mWindow = window;
if ( window ) {
mConnectionTouchesBegan = window->getSignalTouchesBegan().connect( signalPriority,
[ this ]( app::TouchEvent &event ) { touchesBegan( event ); } );
mConnectionTouchesEnded = window->getSignalTouchesEnded().connect( signalPriority,
[ this ]( app::TouchEvent &event ) { touchesEnded( event ); } );
mConnectionTouchesMoved = window->getSignalTouchesMoved().connect( signalPriority,
[ this ]( app::TouchEvent &event ) { touchesMoved( event ); } );
mConnectionUpdate = app::App::get()->getSignalUpdate().connect( signalPriority,
[ this ]() { update(); } );
if ( mMask.empty() ) {
setMask( Area( ivec2( 0 ), window->getSize() ) );
}
} else {
disconnect();
}
}
开发者ID:adamwittsell,项目名称:SpoolCinder,代码行数:20,代码来源:TouchUi.cpp
示例5: Area
TouchUi::TouchUi( const WindowRef& window, int signalPriority )
{
mEnabled = true;
mEnabledConstrain = true;
mEnabledPan = true;
mEnabledRotation = true;
mEnabledScale = true;
mEnabledTap = true;
mInterpolationSpeed = 0.33f;
mNumTouchPointsMax = numeric_limits<int32_t>::max();
mNumTouchPointsMin = 1;
mPan = vec2( 0.0f );
mPanMax = vec2( numeric_limits<float>::max() );
mPanMin = vec2( -numeric_limits<float>::max() );
mPanSpeed = vec2( 1.0f );
mPanTarget = mPan;
mPanThreshold = vec2( 1.0f );
mRotationSpeed = -2.5f;
mRotationThreshold = 0.005f;
mScale = vec2( 1.0f );
mScaleMax = vec2( numeric_limits<float>::max() );
mScaleMin = vec2( 0.0f );
mScaleSpeed = vec2( 0.0067f );
mScaleSymmetry = true;
mScaleTarget = mScale;
mScaleThreshold = vec2( 1.0f );
mTapDelay = 0.07;
mTapPosition = vec2( numeric_limits<float>::min() );
mTapTime = 0.0;
mTapThreshold = 15.0f;
mTouchDelay = 0.07;
mTouchTime = 0.0;
if ( window != nullptr ) {
setMask( Area( ivec2( 0 ), window->getSize() ) );
}
connect( window, signalPriority );
}
开发者ID:adamwittsell,项目名称:SpoolCinder,代码行数:38,代码来源:TouchUi.cpp
示例6: resetWindowOriginalSize
void ImageRetargetingApp::resetWindowOriginalSize(WindowRef window)
{
window->setSize(originalTexture.getWidth(), originalTexture.getHeight());
}
开发者ID:cmorace,项目名称:Salient-Image-Retargeting,代码行数:4,代码来源:ImageRetargetingApp.cpp
示例7: create
void View::create (WindowRef & ciWindow, const fs::path & assetFolder)
{
try
{
initGraph (&fps, GRAPH_RENDER_FPS, "Frame Time");
initGraph (&cpuGraph, GRAPH_RENDER_MS, "CPU Time");
setSize (ciWindow->getSize());
nanogui::Window * window = new nanogui::Window (this, "Button demo");
window->setPosition (ivec2 (15, 15));
window->setLayout (new GroupLayout());
/* No need to store a pointer, the data structure will be automatically
freed when the parent window is deleted */
new Label (window, "Push buttons", "sans-bold");
Button * b = new Button (window, "Plain button");
b->setCallback ([] { cout << "pushed!" << endl; });
b = new Button (window, "Styled", ENTYPO_ICON_ROCKET);
b->setBackgroundColor (Colour (0, 0, 255, 25));
b->setCallback ([] { cout << "pushed!" << endl; });
new Label (window, "Toggle buttons", "sans-bold");
b = new Button (window, "Toggle me");
b->setFlags (Button::ToggleButton);
b->setChangeCallback ([] (bool state)
{
cout << "Toggle button state: " << state << endl;
});
new Label (window, "Radio buttons", "sans-bold");
b = new Button (window, "Radio button 1");
b->setFlags (Button::RadioButton);
b = new Button (window, "Radio button 2");
b->setFlags (Button::RadioButton);
new Label (window, "A tool palette", "sans-bold");
Widget * tools = new Widget (window);
tools->setLayout (new BoxLayout (Orientation::Horizontal,
Alignment::Middle, 0, 6));
b = new ToolButton (tools, ENTYPO_ICON_CLOUD);
b = new ToolButton (tools, ENTYPO_ICON_FF);
b = new ToolButton (tools, ENTYPO_ICON_COMPASS);
b = new ToolButton (tools, ENTYPO_ICON_INSTALL);
new Label (window, "Popup buttons", "sans-bold");
PopupButton * popupBtn = new PopupButton (window, "Popup", ENTYPO_ICON_EXPORT);
Popup * popup = popupBtn->popup();
popup->setLayout (new GroupLayout());
new Label (popup, "Arbitrary widgets can be placed here");
new CheckBox (popup, "A check box");
popupBtn = new PopupButton (popup, "Recursive popup", ENTYPO_ICON_FLASH);
popup = popupBtn->popup();
popup->setLayout (new GroupLayout());
new CheckBox (popup, "Another check box");
window = new nanogui::Window (this, "Basic widgets");
window->setPosition (ivec2 (200, 15));
window->setLayout (new GroupLayout());
new Label (window, "Message dialog", "sans-bold");
tools = new Widget (window);
tools->setLayout (new BoxLayout (Orientation::Horizontal,
Alignment::Middle, 0, 6));
b = new Button (tools, "Info");
b->setCallback ([&]
{
auto dlg = new MessageDialog (this, MessageDialog::Type::Information, "Title", "This is an information message");
dlg->setCallback ([] (int result)
{
cout << "Dialog result: " << result << endl;
});
});
b = new Button (tools, "Warn");
b->setCallback ([&]
{
auto dlg = new MessageDialog (this, MessageDialog::Type::Warning, "Title", "This is a warning message");
dlg->setCallback ([] (int result)
{
cout << "Dialog result: " << result << endl;
});
});
b = new Button (tools, "Ask");
b->setCallback ([&]
{
auto dlg = new MessageDialog (this, MessageDialog::Type::Warning, "Title", "This is a question message", "Yes", "No", true);
dlg->setCallback ([] (int result)
{
cout << "Dialog result: " << result << endl;
});
});
std::string iconPath = assetFolder.string();
iconPath += "/icons";
std::vector<std::pair<int, std::string>> icons = NanoUtil::loadImageDirectory (getContext(), iconPath);
new Label (window, "Image panel & scroll panel", "sans-bold");
PopupButton * imagePanelBtn = new PopupButton (window, "Image Panel");
imagePanelBtn->setIcon (ENTYPO_ICON_FOLDER);
popup = imagePanelBtn->popup();
VScrollPanel * vscroll = new VScrollPanel (popup);
ImagePanel * imgPanel = new ImagePanel (vscroll);
imgPanel->setImages (icons);
popup->setFixedSize (ivec2 (245, 150));
new Label (window, "Selected image", "sans-bold");
auto img = new ImageView (window);
img->setFixedSize (ivec2 (40, 40));
//.........这里部分代码省略.........
开发者ID:DanGroom,项目名称:NanoguiBlock,代码行数:101,代码来源:View.cpp
示例8: create
void View::create (WindowRef & ciWindow)
{
try
{
initGraph (&fps, GRAPH_RENDER_FPS, "Frame Time");
initGraph (&cpuGraph, GRAPH_RENDER_MS, "CPU Time");
setSize (ciWindow->getSize());
nanogui::Window * window = new nanogui::Window (this, "Button demo");
window->setPosition (ivec2 (15, 15));
window->setLayout (new GroupLayout());
/* No need to store a pointer, the data structure will be automatically
freed when the parent window is deleted */
new Label (window, "Push buttons", "sans-bold");
Button * b = new Button (window, "Plain button");
b->setCallback ([] { cout << "pushed!" << endl; });
b = new Button (window, "Styled", ENTYPO_ICON_ROCKET);
b->setBackgroundColor (Colour (0, 0, 255, 25));
b->setCallback ([] { cout << "pushed!" << endl; });
new Label (window, "Toggle buttons", "sans-bold");
b = new Button (window, "Toggle me");
b->setFlags (Button::ToggleButton);
b->setChangeCallback ([] (bool state)
{
cout << "Toggle button state: " << state << endl;
});
new Label (window, "Radio buttons", "sans-bold");
b = new Button (window, "Radio button 1");
b->setFlags (Button::RadioButton);
b = new Button (window, "Radio button 2");
b->setFlags (Button::RadioButton);
new Label (window, "A tool palette", "sans-bold");
Widget * tools = new Widget (window);
tools->setLayout (new BoxLayout (Orientation::Horizontal,
Alignment::Middle, 0, 6));
b = new ToolButton (tools, ENTYPO_ICON_CLOUD);
b = new ToolButton (tools, ENTYPO_ICON_FF);
b = new ToolButton (tools, ENTYPO_ICON_COMPASS);
b = new ToolButton (tools, ENTYPO_ICON_INSTALL);
new Label (window, "Popup buttons", "sans-bold");
PopupButton * popupBtn = new PopupButton (window, "Popup", ENTYPO_ICON_EXPORT);
Popup * popup = popupBtn->popup();
popup->setLayout (new GroupLayout());
new Label (popup, "Arbitrary widgets can be placed here");
new CheckBox (popup, "A check box");
popupBtn = new PopupButton (popup, "Recursive popup", ENTYPO_ICON_FLASH);
popup = popupBtn->popup();
popup->setLayout (new GroupLayout());
new CheckBox (popup, "Another check box");
window = new nanogui::Window (this, "Basic widgets");
window->setPosition (ivec2 (200, 15));
window->setLayout (new GroupLayout());
new Label (window, "Message dialog", "sans-bold");
tools = new Widget (window);
tools->setLayout (new BoxLayout (Orientation::Horizontal,
Alignment::Middle, 0, 6));
b = new Button (tools, "Info");
b->setCallback ([&]
{
auto dlg = new MessageDialog (this, MessageDialog::Type::Information, "Title", "This is an information message");
dlg->setCallback ([] (int result)
{
cout << "Dialog result: " << result << endl;
});
});
b = new Button (tools, "Warn");
b->setCallback ([&]
{
auto dlg = new MessageDialog (this, MessageDialog::Type::Warning, "Title", "This is a warning message");
dlg->setCallback ([] (int result)
{
cout << "Dialog result: " << result << endl;
});
});
b = new Button (tools, "Ask");
b->setCallback ([&]
{
auto dlg = new MessageDialog (this, MessageDialog::Type::Warning, "Title", "This is a question message", "Yes", "No", true);
dlg->setCallback ([] (int result)
{
cout << "Dialog result: " << result << endl;
});
});
std::string iconPath ("E:/Code4/nanofish/projects/qdemos/cinder/ciNanogui/assets/icons");
std::vector<std::pair<int, std::string>> icons = NanoUtil::loadImageDirectory (getContext(), iconPath);
new Label (window, "Image panel & scroll panel", "sans-bold");
PopupButton * imagePanelBtn = new PopupButton (window, "Image Panel");
imagePanelBtn->setIcon (ENTYPO_ICON_FOLDER);
popup = imagePanelBtn->popup();
VScrollPanel * vscroll = new VScrollPanel (popup);
ImagePanel * imgPanel = new ImagePanel (vscroll);
imgPanel->setImages (icons);
popup->setFixedSize (ivec2 (245, 150));
new Label (window, "Selected image", "sans-bold");
auto img = new ImageView (window);
img->setFixedSize (ivec2 (40, 40));
img->setImage (icons[0].first);
imgPanel->setCallback ([ &, img, imgPanel, imagePanelBtn] (int i)
{
//.........这里部分代码省略.........
开发者ID:Reymenta-Visuals,项目名称:ciNanoGui,代码行数:101,代码来源:View.cpp
示例9: getManager
inline ManagerRef getManager(WindowRef id) {
return getManager(id.get());
}
开发者ID:berkelium,项目名称:berkelium,代码行数:3,代码来源:Impl.hpp
示例10: isValid
bool OculusRift::isValid( const WindowRef& window )
{
return window && window->isValid();
}
开发者ID:AphexHenry,项目名称:Oculus-Experiments,代码行数:4,代码来源:CinderOculus.cpp
示例11: seamCarvingWindowResize
void ImageRetargetingApp::seamCarvingWindowResize()
{
if(seamCarvingState != SeamCarvingState::SeamCarving)
{
seamCarver->newWidth = seamCarvingWindow->getWidth();
seamCarver->newHeight = seamCarvingWindow->getHeight();
}
}
开发者ID:cmorace,项目名称:Salient-Image-Retargeting,代码行数:8,代码来源:ImageRetargetingApp.cpp
示例12: meshWarpingWindowResize
void ImageRetargetingApp::meshWarpingWindowResize()
{
meshWarpRetargetter->resizeWidth = meshWarpingWindow->getWidth();
meshWarpRetargetter->resizeHeight = meshWarpingWindow->getHeight();
if(meshWarpRetargetter->getNumVertices() < 500)
{
meshWarpRetargetter->resizeMeshRect(meshWarpRetargetter->resizeWidth , meshWarpRetargetter->resizeHeight);
meshWarpingState = MeshWarpingState::ShowMeshWarping;
}
}
开发者ID:cmorace,项目名称:Salient-Image-Retargeting,代码行数:10,代码来源:ImageRetargetingApp.cpp
示例13: drawSeamCarvingWindow
void ImageRetargetingApp::drawSeamCarvingWindow()
{
gl::clear( Color( 0.f, 0.f, 0.f ) );
switch(seamCarvingState)
{
case SeamCarvingState::ShowImage:
if( seamCarvedTexture ) {
gl::draw(seamCarvedTexture);
}
break;
case SeamCarvingState::ShowGradient:
if( gradientTexture ) {
gl::draw(gradientTexture);
}
break;
case SeamCarvingState::SeamCarving:
if(seamCarvedTexture){
int dw = seamCarver->newWidth - seamCarvedImage.getWidth();
int dh = seamCarver->newHeight - seamCarvedImage.getHeight();
if (dw<0 && dh<0){
seamCarvingWindow->setSize(seamCarvedTexture.getWidth()-1, seamCarvedTexture.getHeight());
seamCarvedImage = seamCarver->deleteVerticalSeam(seamCarvedImage);
}
else if (dw<0){
seamCarvingWindow->setSize(seamCarvedTexture.getWidth()-1, seamCarvedTexture.getHeight());
seamCarvedImage = seamCarver->deleteVerticalSeam(seamCarvedImage);
}
else if (dh<0){
seamCarvingWindow->setSize(seamCarvedTexture.getWidth(), seamCarvedTexture.getHeight()-1);
seamCarvedImage = seamCarver->deleteHorizontalSeam(seamCarvedImage);
}
//TODO:: Add Seam
else if (dw>=0 && dh>=0) {
seamCarvingState = SeamCarvingState::ShowImage;
seamCarver->stopCarveTimer();
}
seamCarvedTexture = gl::Texture(seamCarvedImage);
gl::draw(seamCarvedTexture);
}
break;
case SeamCarvingState::Undefined:
break;
}
seamCarvingParams->draw();
}
开发者ID:cmorace,项目名称:Salient-Image-Retargeting,代码行数:49,代码来源:ImageRetargetingApp.cpp
示例14: resizeMeshRect
void ImageRetargetingApp::resizeMeshRect()
{
meshWarpRetargetter->startTimer();
meshWarpRetargetter->resizeMeshRect(meshWarpRetargetter->resizeWidth , meshWarpRetargetter->resizeHeight);
meshWarpRetargetter->stopTimer();
meshWarpingState = MeshWarpingState::ShowMeshWarping;
meshWarpingWindow->setSize(meshWarpRetargetter->resizeWidth , meshWarpRetargetter->resizeHeight);
}
开发者ID:cmorace,项目名称:Salient-Image-Retargeting,代码行数:8,代码来源:ImageRetargetingApp.cpp
示例15: meshWarperResetButtonClick
void ImageRetargetingApp::meshWarperResetButtonClick()
{
meshWarpingState = MeshWarpingState::ShowImage;
saliencyImage = saliencySegmentor->getSaliencyMap(originalImage.clone(), SaliencySegmentor::SaliencyMethod::Sobel);
saliencyImage = saliencySegmentor->getSegmentedSalientImage(saliencyImage);
saliencyTexture = gl::Texture(saliencyImage);
meshWarpRetargetter->initMesh(originalImage.getWidth(), originalImage.getHeight(), saliencySegmentor);
meshWarpingWindow->setSize(originalImage.getWidth(), originalImage.getHeight());
}
开发者ID:cmorace,项目名称:Salient-Image-Retargeting,代码行数:10,代码来源:ImageRetargetingApp.cpp
示例16: initWindows
void ImageRetargetingApp::initWindows()
{
linearScaleWindow = this->getWindow();
linearScaleWindow->setTitle("Linear Scaling");
linearScaleWindow->connectDraw(&ImageRetargetingApp::drawLinearScaleWindow, this);
linearScaleWindow->connectResize(&ImageRetargetingApp::linearResizeWindowResize, this);
linearScalingParams = params::InterfaceGl::create( linearScaleWindow, "Original Image Data", toPixels( ci::Vec2i( 200, 400 ) ) );
seamCarvingWindow = createWindow();
seamCarvingWindow->setTitle("Seam Carving");
seamCarvingWindow->connectDraw(&ImageRetargetingApp::drawSeamCarvingWindow, this);
seamCarvingWindow->connectResize(&ImageRetargetingApp::seamCarvingWindowResize, this);
seamCarvingParams = params::InterfaceGl::create( seamCarvingWindow, "Seam Carving", toPixels( ci::Vec2i( 200, 400 ) ) );
meshWarpingWindow = createWindow();
meshWarpingWindow->setTitle("Mesh Warping");
meshWarpingWindow->connectDraw(&ImageRetargetingApp::drawMeshWarpingWindow, this);
meshWarpingWindow->connectResize(&ImageRetargetingApp::meshWarpingWindowResize, this);
meshWarpingParams = params::InterfaceGl::create( meshWarpingWindow, "Mesh Warping", toPixels( ci::Vec2i( 200, 400 ) ) );
}
开发者ID:cmorace,项目名称:Salient-Image-Retargeting,代码行数:20,代码来源:ImageRetargetingApp.cpp
示例17: resizeMeshEllipse
void ImageRetargetingApp::resizeMeshEllipse()
{
meshWarpRetargetter->resizeMeshEllipse(meshWarpRetargetter->resizeWidth , meshWarpRetargetter->resizeHeight);
meshWarpingState = MeshWarpingState::ShowMeshWarping;
meshWarpingWindow->setSize(meshWarpRetargetter->resizeWidth , meshWarpRetargetter->resizeHeight);
}
开发者ID:cmorace,项目名称:Salient-Image-Retargeting,代码行数:6,代码来源:ImageRetargetingApp.cpp
示例18: linearResizeResetButtonClick
void ImageRetargetingApp::linearResizeResetButtonClick()
{
linearScaleRec->set(0,0,originalImage.getWidth(),originalImage.getHeight());
linearScaleWindow->setSize(originalImage.getWidth(),originalImage.getHeight());
}
开发者ID:cmorace,项目名称:Salient-Image-Retargeting,代码行数:5,代码来源:ImageRetargetingApp.cpp
示例19: linearResizeButtonClick
void ImageRetargetingApp::linearResizeButtonClick()
{
linearScaleRec->set(0,0,linearScaleWidth,linearScaleHeight);
linearScaleWindow->setSize(linearScaleWidth,linearScaleHeight);
}
开发者ID:cmorace,项目名称:Salient-Image-Retargeting,代码行数:5,代码来源:ImageRetargetingApp.cpp
示例20: linearResizeWindowResize
void ImageRetargetingApp::linearResizeWindowResize()
{
linearScaleWidth = linearScaleWindow->getWidth();
linearScaleHeight = linearScaleWindow->getHeight();
linearScaleRec->set(0,0,linearScaleWidth,linearScaleHeight);
}
开发者ID:cmorace,项目名称:Salient-Image-Retargeting,代码行数:6,代码来源:ImageRetargetingApp.cpp
注:本文中的WindowRef类示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论