Skip to content

Commit

Permalink
docs: fix 'shrcv1' typo in Mastodon docs
Browse files Browse the repository at this point in the history
  • Loading branch information
Bionus committed Sep 7, 2022
1 parent 9f43772 commit d9c87af
Show file tree
Hide file tree
Showing 4 changed files with 494 additions and 1 deletion.
2 changes: 1 addition & 1 deletion docs/_sources/mastodon.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ _Note: getting an user ID on Mastodon is not trivial. You can do it by opening a
You need an OAuth app to login. To do so, you need to have cURL (or equivalent) installed, and run this command:

```
curl -X POST -F "client_name=Grabber" -F "redirect_uris=http://127.0.0.1/" https://pawoo.net/api/shrcv1/apps
curl -X POST -F "client_name=Grabber" -F "redirect_uris=http://127.0.0.1/" https://pawoo.net/api/v1/apps
```

The output will output a `client_id` and `client_secret` that you can use for the OAuth login.
125 changes: 125 additions & 0 deletions src/gui/src/meta-search-window.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
#include "search-window.h"
#include <QCalendarWidget>
#include <QCompleter>
#include <QCryptographicHash>
#include <QFile>
#include <QFileDialog>
#include <QRegularExpression>
#include <QSettings>
#include <ui_search-window.h>
#include "functions.h"
#include "models/profile.h"
#include "ui/text-edit.h"


SearchWindow::SearchWindow(QString tags, Profile *profile, QWidget *parent)
: QDialog(parent), ui(new Ui::SearchWindow), m_profile(profile)
{
setAttribute(Qt::WA_DeleteOnClose);
ui->setupUi(this);

m_calendar = new QCalendarWidget(this);
m_calendar->setWindowFlags(Qt::Window);
m_calendar->setLocale(QLocale(m_profile->getSettings()->value("language", "English").toString().toLower().left(2)));
m_calendar->setWindowIcon(QIcon(":/images/icon.ico"));
m_calendar->setWindowTitle(tr("Choose a date"));
m_calendar->setDateRange(QDate(2000, 1, 1), QDateTime::currentDateTime().date().addDays(1));
m_calendar->setSelectedDate(QDateTime::currentDateTime().date());
connect(m_calendar, &QCalendarWidget::activated, this, &SearchWindow::setDate);
connect(m_calendar, &QCalendarWidget::activated, m_calendar, &QCalendarWidget::close);
connect(ui->buttonCalendar, &QPushButton::clicked, m_calendar, &QCalendarWidget::show);

m_tags = new TextEdit(profile, this);
m_tags->setContextMenuPolicy(Qt::CustomContextMenu);
auto *completer = new QCompleter(profile->getAutoComplete(), m_tags);
completer->setCaseSensitivity(Qt::CaseInsensitive);
completer->setModelSorting(QCompleter::CaseSensitivelySortedModel);
m_tags->setCompleter(completer);
connect(m_tags, &TextEdit::returnPressed, this, &SearchWindow::accept);
ui->formLayout->setWidget(0, QFormLayout::FieldRole, m_tags);

const QStringList orders { "id", "id_desc", "score_asc", "score", "mpixels_asc", "mpixels", "filesize", "landscape", "portrait", "favcount", "rank" };
const QStringList ratings { "rating:general", "-rating:general", "rating:safe", "-rating:safe", "rating:questionable", "-rating:questionable", "rating:explicit", "-rating:explicit" };
const QStringList status { "deleted", "active", "flagged", "pending", "any" };

if (tags.contains("order:")) {
static const QRegularExpression reg("order:([^ ]+)");
auto match = reg.match(tags);
ui->comboOrder->setCurrentIndex(orders.indexOf(match.captured(1)) + 1);
tags.remove(match.captured(0));
}
if (tags.contains("rating:")) {
static const QRegularExpression reg("-?rating:[^ ]+");
auto match = reg.match(tags);
ui->comboRating->setCurrentIndex(ratings.indexOf(match.captured(0)) + 1);
tags.remove(match.captured(0));
}
if (tags.contains("status:")) {
static const QRegularExpression reg("status:([^ ]+)");
auto match = reg.match(tags);
ui->comboStatus->setCurrentIndex(status.indexOf(match.captured(1)) + 1);
tags.remove(match.captured(0));
}
if (tags.contains("date:")) {
static const QRegularExpression reg("date:([^ ]+)");
auto match = reg.match(tags);
m_calendar->setSelectedDate(QDate::fromString(match.captured(1), QStringLiteral("MM/dd/yyyy")));
ui->lineDate->setText(match.captured(1));
tags.remove(match.captured(0));
}

m_tags->setText(tags);
}
SearchWindow::~SearchWindow()
{
delete ui;
}

QString SearchWindow::generateSearch(const QString &additional) const
{
const QStringList orders { "id", "id_desc", "score_asc", "score", "mpixels_asc", "mpixels", "filesize", "landscape", "portrait", "favcount", "rank" };
const QStringList ratings { "rating:general", "-rating:general", "rating:safe", "-rating:safe", "rating:questionable", "-rating:questionable", "rating:explicit", "-rating:explicit" };
const QStringList status = { "deleted", "active", "flagged", "pending", "any" };

QString prefix = !additional.isEmpty() ? additional + " " : QString();
QString search = prefix + m_tags->toPlainText();
if (ui->comboStatus->currentIndex() != 0) {
search += " status:" + status.at(ui->comboStatus->currentIndex() - 1);
}
if (ui->comboOrder->currentIndex() != 0) {
search += " order:" + orders.at(ui->comboOrder->currentIndex() - 1);
}
if (ui->comboRating->currentIndex() != 0) {
search += " " + ratings.at(ui->comboRating->currentIndex() - 1);
}
if (!ui->lineDate->text().isEmpty()) {
search += " date:" + ui->lineDate->text();
}

return search.trimmed();
}

void SearchWindow::setDate(QDate d)
{
ui->lineDate->setText(d.toString(QStringLiteral("MM/dd/yyyy")));
}

void SearchWindow::accept()
{
emit accepted(generateSearch());
QDialog::accept();
}

void SearchWindow::on_buttonImage_clicked()
{
QString path = QFileDialog::getOpenFileName(this, tr("Search an image"), m_profile->getSettings()->value("Save/path").toString(), QStringLiteral("Images (*.png *.gif *.jpg *.jpeg)"));
QFile f(path);
QString md5;
if (f.exists()) {
f.open(QFile::ReadOnly);
md5 = QCryptographicHash::hash(f.readAll(), QCryptographicHash::Md5).toHex();
}

emit accepted(generateSearch(!md5.isEmpty() ? "md5:" + md5 : QString()));
QDialog::accept();
}
44 changes: 44 additions & 0 deletions src/gui/src/meta-search-window.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
#ifndef SEARCH_WINDOW_H
#define SEARCH_WINDOW_H

#include <QDialog>
#include <QString>


namespace Ui
{
class SearchWindow;
}


class Profile;
class QCalendarWidget;
class TextEdit;

class SearchWindow : public QDialog
{
Q_OBJECT

public:
explicit SearchWindow(QString tags, Profile *profile, QWidget *parent = nullptr);
~SearchWindow() override;

private:
QString generateSearch(const QString &additional = "") const;

public slots:
void setDate(QDate d);
void accept() override;
void on_buttonImage_clicked();

signals:
void accepted(const QString &search);

private:
Ui::SearchWindow *ui;
QCalendarWidget *m_calendar;
TextEdit *m_tags;
Profile *m_profile;
};

#endif // SEARCH_WINDOW_H
Loading

0 comments on commit d9c87af

Please sign in to comment.