This commit is contained in:
Aliberk Sandıkçı 2024-06-21 18:53:38 +03:00
parent 30698d7dd1
commit e84de621c2
Signed by: asandikci
GPG key ID: 25C67A03B5666BC1
4 changed files with 195 additions and 24 deletions

View file

@ -10,7 +10,12 @@ in pkgs.mkShell {
pkgs.gobject-introspection pkgs.gobject-introspection
pkgs.pkg-config pkgs.pkg-config
pkgs.libnotify pkgs.libnotify
# pkgs.libadwaita pkgs.libadwaita
# pkgs.xdg-desktop-portal-shana
# pkgs.xdg-desktop-portal
# pkgs.xdg-desktop-portal-gtk
# pkgs.xdg-desktop-portal-gnome
# pkgs.gtk3
(pkgs.python3.withPackages (python-pkgs: [ (pkgs.python3.withPackages (python-pkgs: [
# select Python packages here # select Python packages here
# python-pkgs.gi # python-pkgs.gi

39
src/FileOperations.py Normal file
View file

@ -0,0 +1,39 @@
import gi, sys
gi.require_version('Gtk', '4.0')
from gi.repository import GLib, Gio
def get_name(file):
info = file.query_info("standard::display-name", Gio.FileQueryInfoFlags.NONE)
if info:
return info.get_attribute_string("standard::display-name")
else:
return file.get_basename()
def read_file(file, on_finish_callback):
file.load_contents_async(None, _read_file_finish, on_finish_callback)
def _read_file_finish(file, result, on_finish_callback):
contents = file.load_contents_finish(result)
if not contents[0]:
path = file.peek_path()
on_finish_callback(file, "", f"Unable to open {path}: {contents[1]}")
return;
try:
on_finish_callback(file, contents[1].decode('utf-8'), "")
except UnicodeError as err:
path = file.peek_path()
on_finish_callback(file, "", f"Unable to load the contents of {path}: the file is not encoded with UTF-8")
def save_file(file, text, on_finish_callback):
file.replace_contents_async(str.encode(text), None, False, Gio.FileCreateFlags.NONE, None, _save_file_finish, on_finish_callback)
def _save_file_finish(file, result, on_finish_callback):
(success, new_etag) = file.replace_contents_finish(result)
on_finish_callback(file, success, new_etag)

View file

@ -2,10 +2,14 @@ import gi, sys
gi.require_version('Gtk', '4.0') gi.require_version('Gtk', '4.0')
from gi.repository import Gtk, Gio from gi.repository import Gtk, Gio
import FileOperations
class MainWindow(Gtk.ApplicationWindow): class MainWindow(Gtk.ApplicationWindow):
def __init__(self, app): def __init__(self, app):
super().__init__(application=app) super().__init__(application=app)
self.setup_variables()
self.setup_actions() self.setup_actions()
self.setup_window() self.setup_window()
@ -15,18 +19,58 @@ class MainWindow(Gtk.ApplicationWindow):
self.setup_ui() self.setup_ui()
# == SETUPS == # == SETUPS ==
def setup_variables(self):
self._current_working_file = None
def setup_actions(self): def setup_actions(self):
pass new_action = Gio.SimpleAction(name="new")
new_action.connect("activate", self.on_action_win_new_activated)
self.add_action(new_action)
open_action = Gio.SimpleAction(name="open")
open_action.connect("activate", self.on_action_win_open_activated)
self.add_action(open_action)
save_action = Gio.SimpleAction(name="save")
save_action.connect("activate" , self.on_action_win_save_activated)
self.add_action(save_action)
save_as_action = Gio.SimpleAction(name="save-as")
save_as_action.connect("activate", self.on_action_win_save_as_activated)
self.add_action(save_as_action)
def setup_window(self): def setup_window(self):
self.set_default_size(600, 400) self.set_default_size(600, 400)
self.set_title("Metin Editörü") self.set_title("Metin Editörü")
def setup_headerbar(self): def setup_headerbar(self):
btn_new = Gtk.Button(label="New", icon_name="document-new-symbolic", tooltip_text="Yeni Doküman") btn_new = Gtk.Button(
btn_open = Gtk.Button(label="Open", icon_name="document-open-symbolic", tooltip_text="Dosya Aç") label="New",
btn_save = Gtk.Button(label="Save", icon_name="document-save-symbolic", tooltip_text="Kaydet") action_name="win.new",
btn_save_as = Gtk.Button(label="Save As", icon_name="document-save-as-symbolic", tooltip_text="Farklı Kaydet") icon_name="document-new-symbolic",
tooltip_text="Yeni Doküman"
)
btn_open = Gtk.Button(
label="Open",
action_name="win.open",
icon_name="document-open-symbolic",
tooltip_text="Dosya Aç"
)
btn_save = Gtk.Button(
label="Save",
action_name="win.save",
icon_name="document-save-symbolic",
tooltip_text="Kaydet"
)
btn_save_as = Gtk.Button(
label="Save As",
action_name="win.save-as",
icon_name="document-save-as-symbolic",
tooltip_text="Farklı Kaydet"
)
box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
box.append(btn_new) box.append(btn_new)
@ -37,7 +81,7 @@ class MainWindow(Gtk.ApplicationWindow):
headerbar = Gtk.HeaderBar() headerbar = Gtk.HeaderBar()
headerbar.pack_start(box) headerbar.pack_start(box)
btn_preferences = Gtk.Button(label="Preferences", icon_name="preferences-system-symbolic", tooltip_text="Seçenekler") btn_preferences = Gtk.Button(label="Preferences", icon_name="open-menu-symbolic", tooltip_text="Seçenekler")
box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
box.append(btn_preferences) box.append(btn_preferences)
headerbar.pack_end(box) headerbar.pack_end(box)
@ -56,6 +100,88 @@ class MainWindow(Gtk.ApplicationWindow):
self.set_child(scrolled_window) self.set_child(scrolled_window)
# == FUNCTIONS == # == FUNCTIONS ==
def get_textview_text(self):
buffer = self.text_view.get_buffer()
start = buffer.get_start_iter()
end = buffer.get_end_iter()
return buffer.get_text(start, end, False)
def set_textview_text(self, text):
buffer = self.text_view.get_buffer()
buffer.set_text(text)
start = buffer.get_start_iter()
buffer.place_cursor(start)
# == CALLBACKS == # == CALLBACKS ==
def on_btn_button_clicked(self, btn): def on_action_win_new_activated(self, action, params):
print("Merhaba, evet bu bir buton") self.set_textview_text("")
self.set_title("New File")
self._current_working_file = None
def on_action_win_open_activated(self, action, params):
self._open_file_chooser = Gtk.FileChooserNative (
title="Open File",
transient_for=self,
action=Gtk.FileChooserAction.OPEN,
accept_label="_Open",
cancel_label="_Cancel"
)
self._open_file_chooser.connect("response", self.on_open_dialog_response)
self._open_file_chooser.show()
def on_open_dialog_response(self, dialog, response):
if response == Gtk.ResponseType.ACCEPT:
FileOperations.read_file(dialog.get_file(), self.on_file_read)
self._open_file_chooser = None
def on_file_read(self, file, content, err):
if err:
print(f"Error: {err}")
return
self.set_textview_text(content)
filename = FileOperations.get_name(file)
self.set_title(filename)
self._current_working_file = file
def on_action_win_save_activated(self, action, params):
if self._current_working_file:
text = self.get_textview_text()
FileOperations.save_file(self._current_working_file, text, self.on_file_saved)
else:
self.activate_action("win.save-as")
def on_action_win_save_as_activated(self, action, params):
self._save_file_chooser = Gtk.FileChooserNative (
title="Save File",
transient_for=self,
action=Gtk.FileChooserAction.SAVE,
accept_label="_Save",
cancel_label="_Cancel"
)
self._save_file_chooser.connect("response", self.on_save_dialog_response)
self._save_file_chooser.show()
def on_save_dialog_response(self, dialog, response):
if response == Gtk.ResponseType.ACCEPT:
text = self.get_textview_text()
FileOperations.save_file(dialog.get_file(), text, self.on_file_saved)
self._save_file_chooser = None
def on_file_saved(self, file, success, new_etag):
if success:
filename = FileOperations.get_name(file)
self.set_title(filename)
self._current_working_file = file

View file

@ -17,6 +17,7 @@ def on_activate(app):
app = Gtk.Application(application_id='com.asandikci.gtk4py') app = Gtk.Application(application_id='com.asandikci.gtk4py')
app.connect('activate', on_activate) app.connect('activate', on_activate)
app.set_accels_for_action('win.new', ['<Ctrl>t'])
app.set_accels_for_action('win.open', ['<Ctrl>o']) app.set_accels_for_action('win.open', ['<Ctrl>o'])
app.set_accels_for_action('win.save', ['<Ctrl>s']) app.set_accels_for_action('win.save', ['<Ctrl>s'])
app.set_accels_for_action('win.save-as', ['<Ctrl><Shift>s']) app.set_accels_for_action('win.save-as', ['<Ctrl><Shift>s'])