Fixed minor bug in UISplitter that caused to incorrectly calculate its size after being dragged.

Code clean up regarding the status bar (WIP).
This commit is contained in:
Martín Lucas Golini
2024-01-31 01:14:50 -03:00
parent 9a0368af1d
commit ea0f34de7e
12 changed files with 147 additions and 142 deletions

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 12.0.1, 2024-01-30T00:00:55. -->
<!-- Written by QtCreator 12.0.1, 2024-01-31T01:11:26. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
@@ -114,7 +114,7 @@
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{388e5431-b31b-42b3-b9ad-9002d279d75d}</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">11</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">10</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">19</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">

View File

@@ -279,17 +279,19 @@ void UISplitter::updateFromDrag() {
if ( UIOrientation::Horizontal == mOrientation ) {
mSplitPartition = StyleSheetLength(
eeclamp<Float>(
( mSplitter->getPixelsPosition().x + mSplitter->getPixelsSize().getWidth() ) /
( mSize.getWidth() - mPaddingPx.Left - mPaddingPx.Right ) * 100,
0, 100 ),
eeclamp<Float>( mSplitter->getPixelsPosition().x /
( mSize.getWidth() - mPaddingPx.Left - mPaddingPx.Right -
mSplitter->getPixelsSize().getWidth() ) *
100,
0, 100 ),
StyleSheetLength::Percentage );
} else {
mSplitPartition = StyleSheetLength(
eeclamp<Float>(
( mSplitter->getPixelsPosition().y + mSplitter->getPixelsSize().getHeight() ) /
( mSize.getHeight() - mPaddingPx.Top - mPaddingPx.Bottom ) * 100,
0, 100 ),
eeclamp<Float>( mSplitter->getPixelsPosition().y /
( mSize.getHeight() - mPaddingPx.Top - mPaddingPx.Bottom -
mSplitter->getPixelsSize().getHeight() ) *
100,
0, 100 ),
StyleSheetLength::Percentage );
}

View File

@@ -3655,6 +3655,7 @@ void App::init( const LogLevel& logLevel, std::string file, const Float& pidelDe
mMainSplitter->setSplitPartition(
StyleSheetLength( mConfig.windowState.statusBarPartition ) );
mStatusBar = mUISceneNode->find<UIStatusBar>( "status_bar" );
mPluginManager->setMainSplitter( mMainSplitter );
#if EE_PLATFORM != EE_PLATFORM_EMSCRIPTEN
mFileWatcher = new efsw::FileWatcher();

View File

@@ -241,7 +241,7 @@ void GitPlugin::updateStatusBarSync() {
mStatusButton = UIPushButton::New();
mStatusButton->setLayoutSizePolicy( SizePolicy::WrapContent, SizePolicy::MatchParent );
mStatusButton->setParent( mStatusBar );
mStatusButton->setId( "status_git" );
mStatusButton->setId( "git_status" );
mStatusButton->setClass( "status_but" );
mStatusButton->setIcon( iconDrawable( "source-control", 10 ) );
mStatusButton->reloadStyle( true, true );
@@ -250,12 +250,14 @@ void GitPlugin::updateStatusBarSync() {
if ( childCount > 2 )
mStatusButton->toPosition( mStatusBar->getChildCount() - 2 );
mStatusButton->onClick( [this]( const Event* ) {
if ( mTab ) {
mTab->setTabSelected();
if ( mGitStatus.totalInserts || mGitStatus.totalDeletions )
mPanelSwicher->getListBox()->setSelected( 1 );
}
mStatusButton->on( Event::MouseClick, [this]( const Event* event ) {
if ( nullptr == mTab )
return;
mTab->setTabSelected();
if ( event->asMouseEvent()->getFlags() & EE_BUTTON_RMASK )
mPanelSwicher->getListBox()->setSelected( 0 );
else if ( mGitStatus.totalInserts || mGitStatus.totalDeletions )
mPanelSwicher->getListBox()->setSelected( 1 );
} );
}

View File

@@ -139,6 +139,10 @@ UICodeEditorSplitter* PluginManager::getSplitter() const {
return mSplitter;
}
UISplitter* PluginManager::getMainSplitter() const {
return mMainSplitter;
}
UISceneNode* PluginManager::getUISceneNode() const {
return mSplitter ? mSplitter->getUISceneNode() : nullptr;
}
@@ -263,6 +267,10 @@ void PluginManager::setSplitter( UICodeEditorSplitter* splitter ) {
mSplitter = splitter;
}
void PluginManager::setMainSplitter( UISplitter* splitter ) {
mMainSplitter = splitter;
}
void PluginManager::setFileSystemListener( FileSystemListener* listener ) {
if ( listener == mFileSystemListener )
return;

View File

@@ -297,8 +297,12 @@ class PluginManager {
const PluginDefinition* getDefinitionIndex( const Int64& index ) const;
/** This is the code editor splitter. Where documents/terminals/etc are opened */
UICodeEditorSplitter* getSplitter() const;
/** This is the splitter between the code editor splitter and the bottom panel. */
UISplitter* getMainSplitter() const;
UISceneNode* getUISceneNode() const;
const std::string& getWorkspaceFolder() const;
@@ -355,6 +359,7 @@ class PluginManager {
std::map<std::string, PluginDefinition> mDefinitions;
std::shared_ptr<ThreadPool> mThreadPool;
UICodeEditorSplitter* mSplitter{ nullptr };
UISplitter* mMainSplitter{ nullptr };
FileSystemListener* mFileSystemListener{ nullptr };
Mutex mSubscribedPluginsMutex;
Mutex mPluginsFSSubsMutex;
@@ -369,6 +374,8 @@ class PluginManager {
void setSplitter( UICodeEditorSplitter* splitter );
void setMainSplitter( UISplitter* splitter );
void setFileSystemListener( FileSystemListener* listener );
void subscribeFileSystemListener();

View File

@@ -6,58 +6,7 @@ namespace ecode {
StatusBuildOutputController::StatusBuildOutputController( UISplitter* mainSplitter,
UISceneNode* uiSceneNode, App* app ) :
mMainSplitter( mainSplitter ),
mUISceneNode( uiSceneNode ),
mApp( app ),
mSplitter( mApp->getSplitter() ) {}
void StatusBuildOutputController::toggle() {
if ( nullptr == mContainer ) {
show();
return;
}
if ( mMainSplitter->getLastWidget() != nullptr ) {
if ( mMainSplitter->getLastWidget() == mContainer ) {
hide();
} else {
show();
}
} else {
show();
}
}
void StatusBuildOutputController::hide() {
if ( mContainer && mContainer->isVisible() ) {
mContainer->setParent( mUISceneNode );
mContainer->setVisible( false );
mApp->getStatusBar()->updateState();
if ( mSplitter->getCurWidget() )
mSplitter->getCurWidget()->setFocus();
}
}
void StatusBuildOutputController::show() {
if ( nullptr == mContainer ) {
mMainSplitter->updateLayout();
createContainer();
}
if ( !mContainer->isVisible() ) {
mApp->hideLocateBar();
mApp->hideSearchBar();
mApp->hideGlobalSearchBar();
if ( mMainSplitter->getLastWidget() != nullptr ) {
mMainSplitter->getLastWidget()->setVisible( false );
mMainSplitter->getLastWidget()->setParent( mUISceneNode );
}
mContainer->setParent( mMainSplitter );
mContainer->setVisible( true );
mContainer->getFirstChild()->setFocus();
mApp->getStatusBar()->updateState();
}
}
StatusBarElement( mainSplitter, uiSceneNode, app ) {}
static std::string getProjectOutputParserTypeToString( const ProjectOutputParserTypes& type ) {
switch ( type ) {
@@ -369,6 +318,16 @@ void StatusBuildOutputController::runClean( const std::string& buildName,
}
}
UIWidget* StatusBuildOutputController::getWidget() {
return mContainer;
}
UIWidget* StatusBuildOutputController::createWidget() {
if ( nullptr == mContainer )
createContainer();
return mContainer;
}
UICodeEditor* StatusBuildOutputController::getContainer() {
return mBuildOutput;
}

View File

@@ -2,6 +2,7 @@
#define ECODE_STATUSBUILDOUTPUTCONTROLLER_HPP
#include "projectbuild.hpp"
#include "uistatusbar.hpp"
#include "widgetcommandexecuter.hpp"
#include <eepp/system/luapattern.hpp>
#include <eepp/ui/tools/uicodeeditorsplitter.hpp>
@@ -34,22 +35,20 @@ struct PatternHolder {
ProjectBuildOutputParserConfig config;
};
class StatusBuildOutputController {
class StatusBuildOutputController : public StatusBarElement {
public:
StatusBuildOutputController( UISplitter* mainSplitter, UISceneNode* uiSceneNode, App* app );
void toggle();
void hide();
void show();
void runBuild( const std::string& buildName, const std::string& buildType,
const ProjectBuildOutputParser& outputParser = {} );
void runClean( const std::string& buildName, const std::string& buildType,
const ProjectBuildOutputParser& outputParser = {} );
UIWidget* getWidget();
UIWidget* createWidget();
UICodeEditor* getContainer();
void showIssues();
@@ -57,11 +56,6 @@ class StatusBuildOutputController {
void showBuildOutput();
protected:
UISplitter* mMainSplitter{ nullptr };
UISceneNode* mUISceneNode{ nullptr };
App* mApp{ nullptr };
UICodeEditorSplitter* mSplitter{ nullptr };
UIRelativeLayoutCommandExecuter* mContainer{ nullptr };
UICodeEditor* mBuildOutput{ nullptr };
UISelectButton* mButOutput{ nullptr };

View File

@@ -5,61 +5,16 @@ namespace ecode {
StatusTerminalController::StatusTerminalController( UISplitter* mainSplitter,
UISceneNode* uiSceneNode, App* app ) :
mMainSplitter( mainSplitter ),
mUISceneNode( uiSceneNode ),
mApp( app ),
mSplitter( mApp->getSplitter() ) {}
StatusBarElement( mainSplitter, uiSceneNode, app ) {}
void StatusTerminalController::toggle() {
if ( nullptr == mUITerminal ) {
show();
return;
}
if ( mMainSplitter->getLastWidget() != nullptr ) {
if ( mMainSplitter->getLastWidget() == mUITerminal ) {
hide();
} else {
show();
}
} else {
show();
}
UIWidget* StatusTerminalController::getWidget() {
return mUITerminal;
}
void StatusTerminalController::hide() {
if ( mUITerminal && mUITerminal->isVisible() ) {
mUITerminal->setParent( mUISceneNode );
mUITerminal->setVisible( false );
mApp->getStatusBar()->updateState();
if ( mSplitter->getCurWidget() )
mSplitter->getCurWidget()->setFocus();
}
}
void StatusTerminalController::show() {
if ( nullptr == mUITerminal ) {
mMainSplitter->updateLayout();
UIWidget* StatusTerminalController::createWidget() {
if ( mUITerminal == nullptr )
mUITerminal = createTerminal();
if ( !mUITerminal )
return;
mUITerminal->setId( "terminal" );
mUITerminal->setVisible( false );
}
if ( !mUITerminal->isVisible() ) {
mApp->hideLocateBar();
mApp->hideSearchBar();
mApp->hideGlobalSearchBar();
if ( mMainSplitter->getLastWidget() != nullptr ) {
mMainSplitter->getLastWidget()->setVisible( false );
mMainSplitter->getLastWidget()->setParent( mUISceneNode );
}
mUITerminal->setParent( mMainSplitter );
mUITerminal->setVisible( true );
mUITerminal->setFocus();
mApp->getStatusBar()->updateState();
}
return getWidget();
}
UITerminal* StatusTerminalController::getUITerminal() {
@@ -122,6 +77,7 @@ UITerminal* StatusTerminalController::createTerminal( const std::string& working
mApp->registerUnlockedCommands( *term );
mApp->getSplitter()->registerSplitterCommands( *term );
term->setFocus();
term->setId( "terminal" );
return term;
}

View File

@@ -1,6 +1,8 @@
#ifndef ECODE_STATUSTERMINALCONTROLLER_HPP
#define ECODE_STATUSTERMINALCONTROLLER_HPP
#include "uistatusbar.hpp"
#include <eepp/ui/tools/uicodeeditorsplitter.hpp>
#include <eepp/ui/uiscenenode.hpp>
#include <eepp/ui/uisplitter.hpp>
@@ -15,24 +17,18 @@ namespace ecode {
class App;
class StatusTerminalController {
class StatusTerminalController : public StatusBarElement {
public:
StatusTerminalController( UISplitter* mainSplitter, UISceneNode* uiSceneNode, App* app );
void toggle();
UIWidget* getWidget();
void hide();
void show();
UIWidget* createWidget();
UITerminal* getUITerminal();
protected:
UISplitter* mMainSplitter{ nullptr };
UISceneNode* mUISceneNode{ nullptr };
App* mApp{ nullptr };
UITerminal* mUITerminal{ nullptr };
UICodeEditorSplitter* mSplitter{ nullptr };
UITerminal* createTerminal( const std::string& workingDir = "", std::string program = "",
const std::vector<std::string>& args = {} );

View File

@@ -1,10 +1,67 @@
#include "uistatusbar.hpp"
#include "ecode.hpp"
#include "uistatusbar.hpp"
#include <eepp/ui/uiscenenode.hpp>
#include <eepp/window/window.hpp>
namespace ecode {
StatusBarElement::StatusBarElement( UISplitter* mainSplitter, UISceneNode* uiSceneNode, App* app ) :
mMainSplitter( mainSplitter ),
mUISceneNode( uiSceneNode ),
mApp( app ),
mSplitter( mApp->getSplitter() ) {}
void StatusBarElement::toggle() {
if ( nullptr == getWidget() ) {
show();
return;
}
if ( mMainSplitter->getLastWidget() != nullptr ) {
if ( mMainSplitter->getLastWidget() == getWidget() ) {
hide();
} else {
show();
}
} else {
show();
}
}
void StatusBarElement::hide() {
if ( getWidget() && getWidget()->isVisible() ) {
getWidget()->setParent( mUISceneNode );
getWidget()->setVisible( false );
mApp->getStatusBar()->updateState();
if ( mSplitter->getCurWidget() )
mSplitter->getCurWidget()->setFocus();
}
}
void StatusBarElement::show() {
if ( nullptr == getWidget() ) {
mMainSplitter->updateLayout();
createWidget();
if ( nullptr == getWidget() )
return;
getWidget()->setVisible( false );
}
if ( !getWidget()->isVisible() ) {
mApp->hideLocateBar();
mApp->hideSearchBar();
mApp->hideGlobalSearchBar();
if ( mMainSplitter->getLastWidget() != nullptr ) {
mMainSplitter->getLastWidget()->setVisible( false );
mMainSplitter->getLastWidget()->setParent( mUISceneNode );
}
getWidget()->setParent( mMainSplitter );
getWidget()->setVisible( true );
getWidget()->setFocus();
mApp->getStatusBar()->updateState();
}
}
UIStatusBar* UIStatusBar::New() {
return eeNew( UIStatusBar, () );
}

View File

@@ -1,7 +1,9 @@
#ifndef ECODE_UISTATUSBAR_HPP
#define ECODE_UISTATUSBAR_HPP
#include <eepp/ui/tools/uicodeeditorsplitter.hpp>
#include <eepp/ui/uilinearlayout.hpp>
#include <eepp/ui/uisplitter.hpp>
#include <eepp/ui/widgetcommandexecuter.hpp>
using namespace EE;
@@ -11,6 +13,27 @@ namespace ecode {
class App;
class StatusBarElement {
public:
StatusBarElement( UISplitter* mainSplitter, UISceneNode* uiSceneNode, App* app );
virtual void toggle();
virtual void hide();
virtual void show();
virtual UIWidget* getWidget() = 0;
virtual UIWidget* createWidget() = 0;
protected:
UISplitter* mMainSplitter;
UISceneNode* mUISceneNode;
App* mApp;
Tools::UICodeEditorSplitter* mSplitter;
};
class UIStatusBar : public UILinearLayout, public WidgetCommandExecuter {
public:
static UIStatusBar* New();