|
a/dirbrowser/dirbrowser.cpp |
|
b/dirbrowser/dirbrowser.cpp |
|
... |
|
... |
120 |
}
|
120 |
}
|
121 |
}
|
121 |
}
|
122 |
}
|
122 |
}
|
123 |
}
|
123 |
}
|
124 |
|
124 |
|
|
|
125 |
|
125 |
void DirBrowser::addTab()
|
126 |
void DirBrowser::addTab()
|
126 |
{
|
127 |
{
|
127 |
QWidget *tab = new QWidget(this);
|
128 |
QWidget *tab = new QWidget(this);
|
128 |
tab->setObjectName(QString::fromUtf8("tab"));
|
129 |
tab->setObjectName(QString::fromUtf8("tab"));
|
129 |
QVBoxLayout* vl = new QVBoxLayout(tab);
|
130 |
QVBoxLayout* vl = new QVBoxLayout(tab);
|
|
... |
|
... |
149 |
QWidget *w = ui->tabs->widget(i);
|
150 |
QWidget *w = ui->tabs->widget(i);
|
150 |
ui->tabs->removeTab(i);
|
151 |
ui->tabs->removeTab(i);
|
151 |
delete w;
|
152 |
delete w;
|
152 |
}
|
153 |
}
|
153 |
|
154 |
|
|
|
155 |
static const QString UPnPSearchCheat(
|
|
|
156 |
"Album/Artist etc.: just enter a value.<br>"
|
|
|
157 |
"UPnP search string example:<br>"
|
|
|
158 |
"upnp:artist contains \"bach\" and "
|
|
|
159 |
"dc:title contains \"allegro\""
|
|
|
160 |
);
|
|
|
161 |
|
154 |
// Adjust the search panel according the the server caps for the
|
162 |
// Adjust the search panel according the the server caps for the
|
155 |
// active tab
|
163 |
// active tab
|
156 |
void DirBrowser::onCurrentTabChanged(int)
|
164 |
void DirBrowser::onCurrentTabChanged(int)
|
157 |
{
|
165 |
{
|
158 |
CDBrowser *cdb = currentBrowser();
|
166 |
CDBrowser *cdb = currentBrowser();
|
159 |
set<string> caps;
|
167 |
set<string> caps;
|
160 |
if (cdb)
|
168 |
if (cdb)
|
161 |
cdb->getSearchCaps(caps);
|
169 |
cdb->getSearchCaps(caps);
|
|
|
170 |
QString strcaps = u8s2qs("<i></i>Server searchable fields: ") +
|
|
|
171 |
u8s2qs(stringsToString(caps));
|
|
|
172 |
|
162 |
while(ui->propsCMB->count())
|
173 |
while(ui->propsCMB->count())
|
163 |
ui->propsCMB->removeItem(0);
|
174 |
ui->propsCMB->removeItem(0);
|
164 |
if (caps.empty()) {
|
175 |
if (caps.empty()) {
|
165 |
ui->serverSearchCB->setCheckState(Qt::Unchecked);
|
176 |
ui->serverSearchCB->setCheckState(Qt::Unchecked);
|
166 |
ui->serverSearchCB->setEnabled(false);
|
177 |
ui->serverSearchCB->setEnabled(false);
|
|
... |
|
... |
179 |
ui->propsCMB->addItem(u8s2qs(it->second),
|
190 |
ui->propsCMB->addItem(u8s2qs(it->second),
|
180 |
QVariant(u8s2qs(it->first)));
|
191 |
QVariant(u8s2qs(it->first)));
|
181 |
}
|
192 |
}
|
182 |
scs += u8s2qs(it->first.c_str()) + " ";
|
193 |
scs += u8s2qs(it->first.c_str()) + " ";
|
183 |
}
|
194 |
}
|
184 |
qDebug() << "Search caps: " << scs;
|
195 |
ui->propsCMB->addItem(tr("UPnP search string"),
|
|
|
196 |
QVariant(u8s2qs("*")));
|
|
|
197 |
ui->propsCMB->setToolTip(strcaps);
|
|
|
198 |
ui->searchCMB->setToolTip(UPnPSearchCheat);
|
185 |
onSearchKindChanged(ui->serverSearchCB->checkState());
|
199 |
onSearchKindChanged(ui->serverSearchCB->checkState());
|
186 |
}
|
200 |
}
|
187 |
}
|
201 |
}
|
188 |
|
202 |
|
189 |
static QString escapeAmpersand(const QString& in)
|
203 |
static QString escapeAmpersand(const QString& in)
|
|
... |
|
... |
273 |
if (!text.isEmpty()) {
|
287 |
if (!text.isEmpty()) {
|
274 |
doSearch(text, false);
|
288 |
doSearch(text, false);
|
275 |
}
|
289 |
}
|
276 |
}
|
290 |
}
|
277 |
}
|
291 |
}
|
|
|
292 |
|
278 |
void DirBrowser::searchNext()
|
293 |
void DirBrowser::searchNext()
|
279 |
{
|
294 |
{
|
280 |
doSearch(ui->searchCMB->currentText(), false);
|
295 |
doSearch(ui->searchCMB->currentText().trimmed(), false);
|
281 |
}
|
296 |
}
|
282 |
|
297 |
|
283 |
void DirBrowser::searchPrev()
|
298 |
void DirBrowser::searchPrev()
|
284 |
{
|
299 |
{
|
285 |
doSearch(ui->searchCMB->currentText(), true);
|
300 |
doSearch(ui->searchCMB->currentText().trimmed(), true);
|
286 |
}
|
301 |
}
|
287 |
|
302 |
|
288 |
void DirBrowser::returnPressedInSearch()
|
303 |
void DirBrowser::returnPressedInSearch()
|
289 |
{
|
304 |
{
|
290 |
if (ui->propsCMB->isEnabled()) {
|
305 |
if (ui->propsCMB->isEnabled()) {
|
|
... |
|
... |
297 |
}
|
312 |
}
|
298 |
}
|
313 |
}
|
299 |
|
314 |
|
300 |
void DirBrowser::serverSearch()
|
315 |
void DirBrowser::serverSearch()
|
301 |
{
|
316 |
{
|
302 |
QString text = ui->searchCMB->lineEdit()->text();
|
317 |
QString text = ui->searchCMB->lineEdit()->text().trimmed();
|
303 |
int i = ui->propsCMB->currentIndex();
|
318 |
int i = ui->propsCMB->currentIndex();
|
304 |
string prop = qs2utf8s(ui->propsCMB->itemData(i).toString());
|
319 |
string prop = qs2utf8s(ui->propsCMB->itemData(i).toString());
|
305 |
if (text != "") {
|
320 |
if (text != "") {
|
306 |
string iss = qs2utf8s(text);
|
321 |
string iss = qs2utf8s(text);
|
|
|
322 |
// prop can be either a field name (e.g. dc:date,
|
|
|
323 |
// upnp:artist), or "*" in which case the user is responsible
|
|
|
324 |
// for entering an appropriate search"
|
307 |
string ss(prop);
|
325 |
string ss;
|
|
|
326 |
if (prop == "*") {
|
|
|
327 |
ss = iss;
|
|
|
328 |
} else {
|
|
|
329 |
ss.assign(prop);
|
308 |
ss += " contains \"";
|
330 |
ss += " contains \"";
|
309 |
for (unsigned i = 0; i < iss.size(); i++) {
|
331 |
for (unsigned i = 0; i < iss.size(); i++) {
|
310 |
if (iss[i] == '"' || iss[i] == '\\')
|
332 |
if (iss[i] == '"' || iss[i] == '\\')
|
311 |
ss += string("\\");
|
333 |
ss += string("\\");
|
312 |
ss += iss[i];
|
334 |
ss += iss[i];
|
|
|
335 |
}
|
|
|
336 |
ss += '"';
|
313 |
}
|
337 |
}
|
314 |
ss += '"';
|
|
|
315 |
CDBrowser *cdb = currentBrowser();
|
338 |
CDBrowser *cdb = currentBrowser();
|
316 |
if (cdb)
|
339 |
if (cdb)
|
317 |
cdb->search(ss);
|
340 |
cdb->search(ss);
|
318 |
}
|
341 |
}
|
319 |
}
|
342 |
}
|