]> git.sur5r.net Git - minitube/blob - src/refinesearchwidget.cpp
Imported Upstream version 1.9
[minitube] / src / refinesearchwidget.cpp
1 #include "refinesearchwidget.h"
2 #include "fontutils.h"
3 #include "searchparams.h"
4 #ifndef Q_WS_X11
5 #include "extra.h"
6 #endif
7
8 RefineSearchWidget::RefineSearchWidget(QWidget *parent) :
9     QWidget(parent) {
10     dirty = false;
11 }
12
13 void RefineSearchWidget::setup() {
14     static bool isSetup = false;
15     if (isSetup) return;
16     isSetup = true;
17
18     static const int spacing = 15;
19     setFont(FontUtils::medium());
20
21     QBoxLayout *layout = new QVBoxLayout(this);
22     layout->setAlignment(Qt::AlignTop | Qt::AlignHCenter);
23     layout->setMargin(spacing*2);
24     layout->setSpacing(spacing);
25
26     QString paramName = "sortBy";
27     setupLabel(tr("Sort by"), layout, paramName);
28     QToolBar *sortBar = setupBar(paramName);
29     QActionGroup* sortGroup = new QActionGroup(this);
30     QStringList sortOptions = QStringList()
31             << tr("Relevance")
32             << tr("Date")
33             << tr("View Count")
34             << tr("Rating");
35     int i = 0;
36     foreach (QString actionName, sortOptions) {
37         QAction *action = new QAction(actionName, sortBar);
38         action->setCheckable(true);
39         action->setFont(FontUtils::medium());
40         action->setProperty("paramValue", i);
41         sortGroup->addAction(action);
42         sortBar->addAction(action);
43         i++;
44     }
45
46     paramName = "time";
47     layout->addSpacing(spacing);
48     setupLabel(tr("Date"), layout, paramName);
49     QToolBar *timeBar = setupBar(paramName);
50     QActionGroup* timeGroup = new QActionGroup(this);
51     QStringList timeSpans = QStringList()
52             << tr("Anytime")
53             << tr("Today")
54             << tr("7 Days")
55             << tr("30 Days");
56     i = 0;
57     foreach (QString actionName, timeSpans) {
58         QAction *action = new QAction(actionName, timeBar);
59         action->setCheckable(true);
60         action->setFont(FontUtils::medium());
61         action->setProperty("paramValue", i);
62         timeGroup->addAction(action);
63         timeBar->addAction(action);
64         i++;
65     }
66
67     paramName = "duration";
68     layout->addSpacing(spacing);
69     setupLabel(tr("Duration"), layout, paramName);
70     QToolBar *lengthBar = setupBar(paramName);
71     QActionGroup* lengthGroup = new QActionGroup(this);
72     QStringList lengthOptions = QStringList()
73             << tr("All")
74             << tr("Short")
75             << tr("Medium")
76             << tr("Long");
77     QStringList tips = QStringList()
78             << ""
79             << tr("Less than 4 minutes")
80             << tr("Between 4 and 20 minutes")
81             << tr("Longer than 20 minutes");
82     i = 0;
83     foreach (QString actionName, lengthOptions) {
84         QAction *action = new QAction(actionName, timeBar);
85         action->setStatusTip(tips.at(i));
86         action->setCheckable(true);
87         action->setFont(FontUtils::medium());
88         action->setProperty("paramValue", i);
89         lengthGroup->addAction(action);
90         lengthBar->addAction(action);
91         i++;
92     }
93
94     paramName = "quality";
95     layout->addSpacing(spacing);
96     setupLabel(tr("Quality"), layout, paramName);
97     QToolBar *qualityBar = setupBar(paramName);
98     QActionGroup* qualityGroup = new QActionGroup(this);
99     QStringList qualityOptions = QStringList()
100             << tr("All")
101             << tr("High Definition");
102     tips = QStringList()
103             << ""
104             << tr("720p or higher");
105     i = 0;
106     foreach (QString actionName, qualityOptions) {
107         QAction *action = new QAction(actionName, timeBar);
108         action->setStatusTip(tips.at(i));
109         action->setCheckable(true);
110         action->setFont(FontUtils::medium());
111         action->setProperty("paramValue", i);
112         qualityGroup->addAction(action);
113         qualityBar->addAction(action);
114         i++;
115     }
116
117     layout->addSpacing(spacing);
118     QPushButton *doneButton = new QPushButton(tr("Done"), this);
119     doneButton->setDefault(true);
120     doneButton->setFont(FontUtils::medium());
121     doneButton->setProperty("custom", true);
122     doneButton->setProperty("important", true);
123     doneButton->setProperty("big", true);
124     connect(doneButton, SIGNAL(clicked()), SLOT(doneClicked()));
125     layout->addWidget(doneButton, 0, Qt::AlignLeft);
126 }
127
128 void RefineSearchWidget::setupLabel(QString text, QBoxLayout *layout, QString paramName) {
129     QBoxLayout* hLayout = new QHBoxLayout();
130     hLayout->setSpacing(8);
131     hLayout->setMargin(0);
132     hLayout->setAlignment(Qt::AlignVCenter);
133
134     QLabel *icon = new QLabel(this);
135     icon->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
136     QString resource = paramName;
137 #ifndef Q_WS_X11
138     resource = Extra::resourceName(resource);
139 #endif
140     QPixmap pixmap = QPixmap(":/images/search-" + resource + ".png");
141     QPixmap translucentPixmap(pixmap.size());
142     translucentPixmap.fill(Qt::transparent);
143     QPainter painter;
144     painter.begin(&translucentPixmap);
145     painter.setOpacity(0.5);
146     painter.drawPixmap(0, 0, pixmap);
147     painter.end();
148     icon->setPixmap(translucentPixmap);
149     hLayout->addWidget(icon);
150
151     QLabel *label = new QLabel(text.toUpper(), this);
152     label->setFont(FontUtils::mediumBold());
153     label->setStyleSheet("color: rgba(0, 0, 0, 128);");
154     hLayout->addWidget(label);
155
156     icon->setMaximumHeight(label->height());
157
158     layout->addLayout(hLayout);
159 }
160
161 QToolBar* RefineSearchWidget::setupBar(QString paramName) {
162     QToolBar* bar = new QToolBar(this);
163     bar->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
164     // bar->setProperty("segmented", true);
165     bar->setFont(FontUtils::medium());
166     bar->setProperty("paramName", paramName);
167     connect(bar, SIGNAL(actionTriggered(QAction*)),
168             SLOT(actionTriggered(QAction*)));
169     bars.insert(paramName, bar);
170     layout()->addWidget(bar);
171     return bar;
172 }
173
174 void RefineSearchWidget::paintEvent(QPaintEvent * /*event*/) {
175 #if defined(APP_MAC) | defined(APP_WIN)
176     QBrush brush;
177     if (window()->isActiveWindow()) {
178         brush = QBrush(QColor(0xdd, 0xe4, 0xeb));
179     } else {
180         brush = palette().window();
181     }
182     QPainter painter(this);
183     painter.fillRect(0, 0, width(), height(), brush);
184 #endif
185 }
186
187 void RefineSearchWidget::actionTriggered(QAction *action) {
188     QToolBar *bar = static_cast<QToolBar *>(sender());
189     if (!bar) {
190         qDebug() << __PRETTY_FUNCTION__ << "Cannot get sender";
191         return;
192     }
193
194     QString paramName = bar->property("paramName").toString();
195     QVariant paramValue = action->property("paramValue");
196
197     qDebug() << "param changed" << paramName << paramValue;
198     emit paramChanged(paramName, paramValue);
199
200     qDebug() << __PRETTY_FUNCTION__;
201     dirty = true;
202 }
203
204 void RefineSearchWidget::setSearchParams(SearchParams *params) {
205     setup();
206
207     QToolBar* bar;
208     QAction* action;
209
210     bar = bars.value("sortBy");
211     action = bar->actions().at(params->sortBy());
212     if (action) action->setChecked(true);
213
214     bar = bars.value("duration");
215     action = bar->actions().at(params->duration());
216     if (action) action->setChecked(true);
217
218     bar = bars.value("time");
219     action = bar->actions().at(params->time());
220     if (action) action->setChecked(true);
221
222     bar = bars.value("quality");
223     action = bar->actions().at(params->quality());
224     if (action) action->setChecked(true);
225
226     connect(this, SIGNAL(paramChanged(QString,QVariant)),
227             params, SLOT(setParam(QString,QVariant)),
228             Qt::UniqueConnection);
229
230     dirty = false;
231 }
232
233 void RefineSearchWidget::doneClicked() {
234     if (dirty) emit searchRefined();
235     emit done();
236 }