Initial repo creation.

This commit is contained in:
Chris
2026-11-11 17:18:15 +00:00
commit 8ca1ee831a
15 changed files with 439 additions and 0 deletions
+3
View File
@@ -0,0 +1,3 @@
[submodule "interface"]
path = interface
url = https://git.teslos.co.uk/Triplehx3/TTK-Interface.git
+17
View File
@@ -0,0 +1,17 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2026 Teslos
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, either version 3 of the License, or
(at your option) any later version.
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 receive a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
+24
View File
@@ -0,0 +1,24 @@
# Teslos Tool Kit
A simple Qt6 / C++ systray tool that acts as a toolkit for applications loaded via plugins.
**Please note that you must have at least one TTK-Plugin installed for this toolkit to be of any use!**
## Build
```bash
git clone https://git.teslos.co.uk/Triplehx3/TTK-App.git
cd TTK-App
git submodule update --init --recursive
mkdir build
cd build
qmake6 ..
make
```
Or simply open the TTK.pro file in the cloned directory inside Qt Creator.
Run the resulting executable from the build directory.
## License
This project is licensed under the GNU General Public License v3.0 - see the [LICENSE](LICENSE) file for details.
+23
View File
@@ -0,0 +1,23 @@
TARGET = TTK
CONFIG(release, debug|release) {
} else {
DEFINES += DEVMODE
}
QMAKE_CXXFLAGS += -Wno-sfinae-incomplete
QT += widgets
HEADERS = interface/interface.h \
plugindialog.h \
window.h
SOURCES = main.cpp \
plugindialog.cpp \
window.cpp
RESOURCES = ttk.qrc
LIBS = -L../plugins
+9
View File
@@ -0,0 +1,9 @@
[Desktop Entry]
Version=1.0
Name=TTK
Comment=A systray based toolkkit of mini but usefull applets.
Exec=/usr/bin/TTK
Icon=/usr/share/icons/hicolor/16x16/apps/TTK.png
Terminal=false
Type=Application
Categories=Utility;Development;
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 819 B

