aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix (xq) Queißner <git@mq32.de>2020-06-29 22:03:56 +0200
committerFelix (xq) Queißner <git@mq32.de>2020-06-29 22:03:56 +0200
commitb65fac29aeaceb6bf8bf9df7a852cdd4a8b651c8 (patch)
tree60a9a12cad1b2a5a213ca511fa30938e24c7769a
parent8e910f26a28b1b1beae363e6c19f39224f74e2e8 (diff)
downloadkristall-b65fac29aeaceb6bf8bf9df7a852cdd4a8b651c8.tar.gz
Adds basic editing for favourite groups
-rw-r--r--ROADMAP.md4
-rw-r--r--src/favouritecollection.cpp39
-rw-r--r--src/favouritecollection.hpp4
-rw-r--r--src/main.cpp5
-rw-r--r--src/mainwindow.cpp34
-rw-r--r--src/mainwindow.hpp2
-rw-r--r--src/protocols/abouthandler.cpp6
7 files changed, 79 insertions, 15 deletions
diff --git a/ROADMAP.md b/ROADMAP.md
index 62d375a..9a778f0 100644
--- a/ROADMAP.md
+++ b/ROADMAP.md
@@ -14,8 +14,8 @@ This document contains TODO items for planned Kristall releases as well as some
- [x] Ctrl-Leftclick for "open in new tab"
- [ ] Selecting theme in settings dialog is now instant-change
- [ ] Improved favourites
- - [ ] Allow custom favourite title (not the URL itself)
- - [ ] Allow grouping favourites into a single-hierarchy folder structure
+ - [x] Allow custom favourite title (not the URL itself)
+ - [x] Allow grouping favourites into a single-hierarchy folder structure
- [ ] Improve Unicode/Emoji support
- Seems to need multiple font families per font?
- [x] Replace Qt markdown with standalone markdown renderer
diff --git a/src/favouritecollection.cpp b/src/favouritecollection.cpp
index 06329fe..d0a0a09 100644
--- a/src/favouritecollection.cpp
+++ b/src/favouritecollection.cpp
@@ -412,6 +412,16 @@ QVariant FavouriteCollection::data(const QModelIndex &index, int role) const
return "Unknown";
}
}
+ if (role == Qt::EditRole)
+ {
+ switch(item->type) {
+ case Node::Root: return "root";
+ case Node::Group: return static_cast<GroupNode const *>(item)->title;
+ case Node::Favourite: return static_cast<FavouriteNode const *>(item)->favourite.title;
+ default:
+ return "Unknown";
+ }
+ }
else if(role == Qt::DecorationRole) {
switch(item->type) {
@@ -425,6 +435,31 @@ QVariant FavouriteCollection::data(const QModelIndex &index, int role) const
return QVariant();
}
+bool FavouriteCollection::setData(const QModelIndex &index, const QVariant &value, int role)
+{
+ if (!index.isValid())
+ return false;
+
+ Node *item = static_cast<Node*>(index.internalPointer());
+ if (role == Qt::EditRole)
+ {
+ switch(item->type) {
+ case Node::Root: return false;
+ case Node::Group:
+ item->as<GroupNode>().title = value.toString();
+ emit this->dataChanged(index, index, { Qt::EditRole });
+ return true;
+ case Node::Favourite:
+ item->as<FavouriteNode>().favourite.title = value.toString();
+ emit this->dataChanged(index, index, { Qt::EditRole });
+ return true;
+ default: return false;
+ }
+ }
+
+ return false;
+}
+
Qt::ItemFlags FavouriteCollection::flags(const QModelIndex &index) const
{
if (!index.isValid())
@@ -432,9 +467,9 @@ Qt::ItemFlags FavouriteCollection::flags(const QModelIndex &index) const
Node const *item = static_cast<Node const*>(index.internalPointer());
switch(item->type) {
case Node::Favourite:
- return QAbstractItemModel::flags(index) | Qt::ItemIsDragEnabled;
+ return QAbstractItemModel::flags(index) | Qt::ItemIsDragEnabled | Qt::ItemIsEditable;
case Node::Group:
- return QAbstractItemModel::flags(index) | Qt::ItemIsDropEnabled;
+ return QAbstractItemModel::flags(index) | Qt::ItemIsDropEnabled | Qt::ItemIsEditable;
default:
return QAbstractItemModel::flags(index);
}
diff --git a/src/favouritecollection.hpp b/src/favouritecollection.hpp
index ea107ab..ed056ae 100644
--- a/src/favouritecollection.hpp
+++ b/src/favouritecollection.hpp
@@ -18,7 +18,7 @@ struct Favourite
QString getTitle() const {
if(title.isEmpty())
- return destination.toString(QUrl::FullyDecoded);
+ return destination.toString(QUrl::FullyEncoded);
else
return title;
}
@@ -114,6 +114,8 @@ public:
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
+ bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
+
// Drag'n'Drop
Qt::ItemFlags flags(const QModelIndex &index) const override;
diff --git a/src/main.cpp b/src/main.cpp
index 09a6a7c..9be807e 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -147,7 +147,7 @@ int main(int argc, char *argv[])
app_settings.endGroup();
}
- // deprecated_settings.setValue("deprecated", true);
+ deprecated_settings.setValue("deprecated", true);
}
else
{
@@ -159,6 +159,7 @@ int main(int argc, char *argv[])
// Migrate to new favourites format
if(int len = app_settings.beginReadArray("favourites"); len > 0)
{
+ qDebug() << "Migrating old-style favourites...";
std::vector<Favourite> favs;
favs.reserve(len);
@@ -332,7 +333,9 @@ void kristall::saveSettings()
assert(app_settings_ptr != nullptr);
QSettings & app_settings = *app_settings_ptr;
+ app_settings.beginGroup("Favourites");
kristall::favourites.save(app_settings);
+ app_settings.endGroup();
app_settings.beginGroup("Protocols");
kristall::protocols.save(app_settings);
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index b987e7d..62f6ad0 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -10,6 +10,8 @@
#include <QFile>
#include <QTextStream>
#include <QFileDialog>
+#include <QInputDialog>
+
#include "ioutil.hpp"
#include "kristall.hpp"
@@ -145,12 +147,12 @@ void MainWindow::on_browser_tabs_currentChanged(int index)
}
}
-void MainWindow::on_favourites_view_doubleClicked(const QModelIndex &index)
-{
- if(auto url = kristall::favourites.getFavourite(index).destination; url.isValid()) {
- this->addNewTab(true, url);
- }
-}
+//void MainWindow::on_favourites_view_doubleClicked(const QModelIndex &index)
+//{
+// if(auto url = kristall::favourites.getFavourite(index).destination; url.isValid()) {
+// this->addNewTab(true, url);
+// }
+//}
void MainWindow::on_browser_tabs_tabCloseRequested(int index)
{
@@ -406,6 +408,26 @@ void MainWindow::on_favourites_view_customContextMenuRequested(const QPoint &pos
menu.exec(this->ui->favourites_view->mapToGlobal(pos));
}
+ else if(QString group = kristall::favourites.group(idx); not group.isEmpty()) {
+ qDebug() << group;
+ }
+ }
+ else {
+ QMenu menu;
+
+ connect(menu.addAction("Create new group..."), &QAction::triggered, [this]() {
+ QInputDialog dialog { this };
+
+ dialog.setInputMode(QInputDialog::TextInput);
+ dialog.setLabelText(tr("Enter name of the new group:"));
+
+ if(dialog.exec() != QDialog::Accepted)
+ return;
+
+ kristall::favourites.addGroup(dialog.textValue());
+ });
+
+ menu.exec(this->ui->favourites_view->mapToGlobal(pos));
}
}
diff --git a/src/mainwindow.hpp b/src/mainwindow.hpp
index e845bc8..1966684 100644
--- a/src/mainwindow.hpp
+++ b/src/mainwindow.hpp
@@ -35,8 +35,6 @@ public:
private slots:
void on_browser_tabs_currentChanged(int index);
- void on_favourites_view_doubleClicked(const QModelIndex &index);
-
void on_browser_tabs_tabCloseRequested(int index);
void on_history_view_doubleClicked(const QModelIndex &index);
diff --git a/src/protocols/abouthandler.cpp b/src/protocols/abouthandler.cpp
index 53646d9..5192f0c 100644
--- a/src/protocols/abouthandler.cpp
+++ b/src/protocols/abouthandler.cpp
@@ -30,7 +30,11 @@ bool AboutHandler::startRequest(const QUrl &url, ProtocolHandler::RequestOptions
for (auto const &fav : kristall::favourites.allFavourites())
{
- document.append("=> " + fav->destination.toString().toUtf8() + "\n");
+ if(fav->title.isEmpty()) {
+ document.append("=> " + fav->destination.toString().toUtf8() + "\n");
+ } else {
+ document.append("=> " + fav->destination.toString().toUtf8() + " " + fav->title.toUtf8() + "\n");
+ }
}
this->requestComplete(document, "text/gemini");