Compare commits

...

40 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
tastytea 8a5aa60d66
Fixed german translation.
the build was successful Details
2019-01-12 22:16:40 +01:00
tastytea 1a99bf1ded
Bugfix: Do not perform a search if mouse enters text field. 2019-01-12 22:14:04 +01:00
tastytea fd951ed502
Deleted text interface. 2019-01-12 21:28:29 +01:00
tastytea d9065280ea
Let the Database-class handle the data. 2019-01-12 21:24:09 +01:00
tastytea 0fdaad70ee
Only reload database on start and when the reload button is clicked. 2019-01-12 20:37:43 +01:00
tastytea 0f13bc8d9b
Rewrote QT interface to use new database interface.
the build was successful Details
2019-01-12 19:35:24 +01:00
tastytea 75dc40406c
Deactivated text interface. 2019-01-12 18:22:05 +01:00
tastytea 54919796d7
Rewrote database interface.
It is a class now and has a saner return type, a struct.
2019-01-12 18:18:49 +01:00
tastytea 165e9039a7
Added more warnings for debug builds, removed superfluous consts 2019-01-12 17:39:20 +01:00
tastytea f29e180092
Update search results if focus enters text field.
the build was successful Details
With this change, the search results are updated if text is dragged
into the text field.
2019-01-11 23:09:11 +01:00
tastytea 64ab212a1f
Fixed german translation.
the build was successful Details
2019-01-11 21:52:14 +01:00
tastytea eab650d6dd
Added settings for checkboxes in find-widget.
the build was successful Details
2019-01-11 21:13:45 +01:00
tastytea dd83e11338
Added find function 2019-01-11 20:50:22 +01:00
tastytea 89eef7247a
Added find action (without function). 2019-01-11 18:58:20 +01:00
22 changed files with 1309 additions and 1333 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.12.2
VERSION 0.15.0
LANGUAGES CXX
)
@ -13,16 +13,15 @@ pkg_check_modules(LIBXDG_BASEDIR REQUIRED libxdg-basedir)
# because the sqlite3 in Debian jessie doesn't come with a pkg-config module.
pkg_check_modules(SQLITE3 sqlite3)
find_package(Qt5Core CONFIG REQUIRED)
if(NOT WITHOUT_GUI)
find_package(Qt5Widgets CONFIG REQUIRED)
pkg_check_modules(LIBCONFIG REQUIRED libconfig++)
endif()
find_package(Qt5Widgets CONFIG REQUIRED)
pkg_check_modules(LIBCONFIG REQUIRED libconfig++)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -g -Og")
set(CMAKE_CXX_FLAGS_DEBUG
"${CMAKE_CXX_FLAGS_DEBUG} -Wpedantic -Wall -Wextra -g -Og -fno-omit-frame-pointer")
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
@ -42,31 +41,46 @@ configure_file (
"${PROJECT_BINARY_DIR}/version.hpp"
)
set(COMMON_LIBRARIES
${LIBXDG_BASEDIR_LIBRARIES} vsqlitepp stdc++fs)
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)
add_executable(whyblocked
src/interface_text.cpp src/whyblocked.cpp)
target_link_libraries(whyblocked ${COMMON_LIBRARIES} Qt5::Core)
install(TARGETS whyblocked DESTINATION ${CMAKE_INSTALL_BINDIR})
if(NOT WITHOUT_GUI)
add_executable(whyblocked-gui
src/interface_qt.cpp src/whyblocked.cpp src/xdgcfg.cpp)
target_link_libraries(whyblocked-gui
${COMMON_LIBRARIES} Qt5::Widgets
${LIBCONFIG_LIBRARIES} stdc++fs)
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)
* [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
* GUI: [qtwidgets](https://www.qt.io/) (tested: 5.11/5.5)
* GUI: [libconfig++](https://github.com/hyperrealm/libconfig) (tested: 1.5)
* 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,8 +60,8 @@ make install
cmake options:
* `-DCMAKE_BUILD_TYPE=Debug` for a debug build
* `-DWITHOUT_GUI=YES` to not build GUI
* `-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
@ -92,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;

View File

@ -1,322 +0,0 @@
/* This file is part of whyblocked.
* Copyright © 2018 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 <iostream>
#include <QCoreApplication>
#include <QTranslator>
#include <QLocale>
#include <QLibraryInfo>
#include "version.hpp"
#include "whyblocked.hpp"
#include "interface_text.hpp"
using std::cout;
using std::cerr;
using std::cin;
// Allow cout to output QStrings
std::ostream &operator <<(std::ostream &stream, const QString &str)
{
stream << str.toStdString();
return stream;
}
const string Text::get_answer(const QString &question)
{
string answer;
cout << question << ": ";
std::getline(cin, answer, '\n');
return answer;
}
const bool Text::askblocked()
{
while (true)
{
const string blocked = get_answer(tr("Blocked or silenced?") +
" [b/s]");
if (blocked[0] == 'b' || blocked[0] == 'B')
{
return true;
}
else if (blocked[0] == 's' || blocked[0] == 'S')
{
return false;
}
}
}
const void Text::askrecipes(const string &user)
{
while (true)
{
const string receipt_yn = get_answer(tr("Add receipt? [y/n]"));
if (receipt_yn[0] == tr("y")[0] || receipt_yn[0] == tr("Y")[0])
{
const string receipt = get_answer(tr("Receipt"));
if (database::add_receipt(user, receipt))
{
cout << tr("Receipt added.") << '\n';
}
}
else if (receipt_yn[0] == tr("n")[0] || receipt_yn[0] == tr("N")[0])
{
break;
}
else
{
continue;
}
}
}
const void Text::add()
{
const string user = get_answer(tr("User or instance"));
int blocked;
if (askblocked())
{
blocked = 1;
}
else
{
blocked = 0;
}
const string reason = get_answer(tr("Reason"));
if (database::add_block(user, blocked, reason))
{
cout << user << " " << tr("added.") << '\n';
}
askrecipes(user);
}
const void Text::edit()
{
result_details olddata;
const string olduser = get_answer(tr("User or instance"));
if (database::details(olduser, olddata))
{
cout << tr("A blank line keeps the former value.") << '\n';
string newuser = get_answer(tr("Change user or instance to"));
if (newuser.empty())
{
newuser = olduser;
}
int blocked;
if (askblocked())
{
blocked = 1;
}
else
{
blocked = 0;
}
cout << tr("Old reason was:") << " " << std::get<1>(olddata) << '\n';
string newreason = get_answer(tr("Change reason to"));
if (newreason.empty())
{
newreason = std::get<1>(olddata);
}
std::vector<string> newreceipts;
for (const string &oldreceipt : std::get<2>(olddata))
{
cout << tr("Old receipt was:") << " " << oldreceipt << '\n';
string newreceipt = get_answer(tr("Change receipt to"));
if (newreceipt.empty())
{
newreceipt = oldreceipt;
}
newreceipts.push_back(newreceipt);
}
if (database::remove(olduser))
{
database::add_block(newuser, blocked, newreason);
if (!newreceipts.empty())
{
for (const string &newreceipt : newreceipts)
{
database::add_receipt(newuser, newreceipt);
}
}
askrecipes(newuser);
}
else
{
cerr << tr("Could not remove") << " " << olduser << ".\n";
}
}
}
const void Text::remove()
{
const string user = get_answer(tr("User or instance"));
if (database::remove(user))
{
cout << user << " " << tr("removed.") << '\n';
}
}
const void Text::view()
{
result_view result;
if (database::view(result))
{
for (const std::tuple<string, int, string> &line : result)
{
if (std::get<1>(line) == 1)
{
cout << tr(" Blocked:") << " ";
}
else
{
cout << tr("Silenced:") << " ";
}
cout << std::get<0>(line) << " " << tr("because:") << " ";
cout << std::get<2>(line) << '\n';
}
}
}
const void Text::details()
{
const string user = get_answer(tr("User or instance"));
{
result_details result;
if (database::details(user, result))
{
cout << user << " " << tr("is") << " ";
if (std::get<0>(result) == 1)
{
cout << tr("blocked, because:") << " ";
}
else if (std::get<0>(result) == 0)
{
cout << tr("silenced, because:") << " ";
}
cout << std::get<1>(result) << '\n';
if (!std::get<2>(result).empty())
{
cout << tr("Receipts:") << '\n';
for (const string &url : std::get<2>(result))
{
cout << " " << url << '\n';
}
}
}
}
}
const void Text::help()
{
cout << tr(
"Type add, edit, remove, view or details. Or just the first letter.")
<< '\n';
cout << tr(
"Type help or h to show this help. Type quit or q to quit the program.")
<< '\n';
}
Text::Text(QObject *parent) : QObject(parent)
{
bool keeprunning = true;
cout << tr("This is Whyblocked") << " " << global::version << ".\n";
help();
while (keeprunning)
{
string answer = get_answer("");
switch (answer[0])
{
case 'a':
case 'A':
{
add();
break;
}
case 'e':
case 'E':
{
edit();
break;
}
case 'r':
case 'R':
{
remove();
break;
}
case 'v':
case 'V':
{
view();
break;
}
case 'd':
case 'D':
{
details();
break;
}
case 'h':
case 'H':
{
help();
break;
}
case 'q':
case 'Q':
{
keeprunning = false;
break;
}
default:
{
cout << tr("Response not understood.") << '\n';
}
}
}
}
int main(int argc, char *argv[])
{
QCoreApplication 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);
Text t(&app);
return 0;
}

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;
}

View File

@ -1,5 +1,5 @@
/* This file is part of whyblocked.
* Copyright © 2018 tastytea <tastytea@tastytea.de>
* 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
@ -14,31 +14,33 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef INTERFACE_TEXT_HPP
#define INTERFACE_TEXT_HPP
#ifndef DIALOG_ADD_HPP
#define DIALOG_ADD_HPP
#include <string>
#include <QtCore>
#include "mainwindow.hpp"
#include "ui_whyblocked_add.h"
using std::string;
class Text : public QObject
class DialogAdd : public QDialog, private Ui::DialogAdd
{
Q_OBJECT
public:
explicit Text(QObject *parent = nullptr);
explicit DialogAdd(Database &database, QMainWindow *parent = nullptr);
void set_data(const Database::data &data);
private:
const string get_answer(const QString &question);
const bool askblocked();
const void askrecipes(const string &user);
const void add();
const void edit();
const void remove();
const void view();
const void details();
const void help();
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 // INTERFACE_TEXT_HPP
#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

@ -1,5 +1,5 @@
/* This file is part of whyblocked.
* Copyright © 2018 tastytea <tastytea@tastytea.de>
* Copyright © 2018, 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
@ -16,20 +16,27 @@
#include <regex>
#include <array>
#include <locale>
#include <codecvt>
#include <algorithm>
#include <QMessageBox>
#include <QTranslator>
#include <QLibraryInfo>
#include <QtCore/qmimedata.h>
#include <libconfig.h++>
#include "version.hpp"
#include "whyblocked.hpp"
#include "interface_qt.hpp"
#include "mainwindow.hpp"
#include "dialog_add.hpp"
using std::wstring;
MainWindow::MainWindow(QMainWindow *parent)
: QMainWindow(parent)
, _config("whyblocked.cfg")
, _headersize({ 250, 125, 125 })
, _database()
, _dbdata(_database.get_data())
{
std::locale::global(std::locale(""));
setupUi(this);
_model = new QStandardItemModel;
@ -84,9 +91,21 @@ MainWindow::MainWindow(QMainWindow *parent)
const libconfig::Setting &value = root[key.c_str()];
_headersize = { value[0], value[1], value[2] };
}
key = "find_in";
if (root.exists(key) && root[key.c_str()].isGroup())
{
const libconfig::Setting &value = root[key.c_str()];
check_user->setChecked(value["user"]);
check_reason->setChecked(value["reason"]);
}
}
populate_tableview();
widget_find->hide();