This commit is contained in:
2026-03-05 10:59:06 +01:00
parent 99f30a6798
commit 3b53a945f9
11 changed files with 133 additions and 13 deletions

View File

@@ -22,6 +22,9 @@
#define COMMAND_SHOW_NORMAL_WIN 16
#define COMMAND_WINDOW_STATUS 17
#define COMMAND_SET_TITLE 18
#define COMMAND_CHOOSE_DIR 19
#define COMMAND_OPEN_FILE 20
#define COMMAND_SAVE_FILE 21
class Command
{

View File

@@ -51,7 +51,7 @@ int main(int argc, char *argv[])
if (i == 10) {
wv2 = rkt_webview_create(0, eventCb);
wv2 = rkt_webview_create(wv1, eventCb);
rkt_webview_move(wv2, 400, 200);
rkt_webview_resize(wv2, 800, 600);
rkt_webview_set_url(wv2, "https://127.0.0.1");

View File

@@ -184,3 +184,9 @@ result_t rkt_webview_set_title(rktwebview_t wv, const char *title)
rkt_webview_init();
return handler->rktWindowSetTitle(wv, title);
}
rkt_js_result_t *rkt_webview_choose_dir(rktwebview_t w, const char *title, const char *base_dir)
{
rkt_webview_init();
return handler->rktChooseDir(w, title, base_dir);
}

View File

@@ -29,7 +29,10 @@ typedef enum {
webview_unspecified = 10,
webview_dispatch_failed = 11,
move_failed = 12,
resize_failed = 13
resize_failed = 13,
choose_dir_failed = 14,
open_file_failed = 15,
save_file_failed = 16
} result_t;
typedef struct {
@@ -77,6 +80,8 @@ RKTWEBVIEW_QT_EXPORT result_t rkt_webview_maximize(rktwebview_t w);
RKTWEBVIEW_QT_EXPORT result_t rkt_webview_minimize(rktwebview_t w);
RKTWEBVIEW_QT_EXPORT window_state_t rkt_webview_window_state(rktwebview_t w);
RKTWEBVIEW_QT_EXPORT rkt_js_result_t *rkt_webview_choose_dir(rktwebview_t w, const char *title, const char *base_dir);
}
#endif // RKTWEBVIEW_H

View File

@@ -10,6 +10,7 @@
#include <QJsonObject>
#include <QAbstractEventDispatcher>
#include "command.h"
#include <QFileDialog>
void Rktwebview_qt::processCommand(Command *cmd)
{
@@ -25,7 +26,7 @@ void Rktwebview_qt::processCommand(Command *cmd)
void *f = cmd->args[1].value<void *>();
event_cb_t js_event_cb = reinterpret_cast <event_cb_t>(f);
QWidget *p;
WebviewWindow *p;
if (_views.contains(parent)) {
p = _views[parent];
} else {
@@ -248,6 +249,31 @@ void Rktwebview_qt::processCommand(Command *cmd)
cmd->done = true;
}
break;
case COMMAND_CHOOSE_DIR: {
int wv = cmd->args[0].toInt();
QString title = cmd->args[1].toString();
QString base_dir = cmd->args[2].toString();
if (_views.contains(wv)) {
WebviewWindow *w = _views[wv];
QString dir = QFileDialog::getExistingDirectory(w, title, base_dir, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
if (dir == "") {
QJsonObject obj;
obj["state"] = "canceled";
obj["dir"] = base_dir;
cmd->result = QString::fromUtf8(QJsonDocument(obj).toJson(QJsonDocument::JsonFormat::Compact));
} else {
QJsonObject obj;
obj["state"] = "choosen";
obj["dir"] = dir;
cmd->result = QString::fromUtf8(QJsonDocument(obj).toJson(QJsonDocument::JsonFormat::Compact));
}
} else {
cmd->js_result_ok = false;
cmd->result = false;
}
cmd->done = true;
}
break;
default: {
cmd->result = false;
cmd->done = true;
@@ -433,6 +459,31 @@ window_state_t Rktwebview_qt::rktWindowState(rktwebview_t w)
return ws;
}
rkt_js_result_t *Rktwebview_qt::rktChooseDir(rktwebview_t w, const char *title, const char *base_dir)
{
Command c(COMMAND_CHOOSE_DIR);
c.args.push_back(w);
QString t(title);
c.args.push_back(t);
QString dir(base_dir);
c.args.push_back(dir);
postCommand(&c);
while(!c.done) { doEvents(); }
bool oke = c.js_result_ok;
rkt_js_result_t *r = static_cast<rkt_js_result_t *>(malloc(sizeof(rkt_js_result_t)));
r->result = c.js_result_ok ? result_t::oke : result_t::choose_dir_failed;
r->value = strdup(c.result.toString().toUtf8());
return r;
}
result_t Rktwebview_qt::rktWindowSetTitle(rktwebview_t wv, const char *title)
{
Command c(COMMAND_SET_TITLE);

View File

@@ -84,6 +84,8 @@ public:
result_t rktShowNormalWindow(rktwebview_t w);
window_state_t rktWindowState(rktwebview_t w);
rkt_js_result_t *rktChooseDir(rktwebview_t w, const char *title, const char *base_dir);
result_t rktWindowSetTitle(rktwebview_t wv, const char *title);
bool rktValid(rktwebview_t wv);

View File

@@ -11,20 +11,27 @@
#include <QWebEngineScriptCollection>
#include <QWebEngineScript>
#include <QMoveEvent>
#include <QWindow>
WebviewWindow::WebviewWindow(QWidget *parent)
WebviewWindow::WebviewWindow(WebviewWindow *parent)
: QMainWindow{parent}
{
_view = nullptr;
_must_close = false;
_devtools = nullptr;
_parent = parent;
_window_created = false;
_moved = 0;
_resized = 0;
if (parent != nullptr) {
setWindowModality(Qt::WindowModality::WindowModal);
setWindowFlag(Qt::WindowType::Dialog, true);
}
connect(&_resize_timer, &QTimer::timeout, this, &WebviewWindow::triggerResize);
connect(&_move_timer, &QTimer::timeout, this, &WebviewWindow::triggerMove);
}
@@ -227,6 +234,7 @@ void WebviewWindow::triggerResize()
void WebviewWindow::showEvent(QShowEvent *event)
{
_window_created = true;
EventContainer show("show");
_container->triggerEvent(_view->id(), show);
}

View File

@@ -15,6 +15,7 @@ private:
Rktwebview_qt *_container;
WebViewQt *_view;
QMainWindow *_devtools;
WebviewWindow *_parent;
QTimer _resize_timer;
QTimer _move_timer;
@@ -51,7 +52,7 @@ public:
void openDevTools();
public:
explicit WebviewWindow(QWidget *parent = nullptr);
explicit WebviewWindow(WebviewWindow *parent = nullptr);
private slots:
void triggerResize();