diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 3e03ee08..16319c7e 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -40,6 +40,15 @@ MainWindow::MainWindow(GladeSearchpath* gladeSearchPath, Control* control): this->toolbarWidgets = new GtkWidget*[TOOLBAR_DEFINITIONS_LEN]; this->toolbarSelectMenu = new MainWindowToolbarMenu(this); + panedContainerWidget = GTK_WIDGET(get("panelMainContents")); + boxContainerWidget = GTK_WIDGET(get("mainContentContainer")); + mainContentWidget = GTK_WIDGET(get("boxContents")); + sidebarWidget = GTK_WIDGET(get("sidebar")); + g_object_ref(panedContainerWidget); + g_object_ref(boxContainerWidget); + g_object_ref(mainContentWidget); + g_object_ref(sidebarWidget); + loadMainCSS(gladeSearchPath, "xournalpp.css"); GtkOverlay* overlay = GTK_OVERLAY(get("mainOverlay")); @@ -220,6 +229,11 @@ MainWindow::~MainWindow() { delete scrollHandling; scrollHandling = nullptr; + + g_object_unref(panedContainerWidget); + g_object_unref(boxContainerWidget); + g_object_unref(mainContentWidget); + g_object_unref(sidebarWidget); } /** @@ -463,6 +477,11 @@ void MainWindow::updateScrollbarSidebarPosition() { !control->getSettings()->isScrollbarFadeoutDisabled()); } + // If the sidebar isn't visible, we can't change its position! + if (!this->sidebarVisible) { + return; + } + GtkWidget* sidebar = get("sidebar"); GtkWidget* boxContents = get("boxContents"); @@ -527,18 +546,36 @@ auto MainWindow::deleteEventCallback(GtkWidget* widget, GdkEvent* event, Control void MainWindow::setSidebarVisible(bool visible) { Settings* settings = control->getSettings(); - GtkWidget* sidebar = get("sidebar"); - GtkWidget* panel = get("panelMainContents"); - gtk_widget_set_visible(sidebar, visible); settings->setSidebarVisible(visible); - if (!visible && (control->getSidebar() != nullptr)) { saveSidebarSize(); } + if (visible != this->sidebarVisible) { + // Due to a GTK bug, we can't just hide the sidebar widget in the GtkPaned. + // If we do this, we create a dead region where the pane separator was previously. + // In this region, we can't use the touchscreen to start horizontal strokes. + // As such: + if (!visible) { + gtk_container_remove(GTK_CONTAINER(panedContainerWidget), mainContentWidget); + gtk_container_remove(GTK_CONTAINER(boxContainerWidget), GTK_WIDGET(panedContainerWidget)); + gtk_container_add(GTK_CONTAINER(boxContainerWidget), mainContentWidget); + this->sidebarVisible = false; + } else { + gtk_container_remove(GTK_CONTAINER(boxContainerWidget), mainContentWidget); + gtk_container_add(GTK_CONTAINER(panedContainerWidget), mainContentWidget); + gtk_container_add(GTK_CONTAINER(boxContainerWidget), GTK_WIDGET(panedContainerWidget)); + this->sidebarVisible = true; + + updateScrollbarSidebarPosition(); + } + } + + gtk_widget_set_visible(sidebarWidget, visible); + if (visible) { - gtk_paned_set_position(GTK_PANED(panel), settings->getSidebarWidth()); + gtk_paned_set_position(GTK_PANED(panedContainerWidget), settings->getSidebarWidth()); } GtkWidget* w = get("menuViewSidebarVisible"); @@ -561,9 +598,7 @@ void MainWindow::setToolbarVisible(bool visible) { } void MainWindow::saveSidebarSize() { - GtkWidget* panel = get("panelMainContents"); - - this->control->getSettings()->setSidebarWidth(gtk_paned_get_position(GTK_PANED(panel))); + this->control->getSettings()->setSidebarWidth(gtk_paned_get_position(GTK_PANED(panedContainerWidget))); } void MainWindow::setMaximized(bool maximized) { this->maximized = maximized; } diff --git a/src/gui/MainWindow.h b/src/gui/MainWindow.h index 875ac3fc..e2c60b74 100644 --- a/src/gui/MainWindow.h +++ b/src/gui/MainWindow.h @@ -187,4 +187,11 @@ private: MainWindowToolbarMenu* toolbarSelectMenu; GtkAccelGroup* globalAccelGroup; + + bool sidebarVisible = true; + + GtkWidget* boxContainerWidget; + GtkWidget* panedContainerWidget; + GtkWidget* mainContentWidget; + GtkWidget* sidebarWidget; }; diff --git a/ui/main.glade b/ui/main.glade index 1ca7fae4..8d3b52bc 100644 --- a/ui/main.glade +++ b/ui/main.glade @@ -2102,97 +2102,61 @@ - - panelMainContents + True - True + False + vertical - - sidebar + + panelMainContents True - False - vertical + True - + + sidebar True False + vertical - - tbSelectSidebarPage + True False - - - False - True - 0 - - - - - buttonCloseSidebar - True - True - False - none - + + tbSelectSidebarPage True False - gtk-close + + False + True + 0 + - - - - False - True - end - 1 - - - - - False - True - 1 - - - - - sidebarContents - True - False - vertical - - - - - - True - True - 2 - - - - - True - False - - - btUp - True - True - True - 2 - + + buttonCloseSidebar True - False - gtk-go-up + True + False + none + + + True + False + gtk-close + + + + + False + True + end + 1 + @@ -2202,99 +2166,146 @@ - - btDown + + sidebarContents True - True - True + False + vertical - - True - False - gtk-go-down - + - False + True True 2 - - btCopy + True - True - True + False - + + btUp True - False - gtk-copy + True + True + + + True + False + gtk-go-up + + + + False + True + 1 + - - - False - True - 3 - - - - - btDelete - True - True - True - + + btDown True - False - gtk-delete + True + True + + + True + False + gtk-go-down + + + + False + True + 2 + + + + + btCopy + True + True + True + + + True + False + gtk-copy + + + + + False + True + 3 + + + + + btDelete + True + True + True + + + True + False + gtk-delete + + + + + False + True + 4 + False True - 4 + 2 + 3 - False - True - 2 - 3 + False + False - - - False - False - - - - - boxContents - True - False - vertical - + + boxContents + True + False + vertical + + + + + + True + True + - True - True + True + True + 0 True True - 2 + 3