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