LINUX.ORG.RU
ФорумTalks

[плача тред] Задолбался с этим вашим windows way-ем.


0

3

Вопросы, на которые я не знаю ответов:

1. Как из скрипта получить список объектов «Открыть с помощью», ассоциированных с заданным MIME?

2. Какое есть приложение для отображения диалога «Свойства файлов» а ля аналогичные диалоги из наутилус/тунар/pcmanfm? (Нет такого приложения)

3. Какая есть утилита, аналогичная диалогу копирования/перемещения файлов из двухпанельных ФМ. С умными вопросами типа «файл уже существует, заменить/пропустить/переименовать?» (Нет такой утилиты.)

4. Какая есть утилита — универсальный вьюер файлов. С переключением режимов текст/hex-дамп/html/картинко и т.п. С поддержкой кодировок. С поддержкой файлов произвольного размера. С поддержкой плагинов. (Нет такой утилиты.)

5. Какая есть утилита графический фронт-энд для find? (Нет такой утилиты. catfish убог чуть более, чем совсем. Уже подумываю о том, чтобы запилить собственную на Ruby и назвать dogfish.)

Ну и так далее. Смотрю на типичный софт и вижу: не линукс, а сплошная «винда-виндой, только бесплатная». Горы неюзабельного, недопиленного говна. Четыре DE. Десяток файловых менеджеров. Два десятка проигрывателей. Четыре десятка текстовых редакторов. Комбайны, архитектурно не способные к интеграции и взаимодействию. Задрало.

Выдохнул.

Ответ на: комментарий от geekless
@change_agent.signal_connect("changed"){
			if (@change_agent.active_text() == "find") then
				@agent_gui_box.destroy
				@agent_gui_box = Gtk::VBox.new()
				@window_box.pack_start @agent_gui_box, true    
				@window_box.reorder_child(@agent_gui_box, 1)
				@agent = SearchAgentFind.new(self, @history_dispatcher)
				@agent.build_gui(@agent_gui_box)
				@window.show_all
			elsif (@change_agent.active_text() == "locate") then
				@agent_gui_box.destroy
				@agent_gui_box = Gtk::VBox.new()
				@window_box.pack_start @agent_gui_box, true
				@window_box.reorder_child(@agent_gui_box, 1)
				@agent = SearchAgentLocate.new(self, @history_dispatcher)
				@agent.build_gui(@agent_gui_box)
				@window.show_all
			end

		}

Теперь все нормально, но кнопка «Найти» и комбобокс переезжают наверх.

netcat ★★
()

Я решил создать класс Main, абстракцию над Dogfish. Теперь Dogfish оперирует только window_box`ом и размещает там элементы. При нажатии на кнопку «New tab» Dogfish вызывает Main.new_tab и Main,в свою очередь, создает новую вкладку с боксом и экземпляр Dogfish для этого бокса. Но есть одна бага. Попробуй найти что-нибудь, когда агент - find, а затем переключи на locate c помощью комбобокса. Dogfish упадет. Патч и изменениями:

diff --git a/src/dogfish.rb b/src/dogfish.rb
index e91aa4b..a745eda 100755
--- a/src/dogfish.rb
+++ b/src/dogfish.rb
@@ -452,7 +452,7 @@ class SearchAgentLocate
 	end
 end
 
-class Dogfish < Gtk::Window
+class Dogfish #< Gtk::Window
 
 #	include GetText
 #	bindtextdomain("dogfish")
@@ -460,36 +460,61 @@ class Dogfish < Gtk::Window
 	attr_reader :force_exit
 	attr_reader :stop_search
 
-	def initialize
-		super
-		@history_dispatcher = HistoryDispatcher.new
-		#@agent = SearchAgentFind.new(self, @history_dispatcher)
-		@agent = SearchAgentLocate.new(self, @history_dispatcher)
+	def initialize(main, window_box)
 
+		@history_dispatcher = HistoryDispatcher.new
+		@agent = SearchAgentFind.new(self, @history_dispatcher)
+		#@agent = SearchAgentLocate.new(self, @history_dispatcher)
+        @window_box = window_box
+        @main = main
 		@found_files = []
 		@found_files_by_path = Hash[]
-
-		@window = Gtk::Window.new
-		@window_box = Gtk::VBox.new()
-		@window.add @window_box
-
-		@window.title = "dogfish"
-		@window.default_width = 750
-		@window.default_height = 500
-
+        
 		# Search box
 
 		@search_box = Gtk::HBox.new()
 		@window_box.pack_start @search_box, false
 
-		agent_gui_box = Gtk::VBox.new()
-		@search_box.pack_start agent_gui_box, true
+		@agent_gui_box = Gtk::VBox.new()
+		@search_box.pack_start @agent_gui_box, true
 
-		@agent.build_gui(agent_gui_box)
+		@agent.build_gui(@agent_gui_box)
 
 		@button_find = Gtk::Button.new(Gtk::Stock::FIND)
 		@search_box.pack_start @button_find, false
 
+		@change_agent = Gtk::ComboBox.new(true)
+		@search_box.pack_start @change_agent, false
+		["find", "locate"].each {|x| @change_agent.prepend_text(x)}
+        @change_agent.set_active(1)
+        		    
+        @new_tab_button = Gtk::Button.new("New tab")
+        @search_box.pack_start @new_tab_button, false
+        @new_tab_button.signal_connect("clicked"){
+            @main.new_tab()
+        }
+        
+		@change_agent.signal_connect("changed"){
+			if (@change_agent.active_text() == "find") then
+				@agent_gui_box.destroy
+				@agent_gui_box = Gtk::VBox.new()
+				@search_box.pack_start @agent_gui_box
+				@search_box.reorder_child @agent_gui_box, 0
+				@agent = SearchAgentFind.new(self, @history_dispatcher)
+				@agent.build_gui(@agent_gui_box)
+				@main.window().show_all
+			elsif (@change_agent.active_text() == "locate") then
+				@agent_gui_box.destroy
+				@agent_gui_box = Gtk::VBox.new()
+				@search_box.pack_start @agent_gui_box
+				@search_box.reorder_child @agent_gui_box, 0
+				@agent = SearchAgentLocate.new(self, @history_dispatcher)
+				@agent.build_gui(@agent_gui_box)
+				@main.window().show_all
+			end
+
+		}
+
 		# Treeview
 
 		@scrolled_files = Gtk::ScrolledWindow.new
@@ -520,7 +545,6 @@ class Dogfish < Gtk::Window
 		@statusbar.add @found_label
 
 
-		@window.signal_connect('destroy'){self.on_button_close_clicked}
 		@button_find.signal_connect('clicked'){self.on_button_find_clicked}
 
 		initialize_file_menu
@@ -548,12 +572,6 @@ class Dogfish < Gtk::Window
 		@force_exit = false
 		@stop_search = false
 		@searching = false
-
-
-		@window.show_all
-
-		# Start GTK processing
-		Gtk.main()
 	end
 
 
@@ -594,11 +612,6 @@ class Dogfish < Gtk::Window
 		@file_menu.show_all
 	end
 
-	def on_button_close_clicked
-		@force_exit = true;
-		Gtk.main_quit
-	end
-
 	def find_update_stat
 		@found_label.text =_('%d found') % @found_files.size
 		Gtk.main_iteration while Gtk.events_pending?
@@ -777,4 +790,41 @@ class Dogfish < Gtk::Window
 
 end
 
-Dogfish.new
+class Main
+
+def initialize()
+        super
+        @window = Gtk::Window.new
+		@notebook = Gtk::Notebook.new()
+		@window.title = "dogfish"
+		@window.default_width = 750
+		@window.default_height = 500
+		@window.signal_connect('destroy'){self.on_button_close_clicked}
+		@window_box = Gtk::VBox.new()
+		@window.add @notebook
+		@notebook.append_page @window_box
+		@dogfish = Dogfish.new(self, @window_box)
+		@window.show_all
+
+		# Start GTK processing
+		Gtk.main()
+end
+
+def new_tab()
+    window_box = Gtk::VBox.new()
+    @notebook.append_page window_box
+    dogfish = Dogfish.new(self, window_box)
+end
+
+def window
+@window
+end
+
+def on_button_close_clicked
+		@force_exit = true;
+		Gtk.main_quit
+end
+
+end
+
+Main.new

netcat ★★
()
Ответ на: комментарий от netcat

Текст ошибки:

src/dogfish.rb:110:in `child': destroyed GLib::Object
	 from src/dogfish.rb:110:in `save'
	 from src/dogfish.rb:106:in `block in save'
	 from src/dogfish.rb:106:in `each_key'
	 from src/dogfish.rb:106:in `save'
	 from src/dogfish.rb:430:in `do_search'
	 from src/dogfish.rb:763:in `find'
	 from src/dogfish.rb:786:in `on_button_find_clicked'
	 from src/dogfish.rb:548:in `block in initialize'
	 from src/dogfish.rb:810:in `call'
	 from src/dogfish.rb:810:in `main'
	 from src/dogfish.rb:810:in `initialize'
	 from src/dogfish.rb:830:in `new'
	 from src/dogfish.rb:830:in `<main>'

netcat ★★
()
Ответ на: комментарий от netcat
class HistoryDispatcher

	def initialize()
		@widgets = Hash[] # <- фикс
	end
	def register_widget(widget, agent_id, widget_id)
		@widgets[agent_id] = Hash[] if !@widgets.has_key?(agent_id)  # <- фикс
		@widgets[agent_id][widget_id] = widget
geekless ★★
() автор топика
Ответ на: комментарий от netcat
@widgets = Hash.new(Hash.new) # При обращении к несуществующим ключам в @widgets, они будут инициализироваться ссылкой на один и тот же объект.

@widgets = Hash.new{Hash.new} # При обращении к несуществующим ключам в @widgets, каждый раз будет вызываться указанный блок, и возвращаемое им значение будет использовано.
geekless ★★
() автор топика
Ответ на: комментарий от geekless

Но для начала мне нужно получить номер вкладки с фокусом. Gtk::Notebook.page() выдает номер последней созданной страницы

netcat ★★
()
Ответ на: комментарий от geekless

Неправильно, ведь оно дает номер последней СОЗДАННОЙ страницы, а мне нужен номер АКТИВНОЙ страницы. А через этот сигнал я могу нагородить костыль. Щас запилю и отправлю PR

netcat ★★
()
Ответ на: комментарий от geekless

НЕНАВИСТЬ

diff --git a/src/dogfish.rb b/src/dogfish.rb
index e91aa4b..78308a7 100755
--- a/src/dogfish.rb
+++ b/src/dogfish.rb
@@ -62,7 +62,7 @@ end
 class HistoryDispatcher
 
 	def initialize()
-		@widgets = Hash.new(Hash.new)
+		@widgets = Hash.new{Hash.new}
 	end
 
 	def get_history_list(agent_id, widget_id, to_append = [])
@@ -452,7 +452,7 @@ class SearchAgentLocate
 	end
 end
 
-class Dogfish < Gtk::Window
+class Dogfish #< Gtk::Window
 
 #	include GetText
 #	bindtextdomain("dogfish")
@@ -460,36 +460,67 @@ class Dogfish < Gtk::Window
 	attr_reader :force_exit
 	attr_reader :stop_search
 
-	def initialize
-		super
-		@history_dispatcher = HistoryDispatcher.new
-		#@agent = SearchAgentFind.new(self, @history_dispatcher)
-		@agent = SearchAgentLocate.new(self, @history_dispatcher)
+	def initialize(main, window_box)
 
+		@history_dispatcher = HistoryDispatcher.new
+		@agent = SearchAgentFind.new(self, @history_dispatcher)
+		#@agent = SearchAgentLocate.new(self, @history_dispatcher)
+        @window_box = window_box
+        @main = main
 		@found_files = []
 		@found_files_by_path = Hash[]
-
-		@window = Gtk::Window.new
-		@window_box = Gtk::VBox.new()
-		@window.add @window_box
-
-		@window.title = "dogfish"
-		@window.default_width = 750
-		@window.default_height = 500
-
+        
 		# Search box
 
 		@search_box = Gtk::HBox.new()
 		@window_box.pack_start @search_box, false
 
-		agent_gui_box = Gtk::VBox.new()
-		@search_box.pack_start agent_gui_box, true
+		@agent_gui_box = Gtk::VBox.new()
+		@search_box.pack_start @agent_gui_box, true
 
-		@agent.build_gui(agent_gui_box)
+		@agent.build_gui(@agent_gui_box)
 
 		@button_find = Gtk::Button.new(Gtk::Stock::FIND)
 		@search_box.pack_start @button_find, false
 
+		@change_agent = Gtk::ComboBox.new(true)
+		@search_box.pack_start @change_agent, false
+		["find", "locate"].each {|x| @change_agent.prepend_text(x)}
+        @change_agent.set_active(1)
+        		    
+        @new_tab_button = Gtk::Button.new("New tab")
+        @search_box.pack_start @new_tab_button, false
+        @new_tab_button.signal_connect("clicked"){
+            @main.new_tab()
+        }
+        
+        @close_tab_button = Gtk::Button.new("Close tab")
+        @search_box.pack_start @close_tab_button, false
+        @close_tab_button.signal_connect("clicked"){
+            @main.notebook().remove_page(@main.curr_page_num())
+        }
+        
+		@change_agent.signal_connect("changed"){
+			if (@change_agent.active_text() == "find") then
+				@agent_gui_box.destroy
+				@agent_gui_box = Gtk::VBox.new()
+				@search_box.pack_start @agent_gui_box
+				@search_box.reorder_child @agent_gui_box, 0
+				@agent = SearchAgentFind.new(self, @history_dispatcher)
+				@agent.build_gui(@agent_gui_box)
+				@main.window().show_all
+			elsif (@change_agent.active_text() == "locate") then
+				@agent_gui_box.destroy
+				@agent_gui_box = Gtk::VBox.new()
+				@search_box.pack_start @agent_gui_box
+				@search_box.reorder_child @agent_gui_box, 0
+				@agent = SearchAgentLocate.new(self, @history_dispatcher)
+				@agent.build_gui(@agent_gui_box)
+				@main.window().show_all
+			end
+
+		}
+
 		# Treeview
 
 		@scrolled_files = Gtk::ScrolledWindow.new
@@ -520,7 +551,6 @@ class Dogfish < Gtk::Window
 		@statusbar.add @found_label
 
 
-		@window.signal_connect('destroy'){self.on_button_close_clicked}
 		@button_find.signal_connect('clicked'){self.on_button_find_clicked}
 
 		initialize_file_menu
@@ -548,12 +578,6 @@ class Dogfish < Gtk::Window
 		@force_exit = false
 		@stop_search = false
 		@searching = false
-
-
-		@window.show_all
-
-		# Start GTK processing
-		Gtk.main()
 	end
 
 
@@ -594,11 +618,6 @@ class Dogfish < Gtk::Window
 		@file_menu.show_all
 	end
 
-	def on_button_close_clicked
-		@force_exit = true;
-		Gtk.main_quit
-	end
-
 	def find_update_stat
 		@found_label.text =_('%d found') % @found_files.size
 		Gtk.main_iteration while Gtk.events_pending?
@@ -777,4 +796,49 @@ class Dogfish < Gtk::Window
 
 end
 
-Dogfish.new
+class Main
+    def initialize()
+            super
+            @window = Gtk::Window.new
+	    	@notebook = Gtk::Notebook.new()
+	    	@window.title = "dogfish"
+	    	@window.default_width = 750
+	    	@window.default_height = 500
+	    	@window.signal_connect('destroy'){self.on_button_close_clicked}
+	    	@window_box = Gtk::VBox.new()
+	    	@window.add @notebook
+	    	@notebook.append_page @window_box
+	    	@notebook.signal_connect("switch-page"){|notebook, page, page_num| @curr_page_num = page_num}
+	    	@dogfish = Dogfish.new(self, @window_box)
+	    	@window.show_all
+    
+	    	# Start GTK processing
+	    	Gtk.main()
+    end
+
+    def new_tab()
+        window_box = Gtk::VBox.new()
+        @notebook.append_page window_box
+        dogfish = Dogfish.new(self, window_box)
+        @window.show_all
+    end
+
+    def window
+        @window
+    end
+    
+    def notebook
+        @notebook
+    end
+    
+    def on_button_close_clicked
+		@force_exit = true;
+		Gtk.main_quit
+    end
+    
+    def curr_page_num
+        @curr_page_num
+    end
+end
+
+Main.new

По прежнему удаляет только последнюю созданную страницу

netcat ★★
()
Ответ на: комментарий от geekless

1. Создай пять вкладок 2. Переключись на четвертую 3. Нажми кнопку «Закрыть вкладку» 4. Закроется пятая

netcat ★★
()
Ответ на: комментарий от netcat

А ты попользоваться-то поиском пробовал? Всё работает, просто имена на вкладках пляшут (видимо от того, что они безымянные).

geekless ★★
() автор топика
Ответ на: комментарий от geekless

Вкладки какие надо должны закрываться независимо ни от чего. А пользоваться пробовал. Ничего не пляшет, но закрывается последняя созданная вкладка, а не та, на которой я нахожусь.

netcat ★★
()
Ответ на: комментарий от geekless

А может сделать дизайн как в catfish? Т.е. все кнопки слева а не сверху.

netcat ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.