Submodule
+1
Submodule interface added at a60b998305
+14
View File
@@ -0,0 +1,14 @@
#include "window.h"
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
QApplication app(argc, argv);
QApplication::setQuitOnLastWindowClosed(false);
Window window;
return app.exec();
}
+88
View File
@@ -0,0 +1,88 @@
#include "plugindialog.h"
#include "interface/interface.h"
PluginDialog::PluginDialog(const QString &path, const QStringList &fileNames,
QWidget *parent) :
QDialog(parent),
label(new QLabel),
treeWidget(new QTreeWidget),
okButton(new QPushButton(tr("OK")))
{
treeWidget->setAlternatingRowColors(false);
treeWidget->setSelectionMode(QAbstractItemView::NoSelection);
treeWidget->setColumnCount(1);
treeWidget->header()->hide();
okButton->setDefault(true);
connect(okButton, &QAbstractButton::clicked, this, &QWidget::close);
QGridLayout *mainLayout = new QGridLayout;
mainLayout->setColumnStretch(0, 1);
mainLayout->setColumnStretch(2, 1);
mainLayout->addWidget(label, 0, 0, 1, 3);
mainLayout->addWidget(treeWidget, 1, 0, 1, 3);
mainLayout->addWidget(okButton, 2, 1);
setLayout(mainLayout);
interfaceIcon.addPixmap(style()->standardPixmap(QStyle::SP_DirOpenIcon),
QIcon::Normal, QIcon::On);
interfaceIcon.addPixmap(style()->standardPixmap(QStyle::SP_DirClosedIcon),
QIcon::Normal, QIcon::Off);
featureIcon.addPixmap(style()->standardPixmap(QStyle::SP_FileIcon));
setWindowTitle(tr("Plugin Information"));
findPlugins(path, fileNames);
}
void PluginDialog::findPlugins(const QString &path,
const QStringList &fileNames)
{
label->setText(tr("TTK found the following plugins\n"
"(looked in %1):")
.arg(QDir::toNativeSeparators(path)));
const QDir dir(path);
const auto staticInstances = QPluginLoader::staticInstances();
for (QObject *plugin : staticInstances)
populateTreeWidget(plugin, tr("%1 (Static Plugin)")
.arg(plugin->metaObject()->className()));
for (const QString &fileName : fileNames) {
QPluginLoader loader(dir.absoluteFilePath(fileName));
QObject *plugin = loader.instance();
if (plugin)
populateTreeWidget(plugin, fileName);
}
}
void PluginDialog::populateTreeWidget(QObject *plugin, const QString &text)
{
auto pluginItem = new QTreeWidgetItem(treeWidget);
pluginItem->setText(0, text);
pluginItem->setExpanded(true);
QFont boldFont = pluginItem->font(0);
boldFont.setBold(true);
pluginItem->setFont(0, boldFont);
if (plugin) {
auto iBrush = qobject_cast<Interface *>(plugin);
if (iBrush)
addItems(pluginItem, "About", iBrush->pdesc());
}
}
void PluginDialog::addItems(QTreeWidgetItem *pluginItem,
const char *interfaceName,
const QString &feature)
{
auto interfaceItem = new QTreeWidgetItem(pluginItem);
interfaceItem->setText(0, interfaceName);
interfaceItem->setIcon(0, interfaceIcon);
auto featureItem = new QTreeWidgetItem(interfaceItem);
featureItem->setText(0, feature);
featureItem->setIcon(0, featureIcon);
}
+34
View File
@@ -0,0 +1,34 @@
#ifndef PLUGINDIALOG_H
#define PLUGINDIALOG_H
#include <QDialog>
#include <QDir>
#include <QGridLayout>
#include <QHeaderView>
#include <QLabel>
#include <QPluginLoader>
#include <QPushButton>
#include <QTreeWidget>
class PluginDialog : public QDialog
{
Q_OBJECT
public:
PluginDialog(const QString &path, const QStringList &fileNames,
QWidget *parent = nullptr);
private:
void findPlugins(const QString &path, const QStringList &fileNames);
void populateTreeWidget(QObject *plugin, const QString &text);
void addItems(QTreeWidgetItem *pluginItem, const char *interfaceName,
const QString &feature);
QLabel *label;
QTreeWidget *treeWidget;
QPushButton *okButton;
QIcon interfaceIcon;
QIcon featureIcon;
};
#endif
+35
View File
@@ -0,0 +1,35 @@
#include "settingsdialog.h"
settingsdialog::settingsdialog(QWidget *parent) :
QDialog(parent)//,
// label(new QLabel),
// treeWidget(new QTreeWidget),
// okButton(new QPushButton(tr("OK"))
// )
{
// treeWidget->setAlternatingRowColors(false);
// treeWidget->setSelectionMode(QAbstractItemView::NoSelection);
// treeWidget->setColumnCount(1);
// treeWidget->header()->hide();
// okButton->setDefault(true);
// connect(okButton, &QAbstractButton::clicked, this, &QWidget::close);
// QGridLayout *mainLayout = new QGridLayout;
// mainLayout->setColumnStretch(0, 1);
// mainLayout->setColumnStretch(2, 1);
// mainLayout->addWidget(label, 0, 0, 1, 3);
// mainLayout->addWidget(treeWidget, 1, 0, 1, 3);
// mainLayout->addWidget(okButton, 2, 1);
// setLayout(mainLayout);
// interfaceIcon.addPixmap(style()->standardPixmap(QStyle::SP_DirOpenIcon),
// QIcon::Normal, QIcon::On);
// interfaceIcon.addPixmap(style()->standardPixmap(QStyle::SP_DirClosedIcon),
// QIcon::Normal, QIcon::Off);
// featureIcon.addPixmap(style()->standardPixmap(QStyle::SP_FileIcon));
// setWindowTitle(tr("Plugin Information"));
// findPlugins(path, fileNames);
}
+16
View File
@@ -0,0 +1,16 @@
#ifndef SETTINGSDIALOG_H
#define SETTINGSDIALOG_H
#include <QDialog>
class settingsdialog : public QDialog
{
Q_OBJECT
public:
explicit settingsdialog(QWidget *parent = nullptr);
signals:
};
#endif // SETTINGSDIALOG_H
+5
View File
@@ -0,0 +1,5 @@
<RCC>
<qresource prefix="/">
<file>images/smile.png</file>
</qresource>
</RCC>
+124
View File
@@ -0,0 +1,124 @@
#include "window.h"
#include "interface/interface.h"
#include "plugindialog.h"
Window::Window()
{
createActions();
createTrayIcon();
loadPlugins();
setIcon();
trayIcon->show();
}
void Window::loadPlugins()
{
QString pluginPath = "";
#ifdef DEVMODE
pluginPath = QCoreApplication::applicationDirPath() + "/plugins";
#else
pluginPath = "/usr/lib/ttk/plugins";
#endif
pluginsDir = QDir(pluginPath);
const auto entryList = pluginsDir.entryList(QDir::Files);
for (const QString &fileName : entryList) {
QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));
QObject *plugin = loader.instance();
if (plugin) {
populateMenu(plugin);
pluginFileNames += fileName;
}
}
addtrayactions();
}
void Window::changePlugin()
{
auto action = qobject_cast<QAction *>(sender());
if (!action)
return;
auto iPlugin = qobject_cast<Interface *>(action->parent());
if (!iPlugin)
return;
QWidget* output = new QWidget();
output = iPlugin->pcontent();
output->show();
}
void Window::populateMenu(QObject *plugin)
{
auto iPlugin = qobject_cast<Interface *>(plugin);
if (iPlugin)
addToMenu(plugin, iPlugin->pname(), trayIconMenu, &Window::changePlugin);
}
void Window::addToMenu(QObject *plugin, const QString &text,
QMenu *menu, Member member)
{
auto action = new QAction(text, plugin);
connect(action, &QAction::triggered, this, member);
menu->addAction(action);
}
void Window::setIcon()
{
QIcon icon = QIcon(":/images/smile.png");
setWindowIcon(icon);
trayIcon->setIcon(icon);
trayIcon->setToolTip("TTK");
}
void Window::createActions()
{
quitAction = new QAction(tr("&Quit"), this);
connect(quitAction, &QAction::triggered, qApp, &QCoreApplication::quit);
aboutAct = new QAction(tr("&About"), this);
connect(aboutAct, &QAction::triggered, this, &Window::about);
aboutQtAct = new QAction(tr("About &Qt"), this);
connect(aboutQtAct, &QAction::triggered, qApp, &QApplication::aboutQt);
aboutPluginsAct = new QAction(tr("About &Plugins"), this);
connect(aboutPluginsAct, &QAction::triggered, this, &Window::aboutPlugins);
}
void Window::about()
{
QMessageBox::about(this, tr("About TTK"),
tr("This is a wierd handy thing."));
}
void Window::aboutPlugins()
{
PluginDialog dialog(pluginsDir.path(), pluginFileNames, this);
dialog.exec();
}
void Window::addtrayactions()
{
trayIconMenu->addSeparator();
trayIconMenu->addAction(aboutAct);
trayIconMenu->addAction(aboutQtAct);
trayIconMenu->addAction(aboutPluginsAct);
trayIconMenu->addSeparator();
trayIconMenu->addAction(quitAction);
}
void Window::createTrayIcon()
{
trayIconMenu = new QMenu(this);
trayIcon = new QSystemTrayIcon(this);
trayIcon->setContextMenu(trayIconMenu);
}
+46
View File
@@ -0,0 +1,46 @@
#ifndef WINDOW_H
#define WINDOW_H
#include <QSystemTrayIcon>
#include <QDialog>
#include <QDir>
#include <QMenu>
#include <QApplication>
#include <QCoreApplication>
#include <QMessageBox>
class Window : public QDialog
{
Q_OBJECT
public:
Window();
private:
void setIcon();
void changePlugin();
void about();
void aboutPlugins();
typedef void (Window::*Member)();
void createActions();
void createTrayIcon();
void loadPlugins();
void addtrayactions();
void populateMenu(QObject *plugin);
void addToMenu(QObject *plugin, const QString &text, QMenu *menu,Member member);
QAction *quitAction;
QStringList pluginFileNames;
QDir pluginsDir;
QMenu *fileMenu;
QMenu *helpMenu;
QSystemTrayIcon *trayIcon;
QMenu *trayIconMenu;
QAction *exitAct;
QAction *aboutAct;
QAction *aboutQtAct;
QAction *aboutPluginsAct;
};
#endif