1 /****************************************************************************
2 *   Copyright (C) 2012 by Jens Nissen jens-chessx@gmx.net                   *
3 ****************************************************************************/
4 
5 #include "openingtreewidget.h"
6 #include "ui_openingtreewidget.h"
7 
8 #include <QMetaType>
9 #include <QModelIndex>
10 #include <QToolButton>
11 #include <QUndoGroup>
12 #include <QUndoStack>
13 
14 #include "boardview.h"
15 #include "databaseinfo.h"
16 #include "htmlitemdelegate.h"
17 #include "openingtree.h"
18 #include "settings.h"
19 
20 #if defined(_MSC_VER) && defined(_DEBUG)
21 #define DEBUG_NEW new( _NORMAL_BLOCK, __FILE__, __LINE__ )
22 #define new DEBUG_NEW
23 #endif // _MSC_VER
24 
OpeningTreeWidget(QWidget * parent)25 OpeningTreeWidget::OpeningTreeWidget(QWidget *parent) :
26     QWidget(parent),
27     ui(new Ui::OpeningTreeWidget)
28 {
29     ui->setupUi(this);
30 
31     qRegisterMetaType<QList<MoveData> >("QList<MoveData>");
32 
33     m_openingTree = new OpeningTree(ui->OpeningTreeView);
34 
35     QUndoGroup* undoGroup = new QUndoGroup(this);
36     m_UndoStack = new QUndoStack(undoGroup);
37     m_UndoStack->setUndoLimit(100);
38     undoGroup->addStack(m_UndoStack);
39     undoGroup->setActiveStack(m_UndoStack);
40 
41     connect(ui->btUndo, SIGNAL(clicked()), undoGroup, SLOT(undo()));
42     connect(undoGroup, SIGNAL(canUndoChanged(bool)), ui->btUndo, SLOT(setEnabled(bool)));
43     ui->btUndo->setEnabled(false);
44 
45     ui->OpeningTreeView->setObjectName("OpeningTree");
46     ui->OpeningTreeView->setSortingEnabled(true);
47     ui->OpeningTreeView->setModel(m_openingTree);
48     ui->OpeningTreeView->sortByColumn(1, Qt::DescendingOrder);
49 
50     HTMLItemDelegate* htmlItemDelegate = new HTMLItemDelegate(this);
51     ui->OpeningTreeView->setItemDelegate(htmlItemDelegate);
52 
53     connect(ui->OpeningTreeView, SIGNAL(clicked(const QModelIndex&)), parent, SLOT(slotSearchTreeMove(const QModelIndex&)));
54     connect(m_openingTree, SIGNAL(progress(int)), this, SLOT(slotOperationProgress(int)));
55     connect(m_openingTree, SIGNAL(openingTreeUpdated()), this, SLOT(slotTreeUpdate()));
56     connect(m_openingTree, SIGNAL(openingTreeUpdateStarted()), this, SLOT(slotTreeUpdateStarted()));
57     connect(m_openingTree, SIGNAL(requestGameFilterUpdate(int,int)), SIGNAL(requestGameFilterUpdate(int,int)));
58     connect(ui->sourceSelector, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSourceChanged(int)));
59     connect(ui->filterGames, SIGNAL(clicked(bool)), this, SLOT(slotFilterClicked(bool)));
60     m_openingBoardView = new BoardView(this, BoardView::IgnoreSideToMove | BoardView::SuppressGuessMove);
61     m_openingBoardView->setObjectName("OpeningBoardView");
62     m_openingBoardView->setMinimumSize(200, 200);
63     ui->OpeningBoardWidget->addWidget(m_openingBoardView, 1);
64     m_openingBoardView->configure();
65     m_openingBoardView->setEnabled(false);
66 }
67 
~OpeningTreeWidget()68 OpeningTreeWidget::~OpeningTreeWidget()
69 {
70     delete ui;
71 }
72 
cancel()73 void OpeningTreeWidget::cancel()
74 {
75     m_openingTree->cancel();
76 }
77 
move(QModelIndex index) const78 QString OpeningTreeWidget::move(QModelIndex index) const
79 {
80     return m_openingTree->move(index);
81 }
82 
board() const83 BoardX OpeningTreeWidget::board() const
84 {
85     return m_openingTree->board();
86 }
87 
updateFilter(FilterX & f,const BoardX & b,bool bEnd)88 void OpeningTreeWidget::updateFilter(FilterX& f, const BoardX& b, bool bEnd)
89 {
90     if (ui->btPin->isChecked()) return;
91 
92     if (m_openingTree->board() != b)
93     {
94         m_UndoStack->push(new BoardUndoCommand(this,&f,m_openingTree->board(),m_openingTree->bEnd(),""));
95     }
96     doSetBoard(f,b,bEnd);
97 }
98 
filterGames() const99 bool OpeningTreeWidget::filterGames() const
100 {
101     return ui->filterGames->isEnabled() && ui->filterGames->isChecked();
102 }
103 
doSetBoard(FilterX & f,const BoardX & b,bool bEnd)104 void OpeningTreeWidget::doSetBoard(FilterX& f, const BoardX& b, bool bEnd)
105 {
106     m_openingBoardView->setBoard(b);
107     m_openingTree->updateFilter(f, b, filterGames(), ui->sourceSelector->currentIndex()==1, bEnd);
108 }
109 
saveConfig()110 void OpeningTreeWidget::saveConfig()
111 {
112     AppSettings->setLayout(this);
113     ui->OpeningTreeView->saveConfig();
114     AppSettings->beginGroup(objectName());
115     AppSettings->setValue("LastBook", ui->sourceSelector->currentText());
116     AppSettings->endGroup();
117 }
118 
slotReconfigure()119 void OpeningTreeWidget::slotReconfigure()
120 {
121     m_openingBoardView->configure();
122     AppSettings->layout(this);
123     ui->OpeningTreeView->slotReconfigure();
124 }
125 
slotOperationProgress(int value)126 void OpeningTreeWidget::slotOperationProgress(int value)
127 {
128     ui->progress->setValue(value);
129 }
130 
slotTreeUpdate()131 void OpeningTreeWidget::slotTreeUpdate()
132 {
133     ui->progress->setValue(100);
134     if (filterGames())
135     {
136         bool dbIsFilterSource = (ui->sourceSelector->currentIndex()<=1);
137         emit signalTreeUpdated(dbIsFilterSource);
138     }
139 }
140 
slotTreeUpdateStarted()141 void OpeningTreeWidget::slotTreeUpdateStarted()
142 {
143     ui->progress->setValue(0);
144 }
145 
getFilterIndex(QString & name) const146 int OpeningTreeWidget::getFilterIndex(QString& name) const
147 {
148     int index = ui->sourceSelector->currentIndex();
149     if (index>1)
150         name = m_filePaths[ui->sourceSelector->currentIndex()-2];
151     else
152         name = ui->sourceSelector->currentText();
153     return index;
154 }
155 
updateFilterIndex(QStringList files)156 void OpeningTreeWidget::updateFilterIndex(QStringList files)
157 {
158     m_filePaths.clear();
159     m_filePaths = files;
160     disconnect(ui->sourceSelector, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSourceChanged(int)));
161     QString current = ui->sourceSelector->currentText();
162     ui->sourceSelector->clear();
163     QStringList baseNames;
164     foreach(QString filename, files)
165     {
166         QFileInfo fi(filename);
167         QString baseName = fi.baseName();
168         if (DatabaseInfo::IsBook(filename))
169         {
170             baseName += tr(" (Book)");
171         }
172         baseNames.append(baseName);
173     }
174 
175     QStringList allFiles;
176     allFiles << tr("Database") << tr("Filter") << baseNames;
177     ui->sourceSelector->insertItems(0, allFiles);
178     if (allFiles.contains(current))
179     {
180         int index = ui->sourceSelector->findText(current);
181         ui->sourceSelector->setCurrentIndex(index);
182     }
183     else
184     {
185         ui->sourceSelector->setCurrentIndex(0);
186     }
187     connect(ui->sourceSelector, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSourceChanged(int)));
188 }
189 
restoreBook()190 void OpeningTreeWidget::restoreBook()
191 {
192     AppSettings->beginGroup(objectName());
193     QString lastBook = AppSettings->value("LastBook", "").toString();
194     AppSettings->endGroup();
195     int index = ui->sourceSelector->findText(lastBook);
196     if (index >= 0)
197     {
198         ui->sourceSelector->setCurrentIndex(index);
199     }
200 }
201 
shouldAddMove() const202 bool OpeningTreeWidget::shouldAddMove() const
203 {
204     return ui->makeMove->isChecked();
205 }
206 
slotFilterClicked(bool checked)207 void OpeningTreeWidget::slotFilterClicked(bool checked)
208 {
209     if (checked)
210     {
211         emit signalSourceChanged();
212     }
213     else
214     {
215         m_openingTree->cancel();
216     }
217 }
218 
slotSourceChanged(int index)219 void OpeningTreeWidget::slotSourceChanged(int index)
220 {
221     m_UndoStack->clear();
222     m_openingTree->cancel();
223     if (index >= 0)
224     {
225         ui->filterGames->setEnabled(index<=1);
226     }
227     emit signalSourceChanged();
228 }
229