TUI #1
2
build.rs
2
build.rs
@ -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",
|
||||||
|
|||||||
@ -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
103
src/line_count.rs
Normal 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,
|
||||||
|
}
|
||||||
100
src/main.rs
100
src/main.rs
@ -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};
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user