Skip to content

Commit

Permalink
Merge pull request #1433 from kmatheussen/windows_state
Browse files Browse the repository at this point in the history
Remember main window position size/state opened windows (sequencer, mixer) and edit/instrument gui visibilty
  • Loading branch information
kmatheussen authored Feb 5, 2024
2 parents ab84157 + b293669 commit 6afcbf8
Show file tree
Hide file tree
Showing 5 changed files with 160 additions and 13 deletions.
6 changes: 4 additions & 2 deletions Makefile.Qt
Original file line number Diff line number Diff line change
Expand Up @@ -586,7 +586,7 @@ OBJ11= $(T)undo.o $(T)undo_notes.o $(T)undo_fxs.o $(T)undo_temponodes.o $(T)undo
#OBJ12= $(T)X11_visual.o $(T)X11_error.o $(T)X11_Ptask2Mtask.o $(T)X11_Bs_edit.o $(T)X11_Main.o $(T)X11_endprogram.o $(T)X11_disk.o $(T)X11_Player.o $(T)X11_memory.o $(T)X11_ReqType.o $(T)X11_keyboard.o $(T)X11_MidiProperties.o

#Qt Spesific
OBJ12= $(T)Qt_instruments.o $(T)Qt_visual.o $(T)GTK_visual.o $(T)Qt_Main.o $(T)KeyboardFocus.o $(T)Qt_endprogram.o $(T)Qt_EventReceiver.o $(T)Qt_colors.o $(T)Qt_Menues.o $(T)Qt_Fonts.o $(T)Qt_ReqType.o $(T)Qt_PopupMenu.o $(T)Qt_Bs_edit.o $(T)Qt_PluginWidget.o $(T)Qt_SliderPainter.o $(T)Qt_memory.o $(T)Qt_path_resolver.o $(T)Qt_settings.o $(T)Qt_disk.o $(T)Qt_MainWindow.o $(T)Qt_Time.o $(T)Qt_sequencer.o $(T)GTK_ReqType.o $(T)GTK_PopupMenu.o $(T)Qt_soundfilesaver_widget_callbacks.o $(T)Qt_comment_dialog.o $(T)Qt_song_properties.o $(T)Qt_preferences_callbacks.o $(T)Qt_tools_callbacks.o $(T)Qt_Error.o $(T)Qt_progresswindow.o $(T)Qt_check_for_updates.o $(T)Rational.o $(T)Qt_AutoBackups.o $(T)flowlayout.o $(T)Qt_PresetBrowser.o
OBJ12= $(T)Qt_instruments.o $(T)Qt_visual.o $(T)GTK_visual.o $(T)Qt_Main.o $(T)KeyboardFocus.o $(T)Qt_endprogram.o $(T)Qt_EventReceiver.o $(T)Qt_colors.o $(T)Qt_Menues.o $(T)Qt_Fonts.o $(T)Qt_ReqType.o $(T)Qt_PopupMenu.o $(T)Qt_Bs_edit.o $(T)Qt_PluginWidget.o $(T)Qt_SliderPainter.o $(T)Qt_memory.o $(T)Qt_path_resolver.o $(T)Qt_settings.o $(T)Qt_disk.o $(T)Qt_MainWindow.o $(T)Qt_Time.o $(T)Qt_sequencer.o $(T)GTK_ReqType.o $(T)GTK_PopupMenu.o $(T)Qt_soundfilesaver_widget_callbacks.o $(T)Qt_comment_dialog.o $(T)Qt_song_properties.o $(T)Qt_preferences_callbacks.o $(T)Qt_tools_callbacks.o $(T)Qt_Error.o $(T)Qt_progresswindow.o $(T)Qt_check_for_updates.o $(T)Rational.o $(T)Qt_AutoBackups.o $(T)flowlayout.o $(T)Qt_PresetBrowser.o $(T)Qt_SaveRestoreWindows.o

