1 |
schoenebeck |
2624 |
/* |
2 |
|
|
Copyright (c) 2014 Christian Schoenebeck |
3 |
|
|
|
4 |
|
|
This file is part of "gigedit" and released under the terms of the |
5 |
|
|
GNU General Public License version 2. |
6 |
|
|
*/ |
7 |
|
|
|
8 |
|
|
#include "ReferencesView.h" |
9 |
|
|
#include "global.h" |
10 |
|
|
#include "compat.h" |
11 |
|
|
|
12 |
|
|
Glib::ustring gig_to_utf8(const gig::String& gig_string); |
13 |
|
|
Glib::ustring note_str(int note); |
14 |
|
|
|
15 |
|
|
ReferencesView::ReferencesView(Gtk::Window& parent) : |
16 |
|
|
Gtk::Dialog("", parent, true), m_sample(NULL), |
17 |
|
|
m_closeButton(Gtk::Stock::CLOSE), m_descriptionLabel() |
18 |
|
|
{ |
19 |
|
|
set_title("Nothing selected"); |
20 |
|
|
|
21 |
|
|
m_scrolledWindow.add(m_treeView); |
22 |
|
|
m_scrolledWindow.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); |
23 |
|
|
|
24 |
|
|
get_vbox()->pack_start(m_descriptionLabel, Gtk::PACK_SHRINK); |
25 |
|
|
get_vbox()->pack_start(m_scrolledWindow); |
26 |
|
|
get_vbox()->pack_start(m_summaryLabel, Gtk::PACK_SHRINK); |
27 |
|
|
get_vbox()->pack_start(m_buttonBox, Gtk::PACK_SHRINK); |
28 |
|
|
|
29 |
|
|
#if GTKMM_MAJOR_VERSION >= 3 |
30 |
|
|
m_descriptionLabel.set_line_wrap(); |
31 |
|
|
#endif |
32 |
|
|
m_descriptionLabel.set_text(_( |
33 |
|
|
"Selected sample is referenced by the following instruments and their " |
34 |
|
|
"respective regions:" |
35 |
|
|
)); |
36 |
|
|
|
37 |
|
|
m_refTreeModel = RefsTreeStore::create(m_columns); |
38 |
|
|
m_treeView.set_model(m_refTreeModel); |
39 |
|
|
m_treeView.set_tooltip_text(_( |
40 |
|
|
"Amount of times the selected sample in question is referenced." |
41 |
|
|
)); |
42 |
|
|
m_treeView.append_column(_("Name"), m_columns.m_col_name); |
43 |
|
|
m_treeView.append_column(_("References"), m_columns.m_col_refcount); |
44 |
|
|
m_treeView.set_headers_visible(true); |
45 |
|
|
//m_treeView.get_selection()->set_mode(Gtk::SELECTION_MULTIPLE); |
46 |
|
|
//m_treeView.get_selection()->signal_changed().connect( |
47 |
|
|
// sigc::mem_fun(*this, &ReferencesView::onSelectionChanged) |
48 |
|
|
//); |
49 |
|
|
|
50 |
|
|
m_buttonBox.set_layout(Gtk::BUTTONBOX_END); |
51 |
|
|
m_buttonBox.set_border_width(5); |
52 |
|
|
m_buttonBox.pack_start(m_closeButton, Gtk::PACK_SHRINK); |
53 |
|
|
|
54 |
|
|
m_closeButton.signal_clicked().connect( |
55 |
|
|
sigc::mem_fun(*this, &ReferencesView::hide) |
56 |
|
|
); |
57 |
|
|
|
58 |
|
|
show_all_children(); |
59 |
|
|
} |
60 |
|
|
|
61 |
|
|
void ReferencesView::setSample(gig::Sample* sample) { |
62 |
|
|
m_refTreeModel->clear(); |
63 |
|
|
|
64 |
|
|
m_sample = sample; |
65 |
|
|
if (!sample) { |
66 |
|
|
set_title("Nothing selected"); |
67 |
|
|
m_summaryLabel.set_text(""); |
68 |
|
|
return; |
69 |
|
|
} |
70 |
|
|
|
71 |
|
|
set_title(_("References of Sample \"") + sample->pInfo->Name + "\""); |
72 |
|
|
|
73 |
|
|
int filesRefCount = 0; |
74 |
|
|
|
75 |
|
|
gig::File* gig = (gig::File*) sample->GetParent(); |
76 |
|
|
|
77 |
|
|
for (gig::Instrument* instrument = gig->GetFirstInstrument(); instrument; |
78 |
|
|
instrument = gig->GetNextInstrument()) |
79 |
|
|
{ |
80 |
|
|
Gtk::TreeModel::iterator iterInstr = m_refTreeModel->append(); |
81 |
|
|
Gtk::TreeModel::Row rowInstr = *iterInstr; |
82 |
|
|
rowInstr[m_columns.m_col_name] = gig_to_utf8(instrument->pInfo->Name); |
83 |
|
|
rowInstr[m_columns.m_col_instr] = instrument; |
84 |
|
|
rowInstr[m_columns.m_col_region] = NULL; |
85 |
|
|
|
86 |
|
|
int instrumentsRefcount = 0; |
87 |
|
|
for (gig::Region* rgn = instrument->GetFirstRegion(); rgn; |
88 |
|
|
rgn = instrument->GetNextRegion()) |
89 |
|
|
{ |
90 |
|
|
int regionsRefCount = 0; |
91 |
|
|
|
92 |
|
|
for (int i = 0; i < 256; ++i) { |
93 |
|
|
if (!rgn->pDimensionRegions[i]) continue; |
94 |
|
|
if (rgn->pDimensionRegions[i]->pSample != sample) continue; |
95 |
|
|
regionsRefCount++; |
96 |
|
|
} |
97 |
|
|
if (!regionsRefCount) continue; |
98 |
|
|
|
99 |
|
|
instrumentsRefcount += regionsRefCount; |
100 |
|
|
|
101 |
|
|
Gtk::TreeModel::iterator iterRegion = m_refTreeModel->append(rowInstr.children()); |
102 |
|
|
Gtk::TreeModel::Row rowRegion = *iterRegion; |
103 |
|
|
rowRegion[m_columns.m_col_name] = |
104 |
|
|
_("Region from ") + note_str(rgn->KeyRange.low) + _(" to ") + note_str(rgn->KeyRange.high); |
105 |
|
|
rowRegion[m_columns.m_col_instr] = NULL; |
106 |
|
|
rowRegion[m_columns.m_col_region] = rgn; |
107 |
|
|
rowRegion[m_columns.m_col_refcount] = |
108 |
|
|
ToString(regionsRefCount) + " " + _("Refs."); |
109 |
|
|
} |
110 |
|
|
|
111 |
|
|
if (!instrumentsRefcount) { |
112 |
|
|
m_refTreeModel->erase(iterInstr); |
113 |
|
|
continue; |
114 |
|
|
} |
115 |
|
|
|
116 |
|
|
rowInstr[m_columns.m_col_refcount] = |
117 |
|
|
ToString(instrumentsRefcount) + " " + _("Refs."); |
118 |
|
|
|
119 |
|
|
filesRefCount += instrumentsRefcount; |
120 |
|
|
} |
121 |
|
|
|
122 |
|
|
if (filesRefCount) |
123 |
|
|
m_summaryLabel.set_text(_("Total References: ") + ToString(filesRefCount)); |
124 |
|
|
else |
125 |
|
|
m_summaryLabel.set_text(_("This sample is not referenced at all.")); |
126 |
|
|
|
127 |
|
|
// unfold all instruments by default |
128 |
|
|
m_treeView.expand_all(); |
129 |
|
|
} |