void BasePage::printSeries(const Dbo::collection<Dbo::ptr<Seria> >& listseries){ WTable *seriaTable = new WTable(); seriaTable->setHeaderCount(1); seriaTable->setStyleClass("tablestyle"); seriaTable->elementAt(0, 0)->addWidget(new WText("<p align='left'> # </p>")); seriaTable->elementAt(0, 1)->addWidget(new WText("<p align='left'> Name of seria </p>")); seriaTable->elementAt(0, 2)->addWidget(new WText("<p align='left'> Number of books </p>")); _pagecontent->addWidget(seriaTable); int row=1; for (Dbo::collection<Dbo::ptr<Seria> >::const_iterator i = listseries.begin(); i != listseries.end(); ++i){ Dbo::ptr<Seria> Seria = *i; seriaTable->setStyleClass("tablestyle th,td,tr"); //headers seriaTable->elementAt(row, 0) ->addWidget(new WText(WString::fromUTF8("{1}") .arg(row))); //genre seriaTable->elementAt(row, 1) ->addWidget(new WText(WString::fromUTF8(Seria.get()->seria))); //num of books in seria seriaTable->elementAt(row, 2) ->addWidget(new WText(WString::fromUTF8("{1}") .arg((Seria.get()->numOfBooks)))); _pagecontent->addWidget(seriaTable); row++; } }
void BasePage::printAuthors(const Dbo::collection<Dbo::ptr<Author> >& listauthors){ WTable *authTable = new WTable(); authTable->setHeaderCount(1); authTable->setStyleClass("tablestyle"); authTable->elementAt(0, 0)->addWidget(new WText("<p align='left'> # </p>")); authTable->elementAt(0, 1)->addWidget(new WText("<p align='left'> Full name or pseudo </p>")); authTable->elementAt(0, 2)->addWidget(new WText("<p align='left'> Years of life </p>")); _pagecontent->addWidget(authTable); int row=1; for (Dbo::collection<Dbo::ptr<Author> >::const_iterator i = listauthors.begin(); i != listauthors.end(); ++i){ Dbo::ptr<Author> Author = *i; authTable->setStyleClass("tablestyle th,td,tr"); //headers authTable->elementAt(row, 0) ->addWidget(new WText(WString::fromUTF8("{1}") .arg(row))); //name authTable->elementAt(row, 1) ->addWidget(new WText(WString::fromUTF8(Author.get()->name))); //authors authTable->elementAt(row, 2) ->addWidget(new WText(WString::fromUTF8("{1}") .arg((Author.get()->years)))); _pagecontent->addWidget(authTable); row++; } }
LatestCommentsDialog::LatestCommentsDialog(Session* session, MediaCollection *mediaCollection, WObject* parent): WDialog{parent} { setResizable(true); setWindowTitle(wtr("menu.latest.comments")); setClosable(true); setTransient(true); setMaximumSize(700, WLength::Auto); Dbo::Transaction t(*session); Dbo::collection<CommentPtr> latestComments = session->find<Comment>().orderBy("last_updated desc").limit(5); if(!latestComments.size()) contents()->addWidget(new WText{wtr("comments.empty")}); for(CommentPtr comment: latestComments) { WContainerWidget* commentWidget = new WContainerWidget; Media media = mediaCollection->media(comment->mediaId()); WContainerWidget *header = WW<WContainerWidget>(); header->setContentAlignment(AlignCenter); WAnchor *videoLink = WW<WAnchor>("", media.title(t)).css("link-hand label label-info comment-box-element"); header->addWidget(videoLink); Dbo::ptr<AuthInfo> authInfo = session->find<AuthInfo>().where("user_id = ?").bind(comment->user().id()); header->addWidget(WW<WText>(WString("{1} ({2})").arg(authInfo->identity("loginname")).arg(comment->lastUpdated().toString())) .css("label label-success comment-box-element")); commentWidget->addWidget(header); videoLink->clicked().connect([=](WMouseEvent){ _mediaClicked.emit(media); accept(); }); commentWidget->addWidget(WW<WText>(WString::fromUTF8(comment->content())).css("well comment-text comment-box-element").setInline(false)); contents()->addWidget(WW<WContainerWidget>().css("comment-text").add(commentWidget)); } }
CommentsContainerWidget::CommentsContainerWidget(string videoId, Session* session, WContainerWidget* parent) : WContainerWidget(parent), d(videoId, session) { string querysql = "select content,last_updated,\ auth_info.email as email,\ auth_identity.identity as identity\ from comment\ inner join auth_info on comment.user_id = auth_info.user_id\ inner join auth_identity on auth_info.id = auth_identity.auth_info_id\ "; wApp->log("notice") << "comments query: " << querysql; auto query = d->session->query<CommentTuple>(querysql); query.where("media_id = ?").bind(videoId); query.where("auth_identity.provider = 'loginname'"); query.orderBy("last_updated DESC"); addWidget(WW<WText>(wtr("comments.label")).css("label").setInline(false)); WTextArea* newCommentContent = new WTextArea(); newCommentContent->setRows(3); newCommentContent->setInline(false); WPushButton* insertComment = WW<WPushButton>(wtr("comments.addcomment.button")).css("btn btn-primary btn-sm").onClick([=](WMouseEvent){ if(newCommentContent->text().empty()) return; Comment *comment = new Comment(videoId, d->session->user(), newCommentContent->text().toUTF8()); Dbo::Transaction t(*d->session); Dbo::ptr< Comment > newComment = d->session->add(comment); t.commit(); newCommentContent->setText(""); commentViewers.commentAdded(videoId, newComment.id()); }); newCommentContent->keyWentUp().connect([=](WKeyEvent){ insertComment->setEnabled(!newCommentContent->text().empty()); }); insertComment->setEnabled(false); // newCommentContent->setWidth(500); newCommentContent->addStyleClass("col-md-8"); addWidget(WW<WContainerWidget>().css("add-comment-box row").add(newCommentContent).add(insertComment).setContentAlignment(AlignCenter)); addWidget(d->commentsContainer = WW<WContainerWidget>().css("container") ); Dbo::Transaction t(*d->session); for(CommentTuple comment : query.resultList()) d->commentsContainer->addWidget(new CommentView(comment) ); auto commentAdded = [=] (string commentVideoId, long commentId) { if(commentVideoId != videoId) return; Dbo::Transaction t(*d->session); auto query = d->session->query<CommentTuple>(querysql).where("comment.id = ?").bind(commentId); query.where("auth_identity.provider = 'loginname'"); d->commentsContainer->insertWidget(0, new CommentView(query.resultValue())); d->commentsContainer->refresh(); wApp->triggerUpdate(); }; commentViewers.addClient(wApp->sessionId(), commentAdded); }
/*void BasePage::addAuthor(){ WContainerWidget *container1 = new WContainerWidget(); Wt::WTemplate *r = new Wt::WTemplate(Wt::WString::tr("addAuthorForm")); WLineEdit *editName = new WLineEdit(container1); editName->setPlaceholderText("name"); r->bindWidget("name", editName); WLineEdit *editYears = new WLineEdit(container1); editYears->setPlaceholderText("years"); r->bindWidget("years", editYears); WPushButton *button = new WPushButton("Add author", container1); button->setMargin(10, Top | Bottom); button->clicked().connect(std::bind([=] () {BookManager am; am.addAuthor("123","2016"); })); r->bindWidget("button", button); _pagecontent->addWidget(r); }*/ void BasePage::addMark(const Dbo::collection<Dbo::ptr<Book> >& listaddmark){ WTable *table = new WTable(); table->setHeaderCount(1); table->setStyleClass("tablestyle"); table->elementAt(0, 0)->addWidget(new WText("<p align='left'> # </p>")); table->elementAt(0, 1)->addWidget(new WText("<p align='left'> Title of book </p>")); table->elementAt(0, 2)->addWidget(new WText("<p align='left'> Author </p>")); table->elementAt(0, 3)->addWidget(new WText("<p align='left'> Genre </p>")); table->elementAt(0, 4)->addWidget(new WText("<p align='left'> Add your mark </p>")); _pagecontent->addWidget(table); int row=1; for (Dbo::collection<Dbo::ptr<Book> >::const_iterator i = listaddmark.begin(); i != listaddmark.end(); ++i){ Dbo::ptr<Book> book = *i; table->setStyleClass("tablestyle th,td,tr"); //headers table->elementAt(row, 0) ->addWidget(new WText(WString::fromUTF8("{1}") .arg(row))); //titles table->elementAt(row, 1) ->addWidget(new WText(WString::fromUTF8("{1}") .arg(book.get()->title))); //authors table->elementAt(row, 2) ->addWidget(new WText(WString::fromUTF8("{1}") .arg((book.get()->author.get()->name)))); //genres table->elementAt(row, 3) ->addWidget(new WText(WString::fromUTF8("{1}") .arg((book.get()->genre.get()->genre)))); //add mark WLineEdit *editAddMark = new WLineEdit(table->elementAt(row,4)); editAddMark->setPlaceholderText("Add mark"); table->elementAt(row, 4) ->addWidget(editAddMark); table->elementAt(row, 4) ->addWidget(new WText("<br></br>")); WPushButton *button = new WPushButton("Add mark", table->elementAt(row,4)); button->setMargin(10, Top | Bottom); table->elementAt(row, 4) ->addWidget(button); /*button->clicked().connect(std::bind([] ( Dbo::ptr<Book> book) { BookManager bm; std::cout<<book.get()->title; int curMark=book.get()->mark; int curNumMarks=book.get()->numMarks; bm.refreshRate(book.get()->id, curMark+5, curNumMarks+1, session); },*i ));*/ row++; _pagecontent->addWidget(table); } }
void BasePage::printTop10( const Dbo::collection<Dbo::ptr<Book> >& top10){ //setContentText("top10"); // # creating table WTable *table = new WTable(); table->setHeaderCount(1); table->setStyleClass("tablestyle"); table->elementAt(0, 0)->addWidget(new WText("<p align='left'> # </p>")); table->elementAt(0, 1)->addWidget(new WText("<p align='left'> Title of book </p>")); table->elementAt(0, 2)->addWidget(new WText("<p align='left'> Author </p>")); table->elementAt(0, 3)->addWidget(new WText("<p align='left'> Genre </p>")); table->elementAt(0, 4)->addWidget(new WText("<p align='left'> Mark </p>")); _pagecontent->addWidget(table); int row=1; for (Dbo::collection<Dbo::ptr<Book> >::const_iterator i = top10.begin(); i != top10.end(); ++i){ Dbo::ptr<Book> Book = *i; table->setStyleClass("tablestyle th,td,tr"); //headers table->elementAt(row, 0) ->addWidget(new WText(WString::fromUTF8("{1}") .arg(row))); //titles table->elementAt(row, 1) ->addWidget(new WText(WString::fromUTF8("{1}") .arg(Book.get()->title))); //authors table->elementAt(row, 2) ->addWidget(new WText(WString::fromUTF8("{1}") .arg((Book.get()->author.get()->name)))); //genres table->elementAt(row, 3) ->addWidget(new WText(WString::fromUTF8("{1}") .arg((Book.get()->genre.get()->genre)))); //marks table->elementAt(row, 4) ->addWidget(new WText(WString::fromUTF8("{1}") .arg((Book.get()->mark)))); _pagecontent->addWidget(table); row++; } }
void BasePage::printGenres(const Dbo::collection<Dbo::ptr<Genre> >& listgenres){ WTable *genreTable = new WTable(); genreTable->setHeaderCount(1); genreTable->setStyleClass("tablestyle"); genreTable->elementAt(0, 0)->addWidget(new WText("<p align='left'> # </p>")); genreTable->elementAt(0, 1)->addWidget(new WText("<p align='left'> Types og genres </p>")); _pagecontent->addWidget(genreTable); int row=1; for (Dbo::collection<Dbo::ptr<Genre> >::const_iterator i = listgenres.begin(); i != listgenres.end(); ++i){ Dbo::ptr<Genre> Genre = *i; genreTable->setStyleClass("tablestyle th,td,tr"); //headers genreTable->elementAt(row, 0) ->addWidget(new WText(WString::fromUTF8("{1}") .arg(row))); //genre genreTable->elementAt(row, 1) ->addWidget(new WText(WString::fromUTF8(Genre.get()->genre))); _pagecontent->addWidget(genreTable); row++; } }
void CalendarCell::update(const dbo::ptr<UserAccount>& user, const WDate& date) { date_ = date; user_ = user; clear(); dbo::Session& session = PlannerApplication::plannerApplication()->session; dbo::Transaction transaction(session); WString day; day += boost::lexical_cast<std::string>(date.day()); if (date.day() == 1) day += " " + WDate::longMonthName(date.month()); WText* header = new WText(day); header->setStyleClass("cell-header"); addWidget(header); typedef dbo::collection< dbo::ptr<Entry> > Entries; Entries entries = user->entriesInRange(date, date.addDays(1)); const unsigned maxEntries = 4; unsigned counter = 0; for (Entries::const_iterator i = entries.begin(); i != entries.end(); ++i, ++counter) { if (counter == maxEntries) { WText* extra = new WText(tr("calendar.cell.extra") .arg((int)(entries.size() - maxEntries))); extra->setStyleClass("cell-extra"); addWidget(extra); extra->clicked().preventPropagation(); extra->clicked().connect(this, &CalendarCell::showAllEntriesDialog); break; } WString format = EntryDialog::timeFormat; addWidget(new WText((*i)->start.toString(format) + "-" + (*i)->stop.toString(format) + ": " + (*i)->summary)); } transaction.commit(); }
void MediaInfoPanel::info( Media &media ) { clear(); WContainerWidget *header = WW<WContainerWidget>().setContentAlignment( AlignCenter ); Dbo::Transaction t( *d->session ); WString title = media.title( t ); header->addWidget( WW<WText>( title ).css( "media-title" ) ); Dbo::ptr<MediaAttachment> previewAttachment = media.preview( t, Media::PreviewPlayer ); if( previewAttachment ) { WLink previewLink = previewAttachment->link( previewAttachment, t, header ); WLink fullImage = previewLink; Dbo::ptr<MediaAttachment> fullImageAttachment = media.preview( t, Media::PreviewFull ); if( fullImageAttachment ) fullImage = fullImageAttachment->link( fullImageAttachment, t, header ); WAnchor *fullImageLink = new WAnchor {fullImage, WW<WImage>(previewLink, title).css("img-responsive img-rounded")}; fullImageLink->setTarget( Wt::AnchorTarget::TargetNewWindow ); header->addWidget( fullImageLink ); } else { auto iconType = ( media.mimetype().find( "video" ) == string::npos ) ? Settings::AudioFile : Settings::VideoFile; WImage *icon = new WImage { d->settings->icon( iconType ) }; header->addWidget( icon ); } auto mediaMediaInfoPanel = d->createPanel( "mediabrowser.information" ); WTable *table = new WTable( mediaMediaInfoPanel.second ); table->setWidth( WLength( 100, WLength::Percentage ) ); d->labelValueBox( "mediabrowser.filename", WString::fromUTF8(media.filename()), table ); d->labelValueBox( "mediabrowser.filesize", Utils::formatFileSize( fs::file_size( media.path() ) ), table ); MediaPropertiesPtr mediaProperties = media.properties( t ); if( mediaProperties ) { d->labelValueBox( "mediabrowser.creation_time", mediaProperties->creationTime().toString(), table ); d->labelValueBox( "mediabrowser.medialength", WTime( 0, 0, 0 ).addSecs( mediaProperties->duration() ).toString(), table ); if( media.mimetype().find( "video" ) != string::npos && mediaProperties->width() > 0 && mediaProperties->height() > 0 ) d->labelValueBox( "mediabrowser.resolution", WString( "{1}x{2}" ).arg( mediaProperties->width() ).arg( mediaProperties->height() ), table ); } Ratings rating = MediaRating::ratingFor( media, t ); if( rating.users > 0 ) { WContainerWidget *avgRatingWidget = new WContainerWidget; for( int i = 1; i <= 5; i++ ) { avgRatingWidget->addWidget( WW<WImage>( Settings::staticPath( "/icons/rating_small.png" ) ).css( rating.ratingAverage < i ? "rating-unrated" : "" ) ); } d->labelValueBox( "mediabrowser.rating", avgRatingWidget, table ); } auto actions = d->createPanel( "mediabrowser.actions" ); actions.second->addWidget( WW<WPushButton>( wtr( "mediabrowser.play" ) ).css( "btn btn-block btn-sm btn-primary" ).onClick( [ = ]( WMouseEvent ) { d->play.emit( media ); } ) ); actions.second->addWidget( WW<WPushButton>( wtr( "mediabrowser.queue" ) ).css( "btn btn-block btn-sm" ).onClick( [ = ]( WMouseEvent ) { d->queue.emit( media ); } ) ); actions.second->addWidget( WW<WPushButton>( wtr( "mediabrowser.share" ) ).css( "btn btn-block btn-sm" ).onClick( [ = ]( WMouseEvent ) { Wt::Dbo::Transaction t( *d->session ); WW<WMessageBox>(wtr( "mediabrowser.share" ), wtr( "mediabrowser.share.dialog" ) .arg( media.title( t ) ) .arg( d->settings->shareLink( media.uid() ).url() ), Wt::Information, Ok) .button(Ok, [=](WMessageBox *msgBox){ msgBox->accept(); }).get()->show(); } ) ); addWidget( WW<WPushButton>( wtr( "button.close.info" ) ).css( "btn btn-primary btn-block hidden-lg hidden-md" ) .onClick( [ = ]( WMouseEvent ) { wasResetted().emit(); } ) ); actions.second->addWidget( WW<WPushButton>( wtr( "player.downloadlink" ) ).css( "btn btn-block btn-sm btn-success" ).onClick( [ = ]( WMouseEvent ) { WDialog *downloadDialog = new WDialog(wtr("player.downloadlink")); downloadDialog->contents()->addWidget(new WText{wtr("player.downloadlink.message").arg(d->settings->linkFor( media.path() , d->session).url()), XHTMLUnsafeText}); downloadDialog->footer()->addWidget(WW<WPushButton>(wtr("button.ok")).css("btn btn-primary").onClick([=](WMouseEvent){ downloadDialog->accept(); })); downloadDialog->show(); } ) ); addWidget( WW<WPushButton>( wtr( "button.close.info" ) ).css( "btn btn-primary btn-block hidden-lg hidden-md" ) .onClick( [ = ]( WMouseEvent ) { wasResetted().emit(); } ) ); addWidget( header ); addWidget( mediaMediaInfoPanel.first ); addWidget( actions.first ); if( d->isAdmin ) { auto adminActions = d->createPanel( "mediabrowser.admin.actions" ); adminActions.first->addStyleClass( "visible-lg visible-md" ); adminActions.first->collapse(); adminActions.second->addWidget( WW<WPushButton>( wtr( "mediabrowser.admin.settitle" ) ).css( "btn btn-block btn-sm btn-primary" ).onClick( [ = ]( WMouseEvent ) { setTitle().emit( media ); } ) ); adminActions.second->addWidget( WW<WPushButton>( wtr( "mediabrowser.admin.setposter" ) ).css( "btn btn-block btn-sm btn-primary" ).onClick( [ = ]( WMouseEvent ) { setPoster().emit( media ); } ) ); adminActions.second->addWidget( WW<WPushButton>( wtr( "mediabrowser.admin.deletepreview" ) ).css( "btn btn-block btn-sm btn-danger" ).onClick( [ = ]( WMouseEvent ) { deletePoster().emit( media ); } ) ); adminActions.second->addWidget( WW<WPushButton>( wtr( "mediabrowser.admin.deleteattachments" ) ).css( "btn btn-block btn-sm btn-danger" ).onClick( [ = ]( WMouseEvent ) { deleteAttachments().emit( media ); } ) ); addWidget( adminActions.first ); } gotInfo().emit(); }
bool operator==(const hCompositeId& other) const { return name==other.name && parent.id()==other.parent.id() ; }