Commit 15118843 authored by jan.koester's avatar jan.koester
Browse files

test

parent c9376d19
Loading
Loading
Loading
Loading

debian/changelog.dch

0 → 100644
+50 −0
Original line number Diff line number Diff line
blogi (20260416+1) UNRELEASED; urgency=medium

  * AI Tab Optimierungen und HTML-Template Prompts

 -- Jan Koester <jan.koester@intranet.tuxist.de@hel.intranet.tuxist.de>  Thu, 16 Apr 2026 07:43:04 +0200

blogi (20260415+5) unstable; urgency=medium

  * Fix JSON string boolean evaluation from QML in Editor widgets
  * Fix JSON Boolean parsing from QML property strings

 -- Jan Koester <jan.koester@tuxist.de>  Wed, 15 Apr 2026 10:00:01 +0200

blogi (20260415+4) unstable; urgency=medium

  * Fix hidden default:false in all widget schemas (accordion, article,
    button, customhtml, grid, image, list, popup, section, slider,
    survey, table, textbox, video, container)

 -- Jan Koester <jan.koester@tuxist.de>  Tue, 15 Apr 2026 00:00:00 +0200

blogi (20260415+3) unstable; urgency=medium

  * Fix stale currentProps after property save in PropertyPanel

 -- Jan Koester <jan.koester@tuxist.de>  Tue, 15 Apr 2026 00:00:00 +0200

blogi (20260415+2) unstable; urgency=medium

  * Add blogi-dev package with headers and static library

 -- Jan Koester <jan.koester@tuxist.de>  Tue, 15 Apr 2026 00:00:00 +0200

blogi (20260415+1) unstable; urgency=medium

  * Fix container hidden property defaulting to false correctly

 -- Jan Koester <jan.koester@tuxist.de>  Tue, 15 Apr 2026 00:00:00 +0200

blogi (20260411+2) unstable; urgency=medium

  * Rebuild against libdbpp 20260411+2

 -- Jan Koester <jan.koester@tuxist.de>  Sat, 11 Apr 2026 00:00:00 +0200

blogi (20260411+1) unstable; urgency=medium

  * Initial Debian packaging with blogi and blogi-editor packages

 -- Jan Koester <jan.koester@tuxist.de>  Sat, 11 Apr 2026 00:00:00 +0200
+5 −0
Original line number Diff line number Diff line
@@ -22,6 +22,8 @@ qt_add_executable(blogi-editor
    themeprovider.h
    authimageprovider.cpp
    authimageprovider.h
    gitfilesystemmodel.cpp
    gitfilesystemmodel.h
)

