MainAppWindow::MainAppWindow() : DocumentWindow (JUCEApplication::getInstance()->getApplicationName(), Colours::lightgrey, DocumentWindow::allButtons) { setUsingNativeTitleBar (true); setResizable (true, false); setResizeLimits (400, 400, 10000, 10000); #if JUCE_IOS || JUCE_ANDROID setFullScreen (true); #else setBounds ((int) (0.1f * getParentWidth()), (int) (0.1f * getParentHeight()), jmax (850, (int) (0.5f * getParentWidth())), jmax (600, (int) (0.7f * getParentHeight()))); #endif contentComponent = new ContentComponent(); setContentNonOwned (contentComponent, false); setVisible (true); // this lets the command manager use keypresses that arrive in our window to send out commands addKeyListener (getApplicationCommandManager().getKeyMappings()); #if JUCE_WINDOWS || JUCE_LINUX || JUCE_MAC taskbarIcon = new DemoTaskbarComponent(); #endif #if JUCE_ANDROID setOpenGLRenderingEngine(); #endif triggerAsyncUpdate(); }
void ResizableWindow::setFullScreen (const bool shouldBeFullScreen) { if (shouldBeFullScreen != isFullScreen()) { updateLastPos(); fullscreen = shouldBeFullScreen; if (isOnDesktop()) { if (ComponentPeer* const peer = getPeer()) { // keep a copy of this intact in case the real one gets messed-up while we're un-maximising const Rectangle<int> lastPos (lastNonFullScreenPos); peer->setFullScreen (shouldBeFullScreen); if ((! shouldBeFullScreen) && ! lastPos.isEmpty()) setBounds (lastPos); } else { jassertfalse; } } else { if (shouldBeFullScreen) setBounds (0, 0, getParentWidth(), getParentHeight()); else setBounds (lastNonFullScreenPos); } resized(); } }
// set TrackMixerComponent bounds and set track label void TrackMixerComponent::resized() { int buttonSize = 16; _muteButton->setBounds(0, buttonSize * 3, getWidth()/2, buttonSize); _soloButton->setBounds(0, buttonSize * 2, getWidth()/2, buttonSize); _trackLabel->setText("Track " + String (_trackID), NotificationType::dontSendNotification); _trackLabel->setBounds(getWidth()/2+20, getParentHeight()/2, getWidth()/2, buttonSize); }
void update() { if (bounds.isEmpty()) setBounds (0, 0, getParentWidth(), getParentHeight()); else setBounds (bounds); bluetoothDevicesList.setBounds (getOverlayBounds().withTrimmedTop (40)); }
BluetoothMidiSelectorOverlay() { setAlwaysOnTop (true); setVisible (true); addToDesktop (ComponentPeer::windowHasDropShadow); setBounds (0, 0, getParentWidth(), getParentHeight()); toFront (true); addAndMakeVisible (bluetoothDevicesList); enterModalState (true, nullptr, true); }
Rectangle<int> getOverlayBounds() const noexcept { if (bounds.isEmpty()) { const int pw = getParentWidth(); const int ph = getParentHeight(); return Rectangle<int> (pw, ph).withSizeKeepingCentre (jmin (400, pw - 14), jmin (300, ph - 40)); } return bounds.withZeroOrigin(); }
void Node::mouseDrag (const MouseEvent& e) { dragger.dragComponent (this, e, nullptr); auto node = graph.getNodeForID (id); node->setPosition ( std::make_tuple<float, float> ( (getX () + getWidth () / 2.0f) / (float)getParentWidth (), (getY () + getHeight () / 2.0f) / (float)getParentHeight ()) ); getGraph ()->updateGraph (); }
void mouseDrag (const MouseEvent& e) { if (! e.mods.isPopupMenu()) { Point<int> pos (originalPos + Point<int> (e.getDistanceFromDragStartX(), e.getDistanceFromDragStartY())); if (getParentComponent() != nullptr) pos = getParentComponent()->getLocalPoint (nullptr, pos); graph.setNodePosition (filterID, (pos.getX() + getWidth() / 2) / (double) getParentWidth(), (pos.getY() + getHeight() / 2) / (double) getParentHeight()); getGraphPanel()->updateComponents(); } }
void TrackComponent::resized() { // update the bounds of the regions to the values in the _posX container for(size_t current = 0; current < _regions.size(); ++current) { auto r(getLocalBounds().reduced(4)); r.setX((int)_posX.at(current)); int64 lengthSeconds = samplesToSeconds(_sizeSamps.at(current), _sampleRate); r.setWidth((int)lengthSeconds * (int)_pixelsPerClip); r.removeFromBottom(6); _regionComponents.at(current)->setBounds(r.removeFromBottom(90)); } // set the track mixer bounds _trackMixer->setBounds(0, 0, (int)_mixerOffset, getParentHeight()); repaint(); }
void NodeComponent::mouseDrag (const MouseEvent& e) { if (! e.mods.isPopupMenu()) { Point<int> pos (originalPos + Point<int> (e.getDistanceFromDragStartX(), e.getDistanceFromDragStartY())); if (getParentComponent() != nullptr) pos = getParentComponent()->getLocalPoint (nullptr, pos); endPos.x = (pos.getX() + getWidth() / 2) / (double) getParentWidth(); endPos.y = (pos.getY() + getHeight() / 2) / (double) getParentHeight(); audioEngine.getDoc().setNodePosition (nodeID, endPos.x, endPos.y); getGraphEditor()->updateComponents(); } }
PlayContentComponent::PlayContentComponent () { addAndMakeVisible(toolBarControls = new ToolBarControls()); addAndMakeVisible(waveformLiveScroller = new LiveScrollDisplay(0)); addAndMakeVisible(spectrumLiveScroller = new LiveScrollDisplay(1)); addAndMakeVisible(shapeButtonArray = new ClassButtonArray); addAndMakeVisible(metroDisplay = new MetronomeComponent); setSize (getParentWidth(), getParentHeight()); }
void TooltipWindow::showFor (const String& tip) { jassert (tip.isNotEmpty()); if (tipShowing != tip) repaint(); tipShowing = tip; Point<int> mousePos (Desktop::getMousePosition()); if (getParentComponent() != 0) mousePos = getParentComponent()->getLocalPoint (0, mousePos); int x, y, w, h; getLookAndFeel().getTooltipSize (tip, w, h); if (mousePos.getX() > getParentWidth() / 2) x = mousePos.getX() - (w + 12); else x = mousePos.getX() + 24; if (mousePos.getY() > getParentHeight() / 2) y = mousePos.getY() - (h + 6); else y = mousePos.getY() + 6; setBounds (x, y, w, h); setVisible (true); if (getParentComponent() == 0) { addToDesktop (ComponentPeer::windowHasDropShadow | ComponentPeer::windowIsTemporary | ComponentPeer::windowIgnoresKeyPresses); } toFront (false); }
void AlertWindow::updateLayout (const bool onlyIncreaseSize) { const int titleH = 24; const int iconWidth = 80; const Font font (getLookAndFeel().getAlertWindowMessageFont()); const int wid = jmax (font.getStringWidth (text), font.getStringWidth (getName())); const int sw = (int) std::sqrt (font.getHeight() * wid); int w = jmin (300 + sw * 2, (int) (getParentWidth() * 0.7f)); const int edgeGap = 10; const int labelHeight = 18; int iconSpace = 0; AttributedString attributedText; attributedText.append (getName(), font.withHeight (font.getHeight() * 1.1f).boldened()); if (text.isNotEmpty()) attributedText.append ("\n\n" + text, font); attributedText.setColour (findColour (textColourId)); if (alertIconType == NoIcon) { attributedText.setJustification (Justification::centredTop); textLayout.createLayoutWithBalancedLineLengths (attributedText, (float) w); } else { attributedText.setJustification (Justification::topLeft); textLayout.createLayoutWithBalancedLineLengths (attributedText, (float) w); iconSpace = iconWidth; } w = jmax (350, (int) textLayout.getWidth() + iconSpace + edgeGap * 4); w = jmin (w, (int) (getParentWidth() * 0.7f)); const int textLayoutH = (int) textLayout.getHeight(); const int textBottom = 16 + titleH + textLayoutH; int h = textBottom; int buttonW = 40; int i; for (i = 0; i < buttons.size(); ++i) buttonW += 16 + buttons.getUnchecked(i)->getWidth(); w = jmax (buttonW, w); h += (textBoxes.size() + comboBoxes.size() + progressBars.size()) * 50; if (buttons.size() > 0) h += 20 + buttons.getUnchecked(0)->getHeight(); for (i = customComps.size(); --i >= 0;) { Component* c = customComps.getUnchecked(i); w = jmax (w, (c->getWidth() * 100) / 80); h += 10 + c->getHeight(); if (c->getName().isNotEmpty()) h += labelHeight; } for (i = textBlocks.size(); --i >= 0;) { const AlertTextComp* const ac = static_cast <const AlertTextComp*> (textBlocks.getUnchecked(i)); w = jmax (w, ac->getPreferredWidth()); } w = jmin (w, (int) (getParentWidth() * 0.7f)); for (i = textBlocks.size(); --i >= 0;) { AlertTextComp* const ac = static_cast <AlertTextComp*> (textBlocks.getUnchecked(i)); ac->updateLayout ((int) (w * 0.8f)); h += ac->getHeight() + 10; } h = jmin (getParentHeight() - 50, h); if (onlyIncreaseSize) { w = jmax (w, getWidth()); h = jmax (h, getHeight()); } if (! isVisible()) { centreAroundComponent (associatedComponent, w, h); } else { const int cx = getX() + getWidth() / 2; const int cy = getY() + getHeight() / 2; setBounds (cx - w / 2, cy - h / 2, w, h); } textArea.setBounds (edgeGap, edgeGap, w - (edgeGap * 2), h - edgeGap); const int spacer = 16; int totalWidth = -spacer; for (i = buttons.size(); --i >= 0;) totalWidth += buttons.getUnchecked(i)->getWidth() + spacer; int x = (w - totalWidth) / 2; int y = (int) (getHeight() * 0.95f); for (i = 0; i < buttons.size(); ++i) { TextButton* const c = buttons.getUnchecked(i); int ny = proportionOfHeight (0.95f) - c->getHeight(); c->setTopLeftPosition (x, ny); if (ny < y) y = ny; x += c->getWidth() + spacer; c->toFront (false); } y = textBottom; for (i = 0; i < allComps.size(); ++i) { Component* const c = allComps.getUnchecked(i); h = 22; const int comboIndex = comboBoxes.indexOf (dynamic_cast <ComboBox*> (c)); if (comboIndex >= 0 && comboBoxNames [comboIndex].isNotEmpty()) y += labelHeight; const int tbIndex = textBoxes.indexOf (dynamic_cast <TextEditor*> (c)); if (tbIndex >= 0 && textboxNames[tbIndex].isNotEmpty()) y += labelHeight; if (customComps.contains (c)) { if (c->getName().isNotEmpty()) y += labelHeight; c->setTopLeftPosition (proportionOfWidth (0.1f), y); h = c->getHeight(); } else if (textBlocks.contains (c)) { c->setTopLeftPosition ((getWidth() - c->getWidth()) / 2, y); h = c->getHeight(); } else { c->setBounds (proportionOfWidth (0.1f), y, proportionOfWidth (0.8f), h); } y += h + 10; } setWantsKeyboardFocus (getNumChildComponents() == 0); }
void moved() override { if (isMouseButtonDown()) relativePos = getBounds().getCentre().toFloat() / Point<int> (getParentWidth(), getParentHeight()).toFloat(); }
void parentSizeChanged() { setBounds (0, 0, getParentWidth(), getParentHeight()); }
void ResizableWindow::parentSizeChanged() { if (isFullScreen() && getParentComponent() != nullptr) setBounds (0, 0, getParentWidth(), getParentHeight()); }
void parentSizeChanged() override { parentWidth = getParentWidth() - size; parentHeight = getParentHeight() - size; }
void updateComponents() { const int visibleTop = -getY(); const int visibleBottom = visibleTop + getParentHeight(); { for (int i = items.size(); --i >= 0;) items.getUnchecked(i)->shouldKeep = false; } { TreeViewItem* item = owner.rootItem; int y = (item != 0 && ! owner.rootItemVisible) ? -item->itemHeight : 0; while (item != 0 && y < visibleBottom) { y += item->itemHeight; if (y >= visibleTop) { RowItem* const ri = findItem (item->uid); if (ri != 0) { ri->shouldKeep = true; } else { Component* const comp = item->createItemComponent(); if (comp != 0) { items.add (new RowItem (item, comp, item->uid)); addAndMakeVisible (comp); } } } item = item->getNextVisibleItem (true); } } for (int i = items.size(); --i >= 0;) { RowItem* const ri = items.getUnchecked(i); bool keep = false; if (isParentOf (ri->component)) { if (ri->shouldKeep) { Rectangle<int> pos (ri->item->getItemPosition (false)); pos.setSize (pos.getWidth(), ri->item->itemHeight); if (pos.getBottom() >= visibleTop && pos.getY() < visibleBottom) { keep = true; ri->component->setBounds (pos); } } if ((! keep) && isMouseDraggingInChildCompOf (ri->component)) { keep = true; ri->component->setSize (0, 0); } } if (! keep) items.remove (i); } }