1 #include "searchComboBox.h"
2 #include "musescore.h"
3 #include "scoreview.h"
4 #include "libmscore/score.h"
5 #include "scoreaccessibility.h"
6 
7 namespace Ms {
8 
SearchComboBox(QWidget * p)9 SearchComboBox::SearchComboBox(QWidget* p) : QComboBox(p)
10       {
11       setAccessibleName(tr("Search Box"));
12       setAccessibleDescription(tr("Type to search. Press Enter to return to score."));
13       setEditable(true);
14       setInsertPolicy(QComboBox::InsertAtTop);
15       _found = false;
16       _searchType = SearchType::NO_SEARCH;
17       connect(this, SIGNAL(editTextChanged(QString)), this, SLOT(searchTextChanged(QString)));
18       }
19 
searchInit()20 void SearchComboBox::searchInit()
21       {
22       _searchType = SearchType::NO_SEARCH;
23       _found = false;
24       }
25 
setSearchType(SearchType s)26 void SearchComboBox::setSearchType(SearchType s)
27       {
28       _searchType = s;
29       }
30 
searchTextChanged(const QString & s)31 void SearchComboBox::searchTextChanged(const QString& s)
32       {
33       searchInit();
34       if (s.isEmpty())
35             return;
36       ScoreView* cv = mscore->currentScoreView();
37       if (cv == 0)
38             return;
39 
40       bool ok;
41 
42       int n = s.toInt(&ok);
43       if (ok && n > 0) {
44             setSearchType(SearchType::SEARCH_MEASURE);
45             _found = cv->searchMeasure(n);
46             }
47       else {
48             if (s.size() >= 2 && s[0].toLower() == 'p' && s[1].isNumber()) {
49                   n = s.midRef(1).toInt(&ok);
50                   if (ok) {
51                         setSearchType(SearchType::SEARCH_PAGE);
52                         _found = cv->searchPage(n);
53                         }
54                   }
55 
56             if (searchType() != SearchType::SEARCH_PAGE) {
57                   setSearchType(SearchType::SEARCH_REHEARSAL_MARK);
58                   if (s.size() >= 2 && s[0].toLower() == 'r' && s[1].isNumber())
59                         _found = cv->searchRehearsalMark(s.mid(1));
60                   else
61                         _found = cv->searchRehearsalMark(s);
62                   }
63             }
64       //updating status bar
65       ScoreAccessibility::instance()->updateAccessibilityInfo();
66       emit currentSearchFinished();
67       }
68 
AccessibleSearchBox(SearchComboBox * comboBox)69 AccessibleSearchBox::AccessibleSearchBox(SearchComboBox *comboBox) : QAccessibleWidget(comboBox)
70       {
71       searchBox = comboBox;
72       }
73 
SearchBoxFactory(const QString & classname,QObject * object)74 QAccessibleInterface* AccessibleSearchBox::SearchBoxFactory(const QString &classname, QObject *object)
75       {
76           QAccessibleInterface *iface = 0;
77           if (classname == QLatin1String("Ms::SearchComboBox") && object && object->isWidgetType()){
78                 qDebug("Creating interface for SearchComboBox object");
79                 SearchComboBox* s = static_cast<SearchComboBox*>(object);
80                 AccessibleSearchBox* a = new AccessibleSearchBox(s);
81                 QObject::connect(s, SIGNAL(currentSearchFinished()), a, SLOT(searchFinished()));
82                 iface = static_cast<QAccessibleInterface*>(a);
83                 }
84 
85           return iface;
86       }
87 
text(QAccessible::Text t) const88 QString AccessibleSearchBox::text(QAccessible::Text t) const
89       {
90       QString type;
91       QString value = searchBox->currentText();
92       if (t == QAccessible::Value) {
93             switch (searchBox->searchType()) {
94                   case SearchComboBox::SearchType::NO_SEARCH:
95                         return QString();
96                   case SearchComboBox::SearchType::SEARCH_MEASURE:
97                         type = tr("Measure");
98                         break;
99                   case SearchComboBox::SearchType::SEARCH_PAGE:
100                         type = tr("Page");
101                         value = value.mid(1);
102                         break;
103                   case SearchComboBox::SearchType::SEARCH_REHEARSAL_MARK:
104                         type = tr("Rehearsal Mark");
105                         break;
106                   }
107             QString found = searchBox->found() ? "" : tr("Not found") + " ";
108             return QString("%1 %2 %3%4").arg(type, value, found, mscore->currentScoreView()->score()->accessibleInfo());
109             }
110 
111       return QAccessibleWidget::text(t);
112       }
113 
searchFinished()114 void AccessibleSearchBox::searchFinished()
115       {
116       QAccessibleValueChangeEvent ev(searchBox, text(QAccessible::Value));
117       QAccessible::updateAccessibility(&ev);
118       }
119 
120 }
121