qt_add_qml_module(blogi-editor
@@ -35,10 +37,13 @@ qt_add_qml_module(blogi-editor
        qml/PropertyPanel.qml
        qml/PreviewPane.qml
        qml/ConnectionPanel.qml
        qml/FileBrowserTab.qml
        qml/MediaBrowser.qml
        qml/PublishDialog.qml
        qml/publishhelper.js
        qml/AiPromptDialog.qml
        qml/AiTab.qml
        qml/LlmSettingsDialog.qml
)

target_link_libraries(blogi-editor PRIVATE
+71 −0
Original line number Diff line number Diff line
cmake_minimum_required(VERSION 3.18)

find_package(Qt6 REQUIRED COMPONENTS Core Widgets Quick QuickControls2 WebEngineQuick Network)
qt_standard_project_setup()
qt_policy(SET QTP0001 NEW)
qt_policy(SET QTP0004 OLD)

set(CMAKE_AUTOMOC ON)

qt_add_executable(blogi-editor
    main.cpp
    documentmanager.cpp
    documentmanager.h
    htmlimport.cpp
    htmlimport.h
    edit.cpp
    edit.h
    publishclient.cpp
    publishclient.h
    localapi.cpp
    localapi.h
    themeprovider.h
    authimageprovider.cpp
    authimageprovider.h
    gitfilesystemmodel.cpp
    gitfilesystemmodel.h
)

qt_add_qml_module(blogi-editor
    URI BlogiEditor
    VERSION 1.0
    QML_FILES
        qml/Main.qml
        qml/SidebarSection.qml
        qml/WidgetToolbar.qml
        qml/DocumentTree.qml
        qml/PropertyPanel.qml
        qml/PreviewPane.qml
        qml/ConnectionPanel.qml
        qml/FileBrowserTab.qml
        qml/MediaBrowser.qml
        qml/PublishDialog.qml
        qml/publishhelper.js
        qml/AiPromptDialog.qml
)

target_link_libraries(blogi-editor PRIVATE
    Qt6::Core
    Qt6::Widgets
    Qt6::Quick
    Qt6::QuickControls2
    Qt6::WebEngineQuick
    Qt6::Network
    blogidev
    tinyxml2::tinyxml2
    json-c::json-c
    uuidp::uuidp
    htmlpp::htmlpp
)

target_include_directories(blogi-editor PRIVATE
    ${CMAKE_SOURCE_DIR}/src
)

target_compile_definitions(blogi-editor PRIVATE
    WEBEDIT_PLUGIN_DIR="${CMAKE_INSTALL_PREFIX}/lib/blogi/plugins/webedit"
)

add_subdirectory(widgets)

install(TARGETS blogi-editor DESTINATION bin)
+99 −0
Original line number Diff line number Diff line
#include "gitfilesystemmodel.h"
#include <QProcess>
#include <QDir>
#include <QFileInfo>

GitFileSystemModel::GitFileSystemModel(QObject *parent)
    : QFileSystemModel(parent)
{
    setFilter(QDir::AllEntries | QDir::NoDotAndDotDot | QDir::Hidden);
    connect(this, &QFileSystemModel::directoryLoaded, this, &GitFileSystemModel::onDirectoryLoaded);
    connect(this, &QFileSystemModel::rootPathChanged, this, [this](const QString &path){
        updateGitStatus(path);
    });

    _refreshTimer.setInterval(5000);
    connect(&_refreshTimer, &QTimer::timeout, this, &GitFileSystemModel::refreshGitStatus);
    _refreshTimer.start();
}

void GitFileSystemModel::onDirectoryLoaded(const QString &path) {
    updateGitStatus(path);
}

void GitFileSystemModel::refreshGitStatus() {
    updateGitStatus(rootPath());
}

bool GitFileSystemModel::event(QEvent *event) {
    return QFileSystemModel::event(event);
}

QVariant GitFileSystemModel::getRootIndex() const {
    return QVariant::fromValue(index(rootPath()));
}

QString GitFileSystemModel::findGitRepo(const QString &path) const {
    QDir dir(path);
    while (dir.exists()) {
        if (QFileInfo(dir.filePath(".git")).exists()) {
            return dir.absolutePath();
        }
        if (!dir.cdUp()) {
            break;
        }
    }
    return QString();
}

void GitFileSystemModel::updateGitStatus(const QString &repoPath) {
    QString gitPath = findGitRepo(repoPath);
    if (gitPath.isEmpty()) {
        _gitStatuses.clear();
        return; // emit dataChanged maybe?
    }

    QProcess process;
    process.setWorkingDirectory(gitPath);
    process.start("git", QStringList() << "status" << "--porcelain");
    process.waitForFinished(2000);

    QString output = process.readAllStandardOutput();
    QStringList lines = output.split('\n', Qt::SkipEmptyParts);

    QMap<QString, QString> newStatuses;
    for (const QString &line : lines) {
        if (line.length() > 3) {
            QString status = line.left(2);
            QString file = line.mid(3).trimmed();
            newStatuses[QDir(gitPath).filePath(file)] = status;
        }
    }

    if (_gitStatuses != newStatuses) {
        _gitStatuses = newStatuses;
        // Ideally emit dataChanged for all visible indices.
        emit dataChanged(index(rootPath()), index(rootPath()), {GitStatusRole});
    }
}

QHash<int, QByteArray> GitFileSystemModel::roleNames() const {
    QHash<int, QByteArray> roles = QFileSystemModel::roleNames();
    roles[GitStatusRole] = "gitStatus";
    roles[IsFileRole] = "isFile";
    roles[IsDirectoryRole] = "isDirectory";
    return roles;
}

QVariant GitFileSystemModel::data(const QModelIndex &index, int role) const {
    if (role == GitStatusRole) {
        QString path = filePath(index);
        return _gitStatuses.value(path, "");
    } else if (role == IsFileRole) {
        return QFileInfo(filePath(index)).isFile();
    } else if (role == IsDirectoryRole) {
        return QFileInfo(filePath(index)).isDir();
    }
    return QFileSystemModel::data(index, role);
}
+40 −0
Original line number Diff line number Diff line
#pragma once

#include <QFileSystemModel>
#include <QObject>
#include <QMap>
#include <QString>
#include <QTimer>

class GitFileSystemModel : public QFileSystemModel {
    Q_OBJECT
    Q_PROPERTY(QVariant rootIndex READ getRootIndex CONSTANT)
public:
    enum ExtraRoles {
        GitStatusRole = Qt::UserRole + 100,
        IsFileRole = Qt::UserRole + 101,
        IsDirectoryRole = Qt::UserRole + 102
    };
    Q_ENUM(ExtraRoles)

    explicit GitFileSystemModel(QObject *parent = nullptr);

    QHash<int, QByteArray> roleNames() const override;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;

    Q_INVOKABLE void refreshGitStatus();

    QVariant getRootIndex() const;

protected:
    bool event(QEvent *event) override;

private:
    void onDirectoryLoaded(const QString &path);

private:
    QMap<QString, QString> _gitStatuses;
    QTimer _refreshTimer;
    void updateGitStatus(const QString &repoPath);
    QString findGitRepo(const QString &path) const;
};
Loading