diff --git a/YACReaderLibrary/YACReaderLibrary.pro b/YACReaderLibrary/YACReaderLibrary.pro index c23cf6db..b0a33ca3 100644 --- a/YACReaderLibrary/YACReaderLibrary.pro +++ b/YACReaderLibrary/YACReaderLibrary.pro @@ -118,7 +118,8 @@ HEADERS += comic_flow.h \ ../common/exit_check.h \ comics_view.h \ classic_comics_view.h \ - empty_folder_widget.h + empty_folder_widget.h \ + no_search_results_widget.h SOURCES += comic_flow.cpp \ @@ -165,7 +166,8 @@ SOURCES += comic_flow.cpp \ ../common/exit_check.cpp \ comics_view.cpp \ classic_comics_view.cpp \ - empty_folder_widget.cpp + empty_folder_widget.cpp \ + no_search_results_widget.cpp diff --git a/YACReaderLibrary/classic_comics_view.cpp b/YACReaderLibrary/classic_comics_view.cpp index d0cb5f13..f241d5ea 100644 --- a/YACReaderLibrary/classic_comics_view.cpp +++ b/YACReaderLibrary/classic_comics_view.cpp @@ -6,7 +6,7 @@ #include "QsLog.h" ClassicComicsView::ClassicComicsView(QWidget *parent) - :ComicsView(parent) + :ComicsView(parent),searching(false) { QHBoxLayout * layout = new QHBoxLayout; @@ -74,7 +74,9 @@ ClassicComicsView::ClassicComicsView(QWidget *parent) #endif if(settings->contains(COMICS_VIEW_FLOW_SPLITTER_STATUS)) - sVertical->restoreState(settings->value(COMICS_VIEW_FLOW_SPLITTER_STATUS).toByteArray()); + sVertical->restoreState(settings->value(COMICS_VIEW_FLOW_SPLITTER_STATUS).toByteArray()); + + setupSearchingIcon(); } void ClassicComicsView::setToolBar(QToolBar *toolBar) @@ -192,6 +194,29 @@ void ClassicComicsView::setViewActions(const QList &actions) comicFlow->addActions(actions); } +void ClassicComicsView::enableFilterMode(bool enabled) +{ + if(enabled) + { + comicFlow->clear(); + comicFlow->setMinimumHeight(150); + if(previousSplitterStatus.isEmpty()) + previousSplitterStatus = sVertical->saveState(); + sVertical->setSizes(QList () << 150 << 10000000); + showSearchingIcon(); + }else + { + searchingIcon->setHidden(true); + comicFlow->setMinimumHeight(0); + + sVertical->restoreState(previousSplitterStatus); + previousSplitterStatus.clear(); + } + + //sVertical->setCollapsible(0,!enabled); + searching = enabled; +} + void ClassicComicsView::selectAll() { tableView->selectAll(); @@ -222,7 +247,8 @@ void ClassicComicsView::saveTableHeadersStatus() void ClassicComicsView::saveSplitterStatus() { - settings->setValue(COMICS_VIEW_FLOW_SPLITTER_STATUS, sVertical->saveState()); + if(!searching) + settings->setValue(COMICS_VIEW_FLOW_SPLITTER_STATUS, sVertical->saveState()); } void ClassicComicsView::applyModelChanges(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles) @@ -250,3 +276,28 @@ void ClassicComicsView::closeEvent(QCloseEvent *event) ComicsView::closeEvent(event); } +void ClassicComicsView::setupSearchingIcon() +{ + searchingIcon = new QWidget(comicFlow); + + QPixmap p(":/images/searching_icon.png"); + QLabel * l = new QLabel(searchingIcon); + l->setPixmap(p); + + searchingIcon->setFixedSize(p.size()); + + hideSearchingIcon(); +} + +void ClassicComicsView::showSearchingIcon() +{ + searchingIcon->move((comicFlow->width()-searchingIcon->width())/2,(comicFlow->height()-searchingIcon->height())/2); + + searchingIcon->setHidden(false); +} + +void ClassicComicsView::hideSearchingIcon() +{ + searchingIcon->setHidden(true); +} + diff --git a/YACReaderLibrary/classic_comics_view.h b/YACReaderLibrary/classic_comics_view.h index 6e3b3bde..a0b9525b 100644 --- a/YACReaderLibrary/classic_comics_view.h +++ b/YACReaderLibrary/classic_comics_view.h @@ -28,6 +28,7 @@ public: void updateConfig(QSettings * settings); void setItemActions(const QList & actions); void setViewActions(const QList & actions); + void enableFilterMode(bool enabled); public slots: void centerComicFlow(const QModelIndex & mi); @@ -47,6 +48,13 @@ private: ComicFlowWidget * comicFlow; QSettings * settings; void closeEvent ( QCloseEvent * event ); + + QByteArray previousSplitterStatus; + QWidget * searchingIcon; + bool searching; + void setupSearchingIcon(); + void showSearchingIcon(); + void hideSearchingIcon(); }; #endif // CLASSIC_COMICS_VIEW_H diff --git a/YACReaderLibrary/comics_view.cpp b/YACReaderLibrary/comics_view.cpp index 5c5e7725..5a1dac7b 100644 --- a/YACReaderLibrary/comics_view.cpp +++ b/YACReaderLibrary/comics_view.cpp @@ -7,5 +7,5 @@ ComicsView::ComicsView(QWidget *parent) : void ComicsView::setModel(TableModel *m) { - model = m; + model = m; } diff --git a/YACReaderLibrary/comics_view.h b/YACReaderLibrary/comics_view.h index 5ae8e485..d4739f02 100644 --- a/YACReaderLibrary/comics_view.h +++ b/YACReaderLibrary/comics_view.h @@ -32,6 +32,7 @@ public: virtual void setItemActions(const QList & actions) = 0; //actions for visual-oriented views virtual void setViewActions(const QList & actions) = 0; + virtual void enableFilterMode(bool enabled) = 0; signals: void selected(unsigned int); diff --git a/YACReaderLibrary/db/tablemodel.cpp b/YACReaderLibrary/db/tablemodel.cpp index ee78b810..0f44ec01 100644 --- a/YACReaderLibrary/db/tablemodel.cpp +++ b/YACReaderLibrary/db/tablemodel.cpp @@ -346,8 +346,7 @@ void TableModel::setupModelData(const QString &filter, const QString &databasePa QSqlDatabase::removeDatabase(_databasePath); endResetModel(); - if(_data.length()==0) - emit isEmpty(); + emit searchNumResults(_data.length()); } QString TableModel::getComicPath(QModelIndex mi) diff --git a/YACReaderLibrary/db/tablemodel.h b/YACReaderLibrary/db/tablemodel.h index 67a60624..3a2b61b8 100644 --- a/YACReaderLibrary/db/tablemodel.h +++ b/YACReaderLibrary/db/tablemodel.h @@ -116,6 +116,7 @@ signals: void beforeReset(); void reset(); void isEmpty(); + void searchNumResults(int); }; //! [0] diff --git a/YACReaderLibrary/grid_comics_view.cpp b/YACReaderLibrary/grid_comics_view.cpp index 257c2d63..0d96586b 100644 --- a/YACReaderLibrary/grid_comics_view.cpp +++ b/YACReaderLibrary/grid_comics_view.cpp @@ -168,6 +168,11 @@ void GridComicsView::setViewActions(const QList &actions) QLOG_ERROR() << "setViewActions invoked with the wrong number of actions"; } +void GridComicsView::enableFilterMode(bool enabled) +{ + +} + void GridComicsView::selectAll() { QLOG_INFO() << "selectAll"; diff --git a/YACReaderLibrary/grid_comics_view.h b/YACReaderLibrary/grid_comics_view.h index 3066ff68..137c9ab7 100644 --- a/YACReaderLibrary/grid_comics_view.h +++ b/YACReaderLibrary/grid_comics_view.h @@ -28,6 +28,7 @@ public: void updateConfig(QSettings * settings); void setItemActions(const QList & actions); void setViewActions(const QList & actions); + void enableFilterMode(bool enabled); QSize sizeHint(); signals: diff --git a/YACReaderLibrary/images.qrc b/YACReaderLibrary/images.qrc index a8b51e9d..356907f6 100644 --- a/YACReaderLibrary/images.qrc +++ b/YACReaderLibrary/images.qrc @@ -110,6 +110,7 @@ ../images/shortcuts_group_page.png ../images/shortcuts_group_reading.png ../images/shortcuts_group_visualization.png + ../images/searching_icon.png diff --git a/YACReaderLibrary/images_osx.qrc b/YACReaderLibrary/images_osx.qrc index e156480b..be86db51 100644 --- a/YACReaderLibrary/images_osx.qrc +++ b/YACReaderLibrary/images_osx.qrc @@ -20,6 +20,7 @@ ../images/flow_to_grid.gif ../images/grid_to_flow.gif ../images/empty_folder.png + ../images/empty_search.png ../images/iconSearch.png ../images/clearSearch.png diff --git a/YACReaderLibrary/images_win.qrc b/YACReaderLibrary/images_win.qrc index a32506a2..b41ecd8d 100644 --- a/YACReaderLibrary/images_win.qrc +++ b/YACReaderLibrary/images_win.qrc @@ -19,6 +19,7 @@ ../images/flow_to_grid.gif ../images/grid_to_flow.gif ../images/empty_folder.png + ../images/empty_search.png ../images/iconSearchNew.png ../images/clearSearchNew.png diff --git a/YACReaderLibrary/library_window.cpp b/YACReaderLibrary/library_window.cpp index 24822546..5eb1c743 100644 --- a/YACReaderLibrary/library_window.cpp +++ b/YACReaderLibrary/library_window.cpp @@ -68,6 +68,8 @@ #include "edit_shortcuts_dialog.h" #include "shortcuts_manager.h" +#include "no_search_results_widget.h" + #include "QsLog.h" #ifdef Q_OS_WIN @@ -175,7 +177,7 @@ void LibraryWindow::doLayout() //FOLDERS FILTER------------------------------------------------------------- //--------------------------------------------------------------------------- - foldersFilter = new YACReaderSearchLineEdit(); + searchEdit = new YACReaderSearchLineEdit(); //SIDEBAR-------------------------------------------------------------------- //--------------------------------------------------------------------------- @@ -214,6 +216,7 @@ void LibraryWindow::doLayout() comicsView->setToolBar(editInfoToolBar); comicsViewStack->addWidget(comicsViewTransition = new ComicsViewTransition()); comicsViewStack->addWidget(emptyFolderWidget = new EmptyFolderWidget()); + comicsViewStack->addWidget(noSearchResultsWidget = new NoSearchResultsWidget()); comicsViewStack->addWidget(comicsView); comicsViewStack->setCurrentWidget(comicsView); @@ -767,7 +770,7 @@ void LibraryWindow::createToolBars() libraryToolBar->helpButton->setDefaultAction(helpAboutAction); libraryToolBar->toggleComicsViewButton->setDefaultAction(toggleComicsViewAction); libraryToolBar->fullscreenButton->setDefaultAction(toggleFullScreenAction); - libraryToolBar->setSearchWidget(foldersFilter); + libraryToolBar->setSearchWidget(searchEdit); #endif editInfoToolBar->setIconSize(QSize(18,18)); @@ -1000,7 +1003,7 @@ void LibraryWindow::createConnections() //Folders filter //connect(clearFoldersFilter,SIGNAL(clicked()),foldersFilter,SLOT(clear())); - connect(foldersFilter,SIGNAL(textChanged(QString)),this,SLOT(setSearchFilter(QString))); + connect(searchEdit,SIGNAL(textChanged(QString)),this,SLOT(setSearchFilter(QString))); //connect(includeComicsCheckBox,SIGNAL(stateChanged(int)),this,SLOT(searchInFiles(int))); //ContextMenus @@ -1029,6 +1032,7 @@ void LibraryWindow::createConnections() connect(comicsViewTransition,SIGNAL(transitionFinished()),this,SLOT(showComicsView())); connect(comicsModel,SIGNAL(isEmpty()),this,SLOT(showEmptyFolderView())); + connect(comicsModel,SIGNAL(searchNumResults(int)),this,SLOT(checkSearchNumResults(int))); connect(emptyFolderWidget,SIGNAL(subfolderSelected(QModelIndex,int)),this,SLOT(selectSubfolder(QModelIndex,int))); connect(showEditShortcutsAction,SIGNAL(triggered()),editShortcutsDialog,SLOT(show())); @@ -1107,7 +1111,7 @@ void LibraryWindow::loadLibrary(const QString & name) //TODO encontrar el bug que provoca que no se carguen adecuadamente las carátulas en root. setRootIndex(); - foldersFilter->clear(); + searchEdit->clear(); } else if(comparation > 0) { @@ -1197,14 +1201,14 @@ void LibraryWindow::loadCovers(const QModelIndex & mi) //cambiado de orden, ya que al llamar a foldersFilter->clear() se invalidan los model index - if(foldersFilter->text()!="") + if(searchEdit->text()!="") { //setFoldersFilter(""); if(mi.isValid()) { index = static_cast(mi.internalPointer())->originalItem; column = mi.column(); - foldersFilter->clear(); + searchEdit->clear(); } } else @@ -1229,6 +1233,16 @@ void LibraryWindow::loadCovers(const QModelIndex & mi) emptyFolderWidget->setSubfolders(mi,foldersModel->getSubfoldersNames(mi)); } +void LibraryWindow::loadCoversFromCurrentModel() +{ + comicsView->setModel(comicsModel); + QStringList paths = comicsModel->getPaths(currentPath()); + + if(paths.size()>0) { + comicsView->setCurrentIndex(comicsModel->index(0,0)); + } +} + void LibraryWindow::selectSubfolder(const QModelIndex &mi, int child) { QModelIndex dest = foldersModel->index(child,0,mi); @@ -1259,6 +1273,13 @@ void LibraryWindow::checkEmptyFolder(QStringList * paths) void LibraryWindow::reloadCovers() { + //comics view switch when filter/search is enabled + if(!searchEdit->text().isEmpty()) + { + loadCoversFromCurrentModel(); + return; + } + if(foldersView->selectionModel()->selectedRows().length()>0) loadCovers(foldersView->currentIndex()); else @@ -1585,6 +1606,7 @@ void LibraryWindow::setSearchFilter(QString filter) if(filter.isEmpty() && foldersModel->isFilterEnabled()) { foldersModel->resetFilter(); + comicsView->enableFilterMode(false); //foldersView->collapseAll(); if(index != 0) { @@ -1603,6 +1625,7 @@ void LibraryWindow::setSearchFilter(QString filter) { foldersModel->setFilter(filter, true);//includeComicsCheckBox->isChecked()); comicsModel->setupModelData(filter, foldersModel->getDatabase()); + comicsView->enableFilterMode(true); foldersView->expandAll(); } } @@ -1720,6 +1743,11 @@ void LibraryWindow::showEmptyFolderView() comicsViewStack->setCurrentWidget(emptyFolderWidget); } +void LibraryWindow::showNoSearchResultsView() +{ + comicsViewStack->setCurrentWidget(noSearchResultsWidget); +} + //TODO recover the current comics selection and restore it in the destination void LibraryWindow::toggleComicsView() { @@ -1730,6 +1758,14 @@ void LibraryWindow::toggleComicsView() toggleComicsView_delayed(); } +void LibraryWindow::checkSearchNumResults(int numResults) +{ + if(numResults == 0) + showNoSearchResultsView(); + else + showComicsView(); +} + void LibraryWindow::asignNumbers() { QModelIndexList indexList = getSelectedComics(); @@ -1888,14 +1924,14 @@ void LibraryWindow::closeEvent ( QCloseEvent * event ) void LibraryWindow::showNoLibrariesWidget() { disableAllActions(); - foldersFilter->setDisabled(true); + searchEdit->setDisabled(true); mainWidget->setCurrentIndex(1); } void LibraryWindow::showRootWidget() { libraryToolBar->setDisabled(false); - foldersFilter->setEnabled(true); + searchEdit->setEnabled(true); mainWidget->setCurrentIndex(0); } @@ -1904,7 +1940,7 @@ void LibraryWindow::showImportingWidget() disableAllActions(); importWidget->clear(); libraryToolBar->setDisabled(true); - foldersFilter->setDisabled(true); + searchEdit->setDisabled(true); mainWidget->setCurrentIndex(2); } diff --git a/YACReaderLibrary/library_window.h b/YACReaderLibrary/library_window.h index 5b744eef..87fd65c4 100644 --- a/YACReaderLibrary/library_window.h +++ b/YACReaderLibrary/library_window.h @@ -54,6 +54,7 @@ class ClassicComicsView; class GridComicsView; class ComicsViewTransition; class EmptyFolderWidget; +class NoSearchResultsWidget; class EditShortcutsDialog; #include "comic_db.h" @@ -90,11 +91,10 @@ private: QSize slideSizeW; QSize slideSizeF; //search filter - YACReaderSearchLineEdit * foldersFilter; + YACReaderSearchLineEdit * searchEdit; TreeItem * index; //index al que hay que hacer scroll despu�s de pulsar sobre un folder filtrado int column; QString previousFilter; - QPushButton * clearFoldersFilter; QCheckBox * includeComicsCheckBox; //------------- @@ -104,6 +104,7 @@ private: QStackedWidget * comicsViewStack; ComicsViewTransition * comicsViewTransition; EmptyFolderWidget * emptyFolderWidget; + NoSearchResultsWidget * noSearchResultsWidget; YACReaderTreeView * foldersView; YACReaderLibraryListWidget * selectedLibrary; @@ -314,7 +315,10 @@ public slots: void toggleComicsView_delayed();//used in orther to avoid flickering; void showComicsView(); void showEmptyFolderView(); + void showNoSearchResultsView(); void toggleComicsView(); + void checkSearchNumResults(int numResults); + void loadCoversFromCurrentModel(); }; #endif diff --git a/YACReaderLibrary/no_search_results_widget.cpp b/YACReaderLibrary/no_search_results_widget.cpp new file mode 100644 index 00000000..f7506a27 --- /dev/null +++ b/YACReaderLibrary/no_search_results_widget.cpp @@ -0,0 +1,40 @@ +#include "no_search_results_widget.h" + +#include +#include +#include + +NoSearchResultsWidget::NoSearchResultsWidget(QWidget *parent) : + QWidget(parent) +{ + QVBoxLayout * layout = new QVBoxLayout; + + iconLabel = new QLabel(); + iconLabel->setPixmap(QPixmap(":/images/empty_search.png")); + iconLabel->setAlignment(Qt::AlignCenter); + + titleLabel = new QLabel("No results"); + titleLabel->setAlignment(Qt::AlignCenter); + titleLabel->setStyleSheet("QLabel {color:#CCCCCC; font-size:24px;font-family:Arial;font-weight:bold;}"); + + layout->addSpacing(100); + layout->addWidget(iconLabel); + layout->addSpacing(30); + layout->addWidget(titleLabel); + layout->addStretch(); + layout->setMargin(0); + layout->setSpacing(0); + + setContentsMargins(0,0,0,0); + + setStyleSheet("QWidget {background:#2A2A2A}"); + + setSizePolicy(QSizePolicy ::Expanding , QSizePolicy ::Expanding ); + setLayout(layout); +} + +void NoSearchResultsWidget::paintEvent(QPaintEvent *) +{ + QPainter painter (this); + painter.fillRect(0,0,width(),height(),QColor("#2A2A2A")); +} diff --git a/YACReaderLibrary/no_search_results_widget.h b/YACReaderLibrary/no_search_results_widget.h new file mode 100644 index 00000000..8bb6969a --- /dev/null +++ b/YACReaderLibrary/no_search_results_widget.h @@ -0,0 +1,25 @@ +#ifndef NO_SEARCH_RESULTS_WIDGET_H +#define NO_SEARCH_RESULTS_WIDGET_H + +#include + +class QLabel; + +class NoSearchResultsWidget : public QWidget +{ + Q_OBJECT +public: + explicit NoSearchResultsWidget(QWidget *parent = 0); + +signals: + +public slots: + +protected: + QLabel * iconLabel; + QLabel * titleLabel; + void paintEvent(QPaintEvent *); + +}; + +#endif // NO_SEARCH_RESULTS_WIDGET_H diff --git a/custom_widgets/yacreader_search_line_edit.cpp b/custom_widgets/yacreader_search_line_edit.cpp index 3826c674..1e0dff22 100644 --- a/custom_widgets/yacreader_search_line_edit.cpp +++ b/custom_widgets/yacreader_search_line_edit.cpp @@ -27,7 +27,7 @@ YACReaderSearchLineEdit::YACReaderSearchLineEdit(QWidget *parent) #ifdef Q_OS_MAC setStyleSheet(QString("QLineEdit {border-top:1px solid #9F9F9F; border-bottom:1px solid #ACACAC; border-right:1px solid #ACACAC; border-left:1px solid #ACACAC; border-radius: 10px; background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #CACACA, stop: 0.15 #FFFFFF); padding-left: %1px; padding-right: %2px; padding-bottom: 1px; margin-bottom: 1px;} ").arg(searchLabel->sizeHint().width() + frameWidth + 6).arg(clearButton->sizeHint().width() + frameWidth + 2)); #else - setStyleSheet(QString("QLineEdit {color: #ABABAB; border:none; border-radius: 5px; background-color:#404040; padding-left: %1px; padding-right: %2px; padding-bottom: 1px; margin-right: 9px;} ").arg(searchLabel->sizeHint().width() + frameWidth + 6 + 5).arg(clearButton->sizeHint().width() + frameWidth + 2)); + setStyleSheet(QString("QLineEdit {color: #ABABAB; border:none; border-radius: 4px; background-color:#404040; padding-left: %1px; padding-right: %2px; padding-bottom: 1px; margin-right: 9px;} ").arg(searchLabel->sizeHint().width() + frameWidth + 6 + 5).arg(clearButton->sizeHint().width() + frameWidth + 2)); #endif QSize msz = minimumSizeHint(); setMinimumSize(qMax(msz.width(), clearButton->sizeHint().height() + frameWidth * 2 + 2), diff --git a/images/empty_search.png b/images/empty_search.png new file mode 100644 index 00000000..f012d8ec Binary files /dev/null and b/images/empty_search.png differ diff --git a/images/searching_icon.png b/images/searching_icon.png new file mode 100644 index 00000000..95355bfc Binary files /dev/null and b/images/searching_icon.png differ