blob: 067c865e9b4da63bbfea3de0f721f423e2b044b7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
/*
* Copyright (C) 2009-2012 Geometer Plus <contact@geometerplus.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*/
#include <queue>
#include <ZLResource.h>
#include "LibraryView.h"
#include "LibraryNodes.h"
#include "../library/Library.h"
#include "../library/Book.h"
#include "../options/FBOptions.h"
LibraryView::LibraryView(ZLPaintContext &context) : ZLBlockTreeView(context), myCollectionRevision(0) {
}
void LibraryView::paint() {
const std::size_t revision = Library::Instance().revision();
if (myCollectionRevision < revision) {
myCollectionRevision = revision;
makeUpToDate();
}
ZLBlockTreeView::paint();
}
const std::string &LibraryView::caption() const {
return ZLResource::resource("library")["caption"].value();
}
ZLColor LibraryView::backgroundColor() const {
return FBOptions::Instance().BackgroundColorOption.value();
}
void LibraryView::showBook(shared_ptr<Book> book) {
makeUpToDate();
ZLBlockTreeNode::List bookNodes;
std::queue<ZLBlockTreeNode*> nodesQueue;
nodesQueue.push(&rootNode());
while (!nodesQueue.empty()) {
const ZLBlockTreeNode::List &children = nodesQueue.front()->children();
nodesQueue.pop();
for (ZLBlockTreeNode::List::const_iterator it = children.begin(); it != children.end(); ++it) {
if ((*it)->isInstanceOf(BookNode::TYPE_ID)) {
// TODO: replace with == for shared_ptr<Book>
//if (((BookNode*)*it)->book() == book) {
if (((BookNode*)*it)->book()->file() == book->file()) {
bookNodes.push_back(*it);
}
} else {
nodesQueue.push(*it);
}
}
}
if (bookNodes.empty()) {
return;
}
ZLBlockTreeNode *nodeToShow = bookNodes[0];
VisibilityMode mode = INVISIBLE;
for (ZLBlockTreeNode::List::iterator it = bookNodes.begin(); it != bookNodes.end(); ++it) {
VisibilityMode nodeMode = visibilityMode(*it);
if ((nodeMode == VISIBLE && mode != VISIBLE) ||
(nodeMode != INVISIBLE && mode == INVISIBLE)) {
nodeToShow = *it;
mode = nodeMode;
}
}
ensureVisible(nodeToShow);
}
|