Compare commits

...

26 Commits

Author SHA1 Message Date
tastytea 733aad9903
Remove xdgcfg dependency by copying it into this repo.
continuous-integration/drone/push Build is failing Details
2021-12-24 16:10:15 +01:00
tastytea 3a8b8c715a
Fix translation loading.
continuous-integration/drone/push Build is passing Details
https://www.kdab.com/fixing-a-common-antipattern-when-loading-translations-in-qt/
2020-07-09 13:22:17 +02:00
tastytea b19e8b233a
Fixed this and that in the readme. 2019-06-12 01:35:52 +02:00
tastytea bc6444747d
CI: Don't let rm fail if lockfile isn't there.
continuous-integration/drone/push Build is passing Details
2019-06-12 00:26:48 +02:00
tastytea ea9755bf9a
Updated readme.
continuous-integration/drone/push Build is failing Details
2019-06-12 00:22:38 +02:00
tastytea 774c1685af
Modified drone config to work with versions > 1.
continuous-integration/drone/push Build is failing Details
2019-06-12 00:14:33 +02:00
tastytea 9067b9dc91
Small cosmetic change to manpage.
the build was successful Details
2019-04-12 19:54:53 +02:00
tastytea 11b88aaf3d
Added files section to manpage.
the build was successful Details
2019-01-21 01:07:04 +01:00
tastytea 231f8ee1bb
fixed readme.
the build was successful Details
2019-01-21 00:30:58 +01:00
tastytea 788d56f98e
Rearranged stuff 2019-01-21 00:29:29 +01:00
tastytea bd33509e7a
Set default variables in build recipe correctly.
the build failed Details
2019-01-21 00:27:38 +01:00
tastytea 3711f30f3b
Fixed manpage version and email 2019-01-21 00:09:24 +01:00
tastytea 69177d5dda
Fixed translation compilation recipe.
the build was successful Details
2019-01-21 00:03:14 +01:00
tastytea dc33ae0a54
Fixed manpage script
the build failed Details
2019-01-21 00:01:29 +01:00
tastytea 032dc9f644
Enhanced manpage 2019-01-21 00:00:38 +01:00
tastytea 1bb26d9c33
Fixed version
the build failed Details
2019-01-20 23:48:47 +01:00
tastytea 3ab52e1b9e
CI: Added asciidoc as dependency
the build failed Details
2019-01-20 23:48:20 +01:00
tastytea 58a79b0681
Renamed whyblocked-gui -> whyblocked 2019-01-20 23:46:41 +01:00
tastytea fac5bd700a
Added manpage. 2019-01-20 23:31:58 +01:00
tastytea 3ed5d3ce0d
Set to blocked by default if account is added via drag & drop.
the build was successful Details
2019-01-16 15:49:36 +01:00
tastytea 449651e94f
Remove mentions of text interface from readme.
the build was successful Details
2019-01-15 01:46:11 +01:00
tastytea 59466c5f9e
Delete all selected rows, not just half.
the build was successful Details
2019-01-15 01:37:55 +01:00
tastytea 229c3f6645
Re-added translations. They were wiped somehow. 2019-01-15 01:08:15 +01:00
tastytea 2acd37bcce
Made "reason"-header is always 125px wide.
the build was successful Details
Because it stretches all the way to ther right anyway.
2019-01-14 20:50:14 +01:00
tastytea ccf31d072e
Changed search method from eventFilter to textChanged-signal.
The search is also updated if one of the checkbuttons is clicked.
2019-01-14 20:45:22 +01:00
tastytea daefd245f0
Refactored the QT interface. (#12)
the build was successful Details
2019-01-14 15:45:05 +01:00
19 changed files with 1033 additions and 628 deletions

View File

@ -1,185 +1,223 @@
pipeline:
gcc6:
image: ubuntu:xenial
pull: true
environment:
- LANG=C.utf8
- CXX=g++-6
- CXXFLAGS=-pipe -O2
commands:
- rm /etc/apt/apt.conf.d/docker-clean
- echo "deb http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu xenial main" >> /etc/apt/sources.list.d/ubuntu-toolchain-r.list
- gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys 0x60c317803a41ba51845e371a1e9377a2ba9ef27f
- gpg --armor --export 0x60c317803a41ba51845e371a1e9377a2ba9ef27f | apt-key add -
- apt-get update -q
- apt-get install -qy g++-6 cmake pkg-config
- apt-get install -qy libvsqlitepp-dev libboost-dev libxdg-basedir-dev qt5-default qttools5-dev-tools qttools5-dev libconfig++-dev
- apt-get install -qy dpkg-dev rpm file wget
- gpg --import /var/autosign_gpg.key
- rm -rf build && mkdir -p build && cd build
- cmake -DCMAKE_INSTALL_PREFIX=/usr ..
- make VERBOSE=1
- make install DESTDIR=install
- make package
- cmake -DWITH_DEB=ON ..
- make package
- cmake -DWITH_DEB=OFF -DWITH_RPM=ON ..
- make package
- gpg --verbose --detach-sign *.tar.gz
- gpg --verbose --detach-sign *.deb
- gpg --verbose --detach-sign *.rpm
volumes:
- /var/cache/debian-package-cache:/var/cache/apt/archives
- /home/tastytea/misc/autosign_gpg.key:/var/autosign_gpg.key
kind: pipeline
name: build x86_64
gcc7:
image: debian:stretch-slim
pull: true
when:
event: [push, pull_request]
environment:
- LANG=C.utf8
- CXX=g++-7
- CXXFLAGS=-pipe -O2
commands:
- rm /etc/apt/apt.conf.d/docker-clean
- apt-get update -q
- echo "APT::Default-Release \"stretch\";" >> /etc/apt/apt.conf.d/00default_release
- echo "deb http://deb.debian.org/debian stretch-backports main" >> /etc/apt/sources.list.d/backports.list
- echo "deb http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu xenial main" >> /etc/apt/sources.list.d/ubuntu-toolchain-r.list
- apt-get install -qy gnupg
- gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys 0x60c317803a41ba51845e371a1e9377a2ba9ef27f
- gpg --armor --export 0x60c317803a41ba51845e371a1e9377a2ba9ef27f | apt-key add -
- apt-get update -q
- apt-get install -qy -t xenial g++-7
- apt-get install -qy cmake pkg-config
- apt-get install -qy libvsqlitepp-dev libboost-dev libxdg-basedir-dev qt5-default qttools5-dev-tools qttools5-dev libconfig++-dev
- rm -rf build && mkdir -p build && cd build
- cmake ..
- make VERBOSE=1
- make install DESTDIR=install
volumes:
- /var/cache/debian-package-cache:/var/cache/apt/archives
volumes:
- name: debian-package-cache
host:
path: /var/cache/debian-package-cache
gcc8:
image: debian:stretch-slim
pull: true
when:
event: [push, pull_request]
environment:
- LANG=C.utf8
- CXX=g++-8
- CXXFLAGS=-pipe -O2
commands:
- rm /etc/apt/apt.conf.d/docker-clean
- apt-get update -q
- echo "APT::Default-Release \"stretch\";" >> /etc/apt/apt.conf.d/00default_release
- echo "deb http://deb.debian.org/debian stretch-backports main" >> /etc/apt/sources.list.d/backports.list
- echo "deb http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu xenial main" >> /etc/apt/sources.list.d/ubuntu-toolchain-r.list
- apt-get install -qy gnupg
- gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys 0x60c317803a41ba51845e371a1e9377a2ba9ef27f
- gpg --armor --export 0x60c317803a41ba51845e371a1e9377a2ba9ef27f | apt-key add -
- apt-get update -q
- apt-get install -qy -t xenial g++-8
- apt-get install -qy cmake pkg-config
- apt-get install -qy libvsqlitepp-dev libboost-dev libxdg-basedir-dev qt5-default qttools5-dev-tools qttools5-dev libconfig++-dev
- rm -rf build && mkdir -p build && cd build
- cmake ..
- make VERBOSE=1
- make install DESTDIR=install
volumes:
- /var/cache/debian-package-cache:/var/cache/apt/archives
trigger:
event:
exclude:
- tag
clang3:
image: debian:stretch-slim
pull: true
when:
event: [push, pull_request]
environment:
- LANG=C.utf8
- CXX=clang++
- CXXFLAGS=-pipe -O2
commands:
- rm /etc/apt/apt.conf.d/docker-clean
- echo "APT::Default-Release \"stretch\";" >> /etc/apt/apt.conf.d/00default_release
- echo "deb http://deb.debian.org/debian stretch-backports main" >> /etc/apt/sources.list.d/backports.list
- apt-get update -q
- apt-get install -qy clang cmake pkg-config
- apt-get install -qy libvsqlitepp-dev libboost-dev libxdg-basedir-dev qt5-default qttools5-dev-tools qttools5-dev libconfig++-dev
- rm -rf build && mkdir -p build && cd build
- cmake ..
- make VERBOSE=1
- make install DESTDIR=install
volumes:
- /var/cache/debian-package-cache:/var/cache/apt/archives
steps:
- name: submodules
image: docker:git
commands:
- git submodule init
- git submodule update --recursive
clang5:
image: debian:stretch-slim
pull: true
when:
event: [push, pull_request]
environment:
- LANG=C.utf8
- CXX=clang++-5.0
- CXXFLAGS=-pipe -O2
commands:
- rm /etc/apt/apt.conf.d/docker-clean
- echo "APT::Default-Release \"stretch\";" >> /etc/apt/apt.conf.d/00default_release
- echo "deb http://deb.debian.org/debian stretch-backports main" >> /etc/apt/sources.list.d/stretch.list
- apt-get update -q
- apt-get install -qy -t stretch-backports clang-5.0
- apt-get install -qy cmake pkg-config
- apt-get install -qy libvsqlitepp-dev libboost-dev libxdg-basedir-dev qt5-default qttools5-dev-tools qttools5-dev libconfig++-dev
- rm -rf build && mkdir -p build && cd build
- cmake ..
- make VERBOSE=1
- make install DESTDIR=install
volumes:
- /var/cache/debian-package-cache:/var/cache/apt/archives
- name: gcc6
image: ubuntu:xenial
pull: always
environment:
CXX: g++-6
CXXFLAGS: -pipe -O2
commands:
- rm /etc/apt/apt.conf.d/docker-clean
- echo "deb http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu xenial main" >> /etc/apt/sources.list.d/ubuntu-toolchain-r.list
- gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys 0x60c317803a41ba51845e371a1e9377a2ba9ef27f
- gpg --armor --export 0x60c317803a41ba51845e371a1e9377a2ba9ef27f | apt-key add -
- rm -f /var/cache/apt/archives/lock
- apt-get update -q
- rm -f /var/cache/apt/archives/lock
- apt-get install -qy g++-6 cmake pkg-config
- rm -f /var/cache/apt/archives/lock
- apt-get install -qy libvsqlitepp-dev libboost-dev libxdg-basedir-dev qt5-default qttools5-dev-tools qttools5-dev libconfig++-dev asciidoc
- rm -rf build && mkdir -p build && cd build
- cmake -DCMAKE_INSTALL_PREFIX=/usr ..
- make VERBOSE=1
- make install DESTDIR=install
volumes:
- name: debian-package-cache
path: /var/cache/apt/archives
clang6:
image: debian:stretch-slim
pull: true
when:
event: [push, pull_request]
environment:
- LANG=C.utf8
- CXX=clang++-6.0
- CXXFLAGS=-pipe -O2
commands:
- rm /etc/apt/apt.conf.d/docker-clean
- echo "APT::Default-Release \"stretch\";" >> /etc/apt/apt.conf.d/00default_release
- echo "deb http://deb.debian.org/debian stretch-backports main" >> /etc/apt/sources.list.d/stretch.list
- apt-get update -q
- apt-get install -qy -t stretch-backports clang-6.0
- apt-get install -qy cmake pkg-config
- apt-get install -qy libvsqlitepp-dev libboost-dev libxdg-basedir-dev qt5-default qttools5-dev-tools qttools5-dev libconfig++-dev
- rm -rf build && mkdir -p build && cd build
- cmake ..
- make VERBOSE=1
- make install DESTDIR=install
volumes:
- /var/cache/debian-package-cache:/var/cache/apt/archives
- name: gcc9
image: debian:stretch-slim
pull: always
environment:
CXX: g++-9
CXXFLAGS: -pipe -O2
commands:
- rm /etc/apt/apt.conf.d/docker-clean
- rm -f /var/cache/apt/archives/lock
- apt-get update -q
- echo "APT::Default-Release \"stretch\";" >> /etc/apt/apt.conf.d/00default_release
- echo "deb http://deb.debian.org/debian stretch-backports main" >> /etc/apt/sources.list.d/backports.list
- echo "deb http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu xenial main" >> /etc/apt/sources.list.d/ubuntu-toolchain-r.list
- rm -f /var/cache/apt/archives/lock
- apt-get install -qy gnupg
- gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys 0x60c317803a41ba51845e371a1e9377a2ba9ef27f
- gpg --armor --export 0x60c317803a41ba51845e371a1e9377a2ba9ef27f | apt-key add -
- rm -f /var/cache/apt/archives/lock
- apt-get update -q
- rm -f /var/cache/apt/archives/lock
- apt-get install -qy -t xenial g++-9
- rm -f /var/cache/apt/archives/lock
- apt-get install -qy cmake pkg-config
- rm -f /var/cache/apt/archives/lock
- apt-get install -qy libvsqlitepp-dev libboost-dev libxdg-basedir-dev qt5-default qttools5-dev-tools qttools5-dev libconfig++-dev asciidoc
- rm -rf build && mkdir -p build && cd build
- cmake ..
- make VERBOSE=1
- make install DESTDIR=install
volumes:
- name: debian-package-cache
path: /var/cache/apt/archives
prepare_release:
image: ubuntu:xenial
pull: true
when:
event: tag
commands:
- cp -v build/whyblocked-${DRONE_TAG}_x86_64.tar.gz .
- cp -v build/whyblocked-${DRONE_TAG}_x86_64.tar.gz.sig .
- cp -v build/whyblocked_${DRONE_TAG}-0_amd64.deb .
- cp -v build/whyblocked_${DRONE_TAG}-0_amd64.deb.sig .
- cp -v build/whyblocked-${DRONE_TAG}-0.x86_64.rpm .
- cp -v build/whyblocked-${DRONE_TAG}-0.x86_64.rpm.sig .
gitea_release:
image: plugins/gitea-release
pull: true
when:
event: tag
- name: clang3
image: debian:stretch-slim
pull: always
environment:
CXX: clang++
CXXFLAGS: -pipe -O2
commands:
- rm /etc/apt/apt.conf.d/docker-clean
- echo "APT::Default-Release \"stretch\";" >> /etc/apt/apt.conf.d/00default_release
- echo "deb http://deb.debian.org/debian stretch-backports main" >> /etc/apt/sources.list.d/backports.list
- rm -f /var/cache/apt/archives/lock
- apt-get update -q
- rm -f /var/cache/apt/archives/lock
- apt-get install -qy clang cmake pkg-config
- rm -f /var/cache/apt/archives/lock
- apt-get install -qy libvsqlitepp-dev libboost-dev libxdg-basedir-dev qt5-default qttools5-dev-tools qttools5-dev libconfig++-dev asciidoc
- rm -rf build && mkdir -p build && cd build
- cmake ..
- make VERBOSE=1
- make install DESTDIR=install
volumes:
- name: debian-package-cache
path: /var/cache/apt/archives
- name: clang6
image: debian:stretch-slim
pull: always
environment:
CXX: clang++-6.0
CXXFLAGS: -pipe -O2
commands:
- rm /etc/apt/apt.conf.d/docker-clean
- echo "APT::Default-Release \"stretch\";" >> /etc/apt/apt.conf.d/00default_release
- echo "deb http://deb.debian.org/debian stretch-backports main" >> /etc/apt/sources.list.d/stretch.list
- rm -f /var/cache/apt/archives/lock
- apt-get update -q
- rm -f /var/cache/apt/archives/lock
- apt-get install -qy -t stretch-backports clang-6.0
- rm -f /var/cache/apt/archives/lock
- apt-get install -qy cmake pkg-config
- rm -f /var/cache/apt/archives/lock
- apt-get install -qy libvsqlitepp-dev libboost-dev libxdg-basedir-dev qt5-default qttools5-dev-tools qttools5-dev libconfig++-dev asciidoc
- rm -rf build && mkdir -p build && cd build
- cmake ..
- make VERBOSE=1
- make install DESTDIR=install
volumes:
- name: debian-package-cache
path: /var/cache/apt/archives
- name: notify
image: drillster/drone-email
pull: always
settings:
host: cryptoparty-celle.de
username:
from_secret: email_username
password:
from_secret: email_password
from: drone@tzend.de
when:
status: [ changed, failure ]
---
kind: pipeline
name: packages x86_64
volumes:
- name: debian-package-cache
host:
path: /var/cache/debian-package-cache
- name: gpg-key
host:
path: /var/autosign_gpg.key
trigger:
event:
- tag
steps:
- name: submodules
image: docker:git
commands:
- git submodule init
- git submodule update --recursive
- name: gcc6
image: ubuntu:xenial
pull: always
environment:
CXX: g++-6
CXXFLAGS: -pipe -O2
commands:
- rm /etc/apt/apt.conf.d/docker-clean
- echo "deb http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu xenial main" >> /etc/apt/sources.list.d/ubuntu-toolchain-r.list
- gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys 0x60c317803a41ba51845e371a1e9377a2ba9ef27f
- gpg --armor --export 0x60c317803a41ba51845e371a1e9377a2ba9ef27f | apt-key add -
- rm -f /var/cache/apt/archives/lock
- apt-get update -q
- rm -f /var/cache/apt/archives/lock
- apt-get install -qy g++-6 cmake pkg-config
- rm -f /var/cache/apt/archives/lock
- apt-get install -qy libvsqlitepp-dev libboost-dev libxdg-basedir-dev qt5-default qttools5-dev-tools qttools5-dev libconfig++-dev asciidoc
- rm -f /var/cache/apt/archives/lock
- apt-get install -qy dpkg-dev rpm file wget
- gpg --import /var/autosign_gpg.key
- rm -rf build && mkdir -p build && cd build
- cmake -DCMAKE_INSTALL_PREFIX=/usr ..
- make VERBOSE=1
- make install DESTDIR=install
- make package
- cmake -DWITH_DEB=ON ..
- make package
- cmake -DWITH_DEB=OFF -DWITH_RPM=ON ..
- make package
- gpg --verbose --detach-sign *.tar.gz
- gpg --verbose --detach-sign *.deb
- gpg --verbose --detach-sign *.rpm
volumes:
- name: debian-package-cache
path: /var/cache/apt/archives
- name: gpg-key
path: /var/autosign_gpg.key
- name: prepare_release
image: ubuntu:xenial
pull: always
commands:
- cp -v build/whyblocked-${DRONE_TAG}_x86_64.tar.gz .
- cp -v build/whyblocked-${DRONE_TAG}_x86_64.tar.gz.sig .
- cp -v build/whyblocked_${DRONE_TAG}-0_amd64.deb .
- cp -v build/whyblocked_${DRONE_TAG}-0_amd64.deb.sig .
- cp -v build/whyblocked-${DRONE_TAG}-0.x86_64.rpm .
- cp -v build/whyblocked-${DRONE_TAG}-0.x86_64.rpm.sig .
- name: release
image: plugins/gitea-release
pull: always
settings:
base_url: https://schlomp.space
secrets: [ gitea_token ]
api_key:
from_secret: gitea_token
title: ${DRONE_TAG}
prerelease: true
files:
@ -193,11 +231,15 @@ pipeline:
- sha256
- sha512
notify:
image: drillster/drone-email
pull: true
- name: notify
image: drillster/drone-email
pull: always
settings:
host: cryptoparty-celle.de
secrets: [ email_username, email_password ]
username:
from_secret: email_username
password:
from_secret: email_password
from: drone@tzend.de
when:
status: [ changed, failure ]
when:
status: [ changed, failure ]

View File

@ -1,6 +1,6 @@
cmake_minimum_required (VERSION 3.2)
project (whyblocked
VERSION 0.14.0
VERSION 0.15.0
LANGUAGES CXX
)
@ -41,24 +41,46 @@ configure_file (
"${PROJECT_BINARY_DIR}/version.hpp"
)
set(COMMON_LIBRARIES
)
add_executable(whyblocked-gui
src/interface_qt.cpp src/whyblocked.cpp src/xdgcfg.cpp)
target_link_libraries(whyblocked-gui
add_executable(${CMAKE_PROJECT_NAME}
src/qt/main.cpp src/qt/mainwindow.cpp src/qt/dialog_add.cpp
src/whyblocked.cpp src/xdgcfg.cpp)
target_link_libraries(${CMAKE_PROJECT_NAME}
${LIBXDG_BASEDIR_LIBRARIES} vsqlitepp Qt5::Widgets
${LIBCONFIG_LIBRARIES} stdc++fs)
set(WITH_MAN "YES" CACHE STRING "WITH_MAN defaults to \"YES\"")
add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD
WORKING_DIRECTORY "${PROJECT_BINARY_DIR}"
COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_PROJECT_NAME} whyblocked-gui)
install(TARGETS whyblocked-gui DESTINATION ${CMAKE_INSTALL_BINDIR})
install(FILES de.tastytea.Whyblocked.desktop DESTINATION
${CMAKE_INSTALL_DATAROOTDIR}/applications)
install(FILES de.tastytea.Whyblocked.appdata.xml DESTINATION
${CMAKE_INSTALL_DATAROOTDIR}/metainfo)
install(FILES de.tastytea.Whyblocked.svg DESTINATION
${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/apps)
if(WITH_MAN)
add_custom_command(
OUTPUT "${PROJECT_BINARY_DIR}/whyblocked.1"
WORKING_DIRECTORY "${PROJECT_BINARY_DIR}"
DEPENDS "${CMAKE_SOURCE_DIR}/whyblocked.1.adoc"
COMMAND ${CMAKE_SOURCE_DIR}/build_manpage.sh
ARGS ${PROJECT_VERSION})
add_custom_target(run ALL
DEPENDS "${PROJECT_BINARY_DIR}/whyblocked.1"
)
endif()
if(NOT WITHOUT_TRANSLATIONS)
install(TARGETS ${CMAKE_PROJECT_NAME}
DESTINATION ${CMAKE_INSTALL_BINDIR})
install(FILES "${PROJECT_BINARY_DIR}/whyblocked-gui"
DESTINATION "${CMAKE_INSTALL_BINDIR}")
install(FILES de.tastytea.Whyblocked.desktop
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications)
install(FILES de.tastytea.Whyblocked.appdata.xml
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/metainfo)
install(FILES de.tastytea.Whyblocked.svg
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/apps)
if(WITH_MAN)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/whyblocked.1
DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
endif()
set(WITH_TRANSLATIONS "YES" CACHE STRING "WITH_TRANSLATIONS defaults to \"YES\"")
if(WITH_TRANSLATIONS)
add_subdirectory(translations)
endif()

View File

@ -1,14 +1,13 @@
**Whyblocked** allows you to store the reason why you blocked someone, along with
"receipts", URLs to the posts that led you to block them.
**Whyblocked** allows you to store the reason why you blocked someone, along
with “receipts”, URLs to the posts that led you to block them.
It has a text- and a Qt-interface and uses an SQLite-database.
It has a Qt-interface and uses an SQLite-database.
![Screenshot Qt interface](https://doc.schlomp.space/whyblocked/whyblocked_screenshot.png)
![Screenshot](https://doc.schlomp.space/whyblocked/whyblocked_screenshot.png)
## Usage
For the text interface start `whyblocked`, for the Qt interface
`whyblocked-gui`. You can also start it from the menu of your desktop
Run `whyblocked`. You can also start it from the menu of your desktop
environment.
## Install
@ -17,9 +16,12 @@ environment.
Every [release](https://schlomp.space/tastytea/whyblocked/releases) includes
a .deb-package, an .rpm-package and a .tar.gz-package with precompiled binaries
for x86_64(amd64) ([more info](https://schlomp.space/tastytea/whyblocked/wiki/Binary-Packages)). These are automatically built and not tested. You can install
them with `dpkg -i` or `rpm -i`, respectively. The packages are signed with the
PGP key [242E5AC4DA587BF9](https://tastytea.de/tastytea_autosign.asc)
for x86_64(amd64)
([more info](https://schlomp.space/tastytea/whyblocked/wiki/Binary-Packages)).
These are automatically built and not tested. You can install them with
`apt install ./whyblocked*.deb` or `yum install ./whyblocked*.rpm`,
respectively. The packages are signed with the PGP key
[242E5AC4DA587BF9](https://tastytea.de/tastytea_autosign.asc)
(Fingerprint: `F730 1ADF C9ED 2624 48C4 2B64 242E 5AC4 DA58 7BF9`).
Gentoo ebuilds are available via my
@ -29,31 +31,26 @@ Gentoo ebuilds are available via my
#### Dependencies
* C++ compiler (tested: [gcc](https://gcc.gnu.org/) 6/7/8,
[clang](https://llvm.org/) 3/5/6)
* C++ compiler (tested: [gcc](https://gcc.gnu.org/) 6/8/9,
[clang](https://llvm.org/) 3/6)
* [cmake](https://cmake.org/) (at least 3.2)
* [vsqlite++](http://vsqlite.virtuosic-bytes.com/) (tested: 0.3)
* [libxdg-basedir](http://repo.or.cz/w/libxdg-basedir.git) (tested: 1.2)
* [qtcore](https://www.qt.io/) (tested: 5.11/5.5)
* [qtwidgets](https://www.qt.io/) (tested: 5.11/5.5)
* [qtcore](https://www.qt.io/) (tested: 5.12/5.5)
* [qtwidgets](https://www.qt.io/) (tested: 5.12/5.5)
* [libconfig++](https://github.com/hyperrealm/libconfig) (tested: 1.5)
* Optional
* Translations: [lupdate & lrelease](http://doc.qt.io/qt-5/linguist-manager.html) (tested: 5.11/5.5)
* Translations: [lupdate & lrelease](http://doc.qt.io/qt-5/linguist-manager.html) (tested: 5.12/5.5)
* Manpage: [asciidoc](http://asciidoc.org/) (tested: 8.6)
#### Get sourcecode
Download the current
[release](https://schlomp.space/tastytea/whyblocked/releases) and copy
[xdgcfg](https://schlomp.space/tastytea/xdgcfg) into `xdgcfg/`.
If you clone from git, be sure to `git submodule init` and
`git submodule update` afterwards. See the [submodules article in the git book]
(https://git-scm.com/book/en/v2/Git-Tools-Submodules#_cloning_submodules) for
further info.
[release](https://schlomp.space/tastytea/whyblocked/releases).
#### Compile
```SH
``` zsh
mkdir build
cd build
cmake ..
@ -63,7 +60,8 @@ make install
cmake options:
* `-DCMAKE_BUILD_TYPE=Debug` for a debug build
* `-DWITHOUT_TRANSLATIONS=YES` to not compile translations
* `-DWITH_TRANSLATIONS=NO` to not compile translations
* `-DWITH_MAN=NO` to not compile the manpage
* One of:
* `-DWITH_DEB=YES` if you want to be able to generate a deb-package
* `-DWITH_RPM=YES` if you want to be able to generate an rpm-package
@ -91,14 +89,14 @@ Please report them on the
## Licence & Copyright
```PLAIN
``` plain
Copyright © 2018 tastytea <tastytea@tastytea.de>.
License GPLv3: GNU GPL version 3 <https://www.gnu.org/licenses/gpl-3.0.html>.
This program comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
```
The icon is derived from the icons `messagebox critical` and `help` of the
The icon is derived from the icons *“messagebox critical”* and *“help”* of the
[Gartoon icon theme](https://commons.wikimedia.org/wiki/Gartoon_icons). The
original authors were Zeus, Patrick Yavitz and La Mula Francis, who released
them under the terms of the

10
build_manpage.sh Executable file
View File

@ -0,0 +1,10 @@
#!/bin/sh
if [ -n "${1}" ]; then
dir="$(dirname ${0})"
cp -vf ${dir}/whyblocked.1.adoc .
sed -Ei "s/(Revision: +)[0-9]+\.[0-9]\.[0-9]/\1${1}/" whyblocked.1.adoc
a2x --doctype manpage --format manpage --no-xmllint whyblocked.1.adoc
else
echo "usage: ${0} VERSION" >&2
fi

View File

@ -5,7 +5,7 @@ Name=Whyblocked
Comment=Reminds you why you blocked someone
Comment[de]=Erinnert dich, warum du jemanden blockiertest
Icon=de.tastytea.Whyblocked
Exec=whyblocked-gui
Exec=whyblocked
Terminal=false
Categories=Utility;
Keywords=blocklist;social-network;

112
src/qt/dialog_add.cpp Normal file
View File

@ -0,0 +1,112 @@
/* This file is part of whyblocked.
* Copyright © 2019 tastytea <tastytea@tastytea.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <QtCore/qmimedata.h>
#include "dialog_add.hpp"
DialogAdd::DialogAdd(Database &database, QMainWindow *parent)
: QDialog(parent)
, _parent(static_cast<MainWindow*>(parent))
, _database(database)
{
setupUi(this);
}
void DialogAdd::set_data(const Database::data &data)
{
text_user->setText(QString::fromStdString(data.user));
radio_blocked->setChecked(data.blocked);
radio_silcenced->setChecked(!data.blocked);
text_reason->setText(QString::fromStdString(data.reason));
for (const string &receipt : data.receipts)
{
QListWidgetItem *item =
new QListWidgetItem(QString::fromStdString(receipt));
item->setFlags(item->flags() | Qt::ItemIsEditable);
list_receipts->insertItem(list_receipts->count(), item);
}
}
const Database::data DialogAdd::get_data() const
{
std::vector<string> receipts;
for (int row = 0; row <= list_receipts->count() - 1; ++row)
{
receipts.push_back(list_receipts->item(row)->text().toStdString());
}
Database::data data;
data.user = text_user->text().toStdString();
data.blocked = radio_blocked->isChecked();
data.reason = text_reason->text().toStdString();
data.receipts = receipts;
return data;
}
void DialogAdd::dragEnterEvent(QDragEnterEvent *event)
{
if (event->mimeData()->hasFormat("text/plain"))
{
event->acceptProposedAction();
}
}
void DialogAdd::dropEvent(QDropEvent *event)
{
const QString text = event->mimeData()->text();
QListWidgetItem *item = new QListWidgetItem(text);
item->setFlags(item->flags() | Qt::ItemIsEditable);
list_receipts->insertItem(list_receipts->count(), item);
}
void DialogAdd::add_receipt()
{
QListWidgetItem *item = new QListWidgetItem(tr("Insert receipt here."));
item->setFlags(item->flags() | Qt::ItemIsEditable);
list_receipts->insertItem(list_receipts->count(), item);
list_receipts->editItem(item);
}
void DialogAdd::remove_receipt()
{
for (auto item :list_receipts->selectedItems())
{
delete item;
}
}
void DialogAdd::accept()
{
if (property("edit").toBool())
{
_parent->remove();
}
Database::data data = get_data();
if (!data)
{
return;
}
_database.add_user(data);
_parent->add_row(QString::fromStdString(data.user),
data.blocked,
QString::fromStdString(data.reason));
delete this;
}

46
src/qt/dialog_add.hpp Normal file
View File

@ -0,0 +1,46 @@
/* This file is part of whyblocked.
* Copyright © 2019 tastytea <tastytea@tastytea.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef DIALOG_ADD_HPP
#define DIALOG_ADD_HPP
#include "mainwindow.hpp"
#include "ui_whyblocked_add.h"
class DialogAdd : public QDialog, private Ui::DialogAdd
{
Q_OBJECT
public:
explicit DialogAdd(Database &database, QMainWindow *parent = nullptr);
void set_data(const Database::data &data);
private:
const Database::data get_data() const;
void dragEnterEvent(QDragEnterEvent *event);
void dropEvent(QDropEvent *event);
MainWindow *_parent;
Database &_database;
private slots:
void add_receipt();
void remove_receipt();
void accept();
};
#endif // DIALOG_ADD_HPP

42
src/qt/main.cpp Normal file
View File

@ -0,0 +1,42 @@
/* This file is part of whyblocked.
* Copyright © 2019, 2020 tastytea <tastytea@tastytea.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "mainwindow.hpp"
#include <QLibraryInfo>
#include <QLocale>
#include <QTranslator>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QCoreApplication::setApplicationName("Whyblocked");
QTranslator qtTranslator;
qtTranslator.load(QLocale(), "qt", "_",
QLibraryInfo::location(QLibraryInfo::TranslationsPath));
app.installTranslator(&qtTranslator);
QTranslator appTranslator;
appTranslator.load(QLocale(), "whyblocked", "_",
QLibraryInfo::location(QLibraryInfo::TranslationsPath));
app.installTranslator(&appTranslator);
MainWindow win;
win.show();
return app.exec();
}

View File

@ -20,12 +20,11 @@
#include <codecvt>
#include <algorithm>
#include <QMessageBox>
#include <QTranslator>
#include <QLibraryInfo>
#include <QtCore/qmimedata.h>
#include <libconfig.h++>
#include "version.hpp"
#include "interface_qt.hpp"
#include "mainwindow.hpp"
#include "dialog_add.hpp"
using std::wstring;
@ -104,7 +103,6 @@ MainWindow::MainWindow(QMainWindow *parent)
}
widget_find->hide();
text_find->installEventFilter(this);
reload();
@ -164,8 +162,7 @@ MainWindow::~MainWindow()
tableview->horizontalHeader()->sectionSize(0);
headers.add(libconfig::Setting::TypeInt) =
tableview->horizontalHeader()->sectionSize(1);
headers.add(libconfig::Setting::TypeInt) =
tableview->horizontalHeader()->sectionSize(2);
headers.add(libconfig::Setting::TypeInt) = 125;
libconfig::Setting &find_in = root.add("find_in",
libconfig::Setting::TypeGroup);
@ -177,33 +174,6 @@ MainWindow::~MainWindow()
_config.write();
}
void MainWindow::populate_tableview(const vector<Database::data> &entries)
{
_model->clear();
_model->setHorizontalHeaderLabels(
{
tr("User/Instance"),
tr("Blocked/Silenced"),
tr("Reason")
});
tableview->horizontalHeader()->resizeSection(0, _headersize[0]);
tableview->horizontalHeader()->resizeSection(1, _headersize[1]);
tableview->horizontalHeader()->resizeSection(2, _headersize[2]);
for (const Database::data &entry : entries)
{
add_row(QString::fromStdString(entry.user),
entry.blocked,
QString::fromStdString(entry.reason));
}
}
void MainWindow::reload()
{
_database.reload();
populate_tableview(_dbdata);
}
void MainWindow::add_row(const QString &user, const int &blocked,
const QString &reason)
{
@ -221,40 +191,16 @@ void MainWindow::add_row(const QString &user, const int &blocked,
_model->appendRow(items);
}
void MainWindow::add()
{
DialogAdd *dialog = new DialogAdd(_database, this);
dialog->show();
}
void MainWindow::edit()
{
if (tableview->selectionModel()->selectedRows().count() != 1)
{
QMessageBox::warning(this, tr("Invalid selection"),
tr("Please select only 1 entry to edit."));
return;
}
DialogAdd *dialog = new DialogAdd(_database, this);
dialog->setWindowTitle(tr("Edit entry"));
QModelIndex index = tableview->selectionModel()->selectedRows().first();
const string user = index.sibling(index.row(), 0).data()
.toString().toStdString();
dialog->set_data(_database.get_user(user));
dialog->setProperty("edit", true);
dialog->show();
}
void MainWindow::remove()
{
QItemSelectionModel *selection = tableview->selectionModel();
if (selection->hasSelection())
{
for (auto &row : selection->selectedRows())
// I use this construct here because the number of selected rows
// decrease by 1 each iteration.
for (; selection->selectedRows().count() > 0;)
{
const QModelIndex row = selection->selectedRows().front();
const string user = row.data().toString().toStdString();
_database.remove(user);
_model->removeRow(row.row());
@ -268,109 +214,6 @@ void MainWindow::remove()
}
}
void MainWindow::find()
{
if (widget_find->isVisible())
{
widget_find->hide();
}
else
{
widget_find->show();
text_find->setFocus();
}
}
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
wstring searchfor;
if (obj == text_find)
{
if (event->type() == QEvent::KeyRelease)
{
searchfor = text_find->text().toLower().toStdWString();
}
else if (event->type() == QEvent::Drop)
{
QDropEvent *drop = static_cast<QDropEvent*>(event);
searchfor = drop->mimeData()->text().toLower().toStdWString();
}
else
{
return QObject::eventFilter(obj, event);
}
}
else
{
return QObject::eventFilter(obj, event);
}
vector<Database::data> filtered_entries;
if (!_dbdata.empty())
{
for (const Database::data &entry : _dbdata)
{
wstring searchstring;
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> convert;
if (check_user->isChecked())
{
searchstring += convert.from_bytes(entry.user);
}
if (check_reason->isChecked())
{
searchstring += convert.from_bytes(entry.reason);
}
std::transform(searchstring.begin(), searchstring.end(),
searchstring.begin(), ::towlower);
if (searchstring.find(searchfor) != std::string::npos)
{
filtered_entries.push_back(entry);
}
}
}
populate_tableview(filtered_entries);
return QObject::eventFilter(obj, event);
}
void MainWindow::about()
{
QMessageBox::about(this, tr("About Whyblocked"),
tr("<p><b>Whyblocked</b> %1</p>"
"<p>Reminds you why you blocked someone.</p>"
"<p>Sourcecode: <a href=\"https://schlomp.space/tastytea/whyblocked\">"
"https://schlomp.space/tastytea/whyblocked</a></p>"
"<p><small>Copyright © 2018 <a href=\"mailto:tastytea@tastytea.de\">tastytea</a>.<br>"
"Licence GPLv3: <a href=\"https://www.gnu.org/licenses/gpl-3.0.html\">"
"GNU GPL version 3</a>.<br>"
"This program comes with ABSOLUTELY NO WARRANTY. This is free software, "
"and you are welcome to redistribute it under certain conditions.</small></p>")
.arg(global::version));
}
void MainWindow::show_details(QModelIndex index)
{
const string user = index.sibling(index.row(), 0).data()
.toString().toStdString();
Database::data data = _database.get_user(user);
string text = "";
if (!data.receipts.empty())
{
text += string("<b>") + tr("Receipts:").toStdString() + "</b>";
for (const string &url : data.receipts)
{
text += "<br>" + url;
}
text = urls_to_hyperlinks(text);
}
label_receipts->setText(QString::fromStdString((text)));
}
const string MainWindow::urls_to_hyperlinks(const string &text)
{
std::regex re_url("((https?|gopher|ftps?)\\://[^ <]*)");
@ -412,119 +255,145 @@ void MainWindow::dropEvent(QDropEvent *event)
DialogAdd *dialog = new DialogAdd(_database, this);
Database::data data;
data.user = text;
data.blocked = true;
dialog->set_data(data);
dialog->show();
}
DialogAdd::DialogAdd(Database &database, QMainWindow *parent)
: QDialog(parent)
, _parent(static_cast<MainWindow*>(parent))
, _database(database)
void MainWindow::add()
{
setupUi(this);
DialogAdd *dialog = new DialogAdd(_database, this);
dialog->show();
}
const Database::data DialogAdd::get_data() const
void MainWindow::edit()
{
std::vector<string> receipts;
for (int row = 0; row <= list_receipts->count() - 1; ++row)
{
receipts.push_back(list_receipts->item(row)->text().toStdString());
}
Database::data data;
data.user = text_user->text().toStdString();
data.blocked = radio_blocked->isChecked();
data.reason = text_reason->text().toStdString();
data.receipts = receipts;
return data;
}
void DialogAdd::set_data(const Database::data &data)
{
text_user->setText(QString::fromStdString(data.user));
radio_blocked->setChecked(data.blocked);
radio_silcenced->setChecked(!data.blocked);
text_reason->setText(QString::fromStdString(data.reason));
for (const string &receipt : data.receipts)
{
QListWidgetItem *item =
new QListWidgetItem(QString::fromStdString(receipt));
item->setFlags(item->flags() | Qt::ItemIsEditable);
list_receipts->insertItem(list_receipts->count(), item);
}
}
void DialogAdd::add_receipt()
{
QListWidgetItem *item = new QListWidgetItem(tr("Insert receipt here."));
item->setFlags(item->flags() | Qt::ItemIsEditable);
list_receipts->insertItem(list_receipts->count(), item);
list_receipts->editItem(item);
}
void DialogAdd::remove_receipt()
{
for (auto item :list_receipts->selectedItems())
{
delete item;
}
}
void DialogAdd::accept()
{
if (property("edit").toBool())
{
_parent->remove();
}
Database::data data = get_data();
if (!data)
if (tableview->selectionModel()->selectedRows().count() != 1)
{
QMessageBox::warning(this, tr("Invalid selection"),
tr("Please select only 1 entry to edit."));
return;
}
_database.add_user(data);
_parent->add_row(QString::fromStdString(data.user),
data.blocked,
QString::fromStdString(data.reason));
DialogAdd *dialog = new DialogAdd(_database, this);
dialog->setWindowTitle(tr("Edit entry"));
delete this;
QModelIndex index = tableview->selectionModel()->selectedRows().first();
const string user = index.sibling(index.row(), 0).data()
.toString().toStdString();
dialog->set_data(_database.get_user(user));
dialog->setProperty("edit", true);
dialog->show();
}
void DialogAdd::dragEnterEvent(QDragEnterEvent *event)
void MainWindow::about()
{
if (event->mimeData()->hasFormat("text/plain"))
QMessageBox::about(this, tr("About Whyblocked"),
tr("<p><b>Whyblocked</b> %1</p>"
"<p>Reminds you why you blocked someone.</p>"
"<p>Sourcecode: <a href=\"https://schlomp.space/tastytea/whyblocked\">"
"https://schlomp.space/tastytea/whyblocked</a></p>"
"<p><small>Copyright © 2018 <a href=\"mailto:tastytea@tastytea.de\">tastytea</a>.<br>"
"Licence GPLv3: <a href=\"https://www.gnu.org/licenses/gpl-3.0.html\">"
"GNU GPL version 3</a>.<br>"
"This program comes with ABSOLUTELY NO WARRANTY. This is free software, "
"and you are welcome to redistribute it under certain conditions.</small></p>")
.arg(global::version));
}
void MainWindow::show_details(QModelIndex index)
{
const string user = index.sibling(index.row(), 0).data()
.toString().toStdString();
Database::data data = _database.get_user(user);
string text = "";
if (!data.receipts.empty())
{
event->acceptProposedAction();
text += string("<b>") + tr("Receipts:").toStdString() + "</b>";
for (const string &url : data.receipts)
{
text += "<br>" + url;
}
text = urls_to_hyperlinks(text);
}
label_receipts->setText(QString::fromStdString((text)));
}
void MainWindow::populate_tableview(const vector<Database::data> &entries)
{
_model->clear();
_model->setHorizontalHeaderLabels(
{
tr("User/Instance"),
tr("Blocked/Silenced"),
tr("Reason")
});
tableview->horizontalHeader()->resizeSection(0, _headersize[0]);
tableview->horizontalHeader()->resizeSection(1, _headersize[1]);
tableview->horizontalHeader()->resizeSection(2, _headersize[2]);
for (const Database::data &entry : entries)
{
add_row(QString::fromStdString(entry.user),
entry.blocked,
QString::fromStdString(entry.reason));
}
}
void DialogAdd::dropEvent(QDropEvent *event)
void MainWindow::reload()
{
const QString text = event->mimeData()->text();
QListWidgetItem *item = new QListWidgetItem(text);
item->setFlags(item->flags() | Qt::ItemIsEditable);
list_receipts->insertItem(list_receipts->count(), item);
_database.reload();
populate_tableview(_dbdata);
}
int main(int argc, char *argv[])
void MainWindow::find()
{
QApplication app(argc, argv);
QCoreApplication::setApplicationName("Whyblocked");
QTranslator qtTranslator;
qtTranslator.load("qt_" + QLocale::system().name(),
QLibraryInfo::location(QLibraryInfo::TranslationsPath));
app.installTranslator(&qtTranslator);
QTranslator appTranslator;
appTranslator.load("whyblocked_" + QLocale::system().name(),
QLibraryInfo::location(QLibraryInfo::TranslationsPath));
app.installTranslator(&appTranslator);
MainWindow win;
win.show();
return app.exec();
if (widget_find->isVisible())
{
widget_find->hide();
}
else
{
widget_find->show();
text_find->setFocus();
}
}
void MainWindow::update_search(const QString &text)
{
const wstring searchfor = text.toLower().toStdWString();
vector<Database::data> filtered_entries;
if (!_dbdata.empty())
{
for (const Database::data &entry : _dbdata)
{
wstring searchstring;
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> convert;
if (check_user->isChecked())
{
searchstring += convert.from_bytes(entry.user);
}
if (check_reason->isChecked())
{
searchstring += convert.from_bytes(entry.reason);
}
std::transform(searchstring.begin(), searchstring.end(),
searchstring.begin(), ::towlower);
if (searchstring.find(searchfor) != std::string::npos)
{
filtered_entries.push_back(entry);
}
}
}
populate_tableview(filtered_entries);
}
void MainWindow::update_search()
{
update_search(text_find->text());
}

View File

@ -14,8 +14,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef INTERFACE_QT_HPP
#define INTERFACE_QT_HPP
#ifndef MAINWINDOW_HPP
#define MAINWINDOW_HPP
#include <string>
#include <memory>