TUI #1

Merged
shaunrd0 merged 73 commits from ui into master 2026-01-25 20:57:37 +00:00
4 changed files with 109 additions and 112 deletions
Showing only changes of commit 500a329dea - Show all commits

View File

@ -10,7 +10,7 @@ fn main() {
.qt_module("Network") .qt_module("Network")
.qml_module(QmlModule { .qml_module(QmlModule {
uri: "clide.module", uri: "clide.module",
rust_files: &["src/main.rs"], rust_files: &["src/line_count.rs"],
qml_files: &["qml/main.qml", qml_files: &["qml/main.qml",
"qml/ProjectView/ClideProjectView.qml", "qml/ProjectView/ClideProjectView.qml",
"qml/Editor/ClideEditor.qml", "qml/Editor/ClideEditor.qml",

View File

@ -22,7 +22,6 @@ SplitView {
} }
} }
} }
RowLayout { RowLayout {
// We use a flickable to synchronize the position of the editor and // We use a flickable to synchronize the position of the editor and
// the line numbers. This is necessary because the line numbers can // the line numbers. This is necessary because the line numbers can
@ -41,14 +40,16 @@ SplitView {
Column { Column {
anchors.fill: parent anchors.fill: parent
topPadding: 6
Repeater { Repeater {
id: repeatedLineNumbers id: repeatedLineNumbers
// Each line number in the gutter.
delegate: Item { delegate: Item {
required property int index required property int index
height: Math.ceil(fontMetrics.lineSpacing) height: 17
width: parent.width width: parent.width
Label { Label {
@ -71,12 +72,7 @@ SplitView {
width: 1 width: 1
} }
} }
model: LineCount { model: areaText.lineCount
id: lineCountModel
// This count sets the max line numbers shown in the gutter.
count: areaText.lineCount
}
} }
} }
} }
@ -107,10 +103,6 @@ SplitView {
textFormat: Qt.AutoText textFormat: Qt.AutoText
wrapMode: TextArea.Wrap wrapMode: TextArea.Wrap
onTextChanged: {
console.log("Updated line count: " + areaText.lineCount)
}
background: Rectangle { background: Rectangle {
color: "#2b2b2b" color: "#2b2b2b"
} }

103
src/line_count.rs Normal file
View File

@ -0,0 +1,103 @@
// TODO: Header
#[cxx_qt::bridge]
pub mod qobject {
unsafe extern "C++" {
include!("cxx-qt-lib/qvariant.h");
type QVariant = cxx_qt_lib::QVariant;
include!(<QtCore/QAbstractListModel>);
type QModelIndex = cxx_qt_lib::QModelIndex;
type QAbstractListModel;
}
unsafe extern "RustQt" {
#[qobject]
#[base = QAbstractListModel]
type AbstractListModel = super::AbstractListModelRust;
#[qobject]
#[base = AbstractListModel]
#[qml_element]
#[qproperty(i32, count)]
type LineCount = super::LineCountRust;
}
unsafe extern "RustQt" {
#[cxx_name = "beginInsertRows"]
#[inherit]
fn beginInsertRows(self: Pin<&mut LineCount>, parent: &QModelIndex, first: i32, last: i32);
#[cxx_name = "endInsertRows"]
#[inherit]
fn endInsertRows(self: Pin<&mut LineCount>);
#[cxx_name = "beginRemoveRows"]
#[inherit]
fn beginRemoveRows(self: Pin<&mut LineCount>, parent: &QModelIndex, first: i32, last: i32);
#[cxx_name = "endRemoveRows"]
#[inherit]
fn endRemoveRows(self: Pin<&mut LineCount>);
#[qinvokable]
fn set_line_count(self: Pin<&mut LineCount>, line_count: i32);
#[qinvokable]
#[cxx_override]
fn data(self: &LineCount, index: &QModelIndex, role: i32) -> QVariant;
#[qinvokable]
#[cxx_override]
#[cxx_name = "rowCount"]
fn row_count(self: &LineCount, _parent: &QModelIndex) -> i32;
}
}
use cxx_qt::CxxQtType;
use cxx_qt_lib::{QModelIndex, QVariant};
impl qobject::LineCount {
pub fn set_line_count(mut self: std::pin::Pin<&mut Self>, line_count: i32) {
let current_count = self.as_mut().rust_mut().count;
if line_count < 0 || current_count == line_count {
log::warn!(
"Can't set line count: {}; Current count: {}",
line_count,
current_count
);
return;
}
if current_count < line_count {
self.as_mut()
.beginInsertRows(&QModelIndex::default(), current_count, line_count - 1);
self.as_mut().endInsertRows();
} else if current_count > line_count {
self.as_mut()
.beginRemoveRows(&QModelIndex::default(), line_count, current_count - 1);
self.as_mut().endRemoveRows();
}
self.as_mut().rust_mut().count = line_count;
log::warn!(
"Line count changed from {} to {}",
current_count,
line_count
);
}
pub fn row_count(self: &Self, _parent: &QModelIndex) -> i32 {
*self.count()
}
pub fn data(self: &Self, _index: &QModelIndex, _role: i32) -> QVariant {
QVariant::default()
}
}
/// A struct which inherits from QAbstractListModel
#[derive(Default)]
pub struct AbstractListModelRust {}
#[derive(Default)]
pub struct LineCountRust {
pub count: i32,
}

View File

@ -1,104 +1,6 @@
// TODO: Header // TODO: Header
#[cxx_qt::bridge] pub mod line_count;
pub mod qobject {
unsafe extern "C++" {
include!("cxx-qt-lib/qvariant.h");
type QVariant = cxx_qt_lib::QVariant;
include!(<QtCore/QAbstractListModel>);
type QModelIndex = cxx_qt_lib::QModelIndex;
type QAbstractListModel;
}
unsafe extern "RustQt" {
#[qobject]
#[base = QAbstractListModel]
type AbstractListModel = super::AbstractListModelRust;
#[qobject]
#[base = AbstractListModel]
#[qml_element]
#[qproperty(i32, count)]
type LineCount = super::LineCountRust;
#[cxx_name = "beginInsertRows"]
#[inherit]
fn beginInsertRows(self: Pin<&mut LineCount>, parent: &QModelIndex, first: i32, last: i32);
#[cxx_name = "endInsertRows"]
#[inherit]
fn endInsertRows(self: Pin<&mut LineCount>);
#[cxx_name = "beginRemoveRows"]
#[inherit]
fn beginRemoveRows(self: Pin<&mut LineCount>, parent: &QModelIndex, first: i32, last: i32);
#[cxx_name = "endRemoveRows"]
#[inherit]
fn endRemoveRows(self: Pin<&mut LineCount>);
#[qinvokable]
pub fn set_line_count(self: Pin<&mut LineCount>, line_count: i32);
#[qinvokable]
#[cxx_override]
fn data(self: &LineCount, index: &QModelIndex, role: i32) -> QVariant;
#[qinvokable]
#[cxx_override]
#[cxx_name = "rowCount"]
fn row_count(self: &LineCount, _parent: &QModelIndex) -> i32;
}
}
use cxx_qt::CxxQtType;
use cxx_qt_lib::{QModelIndex, QVariant};
impl qobject::LineCount {
pub fn set_line_count(mut self: std::pin::Pin<&mut Self>, line_count: i32) {
let current_count = self.as_mut().rust_mut().count;
if line_count < 0 || current_count == line_count {
log::warn!(
"Can't set line count: {}; Current count: {}",
line_count,
current_count
);
return;
}
if current_count < line_count {
self.as_mut()
.beginInsertRows(&QModelIndex::default(), current_count, line_count - 1);
self.as_mut().endInsertRows();
} else if current_count > line_count {
self.as_mut()
.beginRemoveRows(&QModelIndex::default(), line_count, current_count - 1);
self.as_mut().endRemoveRows();
}
self.as_mut().rust_mut().count = line_count;
log::warn!(
"Line count changed from {} to {}",
current_count,
line_count
);
}
pub fn row_count(self: &Self, _parent: &QModelIndex) -> i32 {
*self.count()
}
pub fn data(self: &Self, _index: &QModelIndex, _role: i32) -> QVariant {
QVariant::default()
}
}
/// A struct which inherits from QAbstractListModel
#[derive(Default)]
pub struct AbstractListModelRust {}
#[derive(Default)]
pub struct LineCountRust {
pub count: i32,
}
fn main() { fn main() {
use cxx_qt_lib::{QGuiApplication, QQmlApplicationEngine, QUrl}; use cxx_qt_lib::{QGuiApplication, QQmlApplicationEngine, QUrl};