diff --git a/data/ui/app.ui b/data/ui/app.ui index 1c955b08..8f7a02a6 100644 --- a/data/ui/app.ui +++ b/data/ui/app.ui @@ -14,7 +14,82 @@ False True - + + True + False + True + True + vertical + + + True + True + bottom + True + + + True + False + + + + + gtk-add + True + True + True + 0.92941176470588238 + start + start + True + top + + + False + + + + + True + True + 0 + + + + + True + True + vertical + True + + + True + False + + + False + True + + + + + True + False + + + False + True + + + + + False + True + end + 1 + + + diff --git a/guake/application.py b/guake/application.py index 57966a8d..16005167 100644 --- a/guake/application.py +++ b/guake/application.py @@ -23,7 +23,7 @@ from __future__ import print_function from __future__ import unicode_literals import logging -# import os +import os # from time import sleep @@ -85,8 +85,11 @@ class GuakeApplication(Gtk.Application): return 0 def do_activate(self): - self.window = GuakeApplicationWindow(application=self, visible=self.show_on_start) - # notebook = GuakeNotebook() + datapath = "./data" + filename = os.path.join(datapath, "ui", "app.ui") + builder = Gtk.Builder() + builder.add_from_file(filename) + self.window = GuakeApplicationWindow(builder, application=self, visible=self.show_on_start) keystr = "F2" Keybinder.init() Keybinder.bind(keystr, self.window.show_hide_handler, "") diff --git a/guake/widgets/application_window.py b/guake/widgets/application_window.py index be198f38..ab3dc937 100644 --- a/guake/widgets/application_window.py +++ b/guake/widgets/application_window.py @@ -43,16 +43,16 @@ logger = logging.getLogger(__name__) class GuakeApplicationWindow(GuakeWidget, Gtk.ApplicationWindow): - __filename__ = "app.ui" - - def __init__(self, *args, **kwargs): + def __init__(self, builder, *args, **kwargs): app = kwargs.get("application") if app is not None: self.set_application(app) self._set_window_position() self._set_window_size() - note = GuakeNotebook() - self.add(note) + # self.note = self.builder.get_object("GuakeNotebook") + self.note = GuakeNotebook(builder) + self.resizer = builder.get_object("GuakeResizer") + self.resizer.connect("motion-notify-event", self.change_size_handler) self.visible = kwargs.get("visible", False) @property @@ -97,3 +97,13 @@ class GuakeApplicationWindow(GuakeWidget, Gtk.ApplicationWindow): def show_hide_handler(self, *args): self.visible = not self.visible return + + def change_size_handler(self, widget, event): + # got from + # http://stackoverflow.com/questions/13638782/resize-borderless-window-with-vpaned-in-pythongtk3 + if Gdk.ModifierType.BUTTON1_MASK & event.get_state() != 0: + mouse_y = event.device.get_position()[2] + new_height = mouse_y - self.get_position()[1] + if new_height > 0: + self.resize(self.get_allocation().width, new_height) + self.show_all() diff --git a/guake/widgets/notebook.py b/guake/widgets/notebook.py index 63a40551..7d2e8c63 100644 --- a/guake/widgets/notebook.py +++ b/guake/widgets/notebook.py @@ -23,7 +23,7 @@ from __future__ import print_function from __future__ import unicode_literals import logging - +import os # pylint: disable=wrong-import-position,wrong-import-order,unused-import from guake import gi assert gi # hack to "use" the import so pep8/pyflakes are happy @@ -32,31 +32,37 @@ assert gi # hack to "use" the import so pep8/pyflakes are happy from gi.repository import Gtk # pylint: enable=wrong-import-position,wrong-import-order,unused-import from guake.widgets.terminal import GuakeTerminal +from guake.widgets.widget import GuakeWidget logger = logging.getLogger(__name__) -class GuakeNotebook(Gtk.Notebook): +class GuakeNotebook(GuakeWidget, Gtk.Notebook): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - # TODO: choose from settings - self.set_tab_pos(Gtk.PositionType.BOTTOM) - self.new_page_button = self._get_new_page_button() + _page_counter = 0 + + def __init__(self, builder, *args, **kwargs): + self.new_page_button = builder.get_object("GuakeNewPageButton") + self.new_page_button.connect("clicked", self.new_page_handler) self._add_new_page() + self.show_all() + + @property + def page_counter(self): + self._page_counter += 1 + return self._page_counter def _add_new_page(self): pages_number = self.get_n_pages() position = 0 if pages_number < 2 else pages_number - 1 - self.insert_page(GuakeTerminal(), Gtk.Label("Terminal"), position) + self.insert_page( + GuakeTerminal(), + Gtk.Label("{}:".format(self.page_counter)), + position + ) self.show_all() + self.set_current_page(position) return - def _get_new_page_button(self): - button = Gtk.Button("+") - self.append_page(Gtk.Frame(), button) - button.connect("clicked", self.new_page_handler) - return button - def new_page_handler(self, *args): self._add_new_page() diff --git a/guake/widgets/widget.py b/guake/widgets/widget.py index e4c0b392..b060652f 100644 --- a/guake/widgets/widget.py +++ b/guake/widgets/widget.py @@ -38,16 +38,10 @@ class GuakeWidget(object): # __filename__ should be set in a child class __filename__ = None - def __new__(cls, *args, **kwargs): + def __new__(cls, builder, *args, **kwargs): """Create application from glade .ui file; ApplicationWindow identifier in the ui-file should be equal to cls.__name__""" - assert isinstance(cls.__filename__, str), "%s has invalid __filename__!" % cls - datapath = kwargs.get("datapath", "./data") - filename = os.path.join(datapath, "ui", cls.__filename__) - builder = Gtk.Builder() - builder.add_from_file(filename) instance = builder.get_object(cls.__name__) assert instance is not None, "Gtk widget %s not found!" % cls.__name__ instance.__class__ = cls - del builder return instance