Compare commits

..

No commits in common. "57f22a6d6c51df1526e6d841638aa8f6c3275cef" and "ebf640520e012c3d050434e3ddb9d4c9b45db6e5" have entirely different histories.

2 changed files with 68 additions and 119 deletions

View File

@ -1,5 +1,5 @@
import { VRAMArea } from "../vram-components.slint"; import { VRAMArea } from "../vram-components.slint";
import { Button, ComboBox, GroupBox, StandardListView, LineEdit, ScrollView, Slider } from "std-widgets.slint"; import { Button, ComboBox, GroupBox, StandardListView, LineEdit } from "std-widgets.slint";
struct VRAMImage { struct VRAMImage {
img: image, img: image,
@ -10,7 +10,6 @@ struct VRAMImage {
} }
export component MainTab inherits Rectangle { export component MainTab inherits Rectangle {
property <float> scale: 1.0;
in-out property <image> vram_bg; in-out property <image> vram_bg;
in-out property <[StandardListViewItem]> vram_files: []; in-out property <[StandardListViewItem]> vram_files: [];
in-out property <[VRAMImage]> vram_images: []; in-out property <[VRAMImage]> vram_images: [];
@ -24,116 +23,72 @@ export component MainTab inherits Rectangle {
group := GroupBox { group := GroupBox {
title: "VRAM Layout"; title: "VRAM Layout";
x: 4px; x: 4px;
y: 4px; y: 4px;
width: main_view.width + 2*main_view.x;
VerticalLayout { VerticalLayout {
main_view := ScrollView { background_rect := Rectangle {
width: rect.width/root.scale; width: background_image.width + root.get_border_width()*2px;
height: rect.height/root.scale; height: background_image.height + root.get_border_width()*2px;
viewport-x: 0; border-width: root.get_border_width()*1px;
viewport-y: 0; border-color: #404040;
viewport-width: rect.width; background: #A0A0A0;
viewport-height: rect.height; background_image := VRAMArea {
x: root.get_border_width()*1px;
y: root.get_border_width()*1px;
img: vram_bg;
img_x: 0;
img_y: 0;
}
rect := Rectangle { for vram_image[i] in root.vram_images: VRAMArea {
width: background_image.width + root.get_border_width()*2px; x: root.get_border_width()*1px;
height: background_image.height + root.get_border_width()*2px; y: root.get_border_width()*1px;
border-width: root.get_border_width()*1px; img: vram_image.img;
border-color: #404040; img_x: vram_image.x;
background: #A0A0A0; img_y: vram_image.y;
background_image := VRAMArea { TouchArea {
x: root.get_border_width()*1px; x: (parent.img_x + self.lines_crossed_x())*1px;
y: root.get_border_width()*1px; y: (parent.img_y + self.lines_crossed_y())*1px;
img: vram_bg; width: (parent.img.width + self.lines_crossed_width())*1px;
img_x: 0; height: (parent.img.height + self.lines_crossed_height())*1px;
img_y: 0; mouse-cursor: grab;
scale: scale; moved => {
} self.mouse-cursor = MouseCursor.grabbing;
root.move_vram_image(i, (self.mouse-x - self.pressed-x)/1px, (self.mouse-y - self.pressed-y)/1px);
for vram_image[i] in root.vram_images: VRAMArea { cur_sel_x.text = parent.img_x;
x: root.get_border_width()*1px; cur_sel_y.text = parent.img_y;
y: root.get_border_width()*1px; }
img: vram_image.img; pointer-event(event) => {
img_x: vram_image.x; if event.kind == PointerEventKind.up {
img_y: vram_image.y; self.mouse-cursor = MouseCursor.grab;
scale: scale;
TouchArea {
x: ((parent.img_x + self.lines_crossed_x())*1px)*scale;
y: ((parent.img_y + self.lines_crossed_y())*1px)*scale;
width: ((parent.img.width + self.lines_crossed_width())*1px)*scale;
height: ((parent.img.height + self.lines_crossed_height())*1px)*scale;
mouse-cursor: grab;
moved => {
self.mouse-cursor = MouseCursor.grabbing;
root.move_vram_image(i, ((self.mouse-x - self.pressed-x)/scale)/1px, ((self.mouse-y - self.pressed-y)/scale)/1px);
cur_sel_x.text = parent.img_x;
cur_sel_y.text = parent.img_y;
} }
pointer-event(event) => {
if event.kind == PointerEventKind.up { if event.kind == PointerEventKind.down {
self.mouse-cursor = MouseCursor.grab; cur_sel_x.text = parent.img_x;
} cur_sel_y.text = parent.img_y;
cur_sel_img.source = parent.img;
if event.kind == PointerEventKind.down { cur_sel_img.visible = true;
cur_sel_x.text = parent.img_x; vram_files_list.current-item = i;
cur_sel_y.text = parent.img_y;
cur_sel_img.source = parent.img;
cur_sel_img.visible = true;
vram_files_list.current-item = i;
}
}
// Thanks to Cody the white tiger
function lines_crossed_x() -> int {
return parent.img_x/64;
}
function lines_crossed_y() -> int {
return parent.img_y/256;
}
function lines_crossed_width() -> int {
return ((parent.img_x + parent.img.width)/64) - self.lines_crossed_x();
}
function lines_crossed_height() -> int {
return ((parent.img_y + parent.img.height)/256) - self.lines_crossed_y();
} }
} }
}
}
function update_viewport() { // Thanks to Cody the white tiger
if abs(self.viewport-x) + self.width > self.viewport-width { function lines_crossed_x() -> int {
self.viewport-x = 0; return parent.img_x/64;
} }
if abs(self.viewport-y) + self.height > self.viewport-height { function lines_crossed_y() -> int {
self.viewport-y = 0; return parent.img_y/256;
} }
}
}
HorizontalLayout {
padding: 4px;
VerticalLayout {
alignment: center;
padding-right: 4px;
Text {
text: "Scale: " + round(slider.value) + "%";
}
}
slider := Slider {
minimum: 100.0;
maximum: 400.0;
step: 1.0;
value: 100.0;
changed(value) => { function lines_crossed_width() -> int {
root.scale = round(value)/100.0; return ((parent.img_x + parent.img.width)/64) - self.lines_crossed_x();
main_view.update_viewport(); }
function lines_crossed_height() -> int {
return ((parent.img_y + parent.img.height)/256) - self.lines_crossed_y();
}
} }
} }
} }
@ -145,7 +100,7 @@ export component MainTab inherits Rectangle {
alignment: start; alignment: start;
padding: 4px; padding: 4px;
vram_files_list := StandardListView { vram_files_list := StandardListView {
width: background_image.width/root.scale/2; width: background_image.width/2;
height: 128px; height: 128px;
model: root.vram_files; model: root.vram_files;

View File

@ -3,18 +3,14 @@ component VRAMSegment inherits Rectangle {
in property <image> img; in property <image> img;
in property <int> clip_x; in property <int> clip_x;
in property <int> clip_y; in property <int> clip_y;
in property <float> scale: 1.0;
width: 64px*scale; width: 64px;
height: 256px*scale; height: 256px;
clip: true; clip: true;
Image { Image {
source: img; source: img;
x: -root.clip_x*1px*scale; x: -root.clip_x*1px;
y: -root.clip_y*1px*scale; y: -root.clip_y*1px;
width: img.width*1px*scale;
height: img.height*1px*scale;
image-rendering: pixelated;
} }
} }
@ -22,19 +18,17 @@ export component VRAMArea inherits Rectangle {
in property <image> img; in property <image> img;
in property <int> img_x; in property <int> img_x;
in property <int> img_y; in property <int> img_y;
in property <float> scale: 1.0;
width: ((64*16+15)*1px)*scale; width: (64*16+15)*1px;
height: ((256*2+1)*1px)*scale; height: (256*2+1)*1px;
for idx in 32 : VRAMSegment { for idx in 32 : VRAMSegment {
x: (root.get_x(idx)*(64px + 1px))*scale; x: root.get_x(idx)*(64px + 1px);
y: (root.get_y(idx)*(256px + 1px))*scale; y: root.get_y(idx)*(256px + 1px);
img: img; img: img;
clip_x: (root.get_x(idx)*64) - root.img_x; clip_x: (root.get_x(idx)*64) - root.img_x;
clip_y: (root.get_y(idx)*256) - root.img_y; clip_y: (root.get_y(idx)*256) - root.img_y;
scale: root.scale;
} }
function get_x(idx: int) -> int { function get_x(idx: int) -> int {