Wt examples 3.1.10
|
00001 /* 00002 * Copyright (C) 2008 Emweb bvba, Heverlee, Belgium. 00003 * 00004 * See the LICENSE file for terms of use. 00005 */ 00006 00007 #include <iostream> 00008 #include <stdlib.h> 00009 00010 #include <Wt/WApplication> 00011 #include <Wt/WContainerWidget> 00012 #include <Wt/WEnvironment> 00013 #include <Wt/WLineEdit> 00014 #include <Wt/WGridLayout> 00015 #include <Wt/WHBoxLayout> 00016 #include <Wt/WPushButton> 00017 #include <Wt/WTable> 00018 #include <Wt/WText> 00019 #include <Wt/WTreeView> 00020 #include <Wt/WVBoxLayout> 00021 #include <Wt/WViewWidget> 00022 00023 #include "GitModel.h" 00024 #include "../wt-homepage/SourceView.h" 00025 00026 using namespace Wt; 00027 00032 00039 class GitViewApplication : public WApplication 00040 { 00041 public: 00044 GitViewApplication(const WEnvironment& env) 00045 : WApplication(env) 00046 { 00047 useStyleSheet("gitview.css"); 00048 setTitle("Git model example"); 00049 00050 const char *gitRepo = getenv("GITVIEW_REPOSITORY_PATH"); 00051 00052 WGridLayout *grid = new WGridLayout(); 00053 grid->addWidget(new WText("Git repository path:"), 0, 0); 00054 grid->addWidget(repositoryEdit_ = new WLineEdit(gitRepo ? gitRepo : "") 00055 , 0, 1, AlignLeft); 00056 grid->addWidget(repositoryError_ = new WText(), 0, 2); 00057 grid->addWidget(new WText("Revision:"), 1, 0); 00058 grid->addWidget(revisionEdit_ = new WLineEdit("master"), 1, 1, AlignLeft); 00059 grid->addWidget(revisionError_ = new WText(), 1, 2); 00060 00061 repositoryEdit_->setTextSize(30); 00062 revisionEdit_->setTextSize(20); 00063 repositoryError_->setStyleClass("error-msg"); 00064 revisionError_->setStyleClass("error-msg"); 00065 00066 repositoryEdit_->enterPressed() 00067 .connect(this, &GitViewApplication::loadGitModel); 00068 revisionEdit_->enterPressed() 00069 .connect(this, &GitViewApplication::loadGitModel); 00070 00071 WPushButton *b = new WPushButton("Load"); 00072 b->clicked().connect(this, &GitViewApplication::loadGitModel); 00073 grid->addWidget(b, 2, 0, AlignLeft); 00074 00075 gitView_ = new WTreeView(); 00076 gitView_->resize(300, WLength::Auto); 00077 gitView_->setSortingEnabled(false); 00078 gitView_->setModel(gitModel_ = new GitModel(this)); 00079 gitView_->setSelectionMode(SingleSelection); 00080 gitView_->selectionChanged().connect(this, &GitViewApplication::showFile); 00081 00082 sourceView_ = new SourceView(DisplayRole, 00083 GitModel::ContentsRole, 00084 GitModel::FilePathRole); 00085 sourceView_->setStyleClass("source-view"); 00086 00087 if (environment().javaScript()) { 00088 /* 00089 * We have JavaScript: We can use layout managers so everything will 00090 * always fit nicely in the window. 00091 */ 00092 WVBoxLayout *topLayout = new WVBoxLayout(); 00093 topLayout->addLayout(grid, 0, AlignTop | AlignLeft); 00094 00095 WHBoxLayout *gitLayout = new WHBoxLayout(); 00096 gitLayout->setLayoutHint("table-layout", "fixed"); 00097 gitLayout->addWidget(gitView_, 0); 00098 gitLayout->addWidget(sourceView_, 1); 00099 topLayout->addLayout(gitLayout, 1); 00100 00101 root()->setLayout(topLayout); 00102 root()->setStyleClass("maindiv"); 00103 } else { 00104 /* 00105 * No JavaScript: let's make the best of the situation using regular 00106 * CSS-based layout 00107 */ 00108 root()->setStyleClass("maindiv"); 00109 WContainerWidget *top = new WContainerWidget(); 00110 top->setLayout(grid, AlignTop | AlignLeft); 00111 root()->addWidget(top); 00112 root()->addWidget(gitView_); 00113 gitView_->setFloatSide(Left); 00114 gitView_->setMargin(6); 00115 root()->addWidget(sourceView_); 00116 sourceView_->setMargin(6); 00117 } 00118 } 00119 00120 private: 00121 WLineEdit *repositoryEdit_, *revisionEdit_; 00122 WText *repositoryError_, *revisionError_; 00123 GitModel *gitModel_; 00124 WTreeView *gitView_; 00125 SourceView *sourceView_; 00126 00129 void loadGitModel() { 00130 sourceView_->setIndex(WModelIndex()); 00131 repositoryError_->setText(""); 00132 revisionError_->setText(""); 00133 try { 00134 gitModel_->setRepositoryPath(repositoryEdit_->text().toUTF8()); 00135 try { 00136 gitModel_->loadRevision(revisionEdit_->text().toUTF8()); 00137 } catch (const Git::Exception& e) { 00138 revisionError_->setText(e.what()); 00139 } 00140 } catch (const Git::Exception& e) { 00141 repositoryError_->setText(e.what()); 00142 } 00143 } 00144 00147 void showFile() { 00148 if (gitView_->selectedIndexes().empty()) 00149 return; 00150 00151 WModelIndex selected = *gitView_->selectedIndexes().begin(); 00152 sourceView_->setIndex(selected); 00153 } 00154 }; 00155 00156 WApplication *createApplication(const WEnvironment& env) 00157 { 00158 return new GitViewApplication(env); 00159 } 00160 00161 int main(int argc, char **argv) 00162 { 00163 return WRun(argc, argv, &createApplication); 00164 } 00165