#X11_MidiProperties.o $(T)X11_ClientMessages.o $(T)
#Qt_Bs_edit.o $(T)
Expand Down Expand Up @@ -1572,6 +1572,9 @@ $(T)Qt_Main.o: $(BUILD_DEPENDENCIES) $(P)Qt_Main.cpp $(P)EditorWidget.h $(P)Qt_
cd Qt && $(MOC) -DFOR_LINUX Timer.hpp > mTimer.hpp
$(CCC2) $(P)Qt_Main.cpp $(QTOPT) $(SNDFILEOPT) $(BOOST_INCLUDE) -DRADIUM_VERSION=\"$(RADIUM_VERSION)\" -Wno-null-dereference # -Wno-deprecated-declarations -Wno-shadow

$(T)Qt_SaveRestoreWindows.o: $(BUILD_DEPENDENCIES) Qt/Qt_SaveRestoreWindows.cpp
$(CCC2) $(P)Qt_SaveRestoreWindows.cpp $(QTOPT)

$(T)KeyboardFocus.o: $(BUILD_DEPENDENCIES) Qt/KeyboardFocus.cpp Qt/KeyboardFocusFrame.hpp
$(CCC2) $(P)KeyboardFocus.cpp $(QTOPT)

Expand Down Expand Up @@ -1678,7 +1681,6 @@ $(T)Qt_PresetBrowser.o: $(BUILD_DEPENDENCIES) $(P)Qt_PresetBrowser.cpp $(INSTRUM
$(CCC2) $(P)Qt_PresetBrowser.cpp $(QTOPT) $(SNDFILEOPT) -O0 -Wno-null-dereference $(NO_ANALYZER) ; \
fi


$(P)mQt_instruments_widget_callbacks.h: $(BUILD_DEPENDENCIES) $(P)qt4_instruments_widget.ui $(P)create_source_from_ui.sh $(P)Qt_instruments_widget_callbacks.h
cd $(P) && ./create_source_from_ui.sh $(UIC) $(MOC) instruments_widget

Expand Down
22 changes: 14 additions & 8 deletions Qt/Qt_Main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "Qt_AutoBackups_proc.h"
#include "Qt_Bs_edit_proc.h"
#include "Qt_PresetBrowser.h"
#include "Qt_SaveRestoreWindows.h"

#include "Timer.hpp"
#include "mTimer.hpp"
Expand Down Expand Up @@ -2624,13 +2625,14 @@ class CalledPeriodically : radium::Timer {

// Show mixer briefly to workaround a Qt quirk/bug causing SceneRect size to be calculated from invisible items when the scene hasn't been shown yet.
// (Fixes extremely large Mixer scene rect if previewing preset before opening the mixer for the first time)
{
// This breaks opening mixer window at startup form configuration - don't know needed anymore I do not see any difference when commented
/*{
if(num_calls_at_this_point==50/_interval)
GFX_ShowMixer();
if(num_calls_at_this_point==70/_interval)
GFX_HideMixer();
}
}*/

// Force full keyboard focus to the main window after startup. This seems to be the only reliable way. (if you think this is unnecessary, see if left alt works to start navigating menues after startup while using the fvwm window manager)
{
Expand Down Expand Up @@ -3972,11 +3974,15 @@ int radium_main(const char *arg){

updateWidgetRecursively(g_main_window);

main_window->adjustSize();
main_window->updateGeometry();
main_window->resize(main_window->width()+100, main_window->height()+100);

moveWindowToCentre(main_window, g_startup_rect);
if (!SETTINGS_read_bool("windows_settings_saved", false))
{
// default main window size/pos when settings was not saved yet
main_window->adjustSize();
main_window->updateGeometry();
main_window->resize(main_window->width()+100, main_window->height()+100);
moveWindowToCentre(main_window, g_startup_rect); // that changes window position
}

main_window->show();
main_window->raise();
main_window->activateWindow();
Expand Down Expand Up @@ -4028,11 +4034,11 @@ int radium_main(const char *arg){
// Hide mixer widget at startup.
GFX_showHideMixerWidget();


// Hide preset browser at startup.
if (SETTINGS_read_bool("preset_browser_visible", false)==false)
hidePresetBrowserAtStartup();

restoreWindowsState(main_window);

#if USE_QT_VISUAL
again:
Expand Down
9 changes: 6 additions & 3 deletions Qt/Qt_MainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include <QCloseEvent>
#pragma GCC diagnostic pop

#include <QWindow>
#include <QStatusBar>
#include <QMenuBar>
#include <QUrl>
Expand Down Expand Up @@ -95,7 +96,7 @@ static HWND gtk_hwnd = NULL;
#include "Qt_MyQSlider.h"
#include "Qt_MyQCheckBox.h"
#include "Qt_PresetBrowser.h"

#include "Qt_SaveRestoreWindows.h"

class Bottom_bar_widget;
static QVector<Bottom_bar_widget*> g_bottom_bars; // need to be defined here since it's used by the upperleft widget.
Expand Down Expand Up @@ -123,7 +124,7 @@ struct MyQMenuBar : QMenuBar {
*/

bool g_user_interaction_enabled = true;

extern bool doquit;

#if USE_GTK_VISUAL

Expand Down Expand Up @@ -508,6 +509,8 @@ class MyQMainWindow : public QWidget{
CancelMaybeNavigateMenus();
ce->ignore();
quit();
if(doquit==true)
saveWindowsState(this);
}

#if 0
Expand Down Expand Up @@ -600,7 +603,7 @@ QWidget *g_main_window = NULL;
void SetupMainWindow(void){

//QMainWindow *main_window = new QMainWindow(NULL, "Radium", Qt::WStyle_Customize | Qt::WStyle_NoBorder);// | Qt::WStyle_Dialog);
QWidget *main_window = new MyQMainWindow();//NULL, "Radium");
MyQMainWindow *main_window = new MyQMainWindow();//NULL, "Radium");
g_main_window = main_window;
g_static_toplevel_widgets.push_back(main_window);

Expand Down
128 changes: 128 additions & 0 deletions Qt/Qt_SaveRestoreWindows.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
#include "Qt_SaveRestoreWindows.h"

#include "../common/nsmtracker.h"
#include "../common/sequencer_proc.h"
#include "../common/settings_proc.h"
#include "../common/visual_proc.h"
#include "Qt_sequencer_proc.h"
#include "../api/api_proc.h"
#include "../api/api_gui_proc.h"
#include "../api/api_various_proc.h"
#include "../api/api_instruments_proc.h"
#include "../api/api_midi_proc.h"
#include "../api/api_common_proc.h"

void saveWindowsState(QWidget * mainWindow) {
printf("\n ***Saving windows state*** \n");
SETTINGS_write_bool("windows_settings_saved", true);

SETTINGS_write_bool("main_window_maximized", mainWindow->isMaximized());
SETTINGS_write_int("main_window_x", mainWindow->pos().x());
SETTINGS_write_int("main_window_y", mainWindow->pos().y());
SETTINGS_write_int("main_window_width", mainWindow->size().width());
SETTINGS_write_int("main_window_height", mainWindow->size().height());
printf("Saved main window settings: %d, %d, %d, %d \n", mainWindow->pos().x(), mainWindow->pos().y(), mainWindow->size().width(), mainWindow->size().height());

SETTINGS_write_bool("sequencer_in_own_window", sequencerInWindow());
if (sequencerInWindow())
{
printf("Sequencer in own window saving settings \n");
QWidget * sequencerWindow = SEQUENCER_getWidget()->window();
// When using configureSequencerWidget() we need be sure that
// second parameter has proper value
SETTINGS_write_bool("position_sequencer_widget_in_mixer", false);
SETTINGS_write_bool("sequencer_window_maximized", sequencerWindow->isMaximized());
SETTINGS_write_int("sequencer_window_x", sequencerWindow->pos().x());
SETTINGS_write_int("sequencer_window_y", sequencerWindow->pos().y());
SETTINGS_write_int("sequencer_window_width", sequencerWindow->size().width());
SETTINGS_write_int("sequencer_window_height", sequencerWindow->size().height());
printf("Saved sequencer settings: %d, %d, %d, %d \n", sequencerWindow->pos().x(), sequencerWindow->pos().y(), sequencerWindow->size().width(), sequencerWindow->size().height());
}

SETTINGS_write_bool("main_mixer_in_own_window", mainMixerInWindow());
if (mainMixerInWindow())
{
printf("Mixer in own window saving settings \n");
QWidget * mixerWindow = API_gui_get_widget(gui_getMainMixerGui())->window();
SETTINGS_write_bool("main_mixer_window_maximized", mixerWindow->isMaximized());
SETTINGS_write_int("main_mixer_window_x", mixerWindow->pos().x());
SETTINGS_write_int("main_mixer_window_y", mixerWindow->pos().y());
SETTINGS_write_int("main_mixer_window_width", mixerWindow->size().width());
SETTINGS_write_int("main_mixer_window_height", mixerWindow->size().height());
printf("Saved mixer settings: %d, %d, %d, %d \n", mixerWindow->pos().x(), mixerWindow->pos().y(), mixerWindow->size().width(), mixerWindow->size().height());
}

SETTINGS_write_bool("edit_gui_visible", editGuiIsVisible());
SETTINGS_write_bool("instrument_window_visible", GFX_InstrumentWindowIsVisible());
}

void restoreWindowsState(QWidget * mainWindow) {
if (!SETTINGS_read_bool("windows_settings_saved", false))
return;

printf("\n ***loading windows state*** \n");
// sequnecer window
bool inOwnWindow = SETTINGS_read_bool("sequencer_in_own_window", false);
if (inOwnWindow)
{
printf("Sequencer in own window loading settings \n");
// When using configureSequencerWidget() we need be sure that
// second parameter has proper value
SETTINGS_write_bool("position_sequencer_widget_in_mixer", false);
configureSequencerWidget(true, true);

bool maximized = SETTINGS_read_bool("sequencer_window_maximized", false);
int x = SETTINGS_read_int("sequencer_window_x", 0);
int y = SETTINGS_read_int("sequencer_window_y", 0);
int width = SETTINGS_read_int("sequencer_window_width", 1024);
int height = SETTINGS_read_int("sequencer_window_height", 550);
printf("Loaded sequencer settings: %d, %d, %d, %d \n", x, y, width, height);
QWidget * sequencerWindow = SEQUENCER_getWidget()->window();
sequencerWindow->setGeometry(x, y, width, height);
if (maximized)
sequencerWindow->showMaximized();
}

inOwnWindow = SETTINGS_read_bool("main_mixer_in_own_window", false);
if (inOwnWindow)
{
printf("Mixer in own window loading settings \n");
setMainMixerInWindow(true);
GFX_ShowMixer();
QWidget * mixerWindow = API_gui_get_widget(gui_getMainMixerGui())->window();
bool maximized = SETTINGS_read_bool("main_mixer_window_maximized", false);
int x = SETTINGS_read_int("main_mixer_window_x", 0);
int y = SETTINGS_read_int("main_mixer_window_y", 0);
int width = SETTINGS_read_int("main_mixer_window_width", 1024);
int height = SETTINGS_read_int("main_mixer_window_height", 550);
printf("Loaded mixer settings: %d, %d, %d, %d \n", x, y, width, height);

mixerWindow->setGeometry(x, y, width, height);
if (maximized)
mixerWindow->showMaximized();
}

printf("Loading main window state \n");
bool maximized = SETTINGS_read_bool("main_window_maximized", false);
int x = SETTINGS_read_int("main_window_x", 0);
int y = SETTINGS_read_int("main_window_y", 0);
int width = SETTINGS_read_int("main_window_width", 1024);
int height = SETTINGS_read_int("main_window_height", 550);
printf("Loaded main window settings: %d, %d, %d, %d \n", x, y, width, height);
mainWindow->setGeometry(x, y, width, height);
if (maximized)
mainWindow->showMaximized();


// show/hide editor gui
if (SETTINGS_read_bool("edit_gui_visible", true))
showEditGui();
else
hideEditGui();

// instrument widget
if (SETTINGS_read_bool("instrument_window_visible", false))
GFX_InstrumentWindowToFront();
else
GFX_InstrumentWindowToBack();
}
8 changes: 8 additions & 0 deletions Qt/Qt_SaveRestoreWindows.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#pragma once

#include <QWidget>
#include <cstdio>


void saveWindowsState(QWidget * mainWindow);
void restoreWindowsState(QWidget * mainWindow);

0 comments on commit 6afcbf8

Please sign in to comment